diff options
author | Vincent Untz <vuntz@gnome.org> | 2007-06-15 23:48:12 +0000 |
---|---|---|
committer | Vincent Untz <vuntz@src.gnome.org> | 2007-06-15 23:48:12 +0000 |
commit | e8353fb29f669040bcb13a1c23513e6bdc99a260 (patch) | |
tree | edeb58e824d9ecf606005e0e8e21bcfc5647e87e | |
parent | 9a0a6f926e2da0a380cfcaa9ce1731f4ea7625fa (diff) | |
download | libwnck-e8353fb29f669040bcb13a1c23513e6bdc99a260.tar.gz |
Add API to get the name of the running window manager. Fix bug #448043.
2007-06-16 Vincent Untz <vuntz@gnome.org>
Add API to get the name of the running window manager.
Fix bug #448043.
* doc/libwnck-sections.txt:
* doc/tmpl/screen.sgml: updated
* libwnck/screen.[ch]: (wnck_screen_class_init): add new
window_manager_changed signal
(wnck_screen_finalize): free wm name
(wnck_screen_construct): we need to update information about the wm
(_wnck_screen_process_property_notify): queue update for wm if the
hint is _NET_SUPPORTING_WM_CHECK
(update_wm): new, get the wm name
(do_update_now): update the wm information
(emit_wm_changed): new, emit window_manager_changed signal
(wnck_screen_get_window_manager_name): new
* libwnck/wnckprop.c: (print_props): print the name of the window
manager running on the screen
svn path=/trunk/; revision=1314
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | doc/libwnck-sections.txt | 1 | ||||
-rw-r--r-- | doc/tmpl/screen.sgml | 16 | ||||
-rw-r--r-- | libwnck/screen.c | 85 | ||||
-rw-r--r-- | libwnck/screen.h | 5 | ||||
-rw-r--r-- | libwnck/wnckprop.c | 8 |
6 files changed, 133 insertions, 2 deletions
@@ -1,3 +1,23 @@ +2007-06-16 Vincent Untz <vuntz@gnome.org> + + Add API to get the name of the running window manager. + Fix bug #448043. + + * doc/libwnck-sections.txt: + * doc/tmpl/screen.sgml: updated + * libwnck/screen.[ch]: (wnck_screen_class_init): add new + window_manager_changed signal + (wnck_screen_finalize): free wm name + (wnck_screen_construct): we need to update information about the wm + (_wnck_screen_process_property_notify): queue update for wm if the + hint is _NET_SUPPORTING_WM_CHECK + (update_wm): new, get the wm name + (do_update_now): update the wm information + (emit_wm_changed): new, emit window_manager_changed signal + (wnck_screen_get_window_manager_name): new + * libwnck/wnckprop.c: (print_props): print the name of the window + manager running on the screen + 2007-06-15 Vincent Untz <vuntz@gnome.org> * libwnck/private.h: add _wnck_stock_icons_init() diff --git a/doc/libwnck-sections.txt b/doc/libwnck-sections.txt index 6270c59..56dda5b 100644 --- a/doc/libwnck-sections.txt +++ b/doc/libwnck-sections.txt @@ -184,6 +184,7 @@ wnck_screen_get_number wnck_screen_get_width wnck_screen_get_height wnck_screen_force_update +wnck_screen_get_window_manager_name wnck_screen_net_wm_supports wnck_screen_get_active_window wnck_screen_get_previously_active_window diff --git a/doc/tmpl/screen.sgml b/doc/tmpl/screen.sgml index 443fd80..901b6fd 100644 --- a/doc/tmpl/screen.sgml +++ b/doc/tmpl/screen.sgml @@ -100,6 +100,13 @@ WnckScreen @wnckscreen: the object which received the signal. @arg1: +<!-- ##### SIGNAL WnckScreen::window-manager-changed ##### --> +<para> + +</para> + +@wnckscreen: the object which received the signal. + <!-- ##### SIGNAL WnckScreen::window-opened ##### --> <para> @@ -192,6 +199,15 @@ WnckScreen @screen: +<!-- ##### FUNCTION wnck_screen_get_window_manager_name ##### --> +<para> + +</para> + +@screen: +@Returns: + + <!-- ##### FUNCTION wnck_screen_net_wm_supports ##### --> <para> diff --git a/libwnck/screen.c b/libwnck/screen.c index 6a4e986..29f1e68 100644 --- a/libwnck/screen.c +++ b/libwnck/screen.c @@ -92,6 +92,8 @@ struct _WnckScreenPrivate gint window_order; Pixmap bg_pixmap; + + char *wm_name; guint update_handler; @@ -118,6 +120,7 @@ struct _WnckScreenPrivate guint need_update_workspace_names : 1; guint need_update_bg_pixmap : 1; guint need_update_showing_desktop : 1; + guint need_update_wm : 1; }; G_DEFINE_TYPE (WnckScreen, wnck_screen, G_TYPE_OBJECT); @@ -137,6 +140,7 @@ enum { BACKGROUND_CHANGED, SHOWING_DESKTOP_CHANGED, VIEWPORTS_CHANGED, + WM_CHANGED, LAST_SIGNAL }; @@ -180,6 +184,7 @@ static void emit_class_group_closed (WnckScreen *screen, static void emit_background_changed (WnckScreen *screen); static void emit_showing_desktop_changed (WnckScreen *screen); static void emit_viewports_changed (WnckScreen *screen); +static void emit_wm_changed (WnckScreen *screen); static guint signals[LAST_SIGNAL] = { 0 }; @@ -429,6 +434,23 @@ wnck_screen_class_init (WnckScreenClass *klass) NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * WnckScreen::window-manager-changed: + * @screen: the #WnckScreen which emitted the signal. + * + * Emitted when the window manager on @screen has changed. + * + * Since: 2.20 + */ + signals[WM_CHANGED] = + g_signal_new ("window_manager_changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (WnckScreenClass, window_manager_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void @@ -448,6 +470,8 @@ wnck_screen_finalize (GObject *object) g_list_free (screen->priv->stacked_windows); g_list_free (screen->priv->workspaces); + g_free (screen->priv->wm_name); + screens[screen->priv->number] = NULL; #ifdef HAVE_STARTUP_NOTIFICATION @@ -510,6 +534,7 @@ wnck_screen_construct (WnckScreen *screen, screen->priv->need_update_workspace_names = TRUE; screen->priv->need_update_bg_pixmap = TRUE; screen->priv->need_update_showing_desktop = TRUE; + screen->priv->need_update_wm = TRUE; queue_update (screen); } @@ -1004,6 +1029,12 @@ _wnck_screen_process_property_notify (WnckScreen *screen, screen->priv->need_update_showing_desktop = TRUE; queue_update (screen); } + else if (xevent->xproperty.atom == + _wnck_atom_get ("_NET_SUPPORTING_WM_CHECK")) + { + screen->priv->need_update_wm = TRUE; + queue_update (screen); + } } /** @@ -2060,6 +2091,32 @@ update_showing_desktop (WnckScreen *screen) } static void +update_wm (WnckScreen *screen) +{ + Window wm_window; + + if (!screen->priv->need_update_wm) + return; + + screen->priv->need_update_wm = FALSE; + + wm_window = None; + _wnck_get_window (screen->priv->xroot, + _wnck_atom_get ("_NET_SUPPORTING_WM_CHECK"), + &wm_window); + + g_free (screen->priv->wm_name); + + if (wm_window != None) + screen->priv->wm_name = _wnck_get_utf8_property (wm_window, + _wnck_atom_get ("_NET_WM_NAME")); + else + screen->priv->wm_name = NULL; + + emit_wm_changed (screen); +} + +static void do_update_now (WnckScreen *screen) { if (screen->priv->update_handler) @@ -2090,6 +2147,7 @@ do_update_now (WnckScreen *screen) update_workspace_layout (screen); update_workspace_names (screen); update_showing_desktop (screen); + update_wm (screen); update_bg_pixmap (screen); } @@ -2248,6 +2306,33 @@ emit_viewports_changed (WnckScreen *screen) 0); } +static void +emit_wm_changed (WnckScreen *screen) +{ + g_signal_emit (G_OBJECT (screen), + signals[WM_CHANGED], + 0); +} + +/** + * wnck_screen_get_window_manager_name: + * @screen: a #WnckScreen. + * + * Returns the name of the window manager. + * + * Return value: the name of the window manager, or %NULL if the window manager + * does not comply with the <ulink + * url="http://standards.freedesktop.org/wm-spec/wm-spec-latest.html">EWMH</ulink> + * specification. + */ +const char * +wnck_screen_get_window_manager_name (WnckScreen *screen) +{ + g_return_val_if_fail (WNCK_IS_SCREEN (screen), NULL); + + return screen->priv->wm_name; +} + /** * wnck_screen_net_wm_supports: * @screen: a #WnckScreen. diff --git a/libwnck/screen.h b/libwnck/screen.h index a8e3e6a..55e1480 100644 --- a/libwnck/screen.h +++ b/libwnck/screen.h @@ -105,8 +105,10 @@ struct _WnckScreenClass /* Viewport stuff changed */ void (* viewports_changed) (WnckScreen *screen); + /* Window manager changed */ + void (* window_manager_changed) (WnckScreen *screen); + /* Padding for future expansion */ - void (* pad1) (void); void (* pad2) (void); void (* pad3) (void); void (* pad4) (void); @@ -224,6 +226,7 @@ void wnck_screen_force_update (WnckScreen *screen); int wnck_screen_get_workspace_count (WnckScreen *screen); void wnck_screen_change_workspace_count (WnckScreen *screen, int count); +const char* wnck_screen_get_window_manager_name (WnckScreen *screen); gboolean wnck_screen_net_wm_supports (WnckScreen *screen, const char *atom); gulong wnck_screen_get_background_pixmap (WnckScreen *screen); diff --git a/libwnck/wnckprop.c b/libwnck/wnckprop.c index b417c97..f9a637f 100644 --- a/libwnck/wnckprop.c +++ b/libwnck/wnckprop.c @@ -86,7 +86,13 @@ print_props (WnckWindow *window) g_print ("none\n"); screen = wnck_window_get_screen (window); - g_print ("On Screen: %d\n", wnck_screen_get_number (screen)); + g_print ("On Screen: %d", wnck_screen_get_number (screen)); + if (wnck_screen_get_window_manager_name (screen) != NULL) + g_print (" (Window Manager: %s)", + wnck_screen_get_window_manager_name (screen)); + else + g_print (" (Window Manager: <no EWMH-compliant window manager>)"); + g_print ("\n"); type = wnck_window_get_window_type (window); g_print ("Window Type: "); |