]> Dogcows Code - chaz/openbox/blobdiff - openbox/moveresize.c
Remove newline from startupnotify description
[chaz/openbox] / openbox / moveresize.c
index dd0605c692a249da7d8443e0e4a7bb4e24d963b4..f324818df86b058afa692c4b867ab5050c3f3177 100644 (file)
@@ -55,6 +55,7 @@ static gint cur_x, cur_y, cur_w, cur_h;
 static guint button;
 static guint32 corner;
 static ObDirection edge_warp_dir = -1;
+static gboolean edge_warp_odd = FALSE;
 static ObDirection key_resize_edge = -1;
 #ifdef SYNC
 static gboolean waiting_for_sync;
@@ -62,6 +63,8 @@ static gboolean waiting_for_sync;
 
 static ObPopup *popup = NULL;
 
+static void do_move(gboolean keyboard, gint keydist);
+static void do_resize(void);
 static void do_edge_warp(gint x, gint y);
 static void cancel_edge_warp();
 #ifdef SYNC
@@ -76,7 +79,7 @@ static void client_dest(ObClient *client, gpointer data)
 
 void moveresize_startup(gboolean reconfig)
 {
-    popup = popup_new(FALSE);
+    popup = popup_new();
     popup_set_text_align(popup, RR_JUSTIFY_CENTER);
 
     if (!reconfig)
@@ -100,17 +103,64 @@ static void popup_coords(ObClient *c, const gchar *format, gint a, gint b)
     gchar *text;
 
     text = g_strdup_printf(format, a, b);
-    if (config_resize_popup_pos == 1) /* == "Top" */
+    if (config_resize_popup_pos == OB_RESIZE_POS_TOP)
         popup_position(popup, SouthGravity,
                        c->frame->area.x
                      + c->frame->area.width/2,
                        c->frame->area.y - ob_rr_theme->fbwidth);
-    else /* == "Center" */
+    else if (config_resize_popup_pos == OB_RESIZE_POS_CENTER)
         popup_position(popup, CenterGravity,
-                       c->frame->area.x + c->frame->size.left +
-                       c->area.width / 2,
-                       c->frame->area.y + c->frame->size.top +
-                       c->area.height / 2);
+                       c->frame->area.x + c->frame->area.width / 2,
+                       c->frame->area.y + c->frame->area.height / 2);
+    else /* Fixed */ {
+        Rect *area = screen_physical_area_active();
+        gint gravity, x, y;
+
+        x = config_resize_popup_fixed.x.pos;
+        if (config_resize_popup_fixed.x.center)
+            x = area->x + area->width/2;
+        else if (config_resize_popup_fixed.x.opposite)
+            x = RECT_RIGHT(*area) - x;
+        else
+            x = area->x + x;
+
+        y = config_resize_popup_fixed.y.pos;
+        if (config_resize_popup_fixed.y.center)
+            y = area->y + area->height/2;
+        else if (config_resize_popup_fixed.y.opposite)
+            y = RECT_RIGHT(*area) - y;
+        else
+            y = area->y + y;
+
+        if (config_resize_popup_fixed.x.center) {
+            if (config_resize_popup_fixed.y.center)
+                gravity = CenterGravity;
+            else if (config_resize_popup_fixed.y.opposite)
+                gravity = SouthGravity;
+            else
+                gravity = NorthGravity;
+        }
+        else if (config_resize_popup_fixed.x.opposite) {
+            if (config_resize_popup_fixed.y.center)
+                gravity = EastGravity;
+            else if (config_resize_popup_fixed.y.opposite)
+                gravity = SouthEastGravity;
+            else
+                gravity = NorthEastGravity;
+        }
+        else {
+            if (config_resize_popup_fixed.y.center)
+                gravity = WestGravity;
+            else if (config_resize_popup_fixed.y.opposite)
+                gravity = SouthWestGravity;
+            else
+                gravity = NorthWestGravity;
+        }
+
+        popup_position(popup, gravity, x, y);
+
+        g_free(area);
+    }
     popup_show(popup, text);
     g_free(text);
 }
@@ -120,6 +170,8 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
     ObCursor cur;
     gboolean mv = (cnr == prop_atoms.net_wm_moveresize_move ||
                    cnr == prop_atoms.net_wm_moveresize_move_keyboard);
+    gint up = 1;
+    gint left = 1;
 
     if (moveresize_in_progress || !c->frame->visible ||
         !(mv ?
@@ -127,23 +179,28 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
           (c->functions & OB_CLIENT_FUNC_RESIZE)))
         return;
 
-    if (cnr == prop_atoms.net_wm_moveresize_size_topleft)
+    if (cnr == prop_atoms.net_wm_moveresize_size_topleft) {
         cur = OB_CURSOR_NORTHWEST;
-    else if (cnr == prop_atoms.net_wm_moveresize_size_top)
+        up = left = -1;
+    } else if (cnr == prop_atoms.net_wm_moveresize_size_top) {
         cur = OB_CURSOR_NORTH;
-    else if (cnr == prop_atoms.net_wm_moveresize_size_topright)
+        up = -1;
+    } else if (cnr == prop_atoms.net_wm_moveresize_size_topright) {
         cur = OB_CURSOR_NORTHEAST;
-    else if (cnr == prop_atoms.net_wm_moveresize_size_right)
+        up = -1;
+    } else if (cnr == prop_atoms.net_wm_moveresize_size_right)
         cur = OB_CURSOR_EAST;
     else if (cnr == prop_atoms.net_wm_moveresize_size_bottomright)
         cur = OB_CURSOR_SOUTHEAST;
     else if (cnr == prop_atoms.net_wm_moveresize_size_bottom)
         cur = OB_CURSOR_SOUTH;
-    else if (cnr == prop_atoms.net_wm_moveresize_size_bottomleft)
+    else if (cnr == prop_atoms.net_wm_moveresize_size_bottomleft) {
         cur = OB_CURSOR_SOUTHWEST;
-    else if (cnr == prop_atoms.net_wm_moveresize_size_left)
+        left = -1;
+    } else if (cnr == prop_atoms.net_wm_moveresize_size_left) {
         cur = OB_CURSOR_WEST;
-    else if (cnr == prop_atoms.net_wm_moveresize_size_keyboard)
+        left = -1;
+    } else if (cnr == prop_atoms.net_wm_moveresize_size_keyboard)
         cur = OB_CURSOR_SOUTHEAST;
     else if (cnr == prop_atoms.net_wm_moveresize_move)
         cur = OB_CURSOR_MOVE;
@@ -172,8 +229,8 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
        friendly. you essentially start the resize in the middle of the
        increment instead of at 0, so you have to move half an increment
        either way instead of a full increment one and 1 px the other. */
-    start_x = x - (mv ? 0 : c->size_inc.width / 2);
-    start_y = y - (mv ? 0 : c->size_inc.height / 2);
+    start_x = x - (mv ? 0 : left * c->size_inc.width / 2);
+    start_y = y - (mv ? 0 : up * c->size_inc.height / 2);
     corner = cnr;
     button = b;
     key_resize_edge = -1;
@@ -195,7 +252,8 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
 
 #ifdef SYNC
     if (config_resize_redraw && !moving && extensions_sync &&
-        moveresize_client->sync_request && moveresize_client->sync_counter)
+        moveresize_client->sync_request && moveresize_client->sync_counter &&
+        !moveresize_client->not_responding)
     {
         /* Initialize values for the resize syncing, and create an alarm for
            the client's xsync counter */
@@ -290,8 +348,7 @@ static void do_move(gboolean keyboard, gint keydist)
                      moveresize_client->frame->area.y);
 }
 
-
-static void do_resize()
+static void do_resize(void)
 {
     gint x, y, w, h, lw, lh;
 
@@ -302,52 +359,52 @@ static void do_resize()
     h = cur_h;
     client_try_configure(moveresize_client, &x, &y, &w, &h,
                          &lw, &lh, TRUE);
-    if (w == moveresize_client->area.width &&
-        h == moveresize_client->area.height)
+    if (!(w == moveresize_client->area.width &&
+          h == moveresize_client->area.height))
     {
-        return;
-    }
 
 #ifdef SYNC
-    if (config_resize_redraw && extensions_sync &&
-        moveresize_client->sync_request && moveresize_client->sync_counter)
-    {
-        XEvent ce;
-        XSyncValue val;
-
-        /* are we already waiting for the sync counter to catch up? */
-        if (waiting_for_sync)
-            return;
-
-        /* increment the value we're waiting for */
-        ++moveresize_client->sync_counter_value;
-        XSyncIntToValue(&val, moveresize_client->sync_counter_value);
-
-        /* tell the client what we're waiting for */
-        ce.xclient.type = ClientMessage;
-        ce.xclient.message_type = prop_atoms.wm_protocols;
-        ce.xclient.display = ob_display;
-        ce.xclient.window = moveresize_client->window;
-        ce.xclient.format = 32;
-        ce.xclient.data.l[0] = prop_atoms.net_wm_sync_request;
-        ce.xclient.data.l[1] = event_curtime;
-        ce.xclient.data.l[2] = XSyncValueLow32(val);
-        ce.xclient.data.l[3] = XSyncValueHigh32(val);
-        ce.xclient.data.l[4] = 0l;
-        XSendEvent(ob_display, moveresize_client->window, FALSE,
-                   NoEventMask, &ce);
-
-        waiting_for_sync = TRUE;
-
-        ob_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
-        ob_main_loop_timeout_add(ob_main_loop, G_USEC_PER_SEC * 2,
-                                 sync_timeout_func,
-                                 NULL, NULL, NULL);
-    }
+        if (config_resize_redraw && extensions_sync &&
+            moveresize_client->sync_request &&
+            moveresize_client->sync_counter &&
+            !moveresize_client->not_responding)
+        {
+            XEvent ce;
+            XSyncValue val;
+
+            /* are we already waiting for the sync counter to catch up? */
+            if (waiting_for_sync)
+                return;
+
+            /* increment the value we're waiting for */
+            ++moveresize_client->sync_counter_value;
+            XSyncIntToValue(&val, moveresize_client->sync_counter_value);
+
+            /* tell the client what we're waiting for */
+            ce.xclient.type = ClientMessage;
+            ce.xclient.message_type = prop_atoms.wm_protocols;
+            ce.xclient.display = ob_display;
+            ce.xclient.window = moveresize_client->window;
+            ce.xclient.format = 32;
+            ce.xclient.data.l[0] = prop_atoms.net_wm_sync_request;
+            ce.xclient.data.l[1] = event_curtime;
+            ce.xclient.data.l[2] = XSyncValueLow32(val);
+            ce.xclient.data.l[3] = XSyncValueHigh32(val);
+            ce.xclient.data.l[4] = 0l;
+            XSendEvent(ob_display, moveresize_client->window, FALSE,
+                       NoEventMask, &ce);
+
+            waiting_for_sync = TRUE;
+
+            ob_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
+            ob_main_loop_timeout_add(ob_main_loop, G_USEC_PER_SEC * 2,
+                                     sync_timeout_func, NULL, NULL, NULL);
+        }
 #endif
 
-    client_configure(moveresize_client, cur_x, cur_y, cur_w, cur_h,
-                     TRUE, FALSE, FALSE);
+        client_configure(moveresize_client, cur_x, cur_y, cur_w, cur_h,
+                TRUE, FALSE, FALSE);
+    }
 
     /* this would be better with a fixed width font ... XXX can do it better
        if there are 2 text boxes */
@@ -355,9 +412,7 @@ static void do_resize()
             (config_resize_popup_show == 1 && /* == "Nonpixel" */
              moveresize_client->size_inc.width > 1 &&
              moveresize_client->size_inc.height > 1))
-        popup_coords(moveresize_client, "%d x %d",
-                     moveresize_client->logical_size.width,
-                     moveresize_client->logical_size.height);
+        popup_coords(moveresize_client, "%d x %d", lw, lh);
 }
 
 #ifdef SYNC
@@ -476,12 +531,15 @@ static gboolean edge_warp_delay_func(gpointer data)
 {
     guint d;
 
-    d = screen_find_desktop(screen_desktop, edge_warp_dir, TRUE, FALSE);
-    if (d != screen_desktop) screen_set_desktop(d, TRUE);
-
-    edge_warp_dir = -1;
+    /* only fire every second time. so it's fast the first time, but slower
+       after that */
+    if (edge_warp_odd) {
+        d = screen_find_desktop(screen_desktop, edge_warp_dir, TRUE, FALSE);
+        if (d != screen_desktop) screen_set_desktop(d, TRUE);
+    }
+    edge_warp_odd = !edge_warp_odd;
 
-    return FALSE; /* don't repeat */
+    return TRUE; /* do repeat ! */
 }
 
 static void do_edge_warp(gint x, gint y)
@@ -515,18 +573,19 @@ static void do_edge_warp(gint x, gint y)
     }
 
     if (dir != edge_warp_dir) {
-        if (dir == (ObDirection)-1)
-            cancel_edge_warp();
-        else
+        cancel_edge_warp();
+        if (dir != (ObDirection)-1) {
+            edge_warp_odd = TRUE; /* switch on the first timeout */
             ob_main_loop_timeout_add(ob_main_loop,
                                      config_mouse_screenedgetime * 1000,
                                      edge_warp_delay_func,
                                      NULL, NULL, NULL);
+        }
         edge_warp_dir = dir;
     }
 }
 
-static void cancel_edge_warp()
+static void cancel_edge_warp(void)
 {
     ob_main_loop_timeout_remove(ob_main_loop, edge_warp_delay_func);
 }
This page took 0.032461 seconds and 4 git commands to generate.