x11: Don't share cached GLX visuals with GTK3

We don't want to bind ourselves to GTK3 - both because we don't want to
accidentally cause bugs in a different codebase and because we want to
deviate from it.

While doing so, also store visuals as visuals and not as integers.
And only store one Visual because GTK4 only uses one visual.

And then remove the code that is leftover for dealing with the
compatibility Visual for GTK3.

PS: I'm kinda proud of my STRINGIFY_WITHOUT_BRACKETS hack.
This commit is contained in:
Benjamin Otte
2021-06-03 19:20:51 +02:00
parent 7d32ec51e7
commit 8bfe82f686
3 changed files with 30 additions and 44 deletions

View File

@@ -947,38 +947,36 @@ pick_better_visual_for_gl (GdkX11Screen *x11_screen,
return compatible;
}
static gboolean
get_cached_gl_visuals (GdkDisplay *display, int *system, int *rgba)
#define STRINGIFY_WITHOUT_BRACKETS(x) G_STRINGIFY x
#define CACHED_VISUAL_ATOM_NAME "GDK" STRINGIFY_WITHOUT_BRACKETS(GDK_MAJOR_VERSION) "_GLX_VISUAL"
static VisualID
get_cached_gl_visual (GdkDisplay *display)
{
gboolean found;
Atom type_return;
int format_return;
gulong nitems_return;
gulong bytes_after_return;
guchar *data = NULL;
Display *dpy;
VisualID result;
dpy = gdk_x11_display_get_xdisplay (display);
found = FALSE;
result = 0;
gdk_x11_display_error_trap_push (display);
if (XGetWindowProperty (dpy, DefaultRootWindow (dpy),
gdk_x11_get_xatom_by_name_for_display (display, "GDK_VISUALS"),
0, 2, False, XA_INTEGER, &type_return,
gdk_x11_get_xatom_by_name_for_display (display, CACHED_VISUAL_ATOM_NAME),
0, 1, False, XA_VISUALID, &type_return,
&format_return, &nitems_return,
&bytes_after_return, &data) == Success)
{
if (type_return == XA_INTEGER &&
if (type_return == XA_VISUALID &&
format_return == 32 &&
nitems_return == 2 &&
nitems_return == 1 &&
data != NULL)
{
long *visuals = (long *) data;
*system = (int)visuals[0];
*rgba = (int)visuals[1];
found = TRUE;
result = *(unsigned long *) data;
}
}
gdk_x11_display_error_trap_pop_ignored (display);
@@ -986,25 +984,24 @@ get_cached_gl_visuals (GdkDisplay *display, int *system, int *rgba)
if (data)
XFree (data);
return found;
return result;
}
static void
save_cached_gl_visuals (GdkDisplay *display, int system, int rgba)
save_cached_gl_visual (GdkDisplay *display, VisualID visual)
{
long visualdata[2];
unsigned long visualdata[1];
Display *dpy;
dpy = gdk_x11_display_get_xdisplay (display);
visualdata[0] = system;
visualdata[1] = rgba;
visualdata[0] = visual;
gdk_x11_display_error_trap_push (display);
XChangeProperty (dpy, DefaultRootWindow (dpy),
gdk_x11_get_xatom_by_name_for_display (display, "GDK_VISUALS"),
XA_INTEGER, 32, PropModeReplace,
(unsigned char *)visualdata, 2);
gdk_x11_get_xatom_by_name_for_display (display, CACHED_VISUAL_ATOM_NAME),
XA_VISUALID, 32, PropModeReplace,
(unsigned char *) visualdata, 2);
gdk_x11_display_error_trap_pop_ignored (display);
}
@@ -1016,7 +1013,7 @@ gdk_x11_screen_update_visuals_for_glx (GdkX11Screen *x11_screen)
Display *dpy;
struct glvisualinfo *gl_info;
int i;
int system_visual_id, rgba_visual_id;
int rgba_visual_id;
display = x11_screen->display;
display_x11 = GDK_X11_DISPLAY (display);
@@ -1027,20 +1024,20 @@ gdk_x11_screen_update_visuals_for_glx (GdkX11Screen *x11_screen)
/* We save the default visuals as a property on the root window to avoid
having to initialize GL each time, as it may not be used later. */
if (get_cached_gl_visuals (display, &system_visual_id, &rgba_visual_id))
rgba_visual_id = get_cached_gl_visual (display);
if (rgba_visual_id)
{
for (i = 0; i < x11_screen->nvisuals; i++)
{
GdkX11Visual *visual = x11_screen->visuals[i];
int visual_id = gdk_x11_visual_get_xvisual (visual)->visualid;
if (visual_id == system_visual_id)
x11_screen->system_visual = visual;
if (visual_id == rgba_visual_id)
x11_screen->rgba_visual = visual;
{
x11_screen->rgba_visual = visual;
return;
}
}
return;
}
if (!gdk_x11_screen_init_glx (x11_screen))
@@ -1079,17 +1076,13 @@ gdk_x11_screen_update_visuals_for_glx (GdkX11Screen *x11_screen)
XFree (visual_list);
}
x11_screen->system_visual = pick_better_visual_for_gl (x11_screen, gl_info, x11_screen->system_visual);
if (x11_screen->rgba_visual)
x11_screen->rgba_visual = pick_better_visual_for_gl (x11_screen, gl_info, x11_screen->rgba_visual);
{
x11_screen->rgba_visual = pick_better_visual_for_gl (x11_screen, gl_info, x11_screen->rgba_visual);
save_cached_gl_visual (display, gdk_x11_visual_get_xvisual (x11_screen->rgba_visual)->visualid);
}
g_free (gl_info);
save_cached_gl_visuals (display,
gdk_x11_visual_get_xvisual (x11_screen->system_visual)->visualid,
x11_screen->rgba_visual
? gdk_x11_visual_get_xvisual (x11_screen->rgba_visual)->visualid
: 0);
}
GdkX11GLContext *

View File

@@ -74,7 +74,6 @@ struct _GdkX11Screen
/* Visual Part */
int nvisuals;
GdkX11Visual **visuals;
GdkX11Visual *system_visual;
int available_depths[7];
GdkVisualType available_types[6];
gint16 navailable_depths;

View File

@@ -65,7 +65,6 @@ _gdk_x11_screen_init_visuals (GdkX11Screen *x11_screen)
XVisualInfo *visual_list;
XVisualInfo visual_template;
Visual *default_xvisual;
GdkX11Visual **visuals;
int nxvisuals;
int nvisuals;
@@ -79,8 +78,6 @@ _gdk_x11_screen_init_visuals (GdkX11Screen *x11_screen)
for (i = 0; i < nxvisuals; i++)
visuals[i] = g_object_new (GDK_TYPE_X11_VISUAL, NULL);
default_xvisual = DefaultVisual (x11_screen->xdisplay, x11_screen->screen_num);
nvisuals = 0;
for (i = 0; i < nxvisuals; i++)
{
@@ -143,9 +140,6 @@ _gdk_x11_screen_init_visuals (GdkX11Screen *x11_screen)
for (i = 0; i < nvisuals; i++)
{
if (default_xvisual->visualid == GDK_X11_VISUAL (visuals[i])->xvisual->visualid)
x11_screen->system_visual = visuals[i];
/* For now, we only support 8888 ARGB for the "rgba visual".
* Additional formats (like ABGR) could be added later if they
* turn up.