X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions%2Fcyclewindows.c;h=5f0db27cb5173c0f6e09a9a9e944e428548bb945;hb=c590a83207ed5825b513e2278789ed13f55574b2;hp=d1112242d6f1f7c74c495551e3623361507b97a3;hpb=73575c10ce3ede1637e4f959b56e1f7d5f110b91;p=chaz%2Fopenbox diff --git a/openbox/actions/cyclewindows.c b/openbox/actions/cyclewindows.c index d1112242..5f0db27c 100644 --- a/openbox/actions/cyclewindows.c +++ b/openbox/actions/cyclewindows.c @@ -5,11 +5,13 @@ #include "openbox/focus_cycle.h" #include "openbox/openbox.h" #include "gettext.h" +#include "obt/keyboard.h" typedef struct { gboolean linear; gboolean dock_windows; gboolean desktop_windows; + gboolean only_hilite_windows; gboolean all_desktops; gboolean forward; gboolean bar; @@ -42,6 +44,7 @@ static void free_func(gpointer options); static gboolean run_func(ObActionsData *data, gpointer options); static gboolean i_input_func(guint initial_state, XEvent *e, + ObtIC *ic, gpointer options, gboolean *used); static void i_cancel_func(gpointer options); @@ -63,7 +66,7 @@ static gpointer setup_func(xmlNodePtr node, xmlNodePtr n; Options *o; - o = g_new0(Options, 1); + o = g_slice_new0(Options); o->bar = TRUE; o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_LIST; @@ -72,6 +75,8 @@ static gpointer setup_func(xmlNodePtr node, if ((n = obt_xml_find_node(node, "dialog"))) { if (obt_xml_node_contains(n, "none")) o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_NONE; + else if (obt_xml_node_contains(n, "no")) + o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_NONE; else if (obt_xml_node_contains(n, "icons")) o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_ICONS; } @@ -81,6 +86,8 @@ static gpointer setup_func(xmlNodePtr node, o->raise = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "panels"))) o->dock_windows = obt_xml_node_bool(n); + if ((n = obt_xml_find_node(node, "hilite"))) + o->only_hilite_windows = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "desktop"))) o->desktop_windows = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "allDesktops"))) @@ -142,7 +149,7 @@ static void free_func(gpointer options) o->actions = g_slist_delete_link(o->actions, o->actions); } - g_free(o); + g_slice_free(Options, o); } static gboolean run_func(ObActionsData *data, gpointer options) @@ -152,6 +159,7 @@ static gboolean run_func(ObActionsData *data, gpointer options) ft = focus_cycle(o->forward, o->all_desktops, + !o->only_hilite_windows, o->dock_windows, o->desktop_windows, o->linear, @@ -168,31 +176,39 @@ static gboolean run_func(ObActionsData *data, gpointer options) static gboolean i_input_func(guint initial_state, XEvent *e, + ObtIC *ic, gpointer options, gboolean *used) { Options *o = options; + guint mods; + + mods = obt_keyboard_only_modmasks(e->xkey.state); + if (e->type == KeyRelease) { + /* remove from the state the mask of the modifier key being + released, if it is a modifier key being released that is */ + mods &= ~obt_keyboard_keyevent_to_modmask(e); + } if (e->type == KeyPress) { + KeySym sym = obt_keyboard_keypress_to_keysym(e); + /* Escape cancels no matter what */ - if (ob_keycode_match(e->xkey.keycode, OB_KEY_ESCAPE)) { + if (sym == XK_Escape) { o->cancel = TRUE; o->state = e->xkey.state; return FALSE; } /* There were no modifiers and they pressed enter */ - else if (ob_keycode_match(e->xkey.keycode, OB_KEY_RETURN) && - !initial_state) - { + else if ((sym == XK_Return || sym == XK_KP_Enter) && !initial_state) { o->cancel = FALSE; o->state = e->xkey.state; return FALSE; } } /* They released the modifiers */ - else if (e->type == KeyRelease && initial_state && - (e->xkey.state & initial_state) == 0) + else if (e->type == KeyRelease && initial_state && !(mods & initial_state)) { o->cancel = FALSE; o->state = e->xkey.state; @@ -216,6 +232,7 @@ static void i_post_func(gpointer options) ft = focus_cycle(o->forward, o->all_desktops, + !o->only_hilite_windows, o->dock_windows, o->desktop_windows, o->linear,