[maemo-commits] [maemo-commits] r13434 - in projects/haf/trunk/hildon-desktop: . libhildondesktop

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Aug 28 16:15:54 EEST 2007
Author: jobi
Date: 2007-08-28 16:15:53 +0300 (Tue, 28 Aug 2007)
New Revision: 13434

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-home-item.c
Log:

2007-08-28  Johan Bilien  <johan.bilien at nokia.com>

	* libhildondesktop/hildon-desktop-home-item.c:
	- removed handling of the tap-and-hold
	- when the user taps for more than 400ms without move, propagate
	the button-press and button-release
	- when in normal state, propagate motion-notify events
	Fixes: NB#66765, NB#66429



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-08-28 12:02:56 UTC (rev 13433)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-08-28 13:15:53 UTC (rev 13434)
@@ -1,3 +1,12 @@
+2007-08-28  Johan Bilien  <johan.bilien at nokia.com>
+
+	* libhildondesktop/hildon-desktop-home-item.c:
+	- removed handling of the tap-and-hold
+	- when the user taps for more than 400ms without move, propagate
+	the button-press and button-release
+	- when in normal state, propagate motion-notify events
+	Fixes: NB#66765, NB#66429
+
 2007-08-28  Lucas Rocha  <lucas.rocha at nokia.com>
 
 	* src/hd-applications-menu.c (hd_applications_menu_changed): popdown

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-home-item.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-home-item.c	2007-08-28 12:02:56 UTC (rev 13433)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-home-item.c	2007-08-28 13:15:53 UTC (rev 13434)
@@ -68,14 +68,9 @@
 #define APPLET_CLOSE_BUTTON_HEIGHT  26
 
 #define GRID_SIZE                       10
-#define CLICK_TIMEOUT                   1200
+#define CLICK_TIMEOUT                   400
 #define MOVING_THRESHOLD                30
 
-#define LAYOUT_MODE_HIGHLIGHT_WIDTH 4
-
-#define HH_CLOSE                  (dgettext("hildon-home-image-viewer", "ws_me_close"))
-#define HH_SETTINGS               (dgettext("hildon-home-image-viewer", "ws_me_settings"))
-
 #define HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE(obj) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HILDON_DESKTOP_TYPE_HOME_ITEM, HildonDesktopHomeItemPriv));
 
@@ -185,9 +180,6 @@
 hildon_desktop_home_item_unmap (GtkWidget *widget);
 
 static void
-hildon_desktop_home_item_tap_and_hold (GtkWidget *widget);
-
-static void
 hildon_desktop_home_item_set_property (GObject      *object,
                                        guint         property_id,
                                        const GValue *value,
@@ -207,7 +199,11 @@
                                     HildonDesktopHomeItemState   state,
                                     GdkEventButton              *button);
 
+static void
+hildon_desktop_home_item_propagate_motion_notify (HildonDesktopHomeItem *item,
+                                                  GdkEventMotion        *event);
 
+
 /**
  * hildon_desktop_home_item_resize_type_get_type:
  * @returns: the GType for #HildonDesktopHomeItemResizeType
@@ -303,7 +299,6 @@
   widget_class->unrealize = hildon_desktop_home_item_unrealize;
   widget_class->map = hildon_desktop_home_item_map;
   widget_class->unmap = hildon_desktop_home_item_unmap;
-  widget_class->tap_and_hold = hildon_desktop_home_item_tap_and_hold;
 
   /* We override remove to destroy the applet when it's child is destroyed */
   container_class->remove = hildon_desktop_home_item_remove;
@@ -468,7 +463,6 @@
 {
   HildonDesktopHomeItemPriv    *priv;
   HildonDesktopHomeItemClass   *klass;
-  GtkWidget                    *menu_item;
 
   klass = G_TYPE_INSTANCE_GET_CLASS ((self),
                                      HILDON_DESKTOP_TYPE_HOME_ITEM,
@@ -482,21 +476,8 @@
       priv->close_button = klass->close_button;
     }
 
-  priv->menu = gtk_menu_new ();
-  menu_item = gtk_menu_item_new_with_label (HH_CLOSE);
-  g_signal_connect_swapped (menu_item, "activate",
-                            G_CALLBACK (gtk_widget_destroy),
-                            self);
-  gtk_menu_shell_append (GTK_MENU_SHELL (priv->menu), menu_item);
-  gtk_widget_show (menu_item);
-
   GTK_WIDGET_UNSET_FLAGS (self, GTK_NO_WINDOW);
 
-  gtk_widget_tap_and_hold_setup (GTK_WIDGET (self),
-                                 priv->menu,
-                                 NULL,
-                                 0);
-
 }
 
 static void
@@ -531,6 +512,10 @@
     g_object_unref (priv->resize_handle);
   priv->resize_handle = NULL;
 
+  if (priv->last_click_event)
+      gdk_event_free ((GdkEvent *)priv->last_click_event);
+  priv->last_click_event = NULL;
+
   if (priv->click_timeout)
     {
       g_source_remove (priv->click_timeout);
@@ -775,53 +760,6 @@
 }
 
 static void
-hildon_desktop_home_item_tap_and_hold (GtkWidget *widget)
-{
-  HildonDesktopHomeItemPriv    *priv;
-
-  priv = HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (widget);
-
-  /* If we were in moving or resizing, we should stop */
-  if (priv->state != HILDON_DESKTOP_HOME_ITEM_STATE_NORMAL)
-    {
-      gboolean snap_to_grid = FALSE;
-
-      if (widget->parent)
-        g_object_get (G_OBJECT (widget->parent),
-                      "snap-to-grid", &snap_to_grid,
-                      NULL);
-
-      if (snap_to_grid)
-        hildon_desktop_home_item_snap_to_grid (HILDON_DESKTOP_HOME_ITEM (widget));
-
-      priv->state = HILDON_DESKTOP_HOME_ITEM_STATE_NORMAL;
-      g_object_notify (G_OBJECT (widget), "state");
-
-      gdk_pointer_ungrab (GDK_CURRENT_TIME);
-
-      /* We need to update the rectangle */
-      gtk_widget_queue_draw (widget);
-      if (priv->old_allocation.x != widget->allocation.x ||
-          priv->old_allocation.y != widget->allocation.y ||
-          priv->old_allocation.width != widget->allocation.width ||
-          priv->old_allocation.height != widget->allocation.height)
-
-        {
-          if (HILDON_IS_HOME_AREA (widget->parent))
-            g_signal_emit_by_name (G_OBJECT (widget->parent), "layout-changed");
-        }
-
-      if (HILDON_IS_HOME_AREA (widget->parent))
-        g_signal_emit_by_name (G_OBJECT (widget->parent),
-                               "applet-change-end",
-                               widget);
-    }
-
-  if (GTK_WIDGET_CLASS (parent_class)->tap_and_hold)
-    GTK_WIDGET_CLASS (parent_class)->tap_and_hold(widget);
-}
-
-static void
 hildon_desktop_home_item_size_allocate (GtkWidget *widget,
                                         GtkAllocation *allocation)
 {
@@ -973,9 +911,17 @@
 
   priv = HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (widget);
 
+  if (event->window != priv->event_window &&
+      event->window != priv->resize_handle_window)
+    return FALSE;
+
   if (priv->state == HILDON_DESKTOP_HOME_ITEM_STATE_NORMAL &&
       !priv->click_timeout)
+  {
+    hildon_desktop_home_item_propagate_motion_notify (HILDON_DESKTOP_HOME_ITEM (widget),
+                                                      event);
     return FALSE;
+  }
 
   area = widget->parent;
   gdk_window_get_pointer (area->window, &x_applet, &y_applet, &mod);
@@ -1260,8 +1206,32 @@
 }
 
 static void
-hildon_desktop_home_item_propagate_button (HildonDesktopHomeItem *item)
+hildon_desktop_home_item_propagate_motion_notify (HildonDesktopHomeItem *item,
+                                                  GdkEventMotion        *event)
 {
+  GdkWindow    *child;
+  gint          x, y;
+
+  child = hildon_desktop_home_item_get_window_at (item,
+                                                  event->x,
+                                                  event->y,
+                                                  &x, &y);
+
+  if (!child)
+    return;
+
+  event->window = g_object_ref (child);
+  event->x = x;
+  event->y = y;
+
+  gdk_event_put ((GdkEvent*) event);
+}
+
+static void
+hildon_desktop_home_item_propagate_button (HildonDesktopHomeItem *item,
+                                           gboolean               press,
+                                           gboolean               release)
+{
   HildonDesktopHomeItemPriv    *priv =
       HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (item);
   gint                  x, y;
@@ -1269,9 +1239,6 @@
   GdkEventButton       *event;
   GdkWindow            *child;
 
-  gdk_window_raise (GTK_WIDGET (item)->window);
-  gdk_window_raise (priv->event_window);
-
   child = hildon_desktop_home_item_get_window_at (item,
                                                   priv->last_click_event->x,
                                                   priv->last_click_event->y,
@@ -1280,17 +1247,15 @@
   if (!child)
     return;
 
-  event = priv->last_click_event;
+  event = (GdkEventButton *)gdk_event_copy ((GdkEvent *)priv->last_click_event);
 
   event->x = x;
   event->y = y;
 
+
   /* Send synthetic enter event */
   crossing_event = (GdkEventCrossing *) gdk_event_new (GDK_ENTER_NOTIFY);
-  ((GdkEventAny *)crossing_event)->type = GDK_ENTER_NOTIFY;
-  ((GdkEventAny *)crossing_event)->window = g_object_ref (child);
   ((GdkEventAny *)crossing_event)->send_event = FALSE;
-  crossing_event->subwindow = g_object_ref (child);
   crossing_event->time = event->time;
   crossing_event->x = event->x;
   crossing_event->y = event->y;
@@ -1300,24 +1265,37 @@
   crossing_event->detail = GDK_NOTIFY_UNKNOWN;
   crossing_event->focus = FALSE;
   crossing_event->state = 0;
-  gdk_event_put ((GdkEvent *)crossing_event);
 
   /* Send synthetic click (button press/release) event */
-  ((GdkEventAny *)event)->window = g_object_ref (child);
-  ((GdkEventAny *)event)->type = GDK_BUTTON_PRESS;
-  gdk_event_put ((GdkEvent *)event);
-  ((GdkEventAny *)event)->window = g_object_ref (child);
-  ((GdkEventAny *)event)->type = GDK_BUTTON_RELEASE;
-  gdk_event_put ((GdkEvent *)event);
+  if (press)
+  {
+    ((GdkEventAny *)crossing_event)->type = GDK_ENTER_NOTIFY;
+    ((GdkEventAny *)crossing_event)->window = g_object_ref (child);
+    crossing_event->subwindow = g_object_ref (child);
+    gdk_event_put ((GdkEvent *)crossing_event);
 
-  /* Send synthetic leave event */
-  ((GdkEventAny *)crossing_event)->type = GDK_LEAVE_NOTIFY;
-  ((GdkEventAny *)crossing_event)->window = g_object_ref (child);
-  crossing_event->subwindow = g_object_ref (child);
-  crossing_event->window = g_object_ref (child);
-  crossing_event->detail = GDK_NOTIFY_UNKNOWN;
-  gdk_event_put ((GdkEvent *)crossing_event);
+    ((GdkEventAny *)event)->window = g_object_ref (child);
+    ((GdkEventAny *)event)->type = GDK_BUTTON_PRESS;
+    gdk_event_put ((GdkEvent *)event);
+  }
+
+  if (release)
+  {
+    ((GdkEventAny *)event)->window = g_object_ref (child);
+    ((GdkEventAny *)event)->type = GDK_BUTTON_RELEASE;
+    gdk_event_put ((GdkEvent *)event);
+
+    /* Send synthetic leave event */
+    ((GdkEventAny *)crossing_event)->type = GDK_LEAVE_NOTIFY;
+    ((GdkEventAny *)crossing_event)->window = g_object_ref (child);
+    crossing_event->subwindow = g_object_ref (child);
+    crossing_event->window = g_object_ref (child);
+    crossing_event->detail = GDK_NOTIFY_UNKNOWN;
+    gdk_event_put ((GdkEvent *)crossing_event);
+  }
+
   gdk_event_free ((GdkEvent *)crossing_event);
+  gdk_event_free ((GdkEvent *)event);
 
 }
 
@@ -1329,6 +1307,16 @@
   priv = HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (item);
 
   priv->click_timeout = 0;
+
+  /* If the user did not move, we assume she intends a long
+   * press and we propagate */
+  if (!priv->moving_threshold)
+  {
+    hildon_desktop_home_item_propagate_button (item,
+                                               TRUE,
+                                               FALSE);
+  }
+
   return FALSE;
 }
 
@@ -1367,6 +1355,9 @@
         }
       else
         {
+          if (priv->last_click_event)
+            gdk_event_free ((GdkEvent *)priv->last_click_event);
+
           priv->last_click_event =
               (GdkEventButton *)gdk_event_copy ((GdkEvent *)event);
 
@@ -1387,30 +1378,40 @@
                                                GdkEventButton  *event)
 {
   HildonDesktopHomeItemPriv      *priv;
+  HildonDesktopHomeItem          *item;
 
   priv = HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (widget);
-  hildon_desktop_home_item_raise (HILDON_DESKTOP_HOME_ITEM (widget));
+  item = HILDON_DESKTOP_HOME_ITEM (widget);
+  hildon_desktop_home_item_raise (item);
 
   if (event->window != priv->event_window &&
       event->window != priv->resize_handle_window)
     return FALSE;
 
-  if (priv->click_timeout)
+  if (event->window == priv->event_window)
+  {
+    if (priv->click_timeout)
     {
       g_source_remove (priv->click_timeout);
       priv->click_timeout = 0;
-      hildon_desktop_home_item_propagate_button (HILDON_DESKTOP_HOME_ITEM (widget));
+      hildon_desktop_home_item_propagate_button (item,
+                                                 TRUE,
+                                                 TRUE);
       return FALSE;
     }
+    else if (!priv->moving_threshold)
+    {
+      hildon_desktop_home_item_propagate_button (item,
+                                                 FALSE,
+                                                 TRUE);
+      return FALSE;
+    }
 
-  if (priv->last_click_event)
-  {
-    gdk_event_free ((GdkEvent *)priv->last_click_event);
-    priv->last_click_event = NULL;
+
   }
 
   if (priv->state != HILDON_DESKTOP_HOME_ITEM_STATE_NORMAL)
-    hildon_desktop_home_item_set_state (HILDON_DESKTOP_HOME_ITEM (widget),
+    hildon_desktop_home_item_set_state (item,
                                         HILDON_DESKTOP_HOME_ITEM_STATE_NORMAL,
                                         event);
 
@@ -1450,7 +1451,7 @@
                                     GdkEventButton              *event)
 {
   HildonDesktopHomeItemPriv    *priv;
-  GtkWidget                    *widget; 
+  GtkWidget                    *widget;
 
   priv = HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (item);
   widget = GTK_WIDGET (item);
@@ -1570,10 +1571,10 @@
 GtkWidget *
 hildon_desktop_home_item_new (void)
 {
-  HildonDesktopHomeItem *newapplet = g_object_new(HILDON_DESKTOP_TYPE_HOME_ITEM,
-                                             NULL);
+  GtkWidget *newapplet = g_object_new (HILDON_DESKTOP_TYPE_HOME_ITEM,
+                                       NULL);
 
-  return GTK_WIDGET(newapplet);
+  return newapplet;
 }
 
 /**
@@ -1681,7 +1682,7 @@
 {
   HildonDesktopHomeItemPriv    *priv;
   GtkWidget                    *top_level;
-  
+
   g_return_val_if_fail (HILDON_DESKTOP_IS_HOME_ITEM (item), NULL);
 
   priv = HILDON_DESKTOP_HOME_ITEM_GET_PRIVATE (item);
@@ -1695,21 +1696,7 @@
                          "settings",
                          GTK_IS_WINDOW (top_level) ? top_level : NULL,
                          &priv->settings_menu_item);
-  
-  if (GTK_IS_MENU_ITEM (priv->settings_menu_item))
-  {
-    GtkWidget *settings_item;
 
-    g_debug ("Adding to applet menu");
-    settings_item = gtk_menu_item_new_with_label (HH_SETTINGS);
-    gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->menu), settings_item);
-    gtk_widget_show (settings_item);
-
-    g_signal_connect_swapped (settings_item, "activate",
-                              G_CALLBACK (gtk_widget_activate),
-                              priv->settings_menu_item);
-  }
-
   return priv->settings_menu_item;
 }
 


More information about the maemo-commits mailing list