[maemo-commits] [maemo-commits] r9935 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildondesktop

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Feb 15 23:09:53 EET 2007
Author: jobi
Date: 2007-02-15 23:09:52 +0200 (Thu, 15 Feb 2007)
New Revision: 9935

Modified:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-applet.c
Log:

2007-02-15  Johan Bilien  <johan.bilien at nokia.com>

	* libhildondesktop/hildon-home-applet.c:
	- added "layout-mode-sucks" property (default to FALSE)
	- if TRUE, add a dragging handle and always show the resize handle.
	always react on button press for these handle, and don't react
	to _set_layout_mode. Layout mode dies
	- if FALSE, business as usual



Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2007-02-15 19:15:06 UTC (rev 9934)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2007-02-15 21:09:52 UTC (rev 9935)
@@ -1,3 +1,12 @@
+2007-02-15  Johan Bilien  <johan.bilien at nokia.com>
+
+	* libhildondesktop/hildon-home-applet.c:
+	- added "layout-mode-sucks" property (default to FALSE)
+	- if TRUE, add a dragging handle and always show the resize handle.
+	always react on button press for these handle, and don't react
+	to _set_layout_mode. Layout mode dies
+	- if FALSE, business as usual
+
 2007-02-15  Moises Martinez  <moises.martinez at nokia.com>
 
 	* lbihildondesktop/hildon-desktop-panel-expandable.c:

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-applet.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-applet.c	2007-02-15 19:15:06 UTC (rev 9934)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-applet.c	2007-02-15 21:09:52 UTC (rev 9935)
@@ -65,6 +65,7 @@
 {
   HILDON_HOME_APPLET_PROPERTY_RESIZE_TYPE = 1,
   HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE,
+  HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE_SUCKS,
   HILDON_HOME_APPLET_PROPERTY_DESKTOP_FILE,
   HILDON_HOME_APPLET_PROPERTY_MINIMUM_WIDTH,
   HILDON_HOME_APPLET_PROPERTY_MINIMUM_HEIGHT
@@ -79,6 +80,7 @@
   GdkWindow    *close_button_window;
   GdkPixbuf    *resize_handle;
   GdkWindow    *resize_handle_window;
+  GdkWindow    *drag_handle_window;
 
   GdkWindow    *event_window;
 
@@ -92,6 +94,8 @@
   guint         timeout;
   gboolean      overlaps;
   GtkAllocation old_allocation;
+
+  gboolean      layout_mode_sucks;
 } HildonHomeAppletPriv;
 
 static GtkEventBoxClass *parent_class;
@@ -121,6 +125,12 @@
 static void
 hildon_home_applet_layout_mode_end (HildonHomeApplet *applet);
 
+static GdkWindow *
+hildon_home_applet_create_icon_window (HildonHomeApplet *applet,
+                                       GdkPixbuf *icon,
+                                       gint x,
+                                       gint y);
+
 static gboolean
 hildon_home_applet_button_press_event (GtkWidget *applet,
                                        GdkEventButton   *event);
@@ -168,6 +178,10 @@
                                  guint         property_id,
                                  GValue *value,
                                  GParamSpec   *pspec);
+static GdkFilterReturn
+window_event_filter (GdkXEvent *xevent,
+                     GdkEvent *event,
+                     HildonHomeApplet *applet);
 
 
 GType
@@ -337,6 +351,17 @@
                                    HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE,
                                    pspec);
   
+  pspec =  g_param_spec_boolean ("layout-mode-sucks",
+                                 "Layout mode sucks",
+                                 "Whether or not the layout mode "
+                                 "is considered to suck",
+                                 /*TRUE well really it should*/ FALSE,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+
+  g_object_class_install_property (object_class,
+                                   HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE_SUCKS,
+                                   pspec);
+  
   pspec =  g_param_spec_int ("minimum-width",
                              "Minimum width",
                              "Minimum width for this applet",
@@ -421,6 +446,9 @@
   /* FIXME remove this from the theme */
   gtk_widget_set_name (GTK_WIDGET (self), "osso-home-layoutmode-applet");
 
+  fprintf (stderr, "Layout mode sucks: %i\n", priv->layout_mode_sucks);
+
+
 }
 
 static void
@@ -482,6 +510,11 @@
           hildon_home_applet_set_layout_mode (HILDON_HOME_APPLET (object),
                                               g_value_get_boolean (value));
           break;
+      case HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE_SUCKS:
+          priv->layout_mode_sucks = g_value_get_boolean (value);
+          if (priv->layout_mode_sucks)
+            GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (object), GTK_NO_WINDOW);
+          break;
       case HILDON_HOME_APPLET_PROPERTY_MINIMUM_WIDTH:
           g_object_notify (object, "minimum-width");
           priv->minimum_width = g_value_get_int (value);
@@ -514,6 +547,9 @@
       case HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE:
           g_value_set_boolean (value, priv->layout_mode);
           break;
+      case HILDON_HOME_APPLET_PROPERTY_LAYOUT_MODE_SUCKS:
+          g_value_set_boolean (value, priv->layout_mode_sucks);
+          break;
       case HILDON_HOME_APPLET_PROPERTY_MINIMUM_WIDTH:
           g_value_set_int (value, priv->minimum_width);
           break;
@@ -575,14 +611,43 @@
                                 GTK_STATE_NORMAL);
 #endif
 
-      attributes.wclass = GDK_INPUT_ONLY;
-      attributes_mask = GDK_WA_X | GDK_WA_Y;
 
-      priv->event_window =  gdk_window_new (widget->window,
-                                            &attributes,
-                                            attributes_mask);
-      gdk_window_set_user_data (priv->event_window, widget);
+      if (!priv->layout_mode_sucks)
+        {
+          /* When layout mode is cool, we have an event window
+           * on top of everything to catch the clicks */
+          attributes.wclass = GDK_INPUT_ONLY;
+          attributes_mask = GDK_WA_X | GDK_WA_Y;
+          priv->event_window =  gdk_window_new (widget->window,
+                                                &attributes,
+                                                attributes_mask);
+          gdk_window_set_user_data (priv->event_window, widget);
+        }
+      
+      if (priv->layout_mode_sucks)
+        {
+          priv->drag_handle_window =
+              hildon_home_applet_create_icon_window (HILDON_HOME_APPLET (widget),
+                                                     priv->resize_handle,
+                                                     0,
+                                                     0);
+          
+          if (priv->resize_type != HILDON_HOME_APPLET_RESIZE_NONE)
+            priv->resize_handle_window =
+                hildon_home_applet_create_icon_window 
+                    (HILDON_HOME_APPLET (widget),
+                     priv->resize_handle,
+                     widget->allocation.width - APPLET_RESIZE_HANDLE_WIDTH,
+                     widget->allocation.height - APPLET_RESIZE_HANDLE_HEIGHT);
 
+          gdk_window_set_events (widget->window,
+                                 gdk_window_get_events(widget->window) |
+                                 GDK_SUBSTRUCTURE_MASK);
+          gdk_window_add_filter (widget->window,
+                                 (GdkFilterFunc)window_event_filter,
+                                 widget);
+        }
+
     }
 
   else
@@ -633,7 +698,10 @@
   if (GDK_IS_WINDOW (priv->event_window))
     gdk_window_show (priv->event_window);
 
+  if (priv->drag_handle_window)
+    gdk_window_raise (priv->drag_handle_window);
 
+
 }
 
 static void
@@ -662,7 +730,7 @@
   if (GTK_WIDGET_CLASS (parent_class)->expose_event)
     GTK_WIDGET_CLASS (parent_class)->expose_event (w, event);
   
-  if (w->parent && priv->layout_mode)
+  if (w->parent && (priv->layout_mode || priv->layout_mode_sucks))
     {
       /* Draw the rectangle around */
 
@@ -697,7 +765,7 @@
                               w->allocation.width-LAYOUT_MODE_HIGHLIGHT_WIDTH,
                               w->allocation.height-LAYOUT_MODE_HIGHLIGHT_WIDTH);
         }
-      else /* Normal */
+      else if (!priv->layout_mode_sucks)/* Normal */
         {
           gdk_gc_set_line_attributes (w->style->fg_gc[GTK_STATE_NORMAL],
                                       LAYOUT_MODE_HIGHLIGHT_WIDTH,
@@ -816,6 +884,11 @@
                            &attributes,
                            attributes_mask);
 
+  gdk_window_set_events (window,
+                         gdk_window_get_events (window)
+                         | GDK_BUTTON_PRESS_MASK
+                         | GDK_BUTTON_RELEASE_MASK);
+
   gdk_window_set_user_data (window, w);
   gdk_window_move (window, x, y);
 
@@ -861,8 +934,11 @@
           gdk_window_raise (priv->close_button_window);
       if (priv->resize_handle_window)
         gdk_window_raise (priv->resize_handle_window);
+      if (priv->drag_handle_window)
+        gdk_window_raise (priv->drag_handle_window);
 
-      if (GTK_BIN (applet) && GTK_BIN (applet)->child)
+      if (!priv->layout_mode_sucks && GTK_IS_BIN (applet) &&
+                                      GTK_BIN (applet)->child)
         {
         gtk_widget_set_sensitive (GTK_BIN (applet)->child, TRUE);
         gtk_widget_set_sensitive (GTK_BIN (applet)->child, FALSE);
@@ -883,6 +959,9 @@
  
   widget = GTK_WIDGET (applet);
   priv = HILDON_HOME_APPLET_GET_PRIVATE (applet);
+
+  if (priv->layout_mode_sucks)
+    return;
   
   priv->layout_mode = TRUE;
   
@@ -942,6 +1021,9 @@
   priv = HILDON_HOME_APPLET_GET_PRIVATE (applet);
   widget = GTK_WIDGET (applet);
   
+  if (priv->layout_mode_sucks)
+    return;
+  
   priv->layout_mode = FALSE;
 
   if (priv->close_button_window)
@@ -1134,19 +1216,16 @@
 
   priv = HILDON_HOME_APPLET_GET_PRIVATE (HILDON_HOME_APPLET (w));
 
-  if (!priv->layout_mode)
+  if (!priv->layout_mode_sucks && !priv->layout_mode)
     {
       if (GTK_WIDGET_CLASS (parent_class)->button_press_event)
         return GTK_WIDGET_CLASS (parent_class)->button_press_event (w, event);
       else
         return FALSE;
     }
-  
+
   /* Check if we clicked the close button */
-  if (event->x > HILDON_MARGIN_DEFAULT && 
-      event->x < HILDON_MARGIN_DEFAULT + APPLET_CLOSE_BUTTON_WIDTH &&
-      event->y > HILDON_MARGIN_DEFAULT &&
-      event->y < HILDON_MARGIN_DEFAULT + APPLET_CLOSE_BUTTON_HEIGHT)
+  if (event->window == priv->close_button_window)
     {
       if (HILDON_IS_HOME_AREA (w->parent))
         g_signal_emit_by_name (G_OBJECT (w->parent),
@@ -1155,6 +1234,10 @@
       gtk_widget_destroy (w);
       return TRUE;
     }
+
+  if ((priv->layout_mode_sucks && event->window != priv->drag_handle_window) &&
+      event->window != priv->resize_handle_window)
+    return FALSE;
     
   if (!priv->timeout)
     {
@@ -1164,7 +1247,7 @@
                                w); 
 
       gdk_window_raise (w->window);
-      gdk_pointer_grab (priv->event_window,
+      gdk_pointer_grab (event->window,
                         FALSE,
                         GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK,
                         NULL,
@@ -1173,16 +1256,29 @@
 
       priv->old_allocation = w->allocation;
 
-      if (priv->resize_type != HILDON_HOME_APPLET_RESIZE_NONE &&
-          (w->allocation.width - event->x) < APPLET_RESIZE_HANDLE_WIDTH &&
-          (w->allocation.height - event->y) < APPLET_RESIZE_HANDLE_HEIGHT)
+      if (event->window == priv->resize_handle_window)
         {
-          priv->x_offset = w->allocation.width - event->x;
-          priv->y_offset = w->allocation.height - event->y;
+          gint window_x, window_y;
+          gint window_width, window_height;
+          
+          g_debug ("resizing");
+          
+          gdk_window_get_position (priv->resize_handle_window,
+                                   &window_x,
+                                   &window_y);
+          gdk_drawable_get_size (GDK_DRAWABLE (priv->resize_handle_window),
+                                 &window_width,
+                                 &window_height);
+
+          priv->x_offset = w->allocation.width -
+                           window_x - event->x;
+          priv->y_offset = w->allocation.height -
+                           window_y - event->y;
           priv->state = HILDON_HOME_APPLET_STATE_RESIZING;
         }
       else
         {
+          g_debug ("moving");
           priv->x_offset = event->x;
           priv->y_offset = event->y;
           priv->state = HILDON_HOME_APPLET_STATE_MOVING;
@@ -1204,7 +1300,8 @@
   HildonHomeAppletPriv      *priv;
 
   priv = HILDON_HOME_APPLET_GET_PRIVATE (applet);
-  if (!priv->layout_mode)
+  
+  if (!priv->layout_mode_sucks && !priv->layout_mode)
     {
       if  (GTK_WIDGET_CLASS (parent_class)->button_release_event)
         return GTK_WIDGET_CLASS (parent_class)->button_release_event (applet, event);


More information about the maemo-commits mailing list