From 43b225c28cc43d07d6dd427474d18279bfee34fb Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Tue, 20 Aug 2024 12:22:26 +0200 Subject: [PATCH] Xnest: load fonts via xcb FIXME: support xf86bigfont extension Signed-off-by: Enrico Weigelt, metux IT consult --- hw/xnest/Font.c | 30 +++++++++++++++++++++++++----- hw/xnest/GC.c | 2 +- hw/xnest/XNFont.h | 6 +----- hw/xnest/xnest-xcb.h | 10 ++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/hw/xnest/Font.c b/hw/xnest/Font.c index 602a8aa03..b320d7534 100644 --- a/hw/xnest/Font.c +++ b/hw/xnest/Font.c @@ -28,6 +28,7 @@ is" without express or implied warranty. #include "scrnintstr.h" #include "Xnest.h" +#include "xnest-xcb.h" #include "Display.h" #include "XNFont.h" @@ -65,12 +66,30 @@ xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont) if (!name) return FALSE; - void *priv = calloc(1, sizeof(xnestPrivFont)); + xnestPrivFont* priv = calloc(1, sizeof(xnestPrivFont)); xfont2_font_set_private(pFont, xnestFontPrivateIndex, priv); - xnestFontPriv(pFont)->font_struct = XLoadQueryFont(xnestDisplay, name); + priv->font_id = xcb_generate_id(xnestUpstreamInfo.conn); + xcb_open_font(xnestUpstreamInfo.conn, priv->font_id, strlen(name), name); - if (!xnestFontStruct(pFont)) + xcb_generic_error_t *err = NULL; + priv->font_reply = xcb_query_font_reply( + xnestUpstreamInfo.conn, + xcb_query_font(xnestUpstreamInfo.conn, priv->font_id), + &err); + if (err) { + ErrorF("failed to query font \"%s\": %d", name, err->error_code); + free(err); + return FALSE; + } + if (!priv->font_reply) { + ErrorF("failed to query font \"%s\": no reply", name); + return FALSE; + } + priv->chars_len = xcb_query_font_char_infos_length(priv->font_reply); + priv->chars = xcb_query_font_char_infos(priv->font_reply); + + if (!(xnestFontPriv(pFont)->font_struct = XLoadQueryFont(xnestDisplay, name))) return FALSE; return TRUE; @@ -80,8 +99,9 @@ Bool xnestUnrealizeFont(ScreenPtr pScreen, FontPtr pFont) { if (xnestFontPriv(pFont)) { - if (xnestFontStruct(pFont)) - XFreeFont(xnestDisplay, xnestFontStruct(pFont)); + xcb_close_font(xnestUpstreamInfo.conn, xnestFontPriv(pFont)->font_id); + if (xnestFontPriv(pFont)->font_struct) + XFreeFont(xnestDisplay, xnestFontPriv(pFont)->font_struct); free(xnestFontPriv(pFont)); xfont2_font_set_private(pFont, xnestFontPrivateIndex, NULL); } diff --git a/hw/xnest/GC.c b/hw/xnest/GC.c index 5e574e3b4..d49ff3967 100644 --- a/hw/xnest/GC.c +++ b/hw/xnest/GC.c @@ -150,7 +150,7 @@ xnestChangeGC(GCPtr pGC, unsigned long mask) values.tile_stipple_origin_y = pGC->patOrg.y; if (mask & GCFont) - values.font = xnestFont(pGC->font); + values.font = xnestFontPriv(pGC->font)->font_id; if (mask & GCSubwindowMode) values.subwindow_mode = pGC->subWindowMode; diff --git a/hw/xnest/XNFont.h b/hw/xnest/XNFont.h index 1c10da1ea..da2253d52 100644 --- a/hw/xnest/XNFont.h +++ b/hw/xnest/XNFont.h @@ -17,9 +17,7 @@ is" without express or implied warranty. #include -typedef struct { - XFontStruct *font_struct; -} xnestPrivFont; +#include extern int xnestFontPrivateIndex; @@ -28,8 +26,6 @@ extern int xnestFontPrivateIndex; #define xnestFontStruct(pFont) (xnestFontPriv(pFont)->font_struct) -#define xnestFont(pFont) (xnestFontStruct(pFont)->fid) - Bool xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont); Bool xnestUnrealizeFont(ScreenPtr pScreen, FontPtr pFont); diff --git a/hw/xnest/xnest-xcb.h b/hw/xnest/xnest-xcb.h index b64c50370..4eedbc953 100644 --- a/hw/xnest/xnest-xcb.h +++ b/hw/xnest/xnest-xcb.h @@ -7,6 +7,8 @@ #include +#include "Xnest.h" + struct xnest_upstream_info { xcb_connection_t *conn; uint32_t screenId; @@ -62,4 +64,12 @@ uint32_t xnest_visual_map_to_upstream(VisualID visual); uint32_t xnest_upstream_visual_to_cmap(uint32_t visual); uint32_t xnest_visual_to_upstream_cmap(uint32_t visual); +typedef struct { + XFontStruct *font_struct; + xcb_query_font_reply_t *font_reply; + xcb_font_t font_id; + xcb_charinfo_t *chars; + uint16_t chars_len; +} xnestPrivFont; + #endif /* __XNEST__XCB_H */