1 #include "openbox/actions.h"
2 #include "openbox/event.h"
3 #include "openbox/focus_cycle.h"
4 #include "openbox/openbox.h"
10 gboolean dock_windows
;
11 gboolean desktop_windows
;
12 gboolean all_desktops
;
17 static gboolean cycling
= FALSE
;
19 static gpointer
setup_func(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
);
20 static void free_func(gpointer options
);
21 static gboolean
run_func(ObActionsData
*data
, gpointer options
);
22 static gboolean
i_input_func(guint initial_state
,
26 static void i_cancel_func(gpointer options
);
28 static void end_cycle(gboolean cancel
, guint state
, Options
*o
);
30 void action_cyclewindows_startup()
32 actions_register("CycleWindows",
40 static gpointer
setup_func(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
)
45 o
= g_new0(Options
, 1);
48 if ((n
= parse_find_node("forward", node
)))
49 o
->forward
= parse_bool(doc
, n
);
50 if ((n
= parse_find_node("linear", node
)))
51 o
->linear
= parse_bool(doc
, n
);
52 if ((n
= parse_find_node("dialog", node
)))
53 o
->dialog
= parse_bool(doc
, n
);
54 if ((n
= parse_find_node("panels", node
)))
55 o
->dock_windows
= parse_bool(doc
, n
);
56 if ((n
= parse_find_node("desktop", node
)))
57 o
->desktop_windows
= parse_bool(doc
, n
);
58 if ((n
= parse_find_node("allDesktops", node
)))
59 o
->all_desktops
= parse_bool(doc
, n
);
61 if ((n
= parse_find_node("finalactions", node
))) {
64 m
= parse_find_node("action", n
->xmlChildrenNode
);
66 ObActionsAct
*action
= actions_parse(i
, doc
, m
);
67 if (action
) o
->actions
= g_slist_prepend(o
->actions
, action
);
68 m
= parse_find_node("action", m
->next
);
74 static void free_func(gpointer options
)
81 static gboolean
run_func(ObActionsData
*data
, gpointer options
)
85 /* if using focus_delay, stop the timer now so that focus doesn't go moving
87 event_halt_focus_delay();
89 focus_cycle(o
->forward
,
102 static gboolean
i_input_func(guint initial_state
,
107 if (e
->type
== KeyPress
) {
108 /* Escape cancels no matter what */
109 if (e
->xkey
.keycode
== ob_keycode(OB_KEY_ESCAPE
)) {
110 end_cycle(TRUE
, e
->xkey
.state
, options
);
114 /* There were no modifiers and they pressed enter */
115 else if (e
->xkey
.keycode
== ob_keycode(OB_KEY_RETURN
) &&
118 end_cycle(FALSE
, e
->xkey
.state
, options
);
122 /* They released the modifiers */
123 else if (e
->type
== KeyRelease
&& initial_state
&&
124 (e
->xkey
.state
& initial_state
) == 0)
126 end_cycle(FALSE
, e
->xkey
.state
, options
);
133 static void i_cancel_func(gpointer options
)
135 /* we get cancelled when we move focus, but we're not cycling anymore, so
138 end_cycle(TRUE
, 0, options
);
141 static void end_cycle(gboolean cancel
, guint state
, Options
*o
)
143 struct _ObClient
*ft
;
145 ft
= focus_cycle(o
->forward
,
155 actions_run_acts(o
->actions
, OB_USER_ACTION_KEYBOARD_KEY
,
156 state
, -1, -1, 0, OB_FRAME_CONTEXT_NONE
, ft
);