[Goodies-commits] r3924 - xfmpc/trunk/src

Mike Massonnet mmassonnet at xfce.org
Fri Feb 8 12:34:25 CET 2008


Author: mmassonnet
Date: 2008-02-08 11:34:24 +0000 (Fri, 08 Feb 2008)
New Revision: 3924

Modified:
   xfmpc/trunk/src/interface.c
   xfmpc/trunk/src/main.c
   xfmpc/trunk/src/preferences.c
Log:
Save the sticky window state.
* src/src/preferences.c:
  - Add LastWindowStateSticky preference
* src/interface.c(xfmpc_interface_init):
  - Connect signal "window-state-event" to xfmpc_interface_state_event
  - Restore the preference LastWindowStateSticky
* src/interface.c(xfmpc_interface_state_event):
  - Save the changes of the sticky window state
* src/main.c:
  - Register transform function from G_TYPE_STRING to G_TYPE_BOOLEAN


Modified: xfmpc/trunk/src/interface.c
===================================================================
--- xfmpc/trunk/src/interface.c	2008-02-08 10:33:18 UTC (rev 3923)
+++ xfmpc/trunk/src/interface.c	2008-02-08 11:34:24 UTC (rev 3924)
@@ -42,6 +42,8 @@
 
 static gboolean         xfmpc_interface_reconnect               (XfmpcInterface *interface);
 
+static gboolean         xfmpc_interface_state_event             (XfmpcInterface *interface,
+                                                                 GdkEventWindowState *event);
 static gboolean         xfmpc_interface_closed                  (XfmpcInterface *interface,
                                                                  GdkEvent *event);
 static void             xfmpc_interface_action_previous         (GtkAction *action,
@@ -150,15 +152,20 @@
   gtk_window_set_icon_name (GTK_WINDOW (interface), "stock_volume");
   gtk_window_set_title (GTK_WINDOW (interface), _("Xfmpc"));
   gtk_container_set_border_width (GTK_CONTAINER (interface), BORDER);
-  g_signal_connect (G_OBJECT (interface), "delete-event", G_CALLBACK (xfmpc_interface_closed), interface);
+  g_signal_connect (G_OBJECT (interface), "delete-event", G_CALLBACK (xfmpc_interface_closed), NULL);
+  g_signal_connect (G_OBJECT (interface), "window-state-event", G_CALLBACK (xfmpc_interface_state_event), NULL);
 
   gint posx, posy;
+  gboolean sticky;
   g_object_get (G_OBJECT (interface->preferences),
                 "last-window-posx", &posx,
                 "last-window-posy", &posy,
+                "last-window-state-sticky", &sticky,
                 NULL);
   if (G_LIKELY (posx != -1 && posy != -1))
     gtk_window_move (GTK_WINDOW (interface), posx, posy);
+  if (sticky == TRUE)
+    gtk_window_stick (GTK_WINDOW (interface));
 
   /* === Interface widgets === */
   GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_BUTTON);
@@ -464,6 +471,29 @@
 }
 
 static gboolean
+xfmpc_interface_state_event (XfmpcInterface *interface,
+                             GdkEventWindowState *event)
+{
+  if (G_UNLIKELY (event->type != GDK_WINDOW_STATE))
+    return FALSE;
+
+  /**
+   * Hiding the top level window will unstick it too, and send a
+   * window-state-event signal, so here we take the value only if
+   * the window is visible
+   **/
+  if (event->changed_mask & GDK_WINDOW_STATE_STICKY && GTK_WIDGET_VISIBLE (GTK_WIDGET (interface)))
+    {
+      gboolean sticky = ((gboolean) event->new_window_state & GDK_WINDOW_STATE_STICKY) == FALSE ? FALSE : TRUE;
+      g_object_set (G_OBJECT (interface->preferences),
+                    "last-window-state-sticky", sticky,
+                    NULL);
+    }
+
+  return FALSE;
+}
+
+static gboolean
 xfmpc_interface_closed (XfmpcInterface *interface,
                         GdkEvent *event)
 {

Modified: xfmpc/trunk/src/main.c
===================================================================
--- xfmpc/trunk/src/main.c	2008-02-08 10:33:18 UTC (rev 3923)
+++ xfmpc/trunk/src/main.c	2008-02-08 11:34:24 UTC (rev 3924)
@@ -35,8 +35,15 @@
   g_value_set_int (dst, (gint) strtol (g_value_get_string (src), NULL, 10));
 }
 
+static void
+transform_string_to_boolean (const GValue *src,
+                             GValue *dst)
+{
+  g_value_set_boolean (dst, (gboolean) strcmp (g_value_get_string (src), "FALSE") != 0);
+}
 
 
+
 int
 main (int argc, char *argv[])
 {
@@ -45,6 +52,7 @@
   gtk_init (&argc, &argv);
 
   g_value_register_transform_func (G_TYPE_STRING, G_TYPE_INT, transform_string_to_int);
+  g_value_register_transform_func (G_TYPE_STRING, G_TYPE_BOOLEAN, transform_string_to_boolean);
 
   gtk_window_set_default_icon_name ("xfmpc");
 

Modified: xfmpc/trunk/src/preferences.c
===================================================================
--- xfmpc/trunk/src/preferences.c	2008-02-08 10:33:18 UTC (rev 3923)
+++ xfmpc/trunk/src/preferences.c	2008-02-08 11:34:24 UTC (rev 3924)
@@ -33,6 +33,7 @@
   PROP_0,
   PROP_LAST_WINDOW_POSX,
   PROP_LAST_WINDOW_POSY,
+  PROP_LAST_WINDOW_STATE_STICKY,
   N_PROPERTIES,
 };
 
@@ -130,6 +131,14 @@
                                                      "Window position on axis y",
                                                      -1, G_MAXINT, -1,
                                                      G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_LAST_WINDOW_STATE_STICKY,
+                                   g_param_spec_boolean ("last-window-state-sticky",
+                                                         "LastWindowStateSticky",
+                                                         "Sticky bit on window",
+                                                         FALSE,
+                                                         G_PARAM_READWRITE));
 }
 
 static void




More information about the Goodies-commits mailing list