[maemo-commits] [maemo-commits] r13003 - in projects/haf/trunk/gtk+: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Aug 2 18:56:37 EEST 2007
Author: xan
Date: 2007-08-02 18:56:34 +0300 (Thu, 02 Aug 2007)
New Revision: 13003

Modified:
   projects/haf/trunk/gtk+/ChangeLog
   projects/haf/trunk/gtk+/gtk/gtkmenu.c
   projects/haf/trunk/gtk+/gtk/gtkwindow.c
   projects/haf/trunk/gtk+/gtk/gtkwindow.h
Log:
2007-08-02  Xan Lopez  <xan.lopez at nokia.com>

	* gtk/gtkmenu.c:
	* gtk/gtkwindow.c:
	* gtk/gtkwindow.h:

	Close all temporary windows each time a window is mapped, excluding
	the new window if it were a temporary window itself.

	Fixes: NB#52664, NB#57562


Modified: projects/haf/trunk/gtk+/ChangeLog
===================================================================
--- projects/haf/trunk/gtk+/ChangeLog	2007-08-02 10:09:58 UTC (rev 13002)
+++ projects/haf/trunk/gtk+/ChangeLog	2007-08-02 15:56:34 UTC (rev 13003)
@@ -1,3 +1,14 @@
+2007-08-02  Xan Lopez  <xan.lopez at nokia.com>
+
+	* gtk/gtkmenu.c:
+	* gtk/gtkwindow.c:
+	* gtk/gtkwindow.h:
+
+	Close all temporary windows each time a window is mapped, excluding
+	the new window if it were a temporary window itself.
+
+	Fixes: NB#52664, NB#57562
+
 2007-08-02  Michael Natterer  <mitch at imendio.com>
 
 	* gtk/gtkmenu.c (gtk_menu_key_press): added code that invokes

Modified: projects/haf/trunk/gtk+/gtk/gtkmenu.c
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkmenu.c	2007-08-02 10:09:58 UTC (rev 13002)
+++ projects/haf/trunk/gtk+/gtk/gtkmenu.c	2007-08-02 15:56:34 UTC (rev 13003)
@@ -844,13 +844,14 @@
     case GDK_KEY_RELEASE:
       handled = gtk_widget_event (menu, event);
       break;
-#ifdef MAEMO_CHANGES
+#if defined(MAEMO_CHANGES) && defined(GDK_WINDOWING_X11)
     case GDK_CLIENT_EVENT:
       /* Close down the whole hierarchy, but not if we're torn off. Don't call
        * cancel if the menu isn't visible to avoid extra selection-done
        * signals.
        */
       if (event->client.message_type == gdk_atom_intern_static_string ("_GTK_DELETE_TEMPORARIES") &&
+          _gtk_window_is_on_client_data (GTK_WINDOW (window), event) == FALSE &&
 	  window == GTK_MENU (menu)->toplevel &&
 	  GTK_WIDGET_MAPPED (GTK_MENU (menu)->toplevel))
 	{

Modified: projects/haf/trunk/gtk+/gtk/gtkwindow.c
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkwindow.c	2007-08-02 10:09:58 UTC (rev 13002)
+++ projects/haf/trunk/gtk+/gtk/gtkwindow.c	2007-08-02 15:56:34 UTC (rev 13003)
@@ -289,6 +289,9 @@
 static void        gtk_window_free_key_hash       (GtkWindow   *window);
 static void	   gtk_window_on_composited_changed (GdkScreen *screen,
 						     GtkWindow *window);
+#if defined(MAEMO_CHANGES) && defined(GDK_WINDOWING_X11)
+static void        gtk_window_close_other_temporaries (GtkWindow *window);
+#endif
 
 static GSList      *toplevel_list = NULL;
 static guint        window_signals[LAST_SIGNAL] = { 0 };
@@ -4120,6 +4123,8 @@
   GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (window);
   GdkWindow *toplevel;
 
+  gtk_window_close_other_temporaries (window);
+
   GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
 
   if (window->bin.child &&
@@ -4927,11 +4932,12 @@
 }
 
 static void
-delete_if_temporary (GtkWidget *widget)
+delete_if_temporary (GtkWidget *widget, GdkEventClient *client)
 {
   GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (widget);
 
-  if (priv->is_temporary)
+  if (priv->is_temporary &&
+      _gtk_window_is_on_client_data (GTK_WINDOW (widget), client) == FALSE)
     {
       /* synthesize delete-event to close the window */
       GdkEvent *event;
@@ -4976,7 +4982,7 @@
   if (event->message_type == atom_temporaries)
     {
       send_client_message_to_embedded_windows (widget, atom_temporaries);
-      delete_if_temporary (widget);
+      delete_if_temporary (widget, event);
     }
 #endif /* MAEMO_CHANGES */
 
@@ -7987,7 +7993,37 @@
 {
 }
 
-#endif /* MAEMO_CHANGES */
+#endif
 
+#if defined(MAEMO_CHANGES) && defined(GDK_WINDOWING_X11)
+gboolean
+_gtk_window_is_on_client_data (GtkWindow *window, GdkEventClient *event)
+{
+  XID xid = GDK_WINDOW_XID (GTK_WIDGET (window)->window);
+  return memcmp (&xid, (XID*)(&event->data.b[12]), sizeof(XID)) == 0;
+}
+
+/**
+ * gtk_window_close_other_temporaries:
+ * 
+ * Sends a _GTK_DELETE_TEMPORARIES ClientEvent to all other toplevel windows
+ *
+ * Since: 2.12
+ * Stability: Unstable
+ */
+static void
+gtk_window_close_other_temporaries (GtkWindow *window)
+{
+  GdkEventClient client;
+  XID xid = GDK_WINDOW_XID (GTK_WIDGET (window)->window);
+
+  memset(&client, 0, sizeof(client));
+  client.message_type = gdk_atom_intern ("_GTK_DELETE_TEMPORARIES", FALSE);
+  client.data_format = 8;
+  memcpy (((XID*)(&client.data.b[12])),&xid, sizeof(XID));
+  gdk_event_send_clientmessage_toall ((GdkEvent*)&client);
+}
+#endif /* MAEMO_CHANGES && GDK_WINDOWING_X11 */
+
 #define __GTK_WINDOW_C__
 #include "gtkaliasdef.c"

Modified: projects/haf/trunk/gtk+/gtk/gtkwindow.h
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkwindow.h	2007-08-02 10:09:58 UTC (rev 13002)
+++ projects/haf/trunk/gtk+/gtk/gtkwindow.h	2007-08-02 15:56:34 UTC (rev 13003)
@@ -271,6 +271,8 @@
 void       gtk_window_set_is_temporary	        (GtkWindow *window,
 						 gboolean  setting);
 gboolean   gtk_window_get_is_temporary	        (GtkWindow *window);
+gboolean   _gtk_window_is_on_client_data        (GtkWindow *window,
+                                                 GdkEventClient *event);
 #endif
 
 void       gtk_window_set_icon_list                (GtkWindow  *window,


More information about the maemo-commits mailing list