#include "config.h"
#include "event.h"
#include "debug.h"
-#include "render/render.h"
-#include "render/theme.h"
+#include "obrender/render.h"
+#include "obrender/theme.h"
#include "obt/display.h"
#include "obt/prop.h"
#include "obt/keyboard.h"
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
c->frame->area.y - ob_rr_theme->fbwidth);
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();
+ Rect const *area = screen_physical_area_active();
gint gravity, x, y;
x = config_resize_popup_fixed.x.pos;
}
popup_position(popup, gravity, x, y);
-
- g_free(area);
}
popup_show(popup, text);
g_free(text);
popup_hide(popup);
- if (moving) {
- client_move(moveresize_client,
- (cancel ? start_cx : cur_x),
- (cancel ? start_cy : cur_y));
- } else {
+ if (!moving) {
#ifdef SYNC
/* turn off the alarm */
if (moveresize_alarm != None) {
obt_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
#endif
-
- client_configure(moveresize_client,
- (cancel ? start_cx : cur_x),
- (cancel ? start_cy : cur_y),
- (cancel ? start_cw : cur_w),
- (cancel ? start_ch : cur_h),
- TRUE, TRUE, FALSE);
}
+ /* don't use client_move() here, use the same width/height as
+ we've been using during the move, otherwise we get different results
+ when moving maximized windows between monitors of different sizes !
+ */
+ client_configure(moveresize_client,
+ (cancel ? start_cx : cur_x),
+ (cancel ? start_cy : cur_y),
+ (cancel ? start_cw : cur_w),
+ (cancel ? start_ch : cur_h),
+ TRUE, TRUE, FALSE);
+
/* dont edge warp after its ended */
cancel_edge_warp();
moveresize_client->frame->area.y);
}
-
static void do_resize(void)
{
gint x, y, w, h, lw, lh;
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 && obt_display_extension_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 = OBT_PROP_ATOM(WM_PROTOCOLS);
- ce.xclient.display = obt_display;
- ce.xclient.window = moveresize_client->window;
- ce.xclient.format = 32;
- ce.xclient.data.l[0] = OBT_PROP_ATOM(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(obt_display, moveresize_client->window, FALSE,
- NoEventMask, &ce);
-
- waiting_for_sync = TRUE;
-
- 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 (config_resize_redraw && obt_display_extension_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 = OBT_PROP_ATOM(WM_PROTOCOLS);
+ ce.xclient.display = obt_display;
+ ce.xclient.window = moveresize_client->window;
+ ce.xclient.format = 32;
+ ce.xclient.data.l[0] = OBT_PROP_ATOM(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(obt_display, moveresize_client->window, FALSE,
+ NoEventMask, &ce);
+
+ waiting_for_sync = TRUE;
+
+ 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);
+ }
#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 */
(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
dir = -1;
for (i = 0; i < screen_num_monitors; ++i) {
- Rect *a = screen_physical_area_monitor(i);
+ Rect const *a = screen_physical_area_monitor(i);
if (x == RECT_LEFT(*a)) dir = OB_DIRECTION_WEST;
if (x == RECT_RIGHT(*a)) dir = OB_DIRECTION_EAST;
if (y == RECT_TOP(*a)) dir = OB_DIRECTION_NORTH;
{
dir = -1;
}
- g_free(a);
}
if (dir != edge_warp_dir) {
obt_main_loop_timeout_remove(ob_main_loop, edge_warp_delay_func);
}
-static void move_with_keys(gint keycode, gint state)
+static void move_with_keys(KeySym sym, guint state)
{
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
gint opx, px, opy, py;
gint dist = 0;
/* shift means jump to edge */
- if (state & obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT)) {
+ if (state & obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT))
+ {
gint x, y;
ObDirection dir;
- if (keycode == ob_keycode(OB_KEY_RIGHT))
+ if (sym == XK_Right)
dir = OB_DIRECTION_EAST;
- else if (keycode == ob_keycode(OB_KEY_LEFT))
+ else if (sym == XK_Left)
dir = OB_DIRECTION_WEST;
- else if (keycode == ob_keycode(OB_KEY_DOWN))
+ else if (sym == XK_Down)
dir = OB_DIRECTION_SOUTH;
- else /* if (keycode == ob_keycode(OB_KEY_UP)) */
+ else /* sym == XK_Up */
dir = OB_DIRECTION_NORTH;
client_find_move_directional(moveresize_client, dir, &x, &y);
else
dist = KEY_DIST;
- if (keycode == ob_keycode(OB_KEY_RIGHT))
+ if (sym == XK_Right)
dx = dist;
- else if (keycode == ob_keycode(OB_KEY_LEFT))
+ else if (sym == XK_Left)
dx = -dist;
- else if (keycode == ob_keycode(OB_KEY_DOWN))
+ else if (sym == XK_Down)
dy = dist;
- else /* if (keycode == ob_keycode(OB_KEY_UP)) */
+ else /* if (sym == XK_Up) */
dy = -dist;
}
start_y += (py - opy) - (cur_y - oy);
}
-static void resize_with_keys(gint keycode, gint state)
+static void resize_with_keys(KeySym sym, guint state)
{
gint dw = 0, dh = 0, pdx = 0, pdy = 0, opx, opy, px, py;
- gint dist = 0, resist = 0;
+ gint resist = 0;
ObDirection dir;
/* pick the edge if it needs to move */
- if (keycode == ob_keycode(OB_KEY_RIGHT)) {
+ if (sym == XK_Right) {
dir = OB_DIRECTION_EAST;
if (key_resize_edge != OB_DIRECTION_WEST &&
key_resize_edge != OB_DIRECTION_EAST)
key_resize_edge = OB_DIRECTION_EAST;
return;
}
- }
- if (keycode == ob_keycode(OB_KEY_LEFT)) {
+ } else if (sym == XK_Left) {
dir = OB_DIRECTION_WEST;
if (key_resize_edge != OB_DIRECTION_WEST &&
key_resize_edge != OB_DIRECTION_EAST)
key_resize_edge = OB_DIRECTION_WEST;
return;
}
- }
- if (keycode == ob_keycode(OB_KEY_UP)) {
+ } else if (sym == XK_Up) {
dir = OB_DIRECTION_NORTH;
if (key_resize_edge != OB_DIRECTION_NORTH &&
key_resize_edge != OB_DIRECTION_SOUTH)
key_resize_edge = OB_DIRECTION_NORTH;
return;
}
- }
- if (keycode == ob_keycode(OB_KEY_DOWN)) {
+ } else /* if (sym == XK_Down) */ {
dir = OB_DIRECTION_SOUTH;
if (key_resize_edge != OB_DIRECTION_NORTH &&
key_resize_edge != OB_DIRECTION_SOUTH)
}
/* shift means jump to edge */
- if (state & obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT)) {
+ if (state & obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT))
+ {
gint x, y, w, h;
- if (keycode == ob_keycode(OB_KEY_RIGHT))
+ if (sym == XK_Right)
dir = OB_DIRECTION_EAST;
- else if (keycode == ob_keycode(OB_KEY_LEFT))
+ else if (sym == XK_Left)
dir = OB_DIRECTION_WEST;
- else if (keycode == ob_keycode(OB_KEY_DOWN))
+ else if (sym == XK_Down)
dir = OB_DIRECTION_SOUTH;
- else /* if (keycode == ob_keycode(OB_KEY_UP)) */
+ else /* if (sym == XK_Up)) */
dir = OB_DIRECTION_NORTH;
client_find_resize_directional(moveresize_client, key_resize_edge,
if (key_resize_edge == OB_DIRECTION_WEST) {
if (dir == OB_DIRECTION_WEST)
- dw = (dist = distw);
+ dw = distw;
else
- dw = -(dist = distw);
+ dw = -distw;
}
else if (key_resize_edge == OB_DIRECTION_EAST) {
if (dir == OB_DIRECTION_EAST)
- dw = (dist = distw);
+ dw = distw;
else
- dw = -(dist = distw);
+ dw = -distw;
}
else if (key_resize_edge == OB_DIRECTION_NORTH) {
if (dir == OB_DIRECTION_NORTH)
- dh = (dist = disth);
+ dh = disth;
else
- dh = -(dist = disth);
+ dh = -disth;
}
else /*if (key_resize_edge == OB_DIRECTION_SOUTH)*/ {
if (dir == OB_DIRECTION_SOUTH)
- dh = (dist = disth);
+ dh = disth;
else
- dh = -(dist = disth);
+ dh = -disth;
}
}
}
used = TRUE;
} else if (e->type == KeyPress) {
- if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) {
+ KeySym sym = obt_keyboard_keypress_to_keysym(e);
+
+ if (sym == XK_Escape) {
moveresize_end(TRUE);
used = TRUE;
- } else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN)) {
+ } else if (sym == XK_Return) {
moveresize_end(FALSE);
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))
+ } else if (sym == XK_Right || sym == XK_Left ||
+ sym == XK_Up || sym == XK_Down)
{
if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_KEYBOARD)) {
- resize_with_keys(e->xkey.keycode, e->xkey.state);
+ resize_with_keys(sym, e->xkey.state);
used = TRUE;
} else if (corner ==
OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE_KEYBOARD))
{
- move_with_keys(e->xkey.keycode, e->xkey.state);
+ move_with_keys(sym, e->xkey.state);
used = TRUE;
}
}