From f5fa4a386690180e029ccd471c60874ae3d07c47 Mon Sep 17 00:00:00 2001 From: Thomas James Alexander Thurman Date: Tue, 27 Jan 2009 05:03:06 +0000 Subject: [PATCH] All the window properties are now handled using simple window property handlers. Closes #549886. * src/core/window-private.h: * src/core/window-props.c: * src/core/window.c: svn path=/trunk/; revision=4090 --- ChangeLog | 9 ++++ src/core/window-private.h | 3 ++ src/core/window-props.c | 90 ++++++++++++++++++++++++++++++++++++--- src/core/window.c | 79 ++++++---------------------------- 4 files changed, 107 insertions(+), 74 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4636f2318..dbacc59af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-01-27 Thomas Thurman + + All the window properties are now handled using simple + window property handlers. Closes #549886. + + * src/core/window-private.h: + * src/core/window-props.c: + * src/core/window.c: + 2009-01-26 Thomas Thurman More of the window properties are checked using simple diff --git a/src/core/window-private.h b/src/core/window-private.h index f55471228..657401924 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -629,4 +629,7 @@ void meta_window_unset_demands_attention (MetaWindow *window); void meta_window_update_icon_now (MetaWindow *window); +void meta_window_update_role (MetaWindow *window); +void meta_window_update_net_wm_type (MetaWindow *window); + #endif diff --git a/src/core/window-props.c b/src/core/window-props.c index 1a60fffe7..28512cbfe 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -195,6 +195,65 @@ reload_wm_client_machine (MetaWindow *window, window->wm_client_machine ? window->wm_client_machine : "unset"); } +static void +complain_about_broken_client (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + meta_warning ("Broken client! Window %s changed client leader window or SM client ID\n", + window->desc); +} + +static void +reload_net_wm_window_type (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + meta_window_update_net_wm_type (window); +} + +static void +reload_icon (MetaWindow *window, + Atom atom) +{ + meta_icon_cache_property_changed (&window->icon_cache, + window->display, + atom); + meta_window_queue(window, META_QUEUE_UPDATE_ICON); +} + +static void +reload_net_wm_icon (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + reload_icon (window, window->display->atom__NET_WM_ICON); +} + +static void +reload_kwm_win_icon (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + reload_icon (window, window->display->atom__KWM_WIN_ICON); +} + +static void +reload_struts (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + meta_window_update_struts (window); +} + +static void +reload_wm_window_role (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + meta_window_update_role (window); +} + static void init_net_wm_pid (MetaDisplay *display, Atom property, @@ -565,6 +624,13 @@ reload_net_wm_state (MetaWindow *window, * clients don't change the property. */ + if (!initial) { + /* no, they DON'T change the property */ + meta_verbose ("Ignoring _NET_WM_STATE: we should be the one who set " + "the property in the first place\n"); + return; + } + window->shaded = FALSE; window->maximized_horizontally = FALSE; window->maximized_vertically = FALSE; @@ -1488,7 +1554,7 @@ reload_transient_for (MetaWindow *window, meta_window_queue (window, META_QUEUE_MOVE_RESIZE); } -#define N_HOOKS 26 +#define N_HOOKS 28 void meta_display_init_window_prop_hooks (MetaDisplay *display) @@ -1533,6 +1599,16 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) hooks[i].reload_func = reload_wm_name; ++i; + hooks[i].property = display->atom__NET_WM_ICON; + hooks[i].init_func = NULL; + hooks[i].reload_func = reload_net_wm_icon; + ++i; + + hooks[i].property = display->atom__KWM_WIN_ICON; + hooks[i].init_func = NULL; + hooks[i].reload_func = reload_kwm_win_icon; + ++i; + hooks[i].property = display->atom__NET_WM_ICON_NAME; hooks[i].init_func = init_net_wm_icon_name; hooks[i].reload_func = reload_net_wm_icon_name; @@ -1565,22 +1641,22 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) hooks[i].property = display->atom_WM_CLIENT_LEADER; hooks[i].init_func = NULL; - hooks[i].reload_func = NULL; + hooks[i].reload_func = complain_about_broken_client; ++i; hooks[i].property = display->atom_SM_CLIENT_ID; hooks[i].init_func = NULL; - hooks[i].reload_func = NULL; + hooks[i].reload_func = complain_about_broken_client; ++i; hooks[i].property = display->atom_WM_WINDOW_ROLE; hooks[i].init_func = NULL; - hooks[i].reload_func = NULL; + hooks[i].reload_func = reload_wm_window_role; ++i; hooks[i].property = display->atom__NET_WM_WINDOW_TYPE; hooks[i].init_func = NULL; - hooks[i].reload_func = NULL; + hooks[i].reload_func = reload_net_wm_window_type; ++i; hooks[i].property = display->atom__NET_WM_DESKTOP; @@ -1590,12 +1666,12 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) hooks[i].property = display->atom__NET_WM_STRUT; hooks[i].init_func = NULL; - hooks[i].reload_func = NULL; + hooks[i].reload_func = reload_struts; ++i; hooks[i].property = display->atom__NET_WM_STRUT_PARTIAL; hooks[i].init_func = NULL; - hooks[i].reload_func = NULL; + hooks[i].reload_func = reload_struts; ++i; hooks[i].property = display->atom__NET_STARTUP_ID; diff --git a/src/core/window.c b/src/core/window.c index 370ff74ab..c59f9a390 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -57,8 +57,6 @@ static int destroying_windows_disallowed = 0; static void update_sm_hints (MetaWindow *window); -static void update_role (MetaWindow *window); -static void update_net_wm_type (MetaWindow *window); static void update_net_frame_extents (MetaWindow *window); static void recalc_window_type (MetaWindow *window); static void recalc_window_features (MetaWindow *window); @@ -598,8 +596,8 @@ meta_window_new_with_attrs (MetaDisplay *display, meta_window_reload_properties (window, initial_props, N_INITIAL_PROPS, TRUE); update_sm_hints (window); /* must come after transient_for */ - update_role (window); - update_net_wm_type (window); + meta_window_update_role (window); + meta_window_update_net_wm_type (window); meta_window_update_icon_now (window); if (window->initially_iconic) @@ -5431,11 +5429,7 @@ static gboolean process_property_notify (MetaWindow *window, XPropertyEvent *event) { - /* Property notifies we want to use. - * FIXME once we move entirely to the window-props.h framework, we - * can just call reload on the property in the event and get rid of - * this if-else chain. - */ + Window xid = window->xwindow; if (meta_is_verbose ()) /* avoid looking up the name if we don't have to */ { @@ -5447,62 +5441,13 @@ process_property_notify (MetaWindow *window, XFree (property_name); } - if (event->atom == window->display->atom_WM_WINDOW_ROLE) + if (event->atom == window->display->atom__NET_WM_USER_TIME && + window->user_time_window) { - update_role (window); + xid = window->user_time_window; } - else if (event->atom == - window->display->atom_WM_CLIENT_LEADER || - event->atom == - window->display->atom_SM_CLIENT_ID) - { - meta_warning ("Broken client! Window %s changed client leader window or SM client ID\n", window->desc); - } - else if (event->atom == - window->display->atom__NET_WM_STATE) - { - meta_verbose ("Ignoring _NET_WM_STATE: we should be the one who set the property in the first place\n"); - } - else if (event->atom == - window->display->atom__NET_WM_WINDOW_TYPE) - { - update_net_wm_type (window); - } - else if (event->atom == window->display->atom__NET_WM_ICON) - { - meta_icon_cache_property_changed (&window->icon_cache, - window->display, - event->atom); - meta_window_queue(window, META_QUEUE_UPDATE_ICON); - } - else if (event->atom == window->display->atom__KWM_WIN_ICON) - { - meta_icon_cache_property_changed (&window->icon_cache, - window->display, - event->atom); - meta_window_queue(window, META_QUEUE_UPDATE_ICON); - } - else if ((event->atom == window->display->atom__NET_WM_STRUT) || - (event->atom == window->display->atom__NET_WM_STRUT_PARTIAL)) - { - meta_window_update_struts (window); - } - else if (event->atom == window->display->atom__NET_WM_USER_TIME) - { - Window xid; - Atom atom__NET_WM_USER_TIME; - atom__NET_WM_USER_TIME = window->display->atom__NET_WM_USER_TIME; - if (window->user_time_window) - xid = window->user_time_window; - else - xid = window->xwindow; - meta_window_reload_property_from_xwindow (window, - xid, - atom__NET_WM_USER_TIME, FALSE); - } - else - meta_window_reload_property (window, event->atom, FALSE); + meta_window_reload_property (window, event->atom, FALSE); return TRUE; } @@ -5692,8 +5637,8 @@ update_sm_hints (MetaWindow *window) window->sm_client_id ? window->sm_client_id : "none"); } -static void -update_role (MetaWindow *window) +void +meta_window_update_role (MetaWindow *window) { char *str; @@ -5713,8 +5658,8 @@ update_role (MetaWindow *window) window->desc, window->role ? window->role : "null"); } -static void -update_net_wm_type (MetaWindow *window) +void +meta_window_update_net_wm_type (MetaWindow *window) { int n_atoms; Atom *atoms; @@ -5771,7 +5716,7 @@ update_net_wm_type (MetaWindow *window) meta_XFree (str); } - recalc_window_type (window); + meta_window_recalc_window_type (window); } static void