]> Dogcows Code - chaz/openbox/blobdiff - openbox/moveresize.c
yay. way way cleaner code for iconify animations. let people show/hide the frame...
[chaz/openbox] / openbox / moveresize.c
index 6db822c3f9d3b0d4a3e6bb7303fa9e1782b60369..b0b1f2a106daabeda8afb1a38aa3947084a8cc42 100644 (file)
@@ -82,6 +82,50 @@ void moveresize_shutdown(gboolean reconfig)
     popup = NULL;
 }
 
+static void get_resize_position(gint *x, gint *y, gboolean cancel)
+{
+    gint dw, dh;
+    gint w, h, lw, lh;
+
+    *x = moveresize_client->frame->area.x;
+    *y = moveresize_client->frame->area.y;
+
+    if (cancel) {
+        w = start_cw;
+        h = start_ch;
+    } else {
+        w = cur_x;
+        h = cur_y;
+    }
+
+    /* see how much it is actually going to resize */
+    {
+        gint cx = *x, cy = *y;
+        frame_frame_gravity(moveresize_client->frame, &cx, &cy, w, h);
+        client_try_configure(moveresize_client, &cx, &cy, &w, &h,
+                             &lw, &lh, TRUE);
+    }
+    dw = w - moveresize_client->area.width;
+    dh = h - moveresize_client->area.height;
+
+    switch (lockcorner) {
+    case OB_CORNER_TOPLEFT:
+        break;
+    case OB_CORNER_TOPRIGHT:
+        *x -= dw;
+        break;
+    case OB_CORNER_BOTTOMLEFT:
+        *y -= dh;
+        break;
+    case OB_CORNER_BOTTOMRIGHT:
+        *x -= dw;
+        *y -= dh;
+        break;
+    }
+
+    frame_frame_gravity(moveresize_client->frame, x, y, w, h);
+}
+
 static void popup_coords(ObClient *c, const gchar *format, gint a, gint b)
 {
     gchar *text;
@@ -115,9 +159,11 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
           (c->functions & OB_CLIENT_FUNC_RESIZE)))
         return;
 
+    frame_end_iconify_animation(c->frame);
+
     moveresize_client = c;
-    start_cx = c->frame->area.x;
-    start_cy = c->frame->area.y;
+    start_cx = c->area.x;
+    start_cy = c->area.y;
     /* these adjustments for the size_inc make resizing a terminal more
        friendly. you essentially start the resize in the middle of the
        increment instead of at 0, so you have to move half an increment
@@ -220,6 +266,8 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
 
 void moveresize_end(gboolean cancel)
 {
+    gint x, y;
+
     grab_keyboard(FALSE);
     grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
 
@@ -238,9 +286,8 @@ void moveresize_end(gboolean cancel)
         }
 #endif
 
-        client_configure(moveresize_client, lockcorner,
-                         moveresize_client->area.x,
-                         moveresize_client->area.y,
+        get_resize_position(&x, &y, cancel);
+        client_configure(moveresize_client, x, y,
                          (cancel ? start_cw : cur_x),
                          (cancel ? start_ch : cur_y), TRUE, TRUE);
     }
@@ -256,9 +303,7 @@ static void do_move(gboolean resist)
         resist_move_monitors(moveresize_client, &cur_x, &cur_y);
     }
 
-    /* get where the client should be */
-    frame_frame_gravity(moveresize_client->frame, &cur_x, &cur_y);
-    client_configure(moveresize_client, OB_CORNER_TOPLEFT, cur_x, cur_y,
+    client_configure(moveresize_client, cur_x, cur_y,
                      moveresize_client->area.width,
                      moveresize_client->area.height, TRUE, FALSE);
     if (config_resize_popup_show == 2) /* == "Always" */
@@ -282,11 +327,11 @@ static void do_resize()
             return;
 
         /* see if it is actually going to resize */
-        x = moveresize_client->area.x;
-        y = moveresize_client->area.y;
+        x = 0;
+        y = 0;
         w = cur_x;
         h = cur_y;
-        client_try_configure(moveresize_client, lockcorner, &x, &y, &w, &h,
+        client_try_configure(moveresize_client, &x, &y, &w, &h,
                              &lw, &lh, TRUE);
         if (w == moveresize_client->area.width &&
             h == moveresize_client->area.height)
@@ -316,17 +361,18 @@ static void do_resize()
     }
 #endif
 
-    client_configure(moveresize_client, lockcorner, 
-                     moveresize_client->area.x, moveresize_client->area.y,
-                     cur_x, cur_y, TRUE, FALSE);
+    {
+        gint x, y;
+        get_resize_position(&x, &y, FALSE);
+        client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE);
+    }
 
     /* this would be better with a fixed width font ... XXX can do it better
        if there are 2 text boxes */
     if (config_resize_popup_show == 2 || /* == "Always" */
             (config_resize_popup_show == 1 && /* == "Nonpixel" */
-                (moveresize_client->size_inc.width > 1 ||
-                 moveresize_client->size_inc.height > 1))
-        )
+             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);
@@ -351,8 +397,10 @@ static void calc_resize(gboolean resist)
         moveresize_client->frame->size.bottom;
 }
 
-void moveresize_event(XEvent *e)
+gboolean moveresize_event(XEvent *e)
 {
+    gboolean used = FALSE;
+
     g_assert(moveresize_in_progress);
 
     if (e->type == ButtonPress) {
@@ -361,9 +409,11 @@ void moveresize_event(XEvent *e)
             start_y = e->xbutton.y_root;
             button = e->xbutton.button; /* this will end it now */
         }
+        used = e->xbutton.button == button;
     } else if (e->type == ButtonRelease) {
         if (!button || e->xbutton.button == button) {
             moveresize_end(FALSE);
+            used = TRUE;
         }
     } else if (e->type == MotionNotify) {
         if (moving) {
@@ -415,12 +465,19 @@ void moveresize_event(XEvent *e)
             calc_resize(TRUE);
             do_resize();
         }
+        used = TRUE;
     } else if (e->type == KeyPress) {
-        if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE))
+        if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) {
             moveresize_end(TRUE);
-        else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN))
+            used = TRUE;
+        } else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN)) {
             moveresize_end(FALSE);
-        else {
+            used = TRUE;
+        } else if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT) ||
+                   e->xkey.keycode == ob_keycode(OB_KEY_LEFT) ||
+                   e->xkey.keycode == ob_keycode(OB_KEY_DOWN) ||
+                   e->xkey.keycode == ob_keycode(OB_KEY_UP))
+        {
             if (corner == prop_atoms.net_wm_moveresize_size_keyboard) {
                 gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
 
@@ -430,10 +487,8 @@ void moveresize_event(XEvent *e)
                     dx = -MAX(4, moveresize_client->size_inc.width);
                 else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
                     dy = MAX(4, moveresize_client->size_inc.height);
-                else if (e->xkey.keycode == ob_keycode(OB_KEY_UP))
+                else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
                     dy = -MAX(4, moveresize_client->size_inc.height);
-                else
-                    return;
 
                 cur_x += dx;
                 cur_y += dy;
@@ -453,6 +508,8 @@ void moveresize_event(XEvent *e)
                    actually is */
                 start_x += dx - (cur_x - ox);
                 start_y += dy - (cur_y - oy);
+
+                used = TRUE;
             } else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) {
                 gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
                 gint opx, px, opy, py;
@@ -463,10 +520,8 @@ void moveresize_event(XEvent *e)
                     dx = -4;
                 else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
                     dy = 4;
-                else if (e->xkey.keycode == ob_keycode(OB_KEY_UP))
+                else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
                     dy = -4;
-                else
-                    return;
 
                 cur_x += dx;
                 cur_y += dy;
@@ -488,6 +543,8 @@ void moveresize_event(XEvent *e)
                    actually is */
                 start_x += (px - opx) - (cur_x - ox);
                 start_y += (py - opy) - (cur_y - oy);
+
+                used = TRUE;
             }
         }
     }
@@ -496,6 +553,8 @@ void moveresize_event(XEvent *e)
     {
         waiting_for_sync = FALSE; /* we got our sync... */
         do_resize(); /* ...so try resize if there is more change pending */
+        used = TRUE;
     }
 #endif
+    return used;
 }
This page took 0.026494 seconds and 4 git commands to generate.