From b333dd017e0fdffb9ccf2e3d2f9094f7e9b515bc 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 | 24 +++++++++++++++++++++++- hw/xnest/GC.c | 2 +- hw/xnest/XNFont.h | 4 +--- hw/xnest/xnest-xcb.h | 10 ++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/hw/xnest/Font.c b/hw/xnest/Font.c index b601f7a49..6d4290df0 100644 --- a/hw/xnest/Font.c +++ b/hw/xnest/Font.c @@ -29,6 +29,7 @@ is" without express or implied warranty. #include "scrnintstr.h" #include "Xnest.h" +#include "xnest-xcb.h" #include "Display.h" #include "XNFont.h" @@ -38,7 +39,7 @@ int xnestFontPrivateIndex; Bool xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont) { - void *priv; + xnestPrivFont *priv; Atom name_atom, value_atom; int nprops; FontPropPtr props; @@ -70,6 +71,26 @@ xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont) priv = (void *) malloc(sizeof(xnestPrivFont)); xfont2_font_set_private(pFont, xnestFontPrivateIndex, priv); + priv->font_id = xcb_generate_id(xnestUpstreamInfo.conn); + xcb_open_font(xnestUpstreamInfo.conn, priv->font_id, strlen(name), name); + + 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; @@ -80,6 +101,7 @@ Bool xnestUnrealizeFont(ScreenPtr pScreen, FontPtr pFont) { if (xnestFontPriv(pFont)) { + xcb_close_font(xnestUpstreamInfo.conn, xnestFontPriv(pFont)->font_id); if (xnestFontPriv(pFont)->font_struct) XFreeFont(xnestDisplay, xnestFontPriv(pFont)->font_struct); free(xnestFontPriv(pFont)); diff --git a/hw/xnest/GC.c b/hw/xnest/GC.c index 579d9aef8..84c281e1a 100644 --- a/hw/xnest/GC.c +++ b/hw/xnest/GC.c @@ -148,7 +148,7 @@ xnestChangeGC(GCPtr pGC, unsigned long mask) values.ts_y_origin = pGC->patOrg.y; if (mask & GCFont) - values.font = xnestFontPriv(pGC->font)->font_struct->fid; + 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 a5721085f..db17b6fed 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; diff --git a/hw/xnest/xnest-xcb.h b/hw/xnest/xnest-xcb.h index c153b921a..944f1d27f 100644 --- a/hw/xnest/xnest-xcb.h +++ b/hw/xnest/xnest-xcb.h @@ -7,6 +7,8 @@ #include +#include "Xnest.h" + typedef struct { xcb_connection_t *conn; uint32_t screenId; @@ -136,4 +138,12 @@ uint32_t xnest_visual_map_to_host(VisualID visual); uint32_t xnestHostVisualToHostCmap(uint32_t visual); uint32_t xnestVisualToHostCmap(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 */