linear focus cycling of the gods
This commit is contained in:
parent
69c9b6211b
commit
7ebc5c797f
3 changed files with 47 additions and 13 deletions
|
@ -1,4 +1,5 @@
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "focus.h"
|
||||||
#include "stacking.h"
|
#include "stacking.h"
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
@ -666,9 +667,16 @@ void action_showmenu(union ActionData *data)
|
||||||
void action_cycle_windows(union ActionData *data)
|
void action_cycle_windows(union ActionData *data)
|
||||||
{
|
{
|
||||||
if (data->cycle.linear) {
|
if (data->cycle.linear) {
|
||||||
if (!data->cycle.final) {
|
static Client *first = NULL;
|
||||||
|
static Client *t = NULL;
|
||||||
|
|
||||||
|
if (data->cycle.cancel) {
|
||||||
|
if (first) client_focus(first);
|
||||||
|
} else if (!data->cycle.final) {
|
||||||
GList *it, *start;
|
GList *it, *start;
|
||||||
|
|
||||||
|
t = NULL;
|
||||||
|
first = focus_client;
|
||||||
start = it = g_list_find(client_list, data->cycle.c);
|
start = it = g_list_find(client_list, data->cycle.c);
|
||||||
do {
|
do {
|
||||||
if (data->cycle.forward) {
|
if (data->cycle.forward) {
|
||||||
|
@ -678,9 +686,13 @@ void action_cycle_windows(union ActionData *data)
|
||||||
it = it->prev;
|
it = it->prev;
|
||||||
if (it == NULL) it = g_list_last(client_list);
|
if (it == NULL) it = g_list_last(client_list);
|
||||||
}
|
}
|
||||||
if (client_focus(it->data))
|
if (client_focus(it->data)) {
|
||||||
|
t = it->data;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
} while (it != start);
|
} while (it != start);
|
||||||
|
} else {
|
||||||
|
if (t) stacking_raise(t);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct CycleWindows {
|
||||||
gboolean linear;
|
gboolean linear;
|
||||||
gboolean forward;
|
gboolean forward;
|
||||||
gboolean final;
|
gboolean final;
|
||||||
|
gboolean cancel;
|
||||||
};
|
};
|
||||||
|
|
||||||
union ActionData {
|
union ActionData {
|
||||||
|
|
|
@ -19,7 +19,7 @@ void plugin_setup_config()
|
||||||
KeyBindingTree *firstnode = NULL;
|
KeyBindingTree *firstnode = NULL;
|
||||||
|
|
||||||
static KeyBindingTree *curpos;
|
static KeyBindingTree *curpos;
|
||||||
static guint reset_key, reset_state;
|
static guint reset_key, reset_state, button_return, button_escape;
|
||||||
static gboolean grabbed;
|
static gboolean grabbed;
|
||||||
|
|
||||||
static void grab_keys(gboolean grab)
|
static void grab_keys(gboolean grab)
|
||||||
|
@ -90,17 +90,31 @@ static void event(ObEvent *e, void *foo)
|
||||||
{
|
{
|
||||||
static KeyBindingTree *grabbed_key = NULL;
|
static KeyBindingTree *grabbed_key = NULL;
|
||||||
|
|
||||||
if (e->type == Event_X_KeyRelease) {
|
if (grabbed_key) {
|
||||||
if (grabbed_key) {
|
gboolean done = FALSE;
|
||||||
if (!(grabbed_key->state & e->data.x.e->xkey.state)) {
|
|
||||||
grabbed_key->action->data.cycle.final = TRUE;
|
if ((e->type == Event_X_KeyRelease &&
|
||||||
grabbed_key->action->func(&grabbed_key->action->data);
|
!(grabbed_key->state & e->data.x.e->xkey.state)))
|
||||||
grab_keyboard(FALSE);
|
done = TRUE;
|
||||||
grabbed_key = FALSE;
|
else if (e->type == Event_X_KeyPress) {
|
||||||
|
if (e->data.x.e->xkey.keycode == button_return)
|
||||||
|
done = TRUE;
|
||||||
|
else if (e->data.x.e->xkey.keycode == button_escape) {
|
||||||
|
grabbed_key->action->data.cycle.cancel = TRUE;
|
||||||
|
done = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
if (done) {
|
||||||
|
grabbed_key->action->data.cycle.final = TRUE;
|
||||||
|
grabbed_key->action->func(&grabbed_key->action->data);
|
||||||
|
grab_keyboard(FALSE);
|
||||||
|
grabbed_key = NULL;
|
||||||
|
reset_chains();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (e->type == Event_X_KeyRelease)
|
||||||
|
return;
|
||||||
|
|
||||||
if (e->data.x.e->xkey.keycode == reset_key &&
|
if (e->data.x.e->xkey.keycode == reset_key &&
|
||||||
e->data.x.e->xkey.state == reset_state) {
|
e->data.x.e->xkey.state == reset_state) {
|
||||||
|
@ -130,12 +144,15 @@ static void event(ObEvent *e, void *foo)
|
||||||
g_assert(!(p->action->func == action_move ||
|
g_assert(!(p->action->func == action_move ||
|
||||||
p->action->func == action_resize));
|
p->action->func == action_resize));
|
||||||
|
|
||||||
if (p->action->func == action_cycle_windows)
|
if (p->action->func == action_cycle_windows) {
|
||||||
p->action->data.cycle.final = FALSE;
|
p->action->data.cycle.final = FALSE;
|
||||||
|
p->action->data.cycle.cancel = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
p->action->func(&p->action->data);
|
p->action->func(&p->action->data);
|
||||||
|
|
||||||
if (p->action->func == action_cycle_windows) {
|
if (p->action->func == action_cycle_windows &&
|
||||||
|
!grabbed_key) {
|
||||||
grab_keyboard(TRUE);
|
grab_keyboard(TRUE);
|
||||||
grabbed_key = p;
|
grabbed_key = p;
|
||||||
}
|
}
|
||||||
|
@ -152,12 +169,16 @@ static void event(ObEvent *e, void *foo)
|
||||||
|
|
||||||
void plugin_startup()
|
void plugin_startup()
|
||||||
{
|
{
|
||||||
|
guint i;
|
||||||
|
|
||||||
curpos = NULL;
|
curpos = NULL;
|
||||||
grabbed = FALSE;
|
grabbed = FALSE;
|
||||||
|
|
||||||
dispatch_register(Event_X_KeyPress | Event_X_KeyRelease, (EventHandler)event, NULL);
|
dispatch_register(Event_X_KeyPress | Event_X_KeyRelease, (EventHandler)event, NULL);
|
||||||
|
|
||||||
translate_key("C-g", &reset_state, &reset_key);
|
translate_key("C-g", &reset_state, &reset_key);
|
||||||
|
translate_key("Escape", &i, &button_escape);
|
||||||
|
translate_key("Return", &i, &button_return);
|
||||||
}
|
}
|
||||||
|
|
||||||
void plugin_shutdown()
|
void plugin_shutdown()
|
||||||
|
|
Loading…
Reference in a new issue