woa.. let you do mouse actions while in an interactive keyboard action, and let you do keyboard actions while move/resizing. yay. also you can click in windows at the same time..
This commit is contained in:
parent
0c15af505f
commit
9a9e3f6bf6
4 changed files with 42 additions and 29 deletions
|
@ -546,14 +546,16 @@ static void event_process(const XEvent *ec, gpointer data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useevent) {
|
if (useevent) {
|
||||||
if (!keyboard_process_interactive_grab(e, &client)) {
|
/* if the keyboard interactive action uses the event then dont
|
||||||
if (moveresize_in_progress) {
|
use it for bindings. likewise is moveresize uses the event. */
|
||||||
moveresize_event(e);
|
if (!keyboard_process_interactive_grab(e, &client) &&
|
||||||
|
!(moveresize_in_progress && moveresize_event(e)))
|
||||||
|
{
|
||||||
|
if (moveresize_in_progress)
|
||||||
/* make further actions work on the client being
|
/* make further actions work on the client being
|
||||||
moved/resized */
|
moved/resized */
|
||||||
client = moveresize_client;
|
client = moveresize_client;
|
||||||
}
|
|
||||||
|
|
||||||
menu_can_hide = FALSE;
|
menu_can_hide = FALSE;
|
||||||
ob_main_loop_timeout_add(ob_main_loop,
|
ob_main_loop_timeout_add(ob_main_loop,
|
||||||
|
|
|
@ -199,10 +199,8 @@ static void keyboard_interactive_end(guint state, gboolean cancel, Time time,
|
||||||
|
|
||||||
istate.active = FALSE;
|
istate.active = FALSE;
|
||||||
|
|
||||||
if (ungrab) {
|
if (ungrab)
|
||||||
grab_keyboard(FALSE);
|
grab_keyboard(FALSE);
|
||||||
grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboard_interactive_end_client(ObClient *client, gpointer data)
|
static void keyboard_interactive_end_client(ObClient *client, gpointer data)
|
||||||
|
@ -217,11 +215,8 @@ gboolean keyboard_interactive_grab(guint state, ObClient *client,
|
||||||
g_assert(action->data.any.interactive);
|
g_assert(action->data.any.interactive);
|
||||||
|
|
||||||
if (!istate.active) {
|
if (!istate.active) {
|
||||||
grab_pointer(TRUE, FALSE, OB_CURSOR_POINTER);
|
if (!grab_keyboard(TRUE))
|
||||||
if (!grab_keyboard(TRUE)) {
|
|
||||||
grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
|
||||||
} else if (action->func != istate.action->func) {
|
} else if (action->func != istate.action->func) {
|
||||||
keyboard_interactive_end(state, FALSE, action->data.any.time, FALSE);
|
keyboard_interactive_end(state, FALSE, action->data.any.time, FALSE);
|
||||||
}
|
}
|
||||||
|
@ -241,23 +236,26 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
|
||||||
gboolean cancel = FALSE;
|
gboolean cancel = FALSE;
|
||||||
|
|
||||||
if (istate.active) {
|
if (istate.active) {
|
||||||
if ((e->type == KeyRelease && !(istate.state & e->xkey.state)))
|
if ((e->type == KeyRelease && !(istate.state & e->xkey.state))) {
|
||||||
done = TRUE;
|
done = TRUE;
|
||||||
else if (e->type == KeyPress) {
|
handled = TRUE;
|
||||||
|
} else if (e->type == KeyPress) {
|
||||||
/*if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN))
|
/*if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN))
|
||||||
done = TRUE;
|
done = TRUE;
|
||||||
else */if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE))
|
else */if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) {
|
||||||
cancel = done = TRUE;
|
cancel = done = TRUE;
|
||||||
|
handled = TRUE;
|
||||||
|
}
|
||||||
} else if (e->type == ButtonPress) {
|
} else if (e->type == ButtonPress) {
|
||||||
cancel = FALSE;
|
cancel = FALSE;
|
||||||
done = TRUE;
|
done = TRUE;
|
||||||
|
handled = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (done) {
|
if (done)
|
||||||
keyboard_interactive_end(e->xkey.state, cancel, e->xkey.time,TRUE);
|
keyboard_interactive_end(e->xkey.state, cancel, e->xkey.time,TRUE);
|
||||||
|
|
||||||
handled = TRUE;
|
if (handled)
|
||||||
} else
|
|
||||||
*client = istate.client;
|
*client = istate.client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -395,8 +395,10 @@ static void calc_resize(gboolean resist)
|
||||||
moveresize_client->frame->size.bottom;
|
moveresize_client->frame->size.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveresize_event(XEvent *e)
|
gboolean moveresize_event(XEvent *e)
|
||||||
{
|
{
|
||||||
|
gboolean used = FALSE;
|
||||||
|
|
||||||
g_assert(moveresize_in_progress);
|
g_assert(moveresize_in_progress);
|
||||||
|
|
||||||
if (e->type == ButtonPress) {
|
if (e->type == ButtonPress) {
|
||||||
|
@ -405,10 +407,12 @@ void moveresize_event(XEvent *e)
|
||||||
start_y = e->xbutton.y_root;
|
start_y = e->xbutton.y_root;
|
||||||
button = e->xbutton.button; /* this will end it now */
|
button = e->xbutton.button; /* this will end it now */
|
||||||
}
|
}
|
||||||
|
used = TRUE;
|
||||||
} else if (e->type == ButtonRelease) {
|
} else if (e->type == ButtonRelease) {
|
||||||
if (!button || e->xbutton.button == button) {
|
if (!button || e->xbutton.button == button) {
|
||||||
moveresize_end(FALSE);
|
moveresize_end(FALSE);
|
||||||
}
|
}
|
||||||
|
used = TRUE;
|
||||||
} else if (e->type == MotionNotify) {
|
} else if (e->type == MotionNotify) {
|
||||||
if (moving) {
|
if (moving) {
|
||||||
cur_x = start_cx + e->xmotion.x_root - start_x;
|
cur_x = start_cx + e->xmotion.x_root - start_x;
|
||||||
|
@ -459,12 +463,19 @@ void moveresize_event(XEvent *e)
|
||||||
calc_resize(TRUE);
|
calc_resize(TRUE);
|
||||||
do_resize();
|
do_resize();
|
||||||
}
|
}
|
||||||
|
used = TRUE;
|
||||||
} else if (e->type == KeyPress) {
|
} 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);
|
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);
|
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) {
|
if (corner == prop_atoms.net_wm_moveresize_size_keyboard) {
|
||||||
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
|
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
|
||||||
|
|
||||||
|
@ -474,10 +485,8 @@ void moveresize_event(XEvent *e)
|
||||||
dx = -MAX(4, moveresize_client->size_inc.width);
|
dx = -MAX(4, moveresize_client->size_inc.width);
|
||||||
else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
|
else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
|
||||||
dy = MAX(4, moveresize_client->size_inc.height);
|
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);
|
dy = -MAX(4, moveresize_client->size_inc.height);
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
cur_x += dx;
|
cur_x += dx;
|
||||||
cur_y += dy;
|
cur_y += dy;
|
||||||
|
@ -497,6 +506,8 @@ void moveresize_event(XEvent *e)
|
||||||
actually is */
|
actually is */
|
||||||
start_x += dx - (cur_x - ox);
|
start_x += dx - (cur_x - ox);
|
||||||
start_y += dy - (cur_y - oy);
|
start_y += dy - (cur_y - oy);
|
||||||
|
|
||||||
|
used = TRUE;
|
||||||
} else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) {
|
} else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) {
|
||||||
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
|
gint dx = 0, dy = 0, ox = cur_x, oy = cur_y;
|
||||||
gint opx, px, opy, py;
|
gint opx, px, opy, py;
|
||||||
|
@ -507,10 +518,8 @@ void moveresize_event(XEvent *e)
|
||||||
dx = -4;
|
dx = -4;
|
||||||
else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
|
else if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN))
|
||||||
dy = 4;
|
dy = 4;
|
||||||
else if (e->xkey.keycode == ob_keycode(OB_KEY_UP))
|
else /* if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) */
|
||||||
dy = -4;
|
dy = -4;
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
cur_x += dx;
|
cur_x += dx;
|
||||||
cur_y += dy;
|
cur_y += dy;
|
||||||
|
@ -532,6 +541,8 @@ void moveresize_event(XEvent *e)
|
||||||
actually is */
|
actually is */
|
||||||
start_x += (px - opx) - (cur_x - ox);
|
start_x += (px - opx) - (cur_x - ox);
|
||||||
start_y += (py - opy) - (cur_y - oy);
|
start_y += (py - opy) - (cur_y - oy);
|
||||||
|
|
||||||
|
used = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -540,6 +551,8 @@ void moveresize_event(XEvent *e)
|
||||||
{
|
{
|
||||||
waiting_for_sync = FALSE; /* we got our sync... */
|
waiting_for_sync = FALSE; /* we got our sync... */
|
||||||
do_resize(); /* ...so try resize if there is more change pending */
|
do_resize(); /* ...so try resize if there is more change pending */
|
||||||
|
used = TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return used;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,6 @@ void moveresize_start(struct _ObClient *c,
|
||||||
gint x, gint y, guint button, guint32 corner);
|
gint x, gint y, guint button, guint32 corner);
|
||||||
void moveresize_end(gboolean cancel);
|
void moveresize_end(gboolean cancel);
|
||||||
|
|
||||||
void moveresize_event(XEvent *e);
|
gboolean moveresize_event(XEvent *e);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue