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:
parent
6b84f5bd00
commit
e9fca3eba6
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user