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

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Jun 26 14:57:58 EEST 2007
Author: xan
Date: 2007-06-26 14:57:54 +0300 (Tue, 26 Jun 2007)
New Revision: 12470

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

	* gtk/gtkwindow.c: (gtk_window_class_init),
	(gtk_window_set_property), (gtk_window_get_property),
	(gtk_window_set_temporary), (gtk_window_is_temporary),
	(delete_if_temporary), (gtk_window_client_event):
	* gtk/gtkwindow.h:

	Make GtkWindow listen to _GTK_DELETE_TEMPORARIES ClientMessage
	and send delete-event to all temporary windows ("temporary" property
	set to TRUE) when it receives it.

	Also add API to allow third party plugins to mark their windows as
	temporary.

	This API is *UNSTABLE*


Modified: projects/haf/trunk/gtk+/ChangeLog
===================================================================
--- projects/haf/trunk/gtk+/ChangeLog	2007-06-26 11:52:23 UTC (rev 12469)
+++ projects/haf/trunk/gtk+/ChangeLog	2007-06-26 11:57:54 UTC (rev 12470)
@@ -1,5 +1,22 @@
-2007-06-26  Xan Lopez  <xan at gnome.org>
+2007-06-26  Xan Lopez  <xan at nokia.com>
 
+	* gtk/gtkwindow.c: (gtk_window_class_init),
+	(gtk_window_set_property), (gtk_window_get_property),
+	(gtk_window_set_temporary), (gtk_window_is_temporary),
+	(delete_if_temporary), (gtk_window_client_event):
+	* gtk/gtkwindow.h:
+
+	Make GtkWindow listen to _GTK_DELETE_TEMPORARIES ClientMessage
+	and send delete-event to all temporary windows ("temporary" property
+	set to TRUE) when it receives it.
+
+	Also add API to allow third party plugins to mark their windows as
+	temporary.
+
+	This API is *UNSTABLE*
+
+2007-06-26  Xan Lopez  <xan at nokia.com>
+
 	* gtk/gtkcombobox.c: (gtk_combo_box_set_popup_widget),
 	(gtk_combo_box_child_delete_event), (gtk_combo_box_list_destroy):
 	* gtk/gtkentrycompletion.c: (gtk_entry_completion_init),

Modified: projects/haf/trunk/gtk+/gtk/gtkwindow.c
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkwindow.c	2007-06-26 11:52:23 UTC (rev 12469)
+++ projects/haf/trunk/gtk+/gtk/gtkwindow.c	2007-06-26 11:57:54 UTC (rev 12470)
@@ -90,6 +90,9 @@
   PROP_DELETABLE,
   PROP_GRAVITY,
   PROP_TRANSIENT_FOR,
+#ifdef MAEMO_CHANGES
+  PROP_TEMPORARY,
+#endif /* MAEMO_CHANGES */
   
   /* Readonly properties */
   PROP_IS_ACTIVE,
@@ -174,6 +177,9 @@
   guint focus_on_map : 1;
   guint deletable : 1;
   guint transient_parent_group : 1;
+#ifdef MAEMO_CHANGES
+  guint is_temporary : 1;
+#endif /* MAEMO_CHANGES */
 
   guint reset_type_hint : 1;
   GdkWindowTypeHint type_hint;
@@ -641,6 +647,27 @@
 							 TRUE,
 							 GTK_PARAM_READWRITE));
 
+#ifdef MAEMO_CHANGES
+  /**
+   * GtkWindow:temporary:
+   *
+   * Whether the window is "temporary" (completion popups, menus, etc) and should be
+   * automatically closed when it receives the _GTK_DELETE_TEMPORARIES ClientMessage.
+   * If set to TRUE GTK will send a delete-event to the window whenever it receives
+   * a _GTK_DELETE_TEMPORARIES message, so this needs to be properly handled by the
+   * widget.
+   *
+   * Since: 2.12
+   * Stability: Unstable
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_DELETABLE,
+                                   g_param_spec_boolean ("temporary",
+							 P_("Temporary"),
+							 P_("Whether the window should be closed when it receives the _GTK_DELETE_TEMPORARIES ClientMessage"),
+							 FALSE,
+							 GTK_PARAM_READWRITE));
+#endif
 
   /**
    * GtkWindow:gravity:
@@ -925,6 +952,11 @@
     case PROP_TRANSIENT_FOR:
       gtk_window_set_transient_for (window, g_value_get_object (value));
       break;
+#ifdef MAEMO_CHANGES
+    case PROP_TEMPORARY:
+      gtk_window_set_temporary (window, g_value_get_boolean (value));
+      break;
+#endif
     default:
       break;
     }
@@ -1036,6 +1068,11 @@
     case PROP_TRANSIENT_FOR:
       g_value_set_object (value, gtk_window_get_transient_for (window));
       break;
+#ifdef MAEMO_CHANGES
+    case PROP_TEMPORARY:
+      g_value_set_boolean (value, gtk_window_is_temporary (window));
+      break;
+#endif
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -4821,6 +4858,9 @@
 
 static GdkAtom atom_rcfiles = GDK_NONE;
 static GdkAtom atom_iconthemes = GDK_NONE;
+#ifdef MAEMO_CHANGES
+static GdkAtom atom_temporaries = GDK_NONE;
+#endif /* MAEMO_CHANGES */
 
 static void
 send_client_message_to_embedded_windows (GtkWidget *widget,
@@ -4850,6 +4890,74 @@
     }
 }
 
+#ifdef MAEMO_CHANGES
+/**
+ * gtk_window_set_temporary:
+ * @window: a #GtkWindow
+ * @setting: %TRUE if the window should be closed when it receives the _GTK_DELETE_TEMPORARIES ClientMessage
+ * 
+ * Since: 2.12
+ * Stability: Unstable
+ */
+void
+gtk_window_set_temporary (GtkWindow *window,
+			  gboolean   setting)
+{
+  GtkWindowPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WINDOW (window));
+
+  priv = GTK_WINDOW_GET_PRIVATE (window);
+
+  if (priv->is_temporary != setting)
+    {
+      priv->is_temporary = setting;
+
+      g_object_notify (G_OBJECT (window), "temporary");
+    }
+}
+
+/**
+ * gtk_window_is_temporary:
+ * @window: a #GtkWindow
+ *
+ * Return value: %TRUE if the window is marked as temporary.
+ *
+ * Since: 2.12
+ * Stability: Unstable
+ */
+gboolean
+gtk_window_is_temporary (GtkWindow *window)
+{
+  GtkWindowPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+
+  priv = GTK_WINDOW_GET_PRIVATE (window);
+  return priv->is_temporary;
+}
+
+static void
+delete_if_temporary (GtkWidget *widget)
+{
+  GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (widget);
+
+  if (priv->is_temporary)
+    {
+      /* synthesize delete-event to close the window */
+      GdkEvent *event;
+
+      event = gdk_event_new (GDK_DELETE);
+
+      event->any.window = g_object_ref (widget->window);
+      event->any.send_event = TRUE;
+
+      gtk_main_do_event (event);
+      gdk_event_free (event);
+    }
+}
+#endif /* MAEMO_CHANGES */
+
 static gint
 gtk_window_client_event (GtkWidget	*widget,
 			 GdkEventClient	*event)
@@ -4858,6 +4966,9 @@
     {
       atom_rcfiles = gdk_atom_intern_static_string ("_GTK_READ_RCFILES");
       atom_iconthemes = gdk_atom_intern_static_string ("_GTK_LOAD_ICONTHEMES");
+#ifdef MAEMO_CHANGES
+      atom_temporaries = gdk_atom_intern_static_string ("_GTK_DELETE_TEMPORARIES");
+#endif /* MAEMO_CHANGES */
     }
 
   if (event->message_type == atom_rcfiles) 
@@ -4872,6 +4983,14 @@
       _gtk_icon_theme_check_reload (gtk_widget_get_display (widget));    
     }
 
+#ifdef MAEMO_CHANGES
+  if (event->message_type == atom_temporaries)
+    {
+      send_client_message_to_embedded_windows (widget, atom_temporaries);
+      delete_if_temporary (widget);
+    }
+#endif /* MAEMO_CHANGES */
+
   return FALSE;
 }
 

Modified: projects/haf/trunk/gtk+/gtk/gtkwindow.h
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtkwindow.h	2007-06-26 11:52:23 UTC (rev 12469)
+++ projects/haf/trunk/gtk+/gtk/gtkwindow.h	2007-06-26 11:57:54 UTC (rev 12470)
@@ -262,6 +262,11 @@
 void       gtk_window_set_deletable            (GtkWindow *window,
                                                 gboolean   setting);
 gboolean   gtk_window_get_deletable            (GtkWindow *window);
+#ifdef MAEMO_CHANGES
+void       gtk_window_set_temporary	        (GtkWindow *window,
+						 gboolean  setting);
+gboolean   gtk_window_is_temporary	        (GtkWindow *window);
+#endif
 
 void       gtk_window_set_icon_list                (GtkWindow  *window,
                                                     GList      *list);


More information about the maemo-commits mailing list