[mutter/wip/barriers: 11/16] window: Implement tiling/maximizing through touch events



commit de0d9e4da8b47c777aa13a6913c1cc253a13da98
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Aug 2 19:33:20 2011 +0200

    window: Implement tiling/maximizing through touch events
    
    If during a multitouch drag, the area height is 1.5x the original
    size, the window is tiled to the closest side the hotspot is on
    (left/right).
    
    If both with/height are 1.5x the original, the window is maximized.

 src/core/window-private.h |    4 ++++
 src/core/window.c         |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 0 deletions(-)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index f9a796f..f2a928d 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -431,6 +431,10 @@ struct _MetaWindow
   MetaFocusInfo *cur_focus;
 
   GHashTable *cur_touches;
+  gdouble initial_touch_area_width;
+  gdouble initial_touch_area_height;
+  gdouble cur_touch_area_width;
+  gdouble cur_touch_area_height;
 };
 
 struct _MetaWindowClass
diff --git a/src/core/window.c b/src/core/window.c
index b42244f..d5a9483 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -8827,6 +8827,27 @@ update_move (MetaWindow  *window,
       else if (meta_window_can_tile_maximized (window) &&
                y >= monitor->rect.y && y <= work_area.y)
         window->tile_mode = META_TILE_MAXIMIZED;
+      else if (window->cur_touches &&
+               g_hash_table_size (window->cur_touches) == 3)
+        {
+          window->tile_mode = META_TILE_NONE;
+
+          if (window->cur_touch_area_height >
+              window->initial_touch_area_height * 1.5)
+            {
+              if (window->cur_touch_area_width >
+                  window->initial_touch_area_width * 1.5 &&
+                  meta_window_can_tile_maximized (window))
+                window->tile_mode = META_TILE_MAXIMIZED;
+              else if (meta_window_can_tile_side_by_side (window, device))
+                {
+                  if (x < (monitor->rect.x + (monitor->rect.width / 2)))
+                    window->tile_mode = META_TILE_LEFT;
+                  else
+                    window->tile_mode = META_TILE_RIGHT;
+                }
+            }
+        }
       else
         window->tile_mode = META_TILE_NONE;
 
@@ -11345,6 +11366,11 @@ meta_window_end_touch (MetaWindow *window,
 
   n_touches = g_hash_table_size (window->cur_touches);
 
+  window->initial_touch_area_width = 0;
+  window->initial_touch_area_height = 0;
+  window->cur_touch_area_width = 0;
+  window->cur_touch_area_height = 0;
+
   if (n_touches == 2)
     {
       MetaDevice *device;
@@ -11352,4 +11378,10 @@ meta_window_end_touch (MetaWindow *window,
       device = meta_input_event_get_device (window->display, event);
       meta_display_end_grab_op (window->display, device, evtime);
     }
+  else if (n_touches == 0 &&
+           window->tile_mode != META_TILE_NONE)
+    {
+      meta_window_tile (window);
+      update_tile_mode (window);
+    }
 }



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