Allow cancellation of window moving and resizing. Signed-off-by: Darren Salt Index: themes/default.keys/keythemerc =================================================================== --- themes/default.keys/keythemerc (revision 22203) +++ themes/default.keys/keythemerc (working copy) @@ -10,6 +10,7 @@ maximize_horiz_key=Alt+F7 maximize_vert_key=Alt+F6 maximize_window_key=Alt+F5 +move_resize_cancel_key=Escape move_window_down_key=Control+Shift+Alt+Down move_window_down_workspace_key=None move_window_left_key=Control+Shift+Alt+Left Index: src/settings.c =================================================================== --- src/settings.c (revision 22203) +++ src/settings.c (working copy) @@ -1146,6 +1146,7 @@ parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_HORIZ], getValue ("maximize_horiz_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_VERT], getValue ("maximize_vert_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_WINDOW], getValue ("maximize_window_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_CANCEL], getValue ("move_resize_cancel_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_DOWN], getValue ("move_window_down_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_DOWN_WORKSPACE], getValue ("move_window_down_workspace_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_LEFT], getValue ("move_window_left_key", rc)); @@ -1298,6 +1299,7 @@ {"maximize_horiz_key", NULL, TRUE}, {"maximize_vert_key", NULL, TRUE}, {"maximize_window_key", NULL, TRUE}, + {"move_resize_cancel_key", NULL, TRUE}, {"move_window_down_key", NULL, TRUE}, {"move_window_down_workspace_key", NULL, TRUE}, {"move_window_left_key", NULL, TRUE}, Index: src/settings.h =================================================================== --- src/settings.h (revision 22203) +++ src/settings.h (working copy) @@ -113,7 +113,8 @@ #define KEY_MOVE_DOWN_WORKSPACE 67 #define KEY_MOVE_LEFT_WORKSPACE 68 #define KEY_MOVE_RIGHT_WORKSPACE 69 -#define KEY_COUNT 70 +#define KEY_MOVE_CANCEL 70 +#define KEY_COUNT 71 #define ALIGN_LEFT 0 #define ALIGN_RIGHT 1 Index: src/client.c =================================================================== --- src/client.c (revision 22203) +++ src/client.c (working copy) @@ -98,6 +98,7 @@ gboolean grab; gboolean is_transient; gboolean move_resized; + int cancel_x, cancel_y; /* for cancellation (either position or size) */ int mx, my; int ox, oy; int oldw, oldh; @@ -3210,8 +3211,31 @@ } else if (xevent->type == KeyRelease) { - if (passdata->use_keys) + if (xevent->xkey.keycode == screen_info->params->keys[KEY_MOVE_CANCEL].keycode) { + moving = FALSE; + + if (screen_info->params->box_move) + { + clientDrawOutline (c); + } + + c->x = passdata->cancel_x; + c->y = passdata->cancel_y; + + if (screen_info->params->box_move) + { + clientDrawOutline (c); + } + else + { + wc.x = c->x; + wc.y = c->y; + clientConfigure (c, &wc, CWX | CWY, NO_CFG_FLAG); + } + } + else if (passdata->use_keys) + { if (IsModifierKey (XLookupKeysym (&xevent->xkey, 0))) { moving = FALSE; @@ -3488,8 +3512,8 @@ changes = CWX | CWY; passdata.c = c; - passdata.ox = c->x; - passdata.oy = c->y; + passdata.cancel_x = passdata.ox = c->x; + passdata.cancel_y = passdata.oy = c->y; passdata.use_keys = FALSE; passdata.grab = FALSE; passdata.is_transient = clientIsValidTransientOrModal (c); @@ -3764,8 +3788,42 @@ } else if (xevent->type == KeyRelease) { - if (passdata->use_keys) + if (xevent->xkey.keycode == screen_info->params->keys[KEY_MOVE_CANCEL].keycode) { + resizing = FALSE; + + if (screen_info->params->box_resize) + { + clientDrawOutline (c); + } + + /* restore the pre-resize position & size */ + if (move_left) + { + c->x += c->width - passdata->cancel_x; + } + if (move_top) + { + c->y += c->height - passdata->cancel_y; + } + c->width = passdata->cancel_x; + c->height = passdata->cancel_y; + + if (screen_info->params->box_resize) + { + clientDrawOutline (c); + } + else + { + wc.x = c->x; + wc.y = c->y; + wc.width = c->width; + wc.height = c->height; + clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, NO_CFG_FLAG); + } + } + else if (passdata->use_keys) + { if (IsModifierKey (XLookupKeysym (&xevent->xkey, 0))) { resizing = FALSE; @@ -3958,8 +4016,8 @@ restore_opacity = FALSE; passdata.c = c; - passdata.ox = c->width; - passdata.oy = c->height; + passdata.cancel_x = passdata.ox = c->width; + passdata.cancel_y = passdata.oy = c->height; passdata.use_keys = FALSE; passdata.grab = FALSE; passdata.corner = corner; Index: mcs-plugin/xfwm4_shortcuteditor.c =================================================================== --- mcs-plugin/xfwm4_shortcuteditor.c (revision 22203) +++ mcs-plugin/xfwm4_shortcuteditor.c (working copy) @@ -328,6 +328,7 @@ "resize_window_down_key", "resize_window_left_key", "resize_window_right_key", + "move_resize_cancel_key", "raise_window_key", "lower_window_key", "fullscreen_key", @@ -365,6 +366,7 @@ N_("Resize window down"), N_("Resize window left"), N_("Resize window right"), + N_("Cancel move/resize window"), N_("Raise window"), N_("Lower window"), N_("Toggle fullscreen"),