summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--doc/libwnck-sections.txt1
-rw-r--r--doc/tmpl/screen.sgml16
-rw-r--r--libwnck/screen.c85
-rw-r--r--libwnck/screen.h5
-rw-r--r--libwnck/wnckprop.c8
6 files changed, 133 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index d9fcc8f..29b6eb5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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: ");