#include "framerender.h"
#include "screen.h"
#include "client.h"
+#include "focus.h"
#include "frame.h"
#include "openbox.h"
#include "resist.h"
static gboolean moving = FALSE; /* TRUE - moving, FALSE - resizing */
+/* starting geometry for the window being moved/resized, so it can be
+ restored */
static gint start_x, start_y, start_cx, start_cy, start_cw, start_ch;
+static gboolean was_max_horz, was_max_vert;
+static Rect pre_max_area;
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 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;
button = b;
key_resize_edge = -1;
+ /* default to not putting max back on cancel */
+ was_max_horz = was_max_vert = FALSE;
+
/*
have to change start_cx and start_cy if going to do this..
if (corner == prop_atoms.net_wm_moveresize_move_keyboard ||
cur_h = start_ch;
moveresize_in_progress = TRUE;
+ waiting_for_sync = 0;
#ifdef SYNC
if (config_resize_redraw && !moving && obt_display_extension_sync &&
XSyncCADelta |
XSyncCAEvents,
&aa);
-
- waiting_for_sync = 0;
}
#endif
}
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
}
(cancel ? start_ch : cur_h),
TRUE, TRUE, FALSE);
+ /* restore the client's maximized state. do this after putting the window
+ back in its original spot to minimize visible flicker */
+ if (cancel && (was_max_horz || was_max_vert)) {
+ const gboolean h = moveresize_client->max_horz;
+ const gboolean v = moveresize_client->max_vert;
+
+ client_maximize(moveresize_client, TRUE,
+ was_max_horz && was_max_vert ? 0 :
+ (was_max_horz ? 1 : 2));
+
+ /* replace the premax values with the ones we had saved if
+ the client doesn't have any already set */
+ if (was_max_horz && !h) {
+ moveresize_client->pre_max_area.x = pre_max_area.x;
+ moveresize_client->pre_max_area.width = pre_max_area.width;
+ }
+ if (was_max_vert && !v) {
+ moveresize_client->pre_max_area.y = pre_max_area.y;
+ moveresize_client->pre_max_area.height = pre_max_area.height;
+ }
+ }
+
/* dont edge warp after its ended */
cancel_edge_warp();
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
++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 */
}
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;
}
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)
}
}
+ if (moveresize_client->max_horz &&
+ (key_resize_edge == OB_DIRECTION_WEST ||
+ key_resize_edge == OB_DIRECTION_EAST))
+ {
+ /* unmax horz */
+ was_max_horz = TRUE;
+ pre_max_area.x = moveresize_client->pre_max_area.x;
+ pre_max_area.width = moveresize_client->pre_max_area.width;
+
+ moveresize_client->pre_max_area.x = cur_x;
+ moveresize_client->pre_max_area.width = cur_w;
+ client_maximize(moveresize_client, FALSE, 1);
+ }
+ else if (moveresize_client->max_vert &&
+ (key_resize_edge == OB_DIRECTION_NORTH ||
+ key_resize_edge == OB_DIRECTION_SOUTH))
+ {
+ /* unmax vert */
+ was_max_vert = TRUE;
+ pre_max_area.y = moveresize_client->pre_max_area.y;
+ pre_max_area.height = moveresize_client->pre_max_area.height;
+
+ moveresize_client->pre_max_area.y = cur_y;
+ moveresize_client->pre_max_area.height = cur_h;
+ client_maximize(moveresize_client, FALSE, 2);
+ }
+
calc_resize(TRUE, resist, &dw, &dh, dir);
if (key_resize_edge == OB_DIRECTION_WEST)
cur_x -= dw;
} else
g_assert_not_reached();
+ /* override the client's max state if desired */
+ if (ABS(dw) >= config_resist_edge) {
+ if (moveresize_client->max_horz) {
+ /* unmax horz */
+ was_max_horz = TRUE;
+ pre_max_area.x = moveresize_client->pre_max_area.x;
+ pre_max_area.width = moveresize_client->pre_max_area.width;
+
+ moveresize_client->pre_max_area.x = cur_x;
+ moveresize_client->pre_max_area.width = cur_w;
+ client_maximize(moveresize_client, FALSE, 1);
+ }
+ }
+ else if (was_max_horz && !moveresize_client->max_horz) {
+ /* remax horz and put the premax back */
+ client_maximize(moveresize_client, TRUE, 1);
+ moveresize_client->pre_max_area.x = pre_max_area.x;
+ moveresize_client->pre_max_area.width = pre_max_area.width;
+ }
+
+ if (ABS(dh) >= config_resist_edge) {
+ if (moveresize_client->max_vert) {
+ /* unmax vert */
+ was_max_vert = TRUE;
+ pre_max_area.y = moveresize_client->pre_max_area.y;
+ pre_max_area.height =
+ moveresize_client->pre_max_area.height;
+
+ moveresize_client->pre_max_area.y = cur_y;
+ moveresize_client->pre_max_area.height = cur_h;
+ client_maximize(moveresize_client, FALSE, 2);
+ }
+ }
+ else if (was_max_vert && !moveresize_client->max_vert) {
+ /* remax vert and put the premax back */
+ client_maximize(moveresize_client, TRUE, 2);
+ moveresize_client->pre_max_area.y = pre_max_area.y;
+ moveresize_client->pre_max_area.height = pre_max_area.height;
+ }
+
dw -= cur_w - start_cw;
dh -= cur_h - start_ch;
used = TRUE;
}
#endif
+
+ if (used && moveresize_client == focus_client)
+ event_update_user_time();
+
return used;
}