frames: Intern some Atoms in the MetaFrame struct

Start with the ones we handle through PropertyNotify events,
since we want to expand further on those.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2872>
This commit is contained in:
Carlos Garnacho 2023-02-27 13:51:30 +01:00 committed by Marge Bot
parent 6b84f5bd00
commit e9fca3eba6

View File

@ -31,6 +31,8 @@ struct _MetaFrame
{ {
GtkWindow parent_instance; GtkWindow parent_instance;
GtkWidget *content; GtkWidget *content;
Atom atom__NET_WM_NAME;
Atom atom__MOTIF_WM_HINTS;
}; };
typedef struct typedef struct
@ -52,9 +54,28 @@ typedef struct
G_DEFINE_TYPE (MetaFrame, meta_frame, GTK_TYPE_WINDOW) G_DEFINE_TYPE (MetaFrame, meta_frame, GTK_TYPE_WINDOW)
static void
meta_frame_constructed (GObject *object)
{
MetaFrame *frame = META_FRAME (object);
GdkDisplay *display;
display = gtk_widget_get_display (GTK_WIDGET (object));
frame->atom__NET_WM_NAME =
gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME");
frame->atom__MOTIF_WM_HINTS =
gdk_x11_get_xatom_by_name_for_display (display, "_MOTIF_WM_HINTS");
G_OBJECT_CLASS (meta_frame_parent_class)->constructed (object);
}
static void static void
meta_frame_class_init (MetaFrameClass *klass) meta_frame_class_init (MetaFrameClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = meta_frame_constructed;
} }
static gboolean static gboolean
@ -208,9 +229,10 @@ on_border_changed (GObject *object,
} }
static void static void
frame_sync_title (GtkWindow *frame, frame_sync_title (GtkWindow *window,
Window client_window) Window client_window)
{ {
MetaFrame *frame = META_FRAME (window);
GdkDisplay *display; GdkDisplay *display;
char *title = NULL; char *title = NULL;
int format; int format;
@ -223,8 +245,7 @@ frame_sync_title (GtkWindow *frame,
if (XGetWindowProperty (gdk_x11_display_get_xdisplay (display), if (XGetWindowProperty (gdk_x11_display_get_xdisplay (display),
client_window, client_window,
gdk_x11_get_xatom_by_name_for_display (display, frame->atom__NET_WM_NAME,
"_NET_WM_NAME"),
0, G_MAXLONG, False, 0, G_MAXLONG, False,
gdk_x11_get_xatom_by_name_for_display (display, gdk_x11_get_xatom_by_name_for_display (display,
"UTF8_STRING"), "UTF8_STRING"),
@ -239,14 +260,15 @@ frame_sync_title (GtkWindow *frame,
if (gdk_x11_display_error_trap_pop (display)) if (gdk_x11_display_error_trap_pop (display))
return; return;
gtk_window_set_title (frame, title ? title : ""); gtk_window_set_title (window, title ? title : "");
g_free (title); g_free (title);
} }
static void static void
frame_sync_motif_wm_hints (GtkWindow *frame, frame_sync_motif_wm_hints (GtkWindow *window,
Window client_window) Window client_window)
{ {
MetaFrame *frame = META_FRAME (window);
GdkDisplay *display; GdkDisplay *display;
MotifWmHints *mwm_hints = NULL; MotifWmHints *mwm_hints = NULL;
int format; int format;
@ -260,8 +282,7 @@ frame_sync_motif_wm_hints (GtkWindow *frame,
if (XGetWindowProperty (gdk_x11_display_get_xdisplay (display), if (XGetWindowProperty (gdk_x11_display_get_xdisplay (display),
client_window, client_window,
gdk_x11_get_xatom_by_name_for_display (display, frame->atom__MOTIF_WM_HINTS,
"_MOTIF_WM_HINTS"),
0, sizeof (MotifWmHints) / sizeof (long), 0, sizeof (MotifWmHints) / sizeof (long),
False, AnyPropertyType, False, AnyPropertyType,
&type, &format, &type, &format,
@ -284,7 +305,7 @@ frame_sync_motif_wm_hints (GtkWindow *frame,
deletable = (mwm_hints->functions & MWM_FUNC_CLOSE) == 0; deletable = (mwm_hints->functions & MWM_FUNC_CLOSE) == 0;
} }
gtk_window_set_deletable (frame, deletable); gtk_window_set_deletable (window, deletable);
g_free (mwm_hints); g_free (mwm_hints);
} }
@ -373,7 +394,6 @@ meta_frame_handle_xevent (MetaFrame *frame,
Window window, Window window,
XEvent *xevent) XEvent *xevent)
{ {
GdkDisplay *display;
GtkWidget *content; GtkWidget *content;
gboolean is_frame, is_content; gboolean is_frame, is_content;
GdkSurface *surface; GdkSurface *surface;
@ -393,18 +413,13 @@ meta_frame_handle_xevent (MetaFrame *frame,
if (!is_frame && !is_content) if (!is_frame && !is_content)
return; return;
display = gtk_widget_get_display (GTK_WIDGET (frame));
if (is_content && xevent->type == PropertyNotify) if (is_content && xevent->type == PropertyNotify)
{ {
if (xevent->xproperty.atom == if (xevent->xproperty.atom == frame->atom__NET_WM_NAME)
gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME"))
frame_sync_title (GTK_WINDOW (frame), xevent->xproperty.window); frame_sync_title (GTK_WINDOW (frame), xevent->xproperty.window);
else if (xevent->xproperty.atom == else if (xevent->xproperty.atom == frame->atom__MOTIF_WM_HINTS)
gdk_x11_get_xatom_by_name_for_display (display, "_MOTIF_WM_HINTS"))
frame_sync_motif_wm_hints (GTK_WINDOW (frame), xevent->xproperty.window); frame_sync_motif_wm_hints (GTK_WINDOW (frame), xevent->xproperty.window);
else if (xevent->xproperty.atom == else if (xevent->xproperty.atom == XA_WM_NORMAL_HINTS)
gdk_x11_get_xatom_by_name_for_display (display, "WM_NORMAL_HINTS"))
frame_sync_wm_normal_hints (GTK_WINDOW (frame), xevent->xproperty.window); frame_sync_wm_normal_hints (GTK_WINDOW (frame), xevent->xproperty.window);
} }
} }