Xnest: load fonts via xcb

FIXME: support xf86bigfont extension
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-08-20 12:22:26 +02:00
parent b5ec55f862
commit b333dd017e
4 changed files with 35 additions and 5 deletions

View File

@ -29,6 +29,7 @@ is" without express or implied warranty.
#include "scrnintstr.h" #include "scrnintstr.h"
#include "Xnest.h" #include "Xnest.h"
#include "xnest-xcb.h"
#include "Display.h" #include "Display.h"
#include "XNFont.h" #include "XNFont.h"
@ -38,7 +39,7 @@ int xnestFontPrivateIndex;
Bool Bool
xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont) xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont)
{ {
void *priv; xnestPrivFont *priv;
Atom name_atom, value_atom; Atom name_atom, value_atom;
int nprops; int nprops;
FontPropPtr props; FontPropPtr props;
@ -70,6 +71,26 @@ xnestRealizeFont(ScreenPtr pScreen, FontPtr pFont)
priv = (void *) malloc(sizeof(xnestPrivFont)); priv = (void *) malloc(sizeof(xnestPrivFont));
xfont2_font_set_private(pFont, xnestFontPrivateIndex, priv); 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))) if (!(xnestFontPriv(pFont)->font_struct = XLoadQueryFont(xnestDisplay, name)))
return FALSE; return FALSE;
@ -80,6 +101,7 @@ Bool
xnestUnrealizeFont(ScreenPtr pScreen, FontPtr pFont) xnestUnrealizeFont(ScreenPtr pScreen, FontPtr pFont)
{ {
if (xnestFontPriv(pFont)) { if (xnestFontPriv(pFont)) {
xcb_close_font(xnestUpstreamInfo.conn, xnestFontPriv(pFont)->font_id);
if (xnestFontPriv(pFont)->font_struct) if (xnestFontPriv(pFont)->font_struct)
XFreeFont(xnestDisplay, xnestFontPriv(pFont)->font_struct); XFreeFont(xnestDisplay, xnestFontPriv(pFont)->font_struct);
free(xnestFontPriv(pFont)); free(xnestFontPriv(pFont));

View File

@ -148,7 +148,7 @@ xnestChangeGC(GCPtr pGC, unsigned long mask)
values.ts_y_origin = pGC->patOrg.y; values.ts_y_origin = pGC->patOrg.y;
if (mask & GCFont) if (mask & GCFont)
values.font = xnestFontPriv(pGC->font)->font_struct->fid; values.font = xnestFontPriv(pGC->font)->font_id;
if (mask & GCSubwindowMode) if (mask & GCSubwindowMode)
values.subwindow_mode = pGC->subWindowMode; values.subwindow_mode = pGC->subWindowMode;

View File

@ -17,9 +17,7 @@ is" without express or implied warranty.
#include <X11/Xdefs.h> #include <X11/Xdefs.h>
typedef struct { #include <xcb/xcb.h>
XFontStruct *font_struct;
} xnestPrivFont;
extern int xnestFontPrivateIndex; extern int xnestFontPrivateIndex;

View File

@ -7,6 +7,8 @@
#include <xcb/xcb.h> #include <xcb/xcb.h>
#include "Xnest.h"
typedef struct { typedef struct {
xcb_connection_t *conn; xcb_connection_t *conn;
uint32_t screenId; uint32_t screenId;
@ -136,4 +138,12 @@ uint32_t xnest_visual_map_to_host(VisualID visual);
uint32_t xnestHostVisualToHostCmap(uint32_t visual); uint32_t xnestHostVisualToHostCmap(uint32_t visual);
uint32_t xnestVisualToHostCmap(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 */ #endif /* __XNEST__XCB_H */