[gtk+/multitouch: 51/57] gtk, pah: Use the touch area if available for the notification size.



commit 587842bbac00772201b67017e4a2e3f78eb18859
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Nov 6 12:13:14 2011 +0100

    gtk,pah: Use the touch area if available for the notification size.
    
    On touch devices, and if the touch area isn't provided, it resorts
    to using a 2.5cm diameter via gdk_screen_get_width_mm() in the hope
    that it'll pop out of the finger area

 gtk/gtkwidget.c |   48 ++++++++++++++++++++++++++++++++++--------------
 1 files changed, 34 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index a0bbcbf..5c0759a 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -550,6 +550,7 @@ typedef struct
   /* animation */
   GtkWidget *popup;
   guint delay_animation_id;
+  guint size;
 
   gint start_x;
   gint start_y;
@@ -7004,14 +7005,9 @@ _gtk_widget_press_and_hold_check_threshold (GtkWidget      *widget,
     }
 
   if (data->popup)
-    {
-      guint cursor_size;
-
-      cursor_size = gdk_display_get_default_cursor_size (gtk_widget_get_display (widget));
-      gtk_window_move (GTK_WINDOW (data->popup),
-                       event->x_root - cursor_size / 2,
-                       event->y_root - cursor_size / 2);
-    }
+    gtk_window_move (GTK_WINDOW (data->popup),
+                     event->x_root - data->size / 2,
+                     event->y_root - data->size / 2);
 
   return FALSE;
 }
@@ -7107,17 +7103,15 @@ gtk_widget_press_and_hold_begin_animation_timeout (gpointer user_data)
   GtkWidget *widget = GTK_WIDGET (user_data);
   PressAndHoldData *data;
   gint x, y;
-  guint cursor_size;
 
   data = gtk_widget_peek_press_and_hold_data (widget);
   g_assert (data != NULL);
 
   gdk_window_get_device_position (gdk_screen_get_root_window (gtk_widget_get_screen (widget)),
                                   data->device, &x, &y, NULL);
-  cursor_size = gdk_display_get_default_cursor_size (gtk_widget_get_display (widget));
   gtk_window_move (GTK_WINDOW (data->popup),
-                   x - cursor_size / 2,
-                   y - cursor_size / 2);
+                   x - data->size / 2,
+                   y - data->size / 2);
   gtk_widget_show (data->popup);
 
   gtk_widget_set_state_flags (GTK_WIDGET (data->popup),
@@ -7200,8 +7194,34 @@ _gtk_widget_press_and_hold_check_start (GtkWidget      *widget,
                         G_CALLBACK (press_and_hold_animation_draw),
                         widget);
 
-      cursor_size = gdk_display_get_default_cursor_size (gtk_widget_get_display (widget));
-      gtk_window_resize (GTK_WINDOW (data->popup), cursor_size, cursor_size);
+      source_device = gdk_event_get_source_device ((GdkEvent *) event);
+      source = gdk_device_get_source (source_device);
+
+      if (source == GDK_SOURCE_TOUCH ||
+          source == GDK_SOURCE_MULTITOUCH)
+        {
+          cairo_region_t *region;
+
+          region = gdk_event_get_touch_area ((GdkEvent *) event);
+
+          if (region)
+            {
+              cairo_rectangle_int_t rect;
+
+              cairo_region_get_extents (region, &rect);
+              data->size = MAX (rect.width, rect.height);
+            }
+          else
+            {
+              /* Have an indicator with 2.5cm of diameter */
+              data->size = (25 * gdk_screen_get_width (screen)) /
+                gdk_screen_get_width_mm (screen);
+            }
+        }
+      else
+        data->size = gdk_display_get_default_cursor_size (gtk_widget_get_display (widget));
+
+      gtk_window_resize (GTK_WINDOW (data->popup), data->size, data->size);
 
       region = cairo_region_create ();
       gdk_window_input_shape_combine_region (gtk_widget_get_window (data->popup), region, 0, 0);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]