[maemo-commits] [maemo-commits] r13003 - in projects/haf/trunk/gtk+: . gtk
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Aug 2 18:56:37 EEST 2007
- Previous message: [maemo-commits] r13002 - in projects/haf/trunk/gtk+: . gtk
- Next message: [maemo-commits] r13004 - projects/haf/trunk/gtk+/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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,
- Previous message: [maemo-commits] r13002 - in projects/haf/trunk/gtk+: . gtk
- Next message: [maemo-commits] r13004 - projects/haf/trunk/gtk+/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]