2009-07-19 Christian Kelly <[email protected]>
authorchrisk
Sun, 19 Jul 2009 15:11:37 +0000
changeset 16055 5bccf1b9fcf1
parent 16054 f1e0abde1531
child 16056 3081bac78d06
2009-07-19 Christian Kelly <[email protected]> * base-specs/gnome-panel.spec, patches/gnome-panel-07-restrict-app-launching.diff, patches/gnome-panel-08-launch-menu.diff, patches/gnome-panel-05-notificationarea-tooltip.diff, patches/gnome-panel-02-fish-applet.diff: Bump to 2.27.4. * base-specs/gnome-desktop.spec: Bump to 2.27.4. * base-specs/gnome-menus.spec: Bump to 2.27.4. * base-specs/libwnck.spec, patches/libwnck-01-trusted-extensions.diff: Bump to 2.27.4.
ChangeLog
base-specs/gnome-desktop.spec
base-specs/gnome-menus.spec
base-specs/gnome-panel.spec
base-specs/libwnck.spec
patches/gnome-panel-02-fish-applet.diff
patches/gnome-panel-05-notificationarea-tooltip.diff
patches/gnome-panel-07-restrict-app-launching.diff
patches/gnome-panel-08-launch-menu.diff
patches/libwnck-01-trusted-extensions.diff
--- a/ChangeLog	Sun Jul 19 01:20:52 2009 +0000
+++ b/ChangeLog	Sun Jul 19 15:11:37 2009 +0000
@@ -1,3 +1,15 @@
+2009-07-19  Christian Kelly  <[email protected]>
+
+	* base-specs/gnome-panel.spec, 
+	  patches/gnome-panel-07-restrict-app-launching.diff, 
+	  patches/gnome-panel-08-launch-menu.diff, 
+	  patches/gnome-panel-05-notificationarea-tooltip.diff,
+	  patches/gnome-panel-02-fish-applet.diff: Bump to 2.27.4.
+	* base-specs/gnome-desktop.spec: Bump to 2.27.4.
+	* base-specs/gnome-menus.spec: Bump to 2.27.4.
+	* base-specs/libwnck.spec, patches/libwnck-01-trusted-extensions.diff: 
+	  Bump to 2.27.4.
+
 2009-07-19  Christian Kelly  <[email protected]>
 
 	* base-specs/gcalctool.spec: Bump to 5.27.4.
--- a/base-specs/gnome-desktop.spec	Sun Jul 19 01:20:52 2009 +0000
+++ b/base-specs/gnome-desktop.spec	Sun Jul 19 15:11:37 2009 +0000
@@ -11,7 +11,7 @@
 Name:         gnome-desktop
 License:      LGPL
 Group:        System/Libraries/GNOME
-Version:      2.27.3
+Version:      2.27.4
 Release:      1
 Distribution: Java Desktop System
 Vendor:       Sun Microsystems, Inc.
--- a/base-specs/gnome-menus.spec	Sun Jul 19 01:20:52 2009 +0000
+++ b/base-specs/gnome-menus.spec	Sun Jul 19 15:11:37 2009 +0000
@@ -9,7 +9,7 @@
 Name:			gnome-menus
 License:		LGPL
 Group:			System/GUI/GNOME
-Version:		2.26.2
+Version:		2.27.4
 Release:		1
 Distribution:		Java Desktop System
 Vendor:			Sun Microsystems, Inc.
--- a/base-specs/gnome-panel.spec	Sun Jul 19 01:20:52 2009 +0000
+++ b/base-specs/gnome-panel.spec	Sun Jul 19 15:11:37 2009 +0000
@@ -11,7 +11,7 @@
 Name:		gnome-panel
 License:	GPL
 Group:		System/GUI/GNOME
-Version:	2.26.3
+Version:	2.27.4
 Release:	1
 Distribution:	Java Desktop System
 Vendor:		Sun Microsystems, Inc.
--- a/base-specs/libwnck.spec	Sun Jul 19 01:20:52 2009 +0000
+++ b/base-specs/libwnck.spec	Sun Jul 19 15:11:37 2009 +0000
@@ -11,7 +11,7 @@
 Name:         libwnck
 License:      GPL
 Group:        System/Libraries/GNOME
-Version:      2.26.2
+Version:      2.27.4
 Release:      1
 Distribution: Java Desktop System
 Vendor:       Sun Microsystems, Inc.
--- a/patches/gnome-panel-02-fish-applet.diff	Sun Jul 19 01:20:52 2009 +0000
+++ b/patches/gnome-panel-02-fish-applet.diff	Sun Jul 19 15:11:37 2009 +0000
@@ -61,14 +61,6 @@
  applets/notification_area/Makefile
  applets/wncklet/Makefile
  doc/Makefile
-@@ -355,7 +348,6 @@ doc/reference/Makefile
- doc/reference/panel-applet/Makefile
- help/Makefile
- help/clock/Makefile
--help/fish/Makefile
- help/window-list/Makefile
- help/workspace-switcher/Makefile
- man/Makefile
 /jds/bin/diff -uprN gnome-panel-2.26.2.old/applets/Makefile.am gnome-panel-2.26.2/applets/Makefile.am
 --- gnome-panel-2.26.2.old/applets/Makefile.am	2009-06-03 16:20:50.146577000 +0100
 +++ gnome-panel-2.26.2/applets/Makefile.am	2009-06-03 16:21:12.695750000 +0100
@@ -79,11 +71,22 @@
  	notification_area \
  	wncklet
  
-/jds/bin/diff -uprN gnome-panel-2.26.2.old/help/Makefile.am gnome-panel-2.26.2/help/Makefile.am
---- gnome-panel-2.26.2.old/help/Makefile.am	2009-06-03 16:20:50.276021000 +0100
-+++ gnome-panel-2.26.2/help/Makefile.am	2009-06-03 16:21:06.196636000 +0100
+diff -ruN gnome-panel-2.27.4.orig/configure.in gnome-panel-2.27.4/configure.in
+--- gnome-panel-2.27.4.orig/configure.in	2009-07-19 15:34:20.449234980 +0100
++++ gnome-panel-2.27.4/configure.in	2009-07-19 15:40:36.685825917 +0100
+@@ -338,7 +338,6 @@
+ doc/reference/panel-applet/Makefile
+ help/Makefile
+ help/clock/Makefile
+-help/fish/Makefile
+ man/Makefile
+ ])
+ 
+diff -ruN gnome-panel-2.27.4.orig/help/Makefile.am gnome-panel-2.27.4/help/Makefile.am
+--- gnome-panel-2.27.4.orig/help/Makefile.am	2009-07-19 15:42:12.669015975 +0100
++++ gnome-panel-2.27.4/help/Makefile.am	2009-07-19 15:42:52.234570642 +0100
 @@ -1,3 +1,3 @@
--SUBDIRS = clock fish window-list workspace-switcher
-+SUBDIRS = clock window-list workspace-switcher
+-SUBDIRS = clock fish
++SUBDIRS = clock
  
  -include $(top_srcdir)/git.mk
--- a/patches/gnome-panel-05-notificationarea-tooltip.diff	Sun Jul 19 01:20:52 2009 +0000
+++ b/patches/gnome-panel-05-notificationarea-tooltip.diff	Sun Jul 19 15:11:37 2009 +0000
@@ -1,15 +1,3 @@
-/jds/bin/diff -uprN gnome-panel-2.26.3.old/applets/notification_area/main.c gnome-panel-2.26.3/applets/notification_area/main.c
---- gnome-panel-2.26.3.old/applets/notification_area/main.c	2009-07-01 13:46:00.000000000 +0100
-+++ gnome-panel-2.26.3/applets/notification_area/main.c	2009-07-01 18:42:57.062212000 +0100
-@@ -250,6 +250,8 @@ applet_factory (PanelApplet *applet,
- 
-   panel_applet_set_background_widget (applet, GTK_WIDGET (applet));
- 
-+  na_tray_set_tooltip (GTK_WIDGET (applet), tray);
-+
-   gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (tray));
-   
- #ifndef NOTIFICATION_AREA_INPROCESS
 /jds/bin/diff -uprN gnome-panel-2.26.3.old/applets/notification_area/na-tray.c gnome-panel-2.26.3/applets/notification_area/na-tray.c
 --- gnome-panel-2.26.3.old/applets/notification_area/na-tray.c	2009-04-19 18:45:09.000000000 +0100
 +++ gnome-panel-2.26.3/applets/notification_area/na-tray.c	2009-07-01 18:42:57.062082000 +0100
@@ -94,3 +82,15 @@
 +                                             G_CALLBACK (na_tray_icon_query_tooltip), tray);
 +}
 +
+diff -ruN gnome-panel-2.27.4.orig/applets/notification_area/main.c gnome-panel-2.27.4/applets/notification_area/main.c
+--- gnome-panel-2.27.4.orig/applets/notification_area/main.c	2009-07-19 15:44:22.901680971 +0100
++++ gnome-panel-2.27.4/applets/notification_area/main.c	2009-07-19 15:45:15.316399778 +0100
+@@ -272,6 +272,8 @@
+ 
+   panel_applet_set_background_widget (applet, GTK_WIDGET (applet));
+ 
++  na_tray_set_tooltip (GTK_WIDGET (applet), tray);
++
+   gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (tray));
+   force_no_focus_padding (GTK_WIDGET (applet));
+ 
--- a/patches/gnome-panel-07-restrict-app-launching.diff	Sun Jul 19 01:20:52 2009 +0000
+++ b/patches/gnome-panel-07-restrict-app-launching.diff	Sun Jul 19 15:11:37 2009 +0000
@@ -858,20 +858,6 @@
  	directory = gmenu_tree_header_get_directory (header);
  	menuitem = create_submenu_entry (menu, directory);
  	gmenu_tree_item_unref (directory);
-@@ -1498,10 +1521,12 @@ create_header (GtkWidget       *menu,
- static void
- create_menuitem (GtkWidget          *menu,
- 		 GMenuTreeEntry     *entry,
--		 GMenuTreeDirectory *alias_directory)
-+		 GMenuTreeDirectory *alias_directory,
-+         gboolean *is_hidden)
- {
- 	GtkWidget  *menuitem;
- 	
-+    *is_hidden = FALSE;
- 	menuitem = gtk_image_menu_item_new ();
- 
- 	g_object_set_data_full (G_OBJECT (menuitem),
 @@ -1578,12 +1603,18 @@ create_menuitem (GtkWidget          *men
  	g_signal_connect (menuitem, "activate",
  			  G_CALLBACK (activate_app_def), entry);
@@ -1096,3 +1082,20 @@
  	g_key_file_free (key_file);
  }
  
+diff -ruN gnome-panel-2.27.4.orig/gnome-panel/menu.c gnome-panel-2.27.4/gnome-panel/menu.c
+--- gnome-panel-2.27.4.orig/gnome-panel/menu.c	2009-07-19 15:47:37.034283631 +0100
++++ gnome-panel-2.27.4/gnome-panel/menu.c	2009-07-19 15:49:46.435518348 +0100
+@@ -1472,10 +1472,12 @@
+ static void
+ create_menuitem (GtkWidget          *menu,
+ 		 GMenuTreeEntry     *entry,
+-		 GMenuTreeDirectory *alias_directory)
++		 GMenuTreeDirectory *alias_directory,
++                                    gboolean *is_hidden)
+ {
+ 	GtkWidget  *menuitem;
+ 	
++        *is_hidden = FALSE;
+ 	menuitem = panel_image_menu_item_new ();
+ 
+ 	g_object_set_data_full (G_OBJECT (menuitem),
--- a/patches/gnome-panel-08-launch-menu.diff	Sun Jul 19 01:20:52 2009 +0000
+++ b/patches/gnome-panel-08-launch-menu.diff	Sun Jul 19 15:11:37 2009 +0000
@@ -196,18 +196,6 @@
  	g_object_set_data (G_OBJECT (main_menu), "menu_panel", panel);
  	/* FIXME need to update the panel on parent_set */
  
-/jds/bin/diff -uprN gnome-panel-2.26.3.old/gnome-panel/panel-menu-bar.c gnome-panel-2.26.3/gnome-panel/panel-menu-bar.c
---- gnome-panel-2.26.3.old/gnome-panel/panel-menu-bar.c	2009-07-01 18:50:20.995771000 +0100
-+++ gnome-panel-2.26.3/gnome-panel/panel-menu-bar.c	2009-07-01 19:05:59.892593000 +0100
-@@ -167,6 +167,8 @@ panel_menu_bar_init (PanelMenuBar *menub
- 	menubar->priv->info = NULL;
- 
- 	menubar->priv->applications_menu = create_applications_menu ("applications.menu", NULL);
-+	g_object_set_data (G_OBJECT (menubar->priv->applications_menu), "panel-menu-needs-appending", TRUE);
-+	g_signal_connect (menubar->priv->applications_menu, "show", G_CALLBACK(applications_menu_append), NULL);
- 
- 	menubar->priv->applications_item = gtk_image_menu_item_new_with_label (_("Applications"));
- 	image = gtk_image_new_from_icon_name (PANEL_ICON_MAIN_MENU,
 /jds/bin/diff -uprN gnome-panel-2.26.3.old/gnome-panel/panel-menu-button.c gnome-panel-2.26.3/gnome-panel/panel-menu-button.c
 --- gnome-panel-2.26.3.old/gnome-panel/panel-menu-button.c	2009-04-19 18:45:09.000000000 +0100
 +++ gnome-panel-2.26.3/gnome-panel/panel-menu-button.c	2009-07-01 19:05:59.893447000 +0100
@@ -365,3 +353,16 @@
  
  	return desktop_menu;
  }
+diff -ruN gnome-panel-2.27.4.orig/gnome-panel/panel-menu-bar.c gnome-panel-2.27.4/gnome-panel/panel-menu-bar.c
+--- gnome-panel-2.27.4.orig/gnome-panel/panel-menu-bar.c	2009-07-19 15:50:40.252618922 +0100
++++ gnome-panel-2.27.4/gnome-panel/panel-menu-bar.c	2009-07-19 15:52:01.014245688 +0100
+@@ -167,7 +167,8 @@
+ 	menubar->priv->info = NULL;
+ 
+ 	menubar->priv->applications_menu = create_applications_menu ("applications.menu", NULL);
+-
++        g_object_set_data (G_OBJECT (menubar->priv->applications_menu), "panel-menu-needs-appending", TRUE);
++        g_signal_connect (menubar->priv->applications_menu, "show", G_CALLBACK(applications_menu_append), NULL);
+ 	menubar->priv->applications_item = panel_image_menu_item_new ();
+ 	gtk_menu_item_set_label (GTK_MENU_ITEM (menubar->priv->applications_item),
+ 				 _("Applications"));
--- a/patches/libwnck-01-trusted-extensions.diff	Sun Jul 19 01:20:52 2009 +0000
+++ b/patches/libwnck-01-trusted-extensions.diff	Sun Jul 19 15:11:37 2009 +0000
@@ -2175,3275 +2175,6 @@
    old_state = COMPRESS_STATE (window);
    old_actions = window->priv->actions;
  
-diff -urN libwnck.orig/libwnck/window.c.orig libwnck.new/libwnck/window.c.orig
---- libwnck.orig/libwnck/window.c.orig	1970-01-01 01:00:00.000000000 +0100
-+++ libwnck.new/libwnck/window.c.orig	2008-08-06 23:43:15.390501000 +0100
-@@ -0,0 +1,3265 @@
-+/* window object */
-+/* vim: set sw=2 et: */
-+
-+/*
-+ * Copyright (C) 2001 Havoc Pennington
-+ * Copyright (C) 2003 Kim Woelders
-+ * Copyright (C) 2003 Red Hat, Inc.
-+ * Copyright (C) 2006-2007 Vincent Untz
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Library General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Library General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Library General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+
-+#include <config.h>
-+
-+#include <glib/gi18n-lib.h>
-+#include <string.h>
-+#include <time.h>
-+
-+#include "window.h"
-+#include "class-group.h"
-+#include "util.h"
-+#include "xutils.h"
-+#include "private.h"
-+#include "wnck-enum-types.h"
-+#include "wnck-marshal.h"
-+
-+/**
-+ * SECTION:window
-+ * @short_description: an object representing a window.
-+ * @see_also: #WnckWorkspace, #WnckApplication, #WnckClassGroup
-+ * @stability: Unstable
-+ *
-+ * The #WnckWindow objects are always owned by libwnck and must not be
-+ * referenced or unreferenced.
-+ */
-+
-+#define FALLBACK_NAME _("Untitled window")
-+#define ALL_WORKSPACES (0xFFFFFFFF)
-+
-+static GHashTable *window_hash = NULL;
-+
-+/* Keep 0-7 in sync with the numbers in the WindowState enum. Yeah I'm
-+ * a loser.
-+ */
-+#define COMPRESS_STATE(window)                          \
-+  ( ((window)->priv->is_minimized        << 0) |        \
-+    ((window)->priv->is_maximized_horz   << 1) |        \
-+    ((window)->priv->is_maximized_vert   << 2) |        \
-+    ((window)->priv->is_shaded           << 3) |        \
-+    ((window)->priv->skip_pager          << 4) |        \
-+    ((window)->priv->skip_taskbar        << 5) |        \
-+    ((window)->priv->is_sticky           << 6) |        \
-+    ((window)->priv->is_hidden           << 7) |        \
-+    ((window)->priv->is_fullscreen       << 8) |        \
-+    ((window)->priv->demands_attention   << 9) |        \
-+    ((window)->priv->is_urgent           << 10)|        \
-+    ((window)->priv->is_above            << 11)|        \
-+    ((window)->priv->is_below            << 12))
-+
-+struct _WnckWindowPrivate
-+{
-+  Window xwindow;
-+  WnckScreen *screen;
-+  WnckApplication *app;
-+  WnckClassGroup *class_group;
-+  Window group_leader;
-+  Window transient_for;
-+  GdkRectangle icon_geometry;
-+  char *name;
-+  char *icon_name;
-+  char *session_id;
-+  char *session_id_utf8;
-+  int pid;
-+  int workspace;
-+  gint sort_order;
-+
-+  WnckWindowType wintype;
-+  
-+  GdkPixbuf *icon;
-+  GdkPixbuf *mini_icon;
-+
-+  WnckIconCache *icon_cache;
-+  
-+  WnckWindowActions actions;
-+
-+  int x;
-+  int y;
-+  int width;
-+  int height;
-+
-+  int left_frame;
-+  int right_frame;
-+  int top_frame;
-+  int bottom_frame;
-+
-+  char *startup_id;
-+
-+  char *res_class;
-+  char *res_name;
-+  
-+  /* true if transient_for points to root window,
-+   * not another app window
-+   */
-+  guint transient_for_root : 1;
-+  
-+  /* window state */
-+  guint is_minimized : 1;
-+  guint is_maximized_horz : 1;
-+  guint is_maximized_vert : 1;
-+  guint is_shaded : 1;
-+  guint is_above : 1;
-+  guint is_below : 1;
-+  guint skip_pager : 1;
-+  guint skip_taskbar : 1;
-+  guint is_sticky : 1;
-+  guint is_hidden : 1;
-+  guint is_fullscreen : 1;
-+  guint demands_attention : 1;
-+  guint is_urgent : 1;
-+
-+  time_t needs_attention_time;
-+
-+  /* _NET_WM_STATE_HIDDEN doesn't map directly into an
-+   * externally-visible state (it determines the WM_STATE
-+   * interpretation)
-+   */
-+  guint net_wm_state_hidden : 1;  
-+  guint wm_state_iconic : 1;
-+  
-+  /* idle handler for updates */
-+  guint update_handler;
-+
-+  /* if you add flags, be sure to set them
-+   * when we create the window so we get an initial update
-+   */
-+  guint need_update_name : 1;
-+  guint need_update_state : 1;
-+  guint need_update_wm_state : 1;
-+  guint need_update_icon_name : 1;
-+  guint need_update_workspace : 1;
-+  guint need_update_actions : 1;
-+  guint need_update_wintype : 1;
-+  guint need_update_transient_for : 1;
-+  guint need_update_startup_id : 1;
-+  guint need_update_wmclass : 1;
-+  guint need_update_wmhints : 1;
-+  guint need_update_frame_extents : 1;
-+
-+  guint need_emit_name_changed : 1;
-+  guint need_emit_icon_changed : 1;
-+};
-+
-+G_DEFINE_TYPE (WnckWindow, wnck_window, G_TYPE_OBJECT);
-+#define WNCK_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), WNCK_TYPE_WINDOW, WnckWindowPrivate))
-+
-+enum {
-+  NAME_CHANGED,
-+  STATE_CHANGED,
-+  WORKSPACE_CHANGED,
-+  ICON_CHANGED,
-+  ACTIONS_CHANGED,
-+  GEOMETRY_CHANGED,
-+  LAST_SIGNAL
-+};
-+
-+static void wnck_window_init        (WnckWindow      *window);
-+static void wnck_window_class_init  (WnckWindowClass *klass);
-+static void wnck_window_finalize    (GObject        *object);
-+
-+static void emit_name_changed      (WnckWindow      *window);
-+static void emit_state_changed     (WnckWindow      *window,
-+                                    WnckWindowState  changed_mask,
-+                                    WnckWindowState  new_state);
-+static void emit_workspace_changed (WnckWindow      *window);
-+static void emit_icon_changed      (WnckWindow      *window);
-+static void emit_actions_changed   (WnckWindow       *window,
-+                                    WnckWindowActions changed_mask,
-+                                    WnckWindowActions new_actions);
-+static void emit_geometry_changed  (WnckWindow      *window);
-+
-+static void update_name      (WnckWindow *window);
-+static void update_state     (WnckWindow *window);
-+static void update_wm_state  (WnckWindow *window);
-+static void update_icon_name (WnckWindow *window);
-+static void update_workspace (WnckWindow *window);
-+static void update_actions   (WnckWindow *window);
-+static void update_wintype   (WnckWindow *window);
-+static void update_transient_for (WnckWindow *window);
-+static void update_startup_id (WnckWindow *window);
-+static void update_wmclass    (WnckWindow *window);
-+static void update_frame_extents (WnckWindow *window);
-+static void unqueue_update   (WnckWindow *window);
-+static void queue_update     (WnckWindow *window);
-+static void force_update_now (WnckWindow *window);
-+
-+static WnckWindow* find_last_transient_for (GList *windows,
-+                                            Window xwindow);
-+
-+static guint signals[LAST_SIGNAL] = { 0 };
-+
-+static void
-+wnck_window_init (WnckWindow *window)
-+{
-+  window->priv = WNCK_WINDOW_GET_PRIVATE (window);
-+
-+  window->priv->xwindow = None;
-+  window->priv->name = NULL;
-+  window->priv->app = NULL;
-+  window->priv->class_group = NULL;
-+  window->priv->group_leader = None;
-+  window->priv->transient_for = None;
-+  window->priv->icon_geometry.width = -1; /* invalid cached value */
-+  window->priv->name = NULL;
-+  window->priv->icon_name = NULL;
-+  window->priv->session_id = NULL;
-+  window->priv->session_id_utf8 = NULL;
-+  window->priv->pid = 0;
-+  window->priv->workspace = -1;
-+  window->priv->sort_order = G_MAXINT;
-+
-+  /* FIXME: should we have an invalid window type for this? */
-+  window->priv->wintype = 0;
-+
-+  window->priv->icon = NULL;
-+  window->priv->mini_icon = NULL;
-+
-+  window->priv->icon_cache = _wnck_icon_cache_new ();
-+
-+  window->priv->actions = 0;
-+
-+  window->priv->x = 0;
-+  window->priv->y = 0;
-+  window->priv->width = 0;
-+  window->priv->height = 0;
-+
-+  window->priv->left_frame = 0;
-+  window->priv->right_frame = 0;
-+  window->priv->top_frame = 0;
-+  window->priv->bottom_frame = 0;
-+
-+  window->priv->startup_id = NULL;
-+
-+  window->priv->res_class = NULL;
-+  window->priv->res_name = NULL;
-+
-+  window->priv->transient_for_root = FALSE;
-+
-+  window->priv->is_minimized = FALSE;
-+  window->priv->is_maximized_horz = FALSE;
-+  window->priv->is_maximized_vert = FALSE;
-+  window->priv->is_shaded = FALSE;
-+  window->priv->is_above = FALSE;
-+  window->priv->is_below = FALSE;
-+  window->priv->skip_pager = FALSE;
-+  window->priv->skip_taskbar = FALSE;
-+  window->priv->is_sticky = FALSE;
-+  window->priv->is_hidden = FALSE;
-+  window->priv->is_fullscreen = FALSE;
-+  window->priv->demands_attention = FALSE;
-+  window->priv->is_urgent = FALSE;
-+
-+  window->priv->needs_attention_time = 0;
-+
-+  window->priv->net_wm_state_hidden = FALSE;
-+  window->priv->wm_state_iconic = FALSE;
-+
-+  window->priv->update_handler = 0;
-+
-+  window->priv->need_update_name = FALSE;
-+  window->priv->need_update_state = FALSE;
-+  window->priv->need_update_wm_state = FALSE;
-+  window->priv->need_update_icon_name = FALSE;
-+  window->priv->need_update_workspace = FALSE;
-+  window->priv->need_update_actions = FALSE;
-+  window->priv->need_update_wintype = FALSE;
-+  window->priv->need_update_transient_for = FALSE;
-+  window->priv->need_update_startup_id = FALSE;
-+  window->priv->need_update_wmclass = FALSE;
-+  window->priv->need_update_wmhints = FALSE;
-+  window->priv->need_update_frame_extents = FALSE;
-+
-+  window->priv->need_emit_name_changed = FALSE;
-+  window->priv->need_emit_icon_changed = FALSE;
-+}
-+
-+static void
-+wnck_window_class_init (WnckWindowClass *klass)
-+{
-+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+
-+  g_type_class_add_private (klass, sizeof (WnckWindowPrivate));
-+
-+  object_class->finalize = wnck_window_finalize;
-+
-+  /**
-+   * WnckWindow::name-changed:
-+   * @window: the #WnckWindow which emitted the signal.
-+   *
-+   * Emitted when the name of @window changes.
-+   */
-+  signals[NAME_CHANGED] =
-+    g_signal_new ("name_changed",
-+                  G_OBJECT_CLASS_TYPE (object_class),
-+                  G_SIGNAL_RUN_LAST,
-+                  G_STRUCT_OFFSET (WnckWindowClass, name_changed),
-+                  NULL, NULL,
-+                  g_cclosure_marshal_VOID__VOID,
-+                  G_TYPE_NONE, 0);
-+
-+  /**
-+   * WnckWindow::state-changed:
-+   * @window: the #WnckWindow which emitted the signal.
-+   * @changed_mask: the bitmask containing bits set for all states of @window
-+   * that have changed. 
-+   * @new_state: the new state of @window.
-+   *
-+   * Emitted when the state of @window changes. This can happen when @window is
-+   * (un)minimized, (un)maximized, (un)sticked, (un)shaded, (un)made above,
-+   * (un)made below, (un)set fullscreen, when it needs attention, etc. See
-+   * #WnckWindowState for the complete list of states that might have changed.
-+   */
-+  signals[STATE_CHANGED] =
-+    g_signal_new ("state_changed",
-+                  G_OBJECT_CLASS_TYPE (object_class),
-+                  G_SIGNAL_RUN_LAST,
-+                  G_STRUCT_OFFSET (WnckWindowClass, state_changed),
-+                  NULL, NULL,
-+                  _wnck_marshal_VOID__FLAGS_FLAGS,
-+                  G_TYPE_NONE, 2,
-+                  WNCK_TYPE_WINDOW_STATE, WNCK_TYPE_WINDOW_STATE);
-+
-+  /**
-+   * WnckWindow::workspace-changed:
-+   * @window: the #WnckWindow which emitted the signal.
-+   *
-+   * Emitted when the current workspace of @window changes, or if @window has
-+   * been pinned or unpinned.
-+   */
-+  signals[WORKSPACE_CHANGED] =
-+    g_signal_new ("workspace_changed",
-+                  G_OBJECT_CLASS_TYPE (object_class),
-+                  G_SIGNAL_RUN_LAST,
-+                  G_STRUCT_OFFSET (WnckWindowClass, workspace_changed),
-+                  NULL, NULL,
-+                  g_cclosure_marshal_VOID__VOID,
-+                  G_TYPE_NONE, 0);
-+
-+  /**
-+   * WnckWindow::icon-changed:
-+   * @window: the #WnckWindow which emitted the signal.
-+   *
-+   * Emitted when the icon of @window changes.
-+   */
-+  signals[ICON_CHANGED] =
-+    g_signal_new ("icon_changed",
-+                  G_OBJECT_CLASS_TYPE (object_class),
-+                  G_SIGNAL_RUN_LAST,
-+                  G_STRUCT_OFFSET (WnckWindowClass, icon_changed),
-+                  NULL, NULL,
-+                  g_cclosure_marshal_VOID__VOID,
-+                  G_TYPE_NONE, 0);
-+
-+  /**
-+   * WnckWindow::actions-changed:
-+   * @window: the #WnckWindow which emitted the signal.
-+   * @changed_mask: the bitmask containing bits set for all actions
-+   * availabilities for @window that have changed. 
-+   * @new_state: the new actions availabilities for @window.
-+   *
-+   * Emitted when the actions availabilities for @window change.
-+   */
-+  signals[ACTIONS_CHANGED] =
-+    g_signal_new ("actions_changed",
-+                  G_OBJECT_CLASS_TYPE (object_class),
-+                  G_SIGNAL_RUN_LAST,
-+                  G_STRUCT_OFFSET (WnckWindowClass, actions_changed),
-+                  NULL, NULL,
-+                  _wnck_marshal_VOID__FLAGS_FLAGS,
-+                  G_TYPE_NONE, 2,
-+                  WNCK_TYPE_WINDOW_ACTIONS,
-+                  WNCK_TYPE_WINDOW_ACTIONS);
-+
-+  /**
-+   * WnckWindow::geometry-changed:
-+   * @window: the #WnckWindow which emitted the signal.
-+   *
-+   * Emitted when the geometry of @window changes.
-+   */
-+  signals[GEOMETRY_CHANGED] =
-+    g_signal_new ("geometry_changed",
-+                  G_OBJECT_CLASS_TYPE (object_class),
-+                  G_SIGNAL_RUN_LAST,
-+                  G_STRUCT_OFFSET (WnckWindowClass, geometry_changed),
-+                  NULL, NULL,
-+                  g_cclosure_marshal_VOID__VOID,
-+                  G_TYPE_NONE, 0);  
-+}
-+
-+static void
-+wnck_window_finalize (GObject *object)
-+{
-+  WnckWindow *window;
-+
-+  window = WNCK_WINDOW (object);
-+
-+  unqueue_update (window);
-+
-+  if (window->priv->app)
-+    g_object_unref (G_OBJECT (window->priv->app));
-+  window->priv->app = NULL;
-+
-+  if (window->priv->class_group)
-+    g_object_unref (G_OBJECT (window->priv->class_group));
-+  window->priv->class_group = NULL;
-+
-+  g_free (window->priv->name);
-+  window->priv->name = NULL;
-+  g_free (window->priv->icon_name);
-+  window->priv->icon_name = NULL;
-+  g_free (window->priv->session_id);
-+  window->priv->session_id = NULL;
-+  g_free (window->priv->session_id_utf8);
-+  window->priv->session_id_utf8 = NULL;
-+
-+  if (window->priv->icon)
-+    g_object_unref (G_OBJECT (window->priv->icon));
-+  window->priv->icon = NULL;
-+
-+  if (window->priv->mini_icon)
-+    g_object_unref (G_OBJECT (window->priv->mini_icon));
-+  window->priv->mini_icon = NULL;
-+  
-+  _wnck_icon_cache_free (window->priv->icon_cache);
-+  window->priv->icon_cache = NULL;
-+
-+  g_free (window->priv->startup_id);
-+  window->priv->startup_id = NULL;
-+  g_free (window->priv->res_class);
-+  window->priv->res_class = NULL;
-+  g_free (window->priv->res_name);
-+  window->priv->res_name = NULL;
-+
-+  G_OBJECT_CLASS (wnck_window_parent_class)->finalize (object);
-+}
-+
-+/**
-+ * wnck_window_get:
-+ * @xwindow: an X window ID.
-+ *
-+ * Gets a preexisting #WnckWindow for the X window @xwindow. This will not
-+ * create a #WnckWindow if none exists. The function is robust against bogus
-+ * window IDs.
-+ *
-+ * Return value: the #WnckWindow for @xwindow. The returned #WnckWindow is
-+ * owned by libwnck and must not be referenced or unreferenced.
-+ **/
-+WnckWindow*
-+wnck_window_get (gulong xwindow)
-+{
-+  if (window_hash == NULL)
-+    return NULL;
-+  else
-+    return g_hash_table_lookup (window_hash, &xwindow);
-+}
-+
-+/**
-+ * wnck_window_get_screen:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the #WnckScreen @window is on.
-+ *
-+ * Return value: the #WnckScreen @window is on. The returned #WnckScreen is
-+ * owned by libwnck and must not be referenced or unreferenced.
-+ **/
-+WnckScreen*
-+wnck_window_get_screen (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return window->priv->screen;
-+}
-+
-+WnckWindow*
-+_wnck_window_create (Window      xwindow,
-+                     WnckScreen *screen,
-+                     gint        sort_order)
-+{
-+  WnckWindow *window;
-+
-+  if (window_hash == NULL)
-+    window_hash = g_hash_table_new (_wnck_xid_hash, _wnck_xid_equal);
-+
-+  g_return_val_if_fail (g_hash_table_lookup (window_hash, &xwindow) == NULL,
-+                        NULL);
-+
-+  window = g_object_new (WNCK_TYPE_WINDOW, NULL);
-+  window->priv->xwindow = xwindow;
-+  window->priv->screen = screen;
-+
-+  g_hash_table_insert (window_hash, &window->priv->xwindow, window);
-+
-+  /* Hash now owns one ref, caller gets none */
-+
-+  /* Note that xwindow may correspond to a WnckApplication's xwindow,
-+   * that's why we select the union of the mask we want for Application
-+   * and the one we want for window
-+   */
-+  _wnck_select_input (window->priv->xwindow,
-+                      WNCK_APP_WINDOW_EVENT_MASK);
-+
-+  /* Default the group leader to the window itself; it is set in
-+   * update_wmhints() if a different group leader is specified.
-+   */
-+  window->priv->group_leader = window->priv->xwindow;
-+
-+  window->priv->session_id =
-+    _wnck_get_session_id (window->priv->xwindow);
-+
-+  window->priv->pid =
-+    _wnck_get_pid (window->priv->xwindow);
-+
-+  window->priv->x = 0;
-+  window->priv->y = 0;
-+  window->priv->width = 0;
-+  window->priv->height = 0;
-+  _wnck_get_window_geometry (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+			     xwindow,
-+                             &window->priv->x,
-+                             &window->priv->y,
-+                             &window->priv->width,
-+                             &window->priv->height);
-+
-+  window->priv->sort_order = sort_order;
-+  
-+  window->priv->need_update_name = TRUE;
-+  window->priv->need_update_state = TRUE;
-+  window->priv->need_update_icon_name = TRUE;
-+  window->priv->need_update_wm_state = TRUE;
-+  window->priv->need_update_workspace = TRUE;
-+  window->priv->need_update_actions = TRUE;
-+  window->priv->need_update_wintype = TRUE;
-+  window->priv->need_update_transient_for = TRUE;
-+  window->priv->need_update_startup_id = TRUE;
-+  window->priv->need_update_wmclass = TRUE;
-+  window->priv->need_update_wmhints = TRUE;
-+  window->priv->need_update_frame_extents = TRUE;
-+  window->priv->need_emit_name_changed = FALSE;
-+  window->priv->need_emit_icon_changed = FALSE;
-+  force_update_now (window);
-+
-+  return window;
-+}
-+
-+void
-+_wnck_window_destroy (WnckWindow *window)
-+{
-+  g_return_if_fail (wnck_window_get (window->priv->xwindow) == window);
-+
-+  g_hash_table_remove (window_hash, &window->priv->xwindow);
-+
-+  g_return_if_fail (wnck_window_get (window->priv->xwindow) == NULL);
-+
-+  window->priv->xwindow = None;
-+
-+  /* remove hash's ref on the window */
-+  g_object_unref (G_OBJECT (window));
-+}
-+
-+/**
-+ * wnck_window_has_name:
-+ * @window: a #WnckWindow.
-+ *
-+ * Checks whether or not @window has a name. wnck_window_get_name()
-+ * will always return some value, even if @window has no name set;
-+ * wnck_window_has_name() can be used to tell if that name is
-+ * real or not.
-+ *
-+ * For icons titles, use wnck_window_has_icon_name() instead.
-+ *
-+ * Return value: %TRUE if wnck_window_get_name() returns @window<!-- -->'s
-+ * name, %FALSE if it returns a fallback name.
-+ *
-+ * Since: 2.16
-+ **/
-+gboolean
-+wnck_window_has_name (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->name != NULL;
-+}
-+
-+/**
-+ * wnck_window_get_name:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the name of @window, as it should be displayed in a pager
-+ * or tasklist. Always returns some value, even if @window has no name
-+ * set; use wnck_window_has_name() if you need to know whether the returned
-+ * name is "real" or not.
-+ *
-+ * For icons titles, use wnck_window_get_icon_name() instead.
-+ *
-+ * Return value: the name of @window, or a fallback name if no name is
-+ * available.
-+ **/
-+const char*
-+wnck_window_get_name (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  if (window->priv->name)
-+    return window->priv->name;
-+  else
-+    return FALLBACK_NAME;
-+}
-+
-+/**
-+ * wnck_window_has_icon_name:
-+ * @window: a #WnckWindow
-+ *
-+ * Checks whether or not @window has an icon name.
-+ * wnck_window_get_icon_name() will always return some value, even if
-+ * @window has no icon name set; wnck_window_has_icon_name() can
-+ * be used to tell if that icon name is real or not.
-+ *
-+ * (Note that if wnck_window_has_icon_name() returns %FALSE, but
-+ * wnck_window_has_name() returns %TRUE, then the name returned by
-+ * wnck_window_get_icon_name() is @window<!-- -->'s name. Only when both
-+ * methods return %FALSE does wnck_window_get_icon_name() return a
-+ * generic fallback name.)
-+ *
-+ * Return value: %TRUE if wnck_window_get_icon_name() returns
-+ * @window<!-- -->'s icon name, %FALSE if it returns a fallback name.
-+ *
-+ * Since: 2.16
-+ **/
-+gboolean
-+wnck_window_has_icon_name (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->icon_name != NULL;
-+}
-+
-+/**
-+ * wnck_window_get_icon_name:
-+ * @window: a #WnckWindow
-+ *
-+ * Gets the icon name of @window, as it should be displayed for an icon
-+ * (minimized state). Always returns some value, even if @window has no icon
-+ * name set; use wnck_window_has_icon_name() if you need to know whether the
-+ * returned icon name is "real" or not.
-+ *
-+ * Contrast with wnck_window_get_name(), which returns @window<!-- -->'s
-+ * title, not its icon title.
-+ *
-+ * Return value: the icon name of @window, or a fallback icon name if no icon
-+ * name is available.
-+ **/
-+const char*
-+wnck_window_get_icon_name (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  if (window->priv->icon_name)
-+    return window->priv->icon_name;
-+  else if (window->priv->name)
-+    return window->priv->name;
-+  else
-+    return FALLBACK_NAME;
-+}
-+
-+char *
-+_wnck_window_get_name_for_display (WnckWindow *window,
-+                                   gboolean    use_icon_name,
-+                                   gboolean    use_state_decorations)
-+{
-+  const char *name;
-+
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+  
-+  if (use_icon_name && wnck_window_has_icon_name (window))
-+    name = wnck_window_get_icon_name (window);
-+  else 
-+    name = wnck_window_get_name (window);
-+  
-+  if (use_state_decorations)
-+    {
-+      if (window->priv->is_shaded)
-+        return g_strdup_printf ("=%s=", name);
-+      else if (window->priv->is_minimized)
-+        return g_strdup_printf ("[%s]", name);
-+      else
-+        return g_strdup (name);
-+    }
-+  else
-+    return g_strdup (name);
-+}
-+
-+
-+/**
-+ * wnck_window_get_application:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the #WnckApplication to which @window belongs.
-+ *
-+ * Return value: the #WnckApplication to which @window belongs. The returned
-+ * #WnckApplication is owned by libwnck and must not be referenced or
-+ * unreferenced.
-+ **/
-+WnckApplication*
-+wnck_window_get_application  (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return window->priv->app;
-+}
-+
-+/**
-+ * wnck_window_get_transient:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the #WnckWindow for which @window is transient.
-+ *
-+ * Return value: the #WnckWindow for which @window is transient, or %NULL if
-+ * @window is not transient for any #WnckWindow.
-+ *
-+ * Since: 2.12
-+ **/
-+WnckWindow*
-+wnck_window_get_transient (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return wnck_window_get (window->priv->transient_for);
-+}
-+
-+/**
-+ * wnck_window_get_group_leader:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the group leader of the group of windows to which @window belongs.
-+ *
-+ * Return value: the group leader of the group of windows to which @window
-+ * belongs, or the X window ID of @window if @window does not belong to any
-+ * group.
-+ **/
-+gulong
-+wnck_window_get_group_leader (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), None);
-+
-+  return window->priv->group_leader;
-+}
-+
-+/**
-+ * wnck_window_get_xid:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the X window ID of @window.
-+ *
-+ * Return value: the X window ID of @window.
-+ **/
-+gulong
-+wnck_window_get_xid (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), None);
-+
-+  return window->priv->xwindow;
-+}
-+
-+/**
-+ * wnck_window_get_class_group:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the #WnckClassGroup to which @window belongs.
-+ *
-+ * Return value: the #WnckClassGroup to which @window belongs. The returned
-+ * #WnckClassGroup is owned by libwnck and must not be referenced or
-+ * unreferenced.
-+ *
-+ * Since: 2.2
-+ **/
-+WnckClassGroup *
-+wnck_window_get_class_group (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return window->priv->class_group;
-+}
-+
-+/**
-+ * wnck_window_get_session_id:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the session ID for @window in Latin-1 encoding.
-+ * NOTE: this is invalid UTF-8. You can't display this
-+ * string in a GTK+ widget without converting to UTF-8.
-+ * See wnck_window_get_session_id_utf8().
-+ *
-+ * Return value: the session ID for @window in Latin-1, or %NULL if @window has
-+ * no session ID.
-+ **/
-+const char*
-+wnck_window_get_session_id (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return window->priv->session_id;
-+}
-+
-+/**
-+ * wnck_window_get_session_id_utf8:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the session ID for @window in UTF-8 encoding.
-+ * The session ID should be in Latin-1 encoding, so the conversion should work,
-+ * but a broken client could set a session ID that might not be convertable to
-+ * UTF-8.
-+ *
-+ * Return value: the session ID for @window in UTF-8, or %NULL if @window has
-+ * no session ID.
-+ **/
-+const char*
-+wnck_window_get_session_id_utf8 (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  if (window->priv->session_id_utf8 == NULL &&
-+      window->priv->session_id != NULL)
-+    {
-+      GString *str;
-+      char *p;
-+
-+      str = g_string_new ("");
-+
-+      p = window->priv->session_id;
-+      while (*p)
-+        {
-+          g_string_append_unichar (str, g_utf8_get_char (p));
-+          p = g_utf8_next_char (p);
-+        }
-+
-+      window->priv->session_id_utf8 = g_string_free (str, FALSE);
-+    }
-+
-+  return window->priv->session_id_utf8;
-+}
-+
-+/**
-+ * wnck_window_get_pid:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the process ID of @window.
-+ *
-+ * Return value: the process ID of @window, or 0 if none is available.
-+ **/
-+int
-+wnck_window_get_pid (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
-+
-+  return window->priv->pid;
-+}
-+
-+/**
-+ * wnck_window_get_sort_order:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the sort order of @window, used for ordering of @window in
-+ * #WnckSelector and #WnckTasklist. The sort order is an internal state in
-+ * libwnck. The initial value is defined when the window is created.
-+ *
-+ * Return value: the sort order of @window, or G_MAXINT if none is available.
-+ *
-+ * Since: 2.10
-+ **/
-+gint
-+wnck_window_get_sort_order (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), G_MAXINT);
-+
-+  return window->priv->sort_order;
-+}
-+
-+/**
-+ * wnck_window_set_sort_order:
-+ * @window: a #WnckWindow.
-+ * @order: new sort order for @window.
-+ *
-+ * Sets the sort order of @window. The sort order is used for ordering of
-+ * @window in #WnckSelector and #WnckTasklist.
-+ *
-+ * Since: 2.20
-+ **/
-+void        wnck_window_set_sort_order        (WnckWindow *window, 
-+					       gint order)
-+{ 
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  
-+  window->priv->sort_order = order;
-+  return;
-+}
-+
-+/**
-+ * wnck_window_get_window_type:
-+ * @window: a #WnckWindow.
-+ * 
-+ * Gets the semantic type of @window.
-+ * 
-+ * Return value: the semantic type of @window.
-+ **/
-+WnckWindowType
-+wnck_window_get_window_type (WnckWindow *window)
-+{
-+  /* FIXME: should we have an invalid window type for this? */
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
-+  
-+  return window->priv->wintype;
-+}
-+
-+/**
-+ * wnck_window_set_window_type:
-+ * @window: a #WnckWindow.
-+ * @wintype: a semantic type.
-+ * 
-+ * Sets the semantic type of @window to @wintype.
-+ *
-+ * Since: 2.12
-+ **/
-+void
-+wnck_window_set_window_type (WnckWindow *window, WnckWindowType wintype)
-+{
-+  Atom atom;
-+
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  switch (wintype) {
-+  case WNCK_WINDOW_NORMAL:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_NORMAL");
-+    break;
-+  case WNCK_WINDOW_DESKTOP:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_DESKTOP");
-+    break;
-+  case WNCK_WINDOW_DOCK:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_DOCK");
-+    break;
-+  case WNCK_WINDOW_DIALOG:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_DIALOG");
-+    break;
-+  case WNCK_WINDOW_TOOLBAR:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_TOOLBAR");
-+    break;
-+  case WNCK_WINDOW_MENU:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_MENU");
-+    break;
-+  case WNCK_WINDOW_UTILITY:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_UTILITY");
-+    break;
-+  case WNCK_WINDOW_SPLASHSCREEN:
-+    atom = _wnck_atom_get ("_NET_WM_WINDOW_TYPE_SPLASHSCREEN");
-+    break;
-+  default:
-+    return;
-+  }
-+  _wnck_error_trap_push ();
-+
-+  XChangeProperty (gdk_display,
-+                   window->priv->xwindow, 
-+                   _wnck_atom_get ("_NET_WM_WINDOW_TYPE"),
-+		   XA_ATOM, 32, PropModeReplace,
-+		   (guchar *)&atom, 1);
-+
-+  _wnck_error_trap_pop ();
-+}
-+
-+/**
-+ * wnck_window_is_minimized:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is minimized. Minimization state may change anytime
-+ * a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is minimized, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_minimized (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_minimized;
-+}
-+
-+/**
-+ * wnck_window_needs_attention:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window needs attention. This state may change anytime
-+ * a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * This state depends on flags such as the demands_attention and is_urgent
-+ * hints.
-+ *
-+ * Return value: %TRUE if @window needs attention, %FALSE otherwise.
-+ *
-+ * Since: 2.12
-+ **/
-+gboolean
-+wnck_window_needs_attention (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->demands_attention || window->priv->is_urgent;
-+}
-+
-+time_t
-+_wnck_window_get_needs_attention_time (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
-+
-+  return window->priv->needs_attention_time;
-+}
-+
-+/* Return whether the transient of @window needs attention */
-+static WnckWindow *
-+transient_needs_attention (WnckWindow *window)
-+{
-+  GList *windows;
-+  WnckWindow *transient;
-+  
-+  if (!WNCK_IS_WINDOW (window))
-+    return NULL;
-+
-+  windows = wnck_screen_get_windows_stacked (window->priv->screen);
-+
-+  transient = window;
-+  while ((transient = find_last_transient_for (windows, transient->priv->xwindow)))
-+    {
-+      /* catch transient cycles */
-+      if (transient == window)
-+        return NULL;
-+
-+      if (wnck_window_needs_attention (transient))
-+        return transient;
-+    }
-+
-+  return FALSE;
-+}
-+
-+time_t
-+_wnck_window_or_transient_get_needs_attention_time (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
-+
-+  if (_wnck_window_get_needs_attention_time (window) == 0)
-+    {
-+      WnckWindow *transient;
-+
-+      transient = transient_needs_attention (window);
-+      if (transient)
-+        return _wnck_window_get_needs_attention_time (transient);
-+      else
-+        return 0;
-+    }
-+  else
-+    return _wnck_window_get_needs_attention_time (window);
-+}
-+
-+/**
-+ * wnck_window_or_transient_needs_attention:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window or one of its transients needs attention. This state
-+ * may change anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window or one of its transients needs attention,
-+ * %FALSE otherwise.
-+ *
-+ * Since: 2.12
-+ **/
-+gboolean
-+wnck_window_or_transient_needs_attention (WnckWindow *window)
-+{
-+  return wnck_window_needs_attention (window) || 
-+         transient_needs_attention (window) != NULL;
-+}
-+
-+/**
-+ * wnck_window_is_maximized_horizontally:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is maximized horizontally. Horizontal maximization
-+ * state may change anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is maximized horizontally, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_maximized_horizontally (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_maximized_horz;
-+}
-+
-+/**
-+ * wnck_window_is_maximized_vertically:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is maximized vertically. vertiVal maximization
-+ * state may change anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is maximized vertically, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_maximized_vertically   (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_maximized_vert;
-+}
-+
-+const char*
-+_wnck_window_get_startup_id (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+  
-+  if (window->priv->startup_id == NULL &&
-+      window->priv->group_leader != None)
-+    {
-+      WnckApplication *app;
-+
-+      /* Fall back to group leader property */
-+      
-+      app = wnck_application_get (window->priv->group_leader);
-+      
-+      if (app != NULL)
-+        return wnck_application_get_startup_id (app);
-+      else
-+        return NULL;
-+    }
-+
-+  return window->priv->startup_id;
-+}
-+
-+const char*
-+_wnck_window_get_resource_class (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return window->priv->res_class;
-+}
-+
-+const char*
-+_wnck_window_get_resource_name (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  return window->priv->res_name;
-+}
-+
-+/**
-+ * wnck_window_is_maximized:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is maximized. Maximization state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * As for GDK, "maximized" means both vertically and horizontally. If @window
-+ * is maximized in only one direction, then @window is not considered
-+ * maximized.
-+ *
-+ * Return value: %TRUE if @window is maximized in both directions, %FALSE
-+ * otherwise.
-+ **/
-+gboolean
-+wnck_window_is_maximized (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return
-+    window->priv->is_maximized_horz &&
-+    window->priv->is_maximized_vert;
-+}
-+
-+/**
-+ * wnck_window_is_shaded:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is shaded. Shade state may change anytime
-+ * a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is shaded, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_shaded                 (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_shaded;
-+}
-+
-+/**
-+ * wnck_window_is_above:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is above other windows. This state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * See wnck_window_make_above() for more details on this state.
-+ *
-+ * Return value: %TRUE if @window is above other windows, %FALSE otherwise.
-+ *
-+ * Since: 2.14
-+ **/
-+gboolean
-+wnck_window_is_above                  (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_above;
-+}
-+
-+/**
-+ * wnck_window_is_below:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is below other windows. This state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * See wnck_window_make_below() for more details on this state.
-+ *
-+ * Return value: %TRUE if @window is below other windows, %FALSE otherwise.
-+ *
-+ * Since: 2.20
-+ **/
-+gboolean
-+wnck_window_is_below                  (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_below;
-+}
-+
-+/**
-+ * wnck_window_is_skip_pager:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is included on pagers. This state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is included on pagers, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_skip_pager             (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->skip_pager;
-+}
-+
-+/**
-+ * wnck_window_set_skip_pager:
-+ * @window: a #WnckWindow.
-+ * @skip: whether @window should be included on pagers.
-+ *
-+ * Asks the window manager to make @window included or not included on pagers.
-+ **/
-+void
-+wnck_window_set_skip_pager (WnckWindow *window,
-+                            gboolean skip)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      skip,
-+                      _wnck_atom_get ("_NET_WM_STATE_SKIP_PAGER"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_is_skip_tasklist:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is included on tasklists. This state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is included on tasklists, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_skip_tasklist          (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->skip_taskbar;
-+}
-+
-+/**
-+ * wnck_window_is_fullscreen:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is fullscreen. Fullscreen state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Return value: %TRUE if @window is fullscreen, %FALSE otherwise.
-+ *
-+ * Since: 2.8
-+ **/
-+gboolean
-+wnck_window_is_fullscreen                 (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_fullscreen;
-+}
-+
-+/**
-+ * wnck_window_set_skip_tasklist:
-+ * @window: a #WnckWindow.
-+ * @skip: whether @window should be included on tasklists.
-+ *
-+ * Asks the window manager to make @window included or not included on
-+ * tasklists.
-+ **/
-+void
-+wnck_window_set_skip_tasklist (WnckWindow *window,
-+                               gboolean skip)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      skip,
-+                      _wnck_atom_get ("_NET_WM_STATE_SKIP_TASKBAR"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_set_fullscreen:
-+ * @window: a #WnckWindow.
-+ * @fullscreen: whether to make @window fullscreen.
-+ *
-+ * Asks the window manager to set the fullscreen state of @window according to
-+ * @fullscreen.
-+ *
-+ * Since: 2.8
-+ **/
-+void
-+wnck_window_set_fullscreen (WnckWindow *window,
-+                               gboolean fullscreen)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      fullscreen,
-+                      _wnck_atom_get ("_NET_WM_STATE_FULLSCREEN"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_is_sticky:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is sticky. Sticky state may change
-+ * anytime a #WnckWindow::state-changed signal gets emitted.
-+ *
-+ * Sticky here means "stuck to the glass", i.e. does not scroll with the
-+ * viewport. In GDK/GTK+ (e.g. gdk_window_stick()/gtk_window_stick()), sticky
-+ * means "stuck to the glass" and <emphasis>also</emphasis> that the window is
-+ * on all workspaces. But here it only means the viewport aspect of it.
-+ *
-+ * Return value: %TRUE if @window is "stuck to the glass", %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_sticky                 (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->is_sticky;
-+}
-+
-+/**
-+ * wnck_window_close:
-+ * @window: a #WnckWindow.
-+ * @timestamp: the X server timestamp of the user interaction event that caused
-+ * this call to occur.
-+ *
-+ * Closes @window.
-+ *
-+ * This function existed before 2.6, but the @timestamp argument was missing
-+ * in earlier versions.
-+ * 
-+ * Since: 2.6
-+ **/
-+void
-+wnck_window_close (WnckWindow *window,
-+		   guint32     timestamp)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_close (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+	       window->priv->xwindow, timestamp);
-+}
-+
-+/**
-+ * wnck_window_minimize:
-+ * @window: a #WnckWindow.
-+ *
-+ * Minimizes @window.
-+ **/
-+void
-+wnck_window_minimize                (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_iconify (window->priv->xwindow);
-+}
-+
-+/**
-+ * wnck_window_unminimize:
-+ * @window: a #WnckWindow.
-+ * @timestamp: the X server timestamp of the user interaction event that caused
-+ * this call to occur.
-+ *
-+ * Unminimizes @window by activating it or one of its transients. See
-+ * wnck_window_activate_transient() for details on how the activation is done.
-+ **/
-+void
-+wnck_window_unminimize              (WnckWindow *window,
-+                                     guint32     timestamp)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  wnck_window_activate_transient (window, timestamp);
-+}
-+
-+/**
-+ * wnck_window_maximize:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to maximize @window.
-+ **/
-+void
-+wnck_window_maximize                (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_VERT"),
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_HORZ"));
-+}
-+
-+/**
-+ * wnck_window_unmaximize:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to unmaximize @window.
-+ **/
-+void
-+wnck_window_unmaximize              (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_VERT"),
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_HORZ"));
-+}
-+
-+/**
-+ * wnck_window_maximize_horizontally:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to maximize horizontally @window.
-+ **/
-+void
-+wnck_window_maximize_horizontally   (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_HORZ"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_unmaximize_horizontally:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to unmaximize horizontally @window.
-+ **/
-+void
-+wnck_window_unmaximize_horizontally (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_HORZ"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_maximize_vertically:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to maximize vertically @window.
-+ **/
-+void
-+wnck_window_maximize_vertically     (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_VERT"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_unmaximize_vertically:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to unmaximize vertically @window.
-+ **/
-+void
-+wnck_window_unmaximize_vertically   (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_VERT"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_shade:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to shade @window.
-+ **/
-+void
-+wnck_window_shade                   (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_SHADED"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_unshade:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to unshade @window.
-+ **/
-+void
-+wnck_window_unshade                 (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_SHADED"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_make_above:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to put @window on top of most windows (@window will
-+ * not be on top of focused fullscreen windows, of other windows with this
-+ * setting and of dock windows).
-+ *
-+ * Since: 2.14
-+ **/
-+void
-+wnck_window_make_above (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_ABOVE"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_unmake_above:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to not put @window on top of most windows, and to
-+ * put it again in the stack with other windows.
-+ *
-+ * Since: 2.14
-+ **/
-+void
-+wnck_window_unmake_above (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_ABOVE"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_make_below:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to put @window below most windows.
-+ *
-+ * Since: 2.20
-+ **/
-+void
-+wnck_window_make_below (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_BELOW"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_unmake_below:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to not put @window below most windows, and to
-+ * put it again in the stack with other windows.
-+ *
-+ * Since: 2.20
-+ **/
-+void
-+wnck_window_unmake_below (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_BELOW"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_stick:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to keep the @window<!-- -->'s position fixed on the
-+ * screen, even when the workspace or viewport scrolls.
-+ **/
-+void
-+wnck_window_stick                   (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      TRUE,
-+                      _wnck_atom_get ("_NET_WM_STATE_STICKY"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_unstick:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to not have @window<!-- -->'s position fixed on the
-+ * screen when the workspace or viewport scrolls.
-+ **/
-+void
-+wnck_window_unstick                 (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_state (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+		      window->priv->xwindow,
-+                      FALSE,
-+                      _wnck_atom_get ("_NET_WM_STATE_STICKY"),
-+                      0);
-+}
-+
-+/**
-+ * wnck_window_keyboard_move:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to start moving @window via the keyboard.
-+ **/
-+void
-+wnck_window_keyboard_move (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_keyboard_move (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                       window->priv->xwindow);
-+}
-+
-+/**
-+ * wnck_window_keyboard_size:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to start resizing @window via the keyboard.
-+ **/
-+void
-+wnck_window_keyboard_size (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_keyboard_size (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                       window->priv->xwindow);
-+}
-+
-+/**
-+ * wnck_window_get_workspace:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets the current workspace @window is on. If the window is pinned (on all
-+ * workspaces), or not on any workspaces, %NULL may be returned.
-+ *
-+ * Return value: the single current workspace @window is on, or %NULL. The
-+ * returned #WnckWorkspace is owned by libwnck and must not be referenced or
-+ * unreferenced.
-+ **/
-+WnckWorkspace*
-+wnck_window_get_workspace (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  if (window->priv->workspace == ALL_WORKSPACES)
-+    return NULL;
-+  else
-+    return wnck_screen_get_workspace (window->priv->screen, window->priv->workspace);
-+}
-+
-+/**
-+ * wnck_window_move_to_workspace:
-+ * @window: a #WnckWindow.
-+ * @space: a #WnckWorkspace.
-+ *
-+ * Asks the window manager to move @window to @space.
-+ *
-+ * FIXME: what happens if @window is pinned?
-+ **/
-+void
-+wnck_window_move_to_workspace (WnckWindow    *window,
-+                               WnckWorkspace *space)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  g_return_if_fail (WNCK_IS_WORKSPACE (space));
-+
-+  _wnck_change_workspace (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+			  window->priv->xwindow,
-+                          wnck_workspace_get_number (space));
-+}
-+
-+/**
-+ * wnck_window_is_pinned:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is on all workspace. Pinned state may change
-+ * anytime a #WnckWindow::workspace-changed signal gets emitted, but not when
-+ * a #WnckWindow::state-changed gets emitted.
-+ *
-+ * Return value: %TRUE if @window is on all workspaces, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_pinned (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window->priv->workspace == ALL_WORKSPACES;
-+}
-+
-+/**
-+ * wnck_window_pin:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to put @window on all workspaces.
-+ **/
-+void
-+wnck_window_pin (WnckWindow *window)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_change_workspace (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+			  window->priv->xwindow,
-+                          ALL_WORKSPACES);
-+}
-+
-+/**
-+ * wnck_window_unpin:
-+ * @window: a #WnckWindow.
-+ *
-+ * Asks the window manager to put @window only in the currently active
-+ * workspace, if @window was previously pinned. If @window was not pinned,
-+ * does not change @window<!-- -->'s workspace. If the active workspace
-+ * is not known for some reason (it should not happen much), sets
-+ * @window<!-- -->'s workspace to the first workspace.
-+ **/
-+void
-+wnck_window_unpin (WnckWindow *window)
-+{
-+  WnckWorkspace *active;
-+
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  if (window->priv->workspace != ALL_WORKSPACES)
-+    return;
-+
-+  active = wnck_screen_get_active_workspace (window->priv->screen);
-+
-+  _wnck_change_workspace (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+			  window->priv->xwindow,
-+                          active ? wnck_workspace_get_number (active) : 0);
-+}
-+
-+/**
-+ * wnck_window_activate:
-+ * @window: a #WnckWindow.
-+ * @timestamp: the X server timestamp of the user interaction event that caused
-+ * this call to occur.
-+ *
-+ * Asks the window manager to make @window the active window. The
-+ * window manager may choose to raise @window along with focusing it, and may
-+ * decide to refuse the request (to not steal the focus if there is a more
-+ * recent user activity, for example).
-+ *
-+ * This function existed before 2.10, but the @timestamp argument was missing
-+ * in earlier versions.
-+ * 
-+ * Since: 2.10
-+ **/
-+void
-+wnck_window_activate (WnckWindow *window,
-+                      guint32     timestamp)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  _wnck_activate (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                  window->priv->xwindow,
-+                  timestamp);
-+}
-+
-+/**
-+ * wnck_window_is_active:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is the active window on its #WnckScreen.
-+ *
-+ * Return value: %TRUE if @window is the active window on its #WnckScreen,
-+ * %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_active (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return window == wnck_screen_get_active_window (window->priv->screen);
-+}
-+
-+/**
-+ * wnck_window_is_most_recently_activated:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether @window is the most recently activated window on its
-+ * #WnckScreen.
-+ *
-+ * The most recently activated window is identical to the active
-+ * window for click and sloppy focus methods (since a window is always
-+ * active in those cases) but differs slightly for mouse focus since
-+ * there often is no active window.
-+ *
-+ * Return value: %TRUE if @window was the most recently activated window on its
-+ * #WnckScreen, %FALSE otherwise.
-+ *
-+ * Since: 2.8
-+ **/
-+gboolean
-+wnck_window_is_most_recently_activated (WnckWindow *window)
-+{
-+  WnckWindow * current;
-+  WnckWindow * previous;
-+  WnckWindow * most_recently_activated_window;
-+
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  current  = wnck_screen_get_active_window (window->priv->screen);
-+  previous = wnck_screen_get_previously_active_window (window->priv->screen);
-+
-+  if (current)
-+    most_recently_activated_window = current;
-+  else
-+    most_recently_activated_window = previous;
-+
-+  return (window == most_recently_activated_window);
-+}
-+
-+static WnckWindow*
-+find_last_transient_for (GList *windows,
-+                         Window xwindow)
-+{
-+  GList *tmp; 
-+  WnckWindow *retval;
-+
-+  /* find _last_ transient for xwindow in the list */
-+  
-+  retval = NULL;
-+  
-+  tmp = windows;
-+  while (tmp != NULL)
-+    {
-+      WnckWindow *w = tmp->data;
-+
-+      if (w->priv->transient_for == xwindow &&
-+	  w->priv->wintype != WNCK_WINDOW_UTILITY)
-+        retval = w;
-+      
-+      tmp = tmp->next;
-+    }
-+
-+  return retval;
-+}
-+
-+/**
-+ * wnck_window_activate_transient:
-+ * @window: a #WnckWindow.
-+ * @timestamp: the X server timestamp of the user interaction event that caused
-+ * this call to occur.
-+ *
-+ * If @window has transients, activates the most likely transient
-+ * instead of the window itself. Otherwise activates @window.
-+ * 
-+ * FIXME the ideal behavior of this function is probably to activate
-+ * the most recently active window among @window and its transients.
-+ * This is probably best implemented on the window manager side.
-+ * 
-+ * This function existed before 2.10, but the @timestamp argument was missing
-+ * in earlier versions.
-+ * 
-+ * Since: 2.10
-+ **/
-+void
-+wnck_window_activate_transient (WnckWindow *window,
-+                                guint32     timestamp)
-+{
-+  GList *windows;
-+  WnckWindow *transient;
-+  WnckWindow *next;
-+  
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  windows = wnck_screen_get_windows_stacked (window->priv->screen);
-+
-+  transient = NULL;
-+  next = find_last_transient_for (windows, window->priv->xwindow);
-+  
-+  while (next != NULL)
-+    {
-+      if (next == window)
-+        {
-+          /* catch transient cycles */
-+          transient = NULL;
-+          break;
-+        }
-+
-+      transient = next;
-+      
-+      next = find_last_transient_for (windows, transient->priv->xwindow);
-+    }
-+
-+  if (transient != NULL)
-+    wnck_window_activate (transient, timestamp);
-+  else
-+    wnck_window_activate (window, timestamp);
-+}
-+
-+/**
-+ * wnck_window_transient_is_most_recently_activated:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether one of the transients of @window is the most
-+ * recently activated window. See
-+ * wnck_window_is_most_recently_activated() for a more complete
-+ * description of what is meant by most recently activated.  This
-+ * function is needed because clicking on a #WnckTasklist once will
-+ * activate a transient instead of @window itself
-+ * (wnck_window_activate_transient), and clicking again should
-+ * minimize @window and its transients.  (Not doing this can be
-+ * especially annoying in the case of modal dialogs that don't appear
-+ * in the #WnckTaslist).
-+ * 
-+ * Return value: %TRUE if one of the transients of @window is the most recently
-+ * activated window, %FALSE otherwise.
-+ *
-+ * Since: 2.12
-+ **/
-+gboolean
-+wnck_window_transient_is_most_recently_activated (WnckWindow *window)
-+{
-+  GList *windows;
-+  WnckWindow *transient;
-+  
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  windows = wnck_screen_get_windows_stacked (window->priv->screen);
-+
-+  transient = window;
-+  while ((transient = find_last_transient_for (windows, transient->priv->xwindow)))
-+    {
-+      /* catch transient cycles */
-+      if (transient == window)
-+        return FALSE;
-+
-+      if (wnck_window_is_most_recently_activated (transient))
-+        return TRUE;
-+    }
-+
-+  return FALSE;
-+}
-+
-+static void
-+get_icons (WnckWindow *window)
-+{
-+  GdkPixbuf *icon;
-+  GdkPixbuf *mini_icon;
-+
-+  icon = NULL;
-+  mini_icon = NULL;
-+  
-+  if (_wnck_read_icons (window->priv->xwindow,
-+                        window->priv->icon_cache,
-+                        &icon,
-+                        DEFAULT_ICON_WIDTH, DEFAULT_ICON_HEIGHT,
-+                        &mini_icon,
-+                        DEFAULT_MINI_ICON_WIDTH,
-+                        DEFAULT_MINI_ICON_HEIGHT))
-+    {
-+      window->priv->need_emit_icon_changed = TRUE;
-+
-+      if (window->priv->icon)
-+        g_object_unref (G_OBJECT (window->priv->icon));
-+
-+      if (window->priv->mini_icon)
-+        g_object_unref (G_OBJECT (window->priv->mini_icon));
-+
-+      window->priv->icon = icon;
-+      window->priv->mini_icon = mini_icon;
-+    }
-+
-+  g_assert ((window->priv->icon && window->priv->mini_icon) ||
-+            !(window->priv->icon || window->priv->mini_icon));
-+}
-+
-+/**
-+ * wnck_window_get_icon:
-+ * @window: a #WnckWindow.
-+ * 
-+ * Gets the icon to be used for @window. If no icon was found, a fallback
-+ * icon is used. wnck_window_get_icon_is_fallback() can be used to tell if the
-+ * icon is the fallback icon. 
-+ * 
-+ * Return value: the icon for @window. The caller should reference the
-+ * returned <classname>GdkPixbuf</classname> if it needs to keep the icon
-+ * around.
-+ **/
-+GdkPixbuf*
-+wnck_window_get_icon (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+
-+  get_icons (window);
-+  if (window->priv->need_emit_icon_changed)
-+    queue_update (window); /* not done in get_icons since we call that from
-+                            * the update
-+                            */
-+
-+  return window->priv->icon;
-+}
-+
-+/**
-+ * wnck_window_get_mini_icon:
-+ * @window: a #WnckWindow.
-+ * 
-+ * Gets the mini-icon to be used for @window. If no mini-icon was found, a
-+ * fallback mini-icon is used. wnck_window_get_icon_is_fallback() can be used
-+ * to tell if the mini-icon is the fallback mini-icon. 
-+ * 
-+ * Return value: the mini-icon for @window. The caller should reference the
-+ * returned <classname>GdkPixbuf</classname> if it needs to keep the icon
-+ * around.
-+ **/
-+GdkPixbuf*
-+wnck_window_get_mini_icon (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), NULL);
-+  
-+  get_icons (window);
-+  if (window->priv->need_emit_icon_changed)
-+    queue_update (window); /* not done in get_icons since we call that from
-+                            * the update
-+                            */
-+  
-+  return window->priv->mini_icon;
-+}
-+
-+/**
-+ * wnck_window_get_icon_is_fallback:
-+ * @window: a #WnckWindow.
-+ *
-+ * Gets whether a default fallback icon is used for @window (because none
-+ * was set on @window).
-+ * 
-+ * Return value: %TRUE if the icon for @window is a fallback, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_get_icon_is_fallback (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+
-+  return _wnck_icon_cache_get_is_fallback (window->priv->icon_cache);
-+}
-+
-+/**
-+ * wnck_window_get_actions:
-+ * @window: a #WnckWindow.
-+ * 
-+ * Gets the actions that can be done for @window.
-+ * 
-+ * Return value: bitmask of actions that can be done for @window.
-+ **/
-+WnckWindowActions
-+wnck_window_get_actions (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
-+
-+  return window->priv->actions;
-+}
-+
-+
-+/**
-+ * wnck_window_get_state:
-+ * @window: a #WnckWindow.
-+ * 
-+ * Gets the state of @window.
-+ * 
-+ * Return value: bitmask of active states for @window.
-+ **/
-+WnckWindowState
-+wnck_window_get_state (WnckWindow *window)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
-+
-+  return COMPRESS_STATE (window);
-+}
-+
-+/**
-+ * wnck_window_get_client_window_geometry:
-+ * @window: a #WnckWindow.
-+ * @xp: return location for X coordinate in pixels of @window.
-+ * @yp: return location for Y coordinate in pixels of @window.
-+ * @widthp: return location for width in pixels of @window.
-+ * @heightp: return location for height in pixels of @window.
-+ *
-+ * Gets the size and position of @window, as last received
-+ * in a ConfigureNotify event (i.e. this call does not round-trip
-+ * to the server, just gets the last size we were notified of).
-+ * The X and Y coordinates are relative to the root window.
-+ *
-+ * The window manager usually adds a frame around windows. If
-+ * you need to know the size of @window with the frame, use
-+ * wnck_window_get_geometry().
-+ *
-+ * Since: 2.20
-+ **/
-+void
-+wnck_window_get_client_window_geometry (WnckWindow *window,
-+                                        int        *xp,
-+					int        *yp,
-+					int        *widthp,
-+					int        *heightp)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  if (xp)
-+    *xp = window->priv->x;
-+  if (yp)
-+    *yp = window->priv->y;
-+  if (widthp)
-+    *widthp = window->priv->width;
-+  if (heightp)
-+    *heightp = window->priv->height;
-+}
-+
-+/**
-+ * wnck_window_get_geometry:
-+ * @window: a #WnckWindow.
-+ * @xp: return location for X coordinate in pixels of @window.
-+ * @yp: return location for Y coordinate in pixels of @window.
-+ * @widthp: return location for width in pixels of @window.
-+ * @heightp: return location for height in pixels of @window.
-+ *
-+ * Gets the size and position of @window, including decorations. This
-+ * function uses the information last received in a ConfigureNotify
-+ * event and adjusts it according to the size of the frame that is
-+ * added by the window manager (this call does not round-trip to the
-+ * server, it just gets the last sizes that were notified). The
-+ * X and Y coordinates are relative to the root window.
-+ *
-+ * If you need to know the actual size of @window ignoring the frame
-+ * added by the window manager, use wnck_window_get_client_window_geometry().
-+ **/
-+void
-+wnck_window_get_geometry (WnckWindow *window,
-+                          int        *xp,
-+                          int        *yp,
-+                          int        *widthp,
-+                          int        *heightp)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  if (xp)
-+    *xp = window->priv->x - window->priv->left_frame;
-+  if (yp)
-+    *yp = window->priv->y - window->priv->top_frame;
-+  if (widthp)
-+    *widthp = window->priv->width + window->priv->left_frame + window->priv->right_frame;
-+  if (heightp)
-+    *heightp = window->priv->height + window->priv->top_frame + window->priv->bottom_frame;
-+}
-+
-+/**
-+ * wnck_window_set_geometry:
-+ * @window: a #WnckWindow.
-+ * @gravity: the gravity point to use as a reference for the new position.
-+ * @geometry_mask: a bitmask containing flags for what should be set.
-+ * @x: new X coordinate in pixels of @window.
-+ * @y: new Y coordinate in pixels of @window.
-+ * @width: new width in pixels of @window.
-+ * @height: new height in pixels of @window.
-+ *
-+ * Sets the size and position of @window. The X and Y coordinates should be
-+ * relative to the root window.
-+ *
-+ * Note that the new size and position apply to @window with its frame added
-+ * by the window manager. Therefore, using wnck_window_set_geometry() with
-+ * the values returned by wnck_window_get_geometry() should be a no-op, while
-+ * using wnck_window_set_geometry() with the values returned by
-+ * wnck_window_get_client_window_geometry() should reduce the size of @window
-+ * and move it.
-+ *
-+ * Since: 2.16
-+ **/
-+void
-+wnck_window_set_geometry (WnckWindow               *window,
-+                          WnckWindowGravity         gravity,
-+                          WnckWindowMoveResizeMask  geometry_mask,
-+                          int                       x,
-+                          int                       y,
-+                          int                       width,
-+                          int                       height)
-+{
-+  int gravity_and_flags;
-+  int source;
-+
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  source = _wnck_get_client_type();
-+  gravity_and_flags = gravity;
-+  gravity_and_flags |= geometry_mask << 8;
-+  gravity_and_flags |= source << 12;
-+  
-+  x += window->priv->left_frame;
-+  y += window->priv->top_frame;
-+  width -= window->priv->left_frame + window->priv->right_frame;
-+  height -= window->priv->top_frame + window->priv->bottom_frame;
-+
-+  _wnck_set_window_geometry (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+                             window->priv->xwindow,
-+                             gravity_and_flags, x, y, width, height);
-+}
-+
-+/**
-+ * wnck_window_is_visible_on_workspace:
-+ * @window: a #WnckWindow.
-+ * @workspace: a #WnckWorkspace.
-+ * 
-+ * Like wnck_window_is_on_workspace(), but also checks that
-+ * the window is in a visible state (i.e. not minimized or shaded).
-+ * 
-+ * Return value: %TRUE if @window appears on @workspace in normal state, %FALSE
-+ * otherwise.
-+ **/
-+gboolean
-+wnck_window_is_visible_on_workspace (WnckWindow    *window,
-+                                     WnckWorkspace *workspace)
-+{
-+  WnckWindowState state;
-+
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+  g_return_val_if_fail (WNCK_IS_WORKSPACE (workspace), FALSE);
-+  
-+  state = wnck_window_get_state (window);
-+
-+  if (state & WNCK_WINDOW_STATE_HIDDEN)
-+    return FALSE; /* not visible */
-+
-+  return wnck_window_is_on_workspace (window, workspace);
-+}
-+
-+/**
-+ * wnck_window_set_icon_geometry:
-+ * @window: a #WnckWindow.
-+ * @x: X coordinate in pixels.
-+ * @y: Y coordinate in pixels.
-+ * @width: width in pixels.
-+ * @height: height in pixels.
-+ *
-+ * Sets the icon geometry for @window. A typical use case for this is the
-+ * destination of the minimization animation of @window.
-+ */
-+void
-+wnck_window_set_icon_geometry (WnckWindow *window,
-+			       int         x,
-+			       int         y,
-+			       int         width,
-+			       int         height)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+
-+  if (window->priv->icon_geometry.x == x &&
-+      window->priv->icon_geometry.y == y &&
-+      window->priv->icon_geometry.width == width &&
-+      window->priv->icon_geometry.height == height)
-+    return;
-+
-+  window->priv->icon_geometry.x = x;
-+  window->priv->icon_geometry.y = y;
-+  window->priv->icon_geometry.width = width;
-+  window->priv->icon_geometry.height = height;
-+
-+  _wnck_set_icon_geometry (window->priv->xwindow,
-+                           x, y, width, height);
-+}
-+
-+/**
-+ * wnck_window_is_on_workspace:
-+ * @window: a #WnckWindow.
-+ * @workspace: a #WnckWorkspace.
-+ * 
-+ * Gets whether @window appears on @workspace.
-+ *
-+ * Return value: %TRUE if @window appears on @workspace, %FALSE otherwise.
-+ **/
-+gboolean
-+wnck_window_is_on_workspace (WnckWindow    *window,
-+                             WnckWorkspace *workspace)
-+{
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+  g_return_val_if_fail (WNCK_IS_WORKSPACE (workspace), FALSE);
-+  
-+  return wnck_window_is_pinned (window) ||
-+    wnck_window_get_workspace (window) == workspace;
-+}
-+
-+/**
-+ * wnck_window_is_in_viewport:
-+ * @window: a #WnckWindow.
-+ * @workspace: a #WnckWorkspace.
-+ * 
-+ * Gets %TRUE if @window appears in the current viewport of @workspace.
-+ * 
-+ * Return value: %TRUE if @window appears in current viewport of @workspace,
-+ * %FALSE otherwise.
-+ *
-+ * Since: 2.4
-+ **/
-+gboolean
-+wnck_window_is_in_viewport (WnckWindow    *window,
-+                            WnckWorkspace *workspace)
-+{
-+  GdkRectangle window_rect;
-+  GdkRectangle viewport_rect;
-+  
-+  g_return_val_if_fail (WNCK_IS_WINDOW (window), FALSE);
-+  g_return_val_if_fail (WNCK_IS_WORKSPACE (workspace), FALSE);
-+
-+  if (wnck_window_is_pinned (window) )
-+    return TRUE;
-+
-+  if (wnck_window_get_workspace (window) != workspace)
-+    return FALSE;
-+
-+  viewport_rect.x = wnck_workspace_get_viewport_x (workspace);
-+  viewport_rect.y = wnck_workspace_get_viewport_y (workspace);
-+  viewport_rect.width = wnck_screen_get_width (window->priv->screen);
-+  viewport_rect.height = wnck_screen_get_height (window->priv->screen);
-+
-+  window_rect.x = window->priv->x - window->priv->left_frame + viewport_rect.x;
-+  window_rect.y = window->priv->y - window->priv->top_frame + viewport_rect.y;
-+  window_rect.width = window->priv->width + window->priv->left_frame + window->priv->right_frame;
-+  window_rect.height = window->priv->height + window->priv->top_frame + window->priv->bottom_frame;
-+
-+  return gdk_rectangle_intersect (&viewport_rect, &window_rect, &window_rect);
-+}
-+
-+void
-+_wnck_window_set_application (WnckWindow      *window,
-+                              WnckApplication *app)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  g_return_if_fail (app == NULL || WNCK_IS_APPLICATION (app));
-+
-+  if (app)
-+    g_object_ref (G_OBJECT (app));
-+  if (window->priv->app)
-+    g_object_unref (G_OBJECT (window->priv->app));
-+  window->priv->app = app;
-+}
-+
-+void
-+_wnck_window_set_class_group (WnckWindow     *window,
-+			      WnckClassGroup *class_group)
-+{
-+  g_return_if_fail (WNCK_IS_WINDOW (window));
-+  g_return_if_fail (class_group == NULL || WNCK_IS_CLASS_GROUP (class_group));
-+
-+  if (class_group)
-+    g_object_ref (G_OBJECT (class_group));
-+  if (window->priv->class_group)
-+    g_object_unref (G_OBJECT (window->priv->class_group));
-+  window->priv->class_group = class_group;
-+}
-+
-+void
-+_wnck_window_process_property_notify (WnckWindow *window,
-+                                      XEvent     *xevent)
-+{
-+  if (xevent->xproperty.atom ==
-+      _wnck_atom_get ("_NET_WM_STATE"))
-+    {
-+      window->priv->need_update_state = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+      _wnck_atom_get ("WM_STATE"))
-+    {
-+      window->priv->need_update_wm_state = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           XA_WM_NAME ||
-+           xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_NAME") ||
-+           xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_VISIBLE_NAME"))
-+    {
-+      window->priv->need_update_name = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           XA_WM_ICON_NAME ||
-+           xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_ICON_NAME") ||
-+           xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_VISIBLE_ICON_NAME"))
-+    {
-+      window->priv->need_update_icon_name = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_ALLOWED_ACTIONS"))
-+    {
-+      window->priv->need_update_actions = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_DESKTOP"))
-+    {
-+      window->priv->need_update_workspace = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_WINDOW_TYPE"))
-+    {
-+      window->priv->need_update_wintype = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("WM_TRANSIENT_FOR"))
-+    {
-+      window->priv->need_update_transient_for = TRUE;
-+      window->priv->need_update_wintype = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_STARTUP_ID"))
-+    {
-+      window->priv->need_update_startup_id = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom == XA_WM_CLASS)
-+    {
-+      window->priv->need_update_wmclass = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_WM_ICON") ||
-+           xevent->xproperty.atom ==
-+           _wnck_atom_get ("KWM_WIN_ICON"))
-+    {
-+      _wnck_icon_cache_property_changed (window->priv->icon_cache,
-+                                         xevent->xproperty.atom);
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+  	   _wnck_atom_get ("WM_HINTS"))
-+    {
-+      window->priv->need_update_wmhints = TRUE;
-+      queue_update (window);
-+    }
-+  else if (xevent->xproperty.atom ==
-+           _wnck_atom_get ("_NET_FRAME_EXTENTS"))
-+    {
-+      window->priv->need_update_frame_extents = TRUE;
-+      queue_update (window);
-+    }
-+}
-+
-+void
-+_wnck_window_process_configure_notify (WnckWindow *window,
-+                                       XEvent     *xevent)
-+{
-+  if (xevent->xconfigure.send_event)
-+    {
-+      window->priv->x = xevent->xconfigure.x;
-+      window->priv->y = xevent->xconfigure.y;
-+    }
-+  else
-+    {
-+      _wnck_get_window_position (WNCK_SCREEN_XSCREEN (window->priv->screen),
-+				 window->priv->xwindow,
-+                                 &window->priv->x,
-+                                 &window->priv->y);
-+    }
-+
-+  window->priv->width = xevent->xconfigure.width;
-+  window->priv->height = xevent->xconfigure.height;
-+
-+  emit_geometry_changed (window);
-+}
-+
-+static void
-+update_wm_state (WnckWindow *window)
-+{
-+  int state;
-+
-+  if (!window->priv->need_update_wm_state)
-+    return;
-+
-+  window->priv->need_update_wm_state = FALSE;
-+
-+  window->priv->wm_state_iconic = FALSE;
-+
-+  state = _wnck_get_wm_state (window->priv->xwindow);
-+
-+  if (state == IconicState)
-+    window->priv->wm_state_iconic = TRUE;
-+}
-+
-+static void
-+update_state (WnckWindow *window)
-+{
-+  Atom *atoms;
-+  int n_atoms;
-+  int i;
-+  gboolean reread_net_wm_state;
-+
-+  reread_net_wm_state = window->priv->need_update_state;
-+
-+  window->priv->need_update_state = FALSE;
-+
-+  /* This is a bad hack, we always add the
-+   * state based on window type in to the state,
-+   * even if no state update is pending (since the
-+   * state update just means the _NET_WM_STATE prop
-+   * changed
-+   */
-+  
-+  if (reread_net_wm_state)
-+    {
-+      gboolean demanded_attention;
-+
-+      demanded_attention = window->priv->demands_attention;
-+
-+      window->priv->is_maximized_horz = FALSE;
-+      window->priv->is_maximized_vert = FALSE;
-+      window->priv->is_sticky = FALSE;
-+      window->priv->is_shaded = FALSE;
-+      window->priv->is_above = FALSE;
-+      window->priv->is_below = FALSE;
-+      window->priv->skip_taskbar = FALSE;
-+      window->priv->skip_pager = FALSE;
-+      window->priv->net_wm_state_hidden = FALSE;
-+      window->priv->is_fullscreen = FALSE;
-+      window->priv->demands_attention = FALSE;
-+      
-+      atoms = NULL;
-+      n_atoms = 0;
-+      _wnck_get_atom_list (window->priv->xwindow,
-+                           _wnck_atom_get ("_NET_WM_STATE"),
-+                           &atoms, &n_atoms);
-+
-+      i = 0;
-+      while (i < n_atoms)
-+        {
-+          if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_VERT"))
-+            window->priv->is_maximized_vert = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_MAXIMIZED_HORZ"))
-+            window->priv->is_maximized_horz = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_HIDDEN"))
-+            window->priv->net_wm_state_hidden = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_STICKY"))
-+            window->priv->is_sticky = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_SHADED"))
-+            window->priv->is_shaded = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_ABOVE"))
-+            window->priv->is_above = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_BELOW"))
-+            window->priv->is_below = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_FULLSCREEN"))
-+            window->priv->is_fullscreen = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_SKIP_TASKBAR"))
-+            window->priv->skip_taskbar = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_SKIP_PAGER"))
-+            window->priv->skip_pager = TRUE;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_STATE_DEMANDS_ATTENTION"))
-+            window->priv->demands_attention = TRUE;
-+
-+          ++i;
-+        }
-+
-+      if (window->priv->demands_attention != demanded_attention)
-+        {
-+          if (window->priv->demands_attention)
-+            time (&window->priv->needs_attention_time);
-+          else if (!window->priv->is_urgent)
-+            window->priv->needs_attention_time = 0;
-+        }
-+
-+      g_free (atoms);
-+    }
-+
-+  switch (window->priv->wintype)
-+    {
-+    case WNCK_WINDOW_DESKTOP:
-+    case WNCK_WINDOW_DOCK:
-+    case WNCK_WINDOW_SPLASHSCREEN:
-+      window->priv->skip_taskbar = TRUE;
-+      break;
-+
-+    case WNCK_WINDOW_TOOLBAR:
-+    case WNCK_WINDOW_MENU:
-+    case WNCK_WINDOW_UTILITY:
-+    case WNCK_WINDOW_DIALOG:
-+      /* Skip taskbar if the window is transient
-+       * for some main application window
-+       */
-+      if (wnck_window_get_transient (window) != NULL &&
-+          !window->priv->transient_for_root)
-+        window->priv->skip_taskbar = TRUE;
-+      break;
-+      
-+    case WNCK_WINDOW_NORMAL:
-+      break;
-+    }
-+
-+  /* FIXME!!!!!!!!!! What in the world is this buggy duplicate of the code
-+   * immediately above this for??!?!?
-+   */
-+  switch (window->priv->wintype)
-+    {
-+    case WNCK_WINDOW_DESKTOP:
-+    case WNCK_WINDOW_DOCK:
-+    case WNCK_WINDOW_TOOLBAR:
-+    case WNCK_WINDOW_MENU:
-+    case WNCK_WINDOW_SPLASHSCREEN:
-+      window->priv->skip_pager = TRUE;
-+      break;
-+      
-+    case WNCK_WINDOW_NORMAL:
-+    case WNCK_WINDOW_DIALOG:
-+    case WNCK_WINDOW_UTILITY:
-+      break;
-+    }
-+  
-+  /* FIXME we need to recompute this if the window manager changes */
-+  if (wnck_screen_net_wm_supports (window->priv->screen,
-+                                   "_NET_WM_STATE_HIDDEN"))
-+    {
-+      window->priv->is_hidden = window->priv->net_wm_state_hidden;
-+
-+      /* FIXME this is really broken; need to bring it up on
-+       * wm-spec-list. It results in showing an "Unminimize" menu
-+       * item on task list, for shaded windows.
-+       */
-+      window->priv->is_minimized = window->priv->is_hidden;
-+    }
-+  else
-+    {
-+      window->priv->is_minimized = window->priv->wm_state_iconic;
-+      
-+      window->priv->is_hidden = window->priv->is_minimized || window->priv->is_shaded;
-+    }
-+}
-+
-+static gboolean
-+nullstr_equal (const char *str1, const char *str2)
-+{
-+  if (str1 == NULL || str2 == NULL)
-+    return str1 == str2;
-+  else
-+    return !strcmp (str1, str2);
-+}
-+
-+static void
-+update_name (WnckWindow *window)
-+{
-+  char *new_name;
-+
-+  if (!window->priv->need_update_name)
-+    return;
-+
-+  window->priv->need_update_name = FALSE;
-+
-+  new_name = _wnck_get_name (window->priv->xwindow);
-+
-+  if (!nullstr_equal (window->priv->name, new_name))
-+    window->priv->need_emit_name_changed = TRUE;
-+
-+  g_free (window->priv->name);
-+  window->priv->name = new_name;
-+}
-+
-+static void
-+update_icon_name (WnckWindow *window)
-+{
-+  char *new_name = NULL;
-+
-+  if (!window->priv->need_update_icon_name)
-+    return;
-+
-+  window->priv->need_update_icon_name = FALSE;
-+
-+  new_name = _wnck_get_icon_name (window->priv->xwindow);
-+
-+  if (!nullstr_equal (window->priv->icon_name, new_name))
-+    window->priv->need_emit_name_changed = TRUE;
-+
-+  g_free (window->priv->icon_name);
-+  window->priv->icon_name = new_name;
-+}
-+
-+static void
-+update_workspace (WnckWindow *window)
-+{
-+  int val;
-+  int old;
-+
-+  if (!window->priv->need_update_workspace)
-+    return;
-+
-+  window->priv->need_update_workspace = FALSE;
-+
-+  old = window->priv->workspace;
-+
-+  val = ALL_WORKSPACES;
-+  _wnck_get_cardinal (window->priv->xwindow,
-+                      _wnck_atom_get ("_NET_WM_DESKTOP"),
-+                      &val);
-+
-+  window->priv->workspace = val;
-+
-+  if (old != window->priv->workspace)
-+    emit_workspace_changed (window);
-+}
-+
-+static void
-+update_actions (WnckWindow *window)
-+{
-+  Atom *atoms;
-+  int   n_atoms;
-+  int   i;
-+
-+  if (!window->priv->need_update_actions)
-+    return;
-+
-+  window->priv->need_update_actions = FALSE;
-+
-+  window->priv->actions = 0;
-+
-+  atoms = NULL;
-+  n_atoms = 0;
-+  if (!_wnck_get_atom_list (window->priv->xwindow,
-+                            _wnck_atom_get ("_NET_WM_ALLOWED_ACTIONS"),
-+                            &atoms,
-+                            &n_atoms))
-+    {
-+      window->priv->actions = 
-+                WNCK_WINDOW_ACTION_MOVE                    |
-+                WNCK_WINDOW_ACTION_RESIZE                  |
-+                WNCK_WINDOW_ACTION_SHADE                   |
-+                WNCK_WINDOW_ACTION_STICK                   |
-+                WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY   |
-+                WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY     |
-+                WNCK_WINDOW_ACTION_CHANGE_WORKSPACE        |
-+                WNCK_WINDOW_ACTION_CLOSE                   |
-+                WNCK_WINDOW_ACTION_UNMAXIMIZE_HORIZONTALLY |
-+                WNCK_WINDOW_ACTION_UNMAXIMIZE_VERTICALLY   |
-+                WNCK_WINDOW_ACTION_UNSHADE                 |
-+                WNCK_WINDOW_ACTION_UNSTICK                 |
-+                WNCK_WINDOW_ACTION_MINIMIZE                |
-+                WNCK_WINDOW_ACTION_UNMINIMIZE              |
-+                WNCK_WINDOW_ACTION_MAXIMIZE                |
-+                WNCK_WINDOW_ACTION_UNMAXIMIZE              |
-+                WNCK_WINDOW_ACTION_FULLSCREEN              |
-+                WNCK_WINDOW_ACTION_ABOVE                   |
-+                WNCK_WINDOW_ACTION_BELOW;
-+      return;
-+    }
-+
-+  i = 0;
-+  while (i < n_atoms)
-+    {
-+      if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_MOVE"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_MOVE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_RESIZE"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_RESIZE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_SHADE"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_SHADE |
-+                                 WNCK_WINDOW_ACTION_UNSHADE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_STICK"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_STICK |
-+                                 WNCK_WINDOW_ACTION_UNSTICK;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_MINIMIZE"))
-+	window->priv->actions |= WNCK_WINDOW_ACTION_MINIMIZE   |
-+	                         WNCK_WINDOW_ACTION_UNMINIMIZE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_MAXIMIZE_HORZ"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY |
-+                                 WNCK_WINDOW_ACTION_UNMAXIMIZE_HORIZONTALLY;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_MAXIMIZE_VERT"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY |
-+                                 WNCK_WINDOW_ACTION_UNMAXIMIZE_VERTICALLY;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_CHANGE_DESKTOP"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_CHANGE_WORKSPACE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_CLOSE"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_CLOSE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_FULLSCREEN"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_FULLSCREEN;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_ABOVE"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_ABOVE;
-+
-+      else if (atoms[i] == _wnck_atom_get ("_NET_WM_ACTION_BELOW"))
-+        window->priv->actions |= WNCK_WINDOW_ACTION_BELOW;
-+
-+      else
-+        {
-+          const char *name = _wnck_atom_name (atoms [i]);
-+          g_warning ("Unhandled action type %s", name ? name: "(nil)");
-+        }
-+
-+      i++;
-+    }
-+
-+  g_free (atoms);
-+
-+  if ((window->priv->actions & WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY) &&
-+      (window->priv->actions & WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY))
-+    window->priv->actions |=
-+        WNCK_WINDOW_ACTION_MAXIMIZE   |
-+        WNCK_WINDOW_ACTION_UNMAXIMIZE;
-+}
-+
-+static void
-+update_wintype (WnckWindow *window)
-+{
-+  Atom *atoms;
-+  int n_atoms;
-+  WnckWindowType type;
-+  gboolean found_type;
-+  
-+  if (!window->priv->need_update_wintype)
-+    return;
-+
-+  window->priv->need_update_wintype = FALSE;
-+
-+  found_type = FALSE;
-+  type = WNCK_WINDOW_NORMAL;
-+  
-+  atoms = NULL;
-+  n_atoms = 0;
-+  if (_wnck_get_atom_list (window->priv->xwindow,
-+                           _wnck_atom_get ("_NET_WM_WINDOW_TYPE"),
-+                           &atoms,
-+                           &n_atoms))
-+    {
-+      int i;
-+      
-+      i = 0;
-+      while (i < n_atoms && !found_type)
-+        {
-+          /* We break as soon as we find one we recognize,
-+           * supposed to prefer those near the front of the list
-+           */
-+          found_type = TRUE;
-+          if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_DESKTOP"))
-+            type = WNCK_WINDOW_DESKTOP;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_DOCK"))
-+            type = WNCK_WINDOW_DOCK;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_TOOLBAR"))
-+            type = WNCK_WINDOW_TOOLBAR;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_MENU"))
-+            type = WNCK_WINDOW_MENU;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_DIALOG"))
-+            type = WNCK_WINDOW_DIALOG;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_NORMAL"))
-+            type = WNCK_WINDOW_NORMAL;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_UTILITY"))
-+            type = WNCK_WINDOW_UTILITY;
-+          else if (atoms[i] == _wnck_atom_get ("_NET_WM_WINDOW_TYPE_SPLASH"))
-+            type = WNCK_WINDOW_SPLASHSCREEN;
-+          else
-+            found_type = FALSE;
-+          
-+          ++i;
-+        }
-+
-+      g_free (atoms);
-+    }
-+
-+  if (!found_type)
-+    {
-+      if (window->priv->transient_for != None)
-+        {
-+          type = WNCK_WINDOW_DIALOG;
-+        }
-+      else
-+        {
-+          type = WNCK_WINDOW_NORMAL;
-+        }
-+      found_type = TRUE;
-+    }
-+
-+  window->priv->wintype = type;
-+}
-+
-+static void
-+update_transient_for (WnckWindow *window)
-+{
-+  Window parent;
-+
-+  if (!window->priv->need_update_transient_for)
-+    return;
-+
-+  window->priv->need_update_transient_for = FALSE;
-+  
-+  parent = None;
-+  if (_wnck_get_window (window->priv->xwindow,
-+                        _wnck_atom_get ("WM_TRANSIENT_FOR"),
-+                        &parent) &&
-+      parent != window->priv->xwindow)
-+    {
-+      window->priv->transient_for = parent;
-+
-+      if (wnck_screen_get_for_root (window->priv->transient_for) != NULL)
-+        window->priv->transient_for_root = TRUE;
-+      else
-+        window->priv->transient_for_root = FALSE;
-+    }
-+  else
-+    {
-+      window->priv->transient_for = None;
-+      window->priv->transient_for_root = FALSE;
-+    }
-+}
-+
-+static void
-+update_startup_id (WnckWindow *window)
-+{
-+  if (!window->priv->need_update_startup_id)
-+    return;
-+
-+  window->priv->need_update_startup_id = FALSE;
-+
-+  g_free (window->priv->startup_id);
-+  window->priv->startup_id = 
-+    _wnck_get_utf8_property (window->priv->xwindow,
-+                             _wnck_atom_get ("_NET_STARTUP_ID"));
-+}
-+
-+static void
-+update_wmclass (WnckWindow *window)
-+{
-+  if (!window->priv->need_update_wmclass)
-+    return;
-+
-+  window->priv->need_update_wmclass = FALSE;
-+
-+  g_free (window->priv->res_class);
-+  g_free (window->priv->res_name);
-+
-+  window->priv->res_class = NULL;
-+  window->priv->res_name = NULL;
-+
-+  _wnck_get_wmclass (window->priv->xwindow,
-+                     &window->priv->res_class,
-+                     &window->priv->res_name);
-+}
-+
-+static void
-+update_wmhints (WnckWindow *window)
-+{
-+  XWMHints *hints;
-+
-+  if (!window->priv->need_update_wmhints)
-+    return;
-+
-+  _wnck_error_trap_push ();
-+  hints = XGetWMHints (gdk_display, window->priv->xwindow);
-+  _wnck_error_trap_pop ();
-+
-+  if (hints)
-+    {
-+      if ((hints->flags & IconPixmapHint) ||
-+          (hints->flags & IconMaskHint))
-+        _wnck_icon_cache_property_changed (window->priv->icon_cache,
-+                                           _wnck_atom_get ("WM_HINTS"));
-+
-+      if (hints->flags & WindowGroupHint)
-+          window->priv->group_leader = hints->window_group;
-+
-+      if (hints->flags & XUrgencyHint)
-+        {
-+          window->priv->is_urgent = TRUE;
-+          time (&window->priv->needs_attention_time);
-+        }
-+      else
-+        {
-+          window->priv->is_urgent = FALSE;
-+          if (!window->priv->demands_attention)
-+            window->priv->needs_attention_time = 0;
-+        }
-+
-+      XFree (hints);
-+    }
-+
-+  window->priv->need_update_wmhints = FALSE;
-+}
-+
-+static void
-+update_frame_extents (WnckWindow *window)
-+{
-+  int left, right, top, bottom;
-+
-+  if (!window->priv->need_update_frame_extents)
-+    return;
-+
-+  window->priv->need_update_frame_extents = FALSE;
-+
-+  left = right = top = bottom = 0;
-+
-+  if (!_wnck_get_frame_extents (window->priv->xwindow,
-+                                &left, &right, &top, &bottom))
-+    return;
-+
-+  if (left   != window->priv->left_frame ||
-+      right  != window->priv->right_frame ||
-+      top    != window->priv->top_frame ||
-+      bottom != window->priv->bottom_frame)
-+    {
-+      window->priv->left_frame   = left;
-+      window->priv->right_frame  = right;
-+      window->priv->top_frame    = top;
-+      window->priv->bottom_frame = bottom;
-+
-+      emit_geometry_changed (window);
-+    }
-+}
-+
-+static void
-+force_update_now (WnckWindow *window)
-+{
-+  WnckWindowState old_state;
-+  WnckWindowState new_state;
-+  WnckWindowActions old_actions;
-+  
-+  unqueue_update (window);
-+
-+  /* Name must be done before all other stuff,
-+   * because we have iconsistent state across the
-+   * update_name/update_icon_name functions (no window name),
-+   * and we have to fix that before we emit any other signals
-+   */
-+
-+  update_name (window);
-+  update_icon_name (window);
-+
-+  if (window->priv->need_emit_name_changed)
-+    emit_name_changed (window);
-+
-+  old_state = COMPRESS_STATE (window);
-+  old_actions = window->priv->actions;
-+
-+  update_startup_id (window);    /* no side effects */
-+  update_wmclass (window);
-+  update_wmhints (window);
-+  update_transient_for (window); /* wintype needs this to be first */
-+  update_wintype (window);
-+  update_wm_state (window);
-+  update_state (window);     /* must come after the above, since they affect
-+                              * our calculated state
-+                              */
-+  update_workspace (window); /* emits signals */
-+  update_actions (window);
-+  update_frame_extents (window); /* emits signals */
-+
-+  get_icons (window);
-+  
-+  new_state = COMPRESS_STATE (window);
-+
-+  if (old_state != new_state)
-+    emit_state_changed (window, old_state ^ new_state, new_state);
-+
-+  if (old_actions != window->priv->actions)
-+    emit_actions_changed (window, old_actions ^ window->priv->actions,
-+                          window->priv->actions);
-+  
-+  if (window->priv->need_emit_icon_changed)
-+    emit_icon_changed (window);
-+}
-+
-+
-+static gboolean
-+update_idle (gpointer data)
-+{
-+  WnckWindow *window = WNCK_WINDOW (data);
-+
-+  window->priv->update_handler = 0;
-+  force_update_now (window);
-+  return FALSE;
-+}
-+
-+static void
-+queue_update (WnckWindow *window)
-+{
-+  if (window->priv->update_handler != 0)
-+    return;
-+
-+  window->priv->update_handler = g_idle_add (update_idle, window);
-+}
-+
-+static void
-+unqueue_update (WnckWindow *window)
-+{
-+  if (window->priv->update_handler != 0)
-+    {
-+      g_source_remove (window->priv->update_handler);
-+      window->priv->update_handler = 0;
-+    }
-+}
-+
-+static void
-+emit_name_changed (WnckWindow *window)
-+{
-+  window->priv->need_emit_name_changed = FALSE;
-+  g_signal_emit (G_OBJECT (window),
-+                 signals[NAME_CHANGED],
-+                 0);
-+}
-+
-+static void
-+emit_state_changed (WnckWindow     *window,
-+                    WnckWindowState changed_mask,
-+                    WnckWindowState new_state)
-+{
-+  g_signal_emit (G_OBJECT (window),
-+                 signals[STATE_CHANGED],
-+                 0, changed_mask, new_state);
-+}
-+
-+static void
-+emit_workspace_changed (WnckWindow *window)
-+{
-+  g_signal_emit (G_OBJECT (window),
-+                 signals[WORKSPACE_CHANGED],
-+                 0);
-+}
-+
-+static void
-+emit_icon_changed (WnckWindow *window)
-+{
-+  window->priv->need_emit_icon_changed = FALSE;
-+  g_signal_emit (G_OBJECT (window),
-+                 signals[ICON_CHANGED],
-+                 0);
-+}
-+
-+static void
-+emit_actions_changed   (WnckWindow       *window,
-+                        WnckWindowActions changed_mask,
-+                        WnckWindowActions new_actions)
-+{
-+  g_signal_emit (G_OBJECT (window),
-+                 signals[ACTIONS_CHANGED],
-+                 0, changed_mask, new_actions);
-+}
-+
-+static void
-+emit_geometry_changed (WnckWindow *window)
-+{
-+  g_signal_emit (G_OBJECT (window),
-+                 signals[GEOMETRY_CHANGED],
-+                 0);
-+}
 diff -urN libwnck.orig/libwnck/window.h libwnck.new/libwnck/window.h
 --- libwnck.orig/libwnck/window.h	2008-08-06 23:43:13.423557000 +0100
 +++ libwnck.new/libwnck/window.h	2008-08-06 23:43:40.134710000 +0100