1 /* -*-c-*- */
2 
3 #ifndef FOCUS_POLICY_H
4 #define FOCUS_POLICY_H
5 
6 /* Note: focus_policy.[ch] is meant to manage structures of type focus_policy_t
7  * only.  No code dealing with *any* external data types belongs in here!  Put
8  * it in focus.[ch] instead. */
9 
10 /* ---------------------------- included header files ---------------------- */
11 
12 /* ---------------------------- global definitions ------------------------- */
13 
14 #define FPOL_ANY_MODIFIER 0xff
15 
16 /* ---------------------------- access macros ------------------------------ */
17 
18 #define FP_DO_RAISE_FOCUSED_CLICK(fp) \
19 	((fp).do_raise_focused_click)
20 #define FP_DO_RAISE_UNFOCUSED_CLICK(fp) \
21 	((fp).do_raise_unfocused_click)
22 #define FP_DO_FOCUS_CLICK(fp) \
23 	((fp).do_focus_click)
24 #define FP_DO_RAISE_FOCUSED_CLIENT_CLICK(fp) \
25 	((fp).do_raise_focused_click.client)
26 #define FPS_RAISE_FOCUSED_CLIENT_CLICK(fp,x) \
27 	((fp).do_raise_focused_click.client = !!(x))
28 #define FP_DO_RAISE_UNFOCUSED_CLIENT_CLICK(fp) \
29 	((fp).do_raise_unfocused_click.client)
30 #define FPS_RAISE_UNFOCUSED_CLIENT_CLICK(fp,x) \
31 	((fp).do_raise_unfocused_click.client = !!(x))
32 #define FP_DO_RAISE_FOCUSED_DECOR_CLICK(fp) \
33 	((fp).do_raise_focused_click.decor)
34 #define FPS_RAISE_FOCUSED_DECOR_CLICK(fp,x) \
35 	((fp).do_raise_focused_click.decor = !!(x))
36 #define FP_DO_RAISE_UNFOCUSED_DECOR_CLICK(fp) \
37 	((fp).do_raise_unfocused_click.decor)
38 #define FPS_RAISE_UNFOCUSED_DECOR_CLICK(fp,x) \
39 	((fp).do_raise_unfocused_click.decor = !!(x))
40 #define FP_DO_RAISE_FOCUSED_ICON_CLICK(fp) \
41 	((fp).do_raise_focused_click.icon)
42 #define FPS_RAISE_FOCUSED_ICON_CLICK(fp,x) \
43 	((fp).do_raise_focused_click.icon = !!(x))
44 #define FP_DO_RAISE_UNFOCUSED_ICON_CLICK(fp) \
45 	((fp).do_raise_unfocused_click.icon)
46 #define FPS_RAISE_UNFOCUSED_ICON_CLICK(fp,x) \
47 	((fp).do_raise_unfocused_click.icon = !!(x))
48 #define FP_DO_FOCUS_ENTER(fp) \
49 	((fp).do_focus_enter)
50 #define FPS_FOCUS_ENTER(fp,x) \
51 	((fp).do_focus_enter = !!(x))
52 #define FP_DO_UNFOCUS_LEAVE(fp) \
53 	((fp).do_unfocus_leave)
54 #define FPS_UNFOCUS_LEAVE(fp,x) \
55 	((fp).do_unfocus_leave = !!(x))
56 #define FP_DO_FOCUS_CLICK_CLIENT(fp) \
57 	((fp).do_focus_click.client)
58 #define FPS_FOCUS_CLICK_CLIENT(fp,x) \
59 	((fp).do_focus_click.client = !!(x))
60 #define FP_DO_FOCUS_CLICK_DECOR(fp) \
61 	((fp).do_focus_click.decor)
62 #define FPS_FOCUS_CLICK_DECOR(fp,x) \
63 	((fp).do_focus_click.decor = !!(x))
64 #define FP_DO_FOCUS_CLICK_ICON(fp) \
65 	((fp).do_focus_click.icon)
66 #define FPS_FOCUS_CLICK_ICON(fp,x) \
67 	((fp).do_focus_click.icon = !!(x))
68 #define FP_DO_FOCUS_BY_PROGRAM(fp) \
69 	((fp).do_focus_by_program)
70 #define FPS_FOCUS_BY_PROGRAM(fp,x) \
71 	((fp).do_focus_by_program = !!(x))
72 #define FP_DO_FOCUS_BY_FUNCTION(fp) \
73 	((fp).do_focus_by_function)
74 #define FPS_FOCUS_BY_FUNCTION(fp,x) \
75 	((fp).do_focus_by_function = !!(x))
76 #define FP_DO_WARP_POINTER_ON_FOCUS_FUNC(fp) \
77 	((fp).do_warp_pointer_on_focus_func)
78 #define FPS_WARP_POINTER_ON_FOCUS_FUNC(fp,x) \
79 	((fp).do_warp_pointer_on_focus_func = !!(x))
80 #define FP_IS_LENIENT(fp) \
81 	((fp).is_lenient)
82 #define FPS_LENIENT(fp,x) \
83 	((fp).is_lenient = !!(x))
84 #define FP_USE_MOUSE_BUTTONS(fp) \
85 	((fp).use_mouse_buttons)
86 #define FPS_MOUSE_BUTTONS(fp,x) \
87 	((fp).use_mouse_buttons = (x))
88 #define FP_USE_MODIFIERS(fp) \
89 	((fp).use_modifiers)
90 #define FPS_MODIFIERS(fp,x) \
91 	((fp).use_modifiers = (x))
92 #define FP_DO_PASS_FOCUS_CLICK(fp) \
93 	((fp).do_pass_focus_click)
94 #define FPS_PASS_FOCUS_CLICK(fp,x) \
95 	((fp).do_pass_focus_click = !!(x))
96 #define FP_DO_PASS_RAISE_CLICK(fp) \
97 	((fp).do_pass_raise_click)
98 #define FPS_PASS_RAISE_CLICK(fp,x) \
99 	((fp).do_pass_raise_click = !!(x))
100 #define FP_DO_IGNORE_FOCUS_CLICK_MOTION(fp) \
101 	((fp).do_ignore_focus_click_motion)
102 #define FPS_IGNORE_FOCUS_CLICK_MOTION(fp,x) \
103 	((fp).do_ignore_focus_click_motion = !!(x))
104 #define FP_DO_IGNORE_RAISE_CLICK_MOTION(fp) \
105 	((fp).do_ignore_raise_click_motion)
106 #define FPS_IGNORE_RAISE_CLICK_MOTION(fp,x) \
107 	((fp).do_ignore_raise_click_motion = !!(x))
108 #define FP_DO_ALLOW_FUNC_FOCUS_CLICK(fp) \
109 	((fp).do_allow_func_focus_click)
110 #define FPS_ALLOW_FUNC_FOCUS_CLICK(fp,x) \
111 	((fp).do_allow_func_focus_click = !!(x))
112 #define FP_DO_ALLOW_FUNC_RAISE_CLICK(fp) \
113 	((fp).do_allow_func_raise_click)
114 #define FPS_ALLOW_FUNC_RAISE_CLICK(fp,x) \
115 	((fp).do_allow_func_raise_click = !!(x))
116 #define FP_DO_GRAB_FOCUS(fp) \
117 	((fp).do_open_grabs_focus)
118 #define FPS_GRAB_FOCUS(fp,x) \
119 	((fp).do_open_grabs_focus = !!(x))
120 #define FP_DO_GRAB_FOCUS_TRANSIENT(fp) \
121 	((fp).do_open_grabs_focus_transient)
122 #define FPS_GRAB_FOCUS_TRANSIENT(fp,x) \
123 	((fp).do_open_grabs_focus_transient = !!(x))
124 #define FP_DO_OVERRIDE_GRAB_FOCUS(fp) \
125 	((fp).do_override_grab_focus)
126 #define FPS_OVERRIDE_GRAB_FOCUS(fp,x) \
127 	((fp).do_override_grab_focus = !!(x))
128 #define FP_DO_RELEASE_FOCUS(fp) \
129 	((fp).do_close_releases_focus)
130 #define FPS_RELEASE_FOCUS(fp,x) \
131 	((fp).do_close_releases_focus = !!(x))
132 #define FP_DO_RELEASE_FOCUS_TRANSIENT(fp) \
133 	((fp).do_close_releases_focus_transient)
134 #define FPS_RELEASE_FOCUS_TRANSIENT(fp,x) \
135 	((fp).do_close_releases_focus_transient = !!(x))
136 #define FP_DO_OVERRIDE_RELEASE_FOCUS(fp) \
137 	((fp).do_override_release_focus)
138 #define FPS_OVERRIDE_RELEASE_FOCUS(fp,x) \
139 	((fp).do_override_release_focus = !!(x))
140 #define FP_DO_SORT_WINDOWLIST_BY(fp) \
141 	((fp).do_sort_windowlist_by)
142 #define FPS_SORT_WINDOWLIST_BY(fp,x) \
143 	((fp).do_sort_windowlist_by = !!(x))
144 
145 /* ---------------------------- type definitions --------------------------- */
146 
147 typedef enum
148 {
149 	FPOL_SORT_WL_BY_FOCUS = 0,
150 	FPOL_SORT_WL_BY_OPEN = 1
151 } fpol_sort_windowlist_t;
152 
153 typedef enum
154 {
155 	FOCUS_SET_BY_CLICK_CLIENT,
156 	FOCUS_SET_BY_CLICK_DECOR,
157 	FOCUS_SET_BY_CLICK_ICON,
158 	FOCUS_SET_BY_ENTER,
159 	FOCUS_SET_BY_PROGRAM,
160 	FOCUS_SET_BY_FUNCTION,
161 	/* used internally to restore the focus after certain actions */
162 	FOCUS_SET_FORCE
163 } fpol_set_focus_by_t;
164 
165 typedef struct
166 {
167 	unsigned client : 1;
168 	unsigned decor : 1;
169 	unsigned icon : 1;
170 } fpol_context_t;
171 
172 typedef struct
173 {
174 	/* raising the window */
175 	fpol_context_t do_raise_focused_click;
176 	fpol_context_t do_raise_unfocused_click;
177 	/* focus transition */
178 	fpol_context_t do_focus_click;
179 	unsigned do_focus_enter : 1;
180 	unsigned do_unfocus_leave : 1;
181 	unsigned do_focus_by_program : 1;
182 	unsigned do_focus_by_function : 1;
183 	unsigned do_warp_pointer_on_focus_func : 1;
184 	/* application focus model */
185 	unsigned is_lenient : 1;
186 	/* click configuration */
187 	unsigned use_mouse_buttons : NUMBER_OF_EXTENDED_MOUSE_BUTTONS;
188 	unsigned use_modifiers : 8;
189 	/* recycling of focus and raise clicks */
190 	unsigned do_pass_focus_click : 1;
191 	unsigned do_pass_raise_click : 1;
192 	unsigned do_ignore_focus_click_motion : 1;
193 	unsigned do_ignore_raise_click_motion : 1;
194 	unsigned do_allow_func_focus_click : 1;
195 	unsigned do_allow_func_raise_click : 1;
196 	/* keeping track of the focus */
197 	unsigned do_open_grabs_focus : 1;
198 	unsigned do_open_grabs_focus_transient : 1;
199 	unsigned do_override_grab_focus : 1;
200 	unsigned do_close_releases_focus : 1;
201 	unsigned do_close_releases_focus_transient : 1;
202 	unsigned do_override_release_focus : 1;
203 	unsigned do_sort_windowlist_by : 1;
204 } focus_policy_t;
205 
206 /* ---------------------------- forward declarations ----------------------- */
207 
208 /* ---------------------------- exported variables (globals) --------------- */
209 
210 /* ---------------------------- interface functions ------------------------ */
211 
212 void fpol_init_default_fp(
213 	focus_policy_t *fp);
214 int fpol_query_allow_set_focus(
215 	focus_policy_t *fpol, fpol_set_focus_by_t set_by_mode);
216 int fpol_query_allow_user_focus(
217 	focus_policy_t *fpol);
218 int fpol_is_policy_changed(
219 	focus_policy_t *fpol);
220 
221 #endif /* FOCUS_POLICY_H */
222