[maemo-commits] [maemo-commits] r13434 - in projects/haf/trunk/hildon-desktop: . libhildondesktop
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Tue Aug 28 16:15:54 EEST 2007
- Previous message: [maemo-commits] r13433 - in projects/haf/trunk/hildon-home-webshortcut: . plugin
- Next message: [maemo-commits] r13435 - in projects/haf/trunk/hildon-desktop: . src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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; }
- Previous message: [maemo-commits] r13433 - in projects/haf/trunk/hildon-home-webshortcut: . plugin
- Next message: [maemo-commits] r13435 - in projects/haf/trunk/hildon-desktop: . src
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]