summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas James Alexander Thurman <tthurman@src.gnome.org>2009-01-27 05:03:06 +0000
committerThomas James Alexander Thurman <tthurman@src.gnome.org>2009-01-27 05:03:06 +0000
commitf5fa4a386690180e029ccd471c60874ae3d07c47 (patch)
treeb311cf3b115982c6276053dcc8622863e20994e2
parent8cbcbb0655a142bca77e3e49619310a8626301f4 (diff)
downloadmetacity-f5fa4a386690180e029ccd471c60874ae3d07c47.tar.gz
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
-rw-r--r--ChangeLog9
-rw-r--r--src/core/window-private.h3
-rw-r--r--src/core/window-props.c90
-rw-r--r--src/core/window.c79
4 files changed, 107 insertions, 74 deletions
diff --git a/ChangeLog b/ChangeLog
index 4636f231..dbacc59a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-01-27 Thomas Thurman <tthurman@gnome.org>
+
+ 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 <tthurman@gnome.org>
More of the window properties are checked using simple
diff --git a/src/core/window-private.h b/src/core/window-private.h
index f5547122..65740192 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 1a60fffe..28512cbf 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -196,6 +196,65 @@ reload_wm_client_machine (MetaWindow *window,
}
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,
MetaPropValue *value)
@@ -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 370ff74a..c59f9a39 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)
- {
- update_role (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)
+ if (event->atom == window->display->atom__NET_WM_USER_TIME &&
+ window->user_time_window)
{
- meta_icon_cache_property_changed (&window->icon_cache,
- window->display,
- event->atom);
- meta_window_queue(window, META_QUEUE_UPDATE_ICON);
+ xid = window->user_time_window;
}
- 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