]> Dogcows Code - chaz/openbox/blobdiff - openbox/moveresize.c
Merge branch 'master' into chaz
[chaz/openbox] / openbox / moveresize.c
index 96cd62394cf9c239edf9d7d71814946af90877a9..a8965570b10c22de31cb0b9269ae4bcf1ff0c022 100644 (file)
@@ -21,6 +21,7 @@
 #include "framerender.h"
 #include "screen.h"
 #include "client.h"
+#include "focus.h"
 #include "frame.h"
 #include "openbox.h"
 #include "resist.h"
@@ -61,9 +62,11 @@ static guint button;
 static guint32 corner;
 static ObDirection edge_warp_dir = -1;
 static gboolean edge_warp_odd = FALSE;
+static guint edge_warp_timer = 0;
 static ObDirection key_resize_edge = -1;
-#ifdef SYNC
 static guint waiting_for_sync;
+#ifdef SYNC
+static guint sync_timer = 0;
 #endif
 
 static ObPopup *popup = NULL;
@@ -80,6 +83,8 @@ static void client_dest(ObClient *client, gpointer data)
 {
     if (moveresize_client == client)
         moveresize_end(TRUE);
+    if (popup && client == popup->client)
+        popup->client = NULL;
 }
 
 void moveresize_startup(gboolean reconfig)
@@ -164,6 +169,7 @@ static void popup_coords(ObClient *c, const gchar *format, gint a, gint b)
 
         popup_position(popup, gravity, x, y);
     }
+    popup->client = c;
     popup_show(popup, text);
     g_free(text);
 }
@@ -260,6 +266,7 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
     cur_h = start_ch;
 
     moveresize_in_progress = TRUE;
+    waiting_for_sync = 0;
 
 #ifdef SYNC
     if (config_resize_redraw && !moving && obt_display_extension_sync &&
@@ -298,8 +305,6 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
                                             XSyncCADelta |
                                             XSyncCAEvents,
                                             &aa);
-
-        waiting_for_sync = 0;
     }
 #endif
 }
@@ -310,6 +315,7 @@ void moveresize_end(gboolean cancel)
     ungrab_pointer();
 
     popup_hide(popup);
+    popup->client = NULL;
 
     if (!moving) {
 #ifdef SYNC
@@ -319,7 +325,8 @@ void moveresize_end(gboolean cancel)
             moveresize_alarm = None;
         }
 
-        obt_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
+        if (sync_timer) g_source_remove(sync_timer);
+        sync_timer = 0;
 #endif
     }
 
@@ -433,10 +440,8 @@ static void do_resize(void)
 
             waiting_for_sync = 1;
 
-            obt_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
-            obt_main_loop_timeout_add(ob_main_loop, G_USEC_PER_SEC * 2,
-                                      sync_timeout_func,
-                                      NULL, NULL, NULL);
+            if (sync_timer) g_source_remove(sync_timer);
+            sync_timer = g_timeout_add(2000, sync_timeout_func, NULL);
         }
 #endif
 
@@ -461,8 +466,10 @@ static gboolean sync_timeout_func(gpointer data)
     ++waiting_for_sync; /* we timed out waiting for our sync... */
     do_resize(); /* ...so let any pending resizes through */
 
-    if (waiting_for_sync > SYNC_TIMEOUTS)
+    if (waiting_for_sync > SYNC_TIMEOUTS) {
+        sync_timer = 0;
         return FALSE; /* don't repeat */
+    }
     else
         return TRUE; /* keep waiting */
 }
@@ -579,19 +586,19 @@ static void edge_warp_move_ptr(void)
     a = screen_physical_area_all_monitors();
 
     switch (edge_warp_dir) {
-       case OB_DIRECTION_NORTH:
-           y = a->height - 1;
-           break;
-       case OB_DIRECTION_EAST:
-           x = a->x;
-           break;
-       case OB_DIRECTION_SOUTH:
-           y = a->y;
-           break;
-       case OB_DIRECTION_WEST:
-           x = a->width - 1;
-           break;
-       default:
+    case OB_DIRECTION_NORTH:
+        y = a->height - 2;
+        break;
+    case OB_DIRECTION_EAST:
+        x = a->x + 1;
+        break;
+    case OB_DIRECTION_SOUTH:
+        y = a->y + 1;
+        break;
+    case OB_DIRECTION_WEST:
+        x = a->width - 2;
+        break;
+    default:
         g_assert_not_reached();
     }
 
@@ -627,6 +634,10 @@ static void do_edge_warp(gint x, gint y)
 
     for (i = 0; i < screen_num_monitors; ++i) {
         const Rect *a = screen_physical_area_monitor(i);
+
+        if (!RECT_CONTAINS(*a, x, y))
+            continue;
+
         if (x == RECT_LEFT(*a)) dir = OB_DIRECTION_WEST;
         if (x == RECT_RIGHT(*a)) dir = OB_DIRECTION_EAST;
         if (y == RECT_TOP(*a)) dir = OB_DIRECTION_NORTH;
@@ -649,10 +660,8 @@ static void do_edge_warp(gint x, gint y)
         cancel_edge_warp();
         if (dir != (ObDirection)-1) {
             edge_warp_odd = TRUE; /* switch on the first timeout */
-            obt_main_loop_timeout_add(ob_main_loop,
-                                      config_mouse_screenedgetime * 1000,
-                                      edge_warp_delay_func,
-                                      NULL, NULL, NULL);
+            edge_warp_timer = g_timeout_add(config_mouse_screenedgetime,
+                                            edge_warp_delay_func, NULL);
         }
         edge_warp_dir = dir;
     }
@@ -660,7 +669,8 @@ static void do_edge_warp(gint x, gint y)
 
 static void cancel_edge_warp(void)
 {
-    obt_main_loop_timeout_remove(ob_main_loop, edge_warp_delay_func);
+    if (edge_warp_timer) g_source_remove(edge_warp_timer);
+    edge_warp_timer = 0;
 }
 
 static void move_with_keys(KeySym sym, guint state)
@@ -1082,5 +1092,9 @@ gboolean moveresize_event(XEvent *e)
         used = TRUE;
     }
 #endif
+
+    if (used && moveresize_client == focus_client)
+        event_update_user_time();
+
     return used;
 }
This page took 0.024969 seconds and 4 git commands to generate.