+ ungrab_keyboard();
+ ungrab_pointer();
+
+ popup_hide(popup);
+
+ if (moving) {
+ client_move(moveresize_client,
+ (cancel ? start_cx : cur_x),
+ (cancel ? start_cy : cur_y));
+ } else {
+#ifdef SYNC
+ /* turn off the alarm */
+ if (moveresize_alarm != None) {
+ XSyncDestroyAlarm(ob_display, moveresize_alarm);
+ moveresize_alarm = None;
+ }
+#endif
+
+ get_resize_position(&x, &y, cancel);
+ client_configure(moveresize_client, x, y,
+ (cancel ? start_cw : cur_x),
+ (cancel ? start_ch : cur_y),
+ TRUE, TRUE, FALSE);
+ }
+
+ moveresize_in_progress = FALSE;
+ moveresize_client = NULL;
+}
+
+static void do_move(gboolean keyboard)
+{
+ gint resist;
+
+ if (keyboard) resist = KEY_DIST - 1; /* resist for one key press */
+ else resist = config_resist_win;
+ resist_move_windows(moveresize_client, resist, &cur_x, &cur_y);
+ if (!keyboard) resist = config_resist_edge;
+ resist_move_monitors(moveresize_client, resist, &cur_x, &cur_y);
+
+ client_configure(moveresize_client, cur_x, cur_y,
+ moveresize_client->area.width,
+ moveresize_client->area.height,
+ TRUE, FALSE, FALSE);
+ if (config_resize_popup_show == 2) /* == "Always" */
+ popup_coords(moveresize_client, "%d x %d",
+ moveresize_client->frame->area.x,
+ moveresize_client->frame->area.y);
+}
+
+static void do_resize()
+{
+ gint x, y, w, h, lw, lh;
+
+ /* see if it is actually going to resize */
+ x = 0;
+ y = 0;
+ w = cur_x;
+ h = cur_y;
+ client_try_configure(moveresize_client, &x, &y, &w, &h,
+ &lw, &lh, TRUE);
+ 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;
+ }
+#endif
+
+ get_resize_position(&x, &y, FALSE);
+ client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE, FALSE);