1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 
3 /* Metacity preferences */
4 
5 /*
6  * Copyright (C) 2001 Havoc Pennington
7  * Copyright (C) 2006 Elijah Newren
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of the
12  * License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #ifndef META_PREFS_H
24 #define META_PREFS_H
25 
26 /* This header is a "common" one between the UI and core side */
27 #include "common.h"
28 #include "meta-compositor.h"
29 #include "types.h"
30 #include <libmetacity/meta-theme.h>
31 #include <pango/pango-font.h>
32 #include <gdesktop-enums.h>
33 
34 /* Keep in sync with GSettings schemas! */
35 typedef enum
36 {
37   META_PREF_MOUSE_BUTTON_MODS,
38   META_PREF_FOCUS_MODE,
39   META_PREF_FOCUS_NEW_WINDOWS,
40   META_PREF_ATTACH_MODAL_DIALOGS,
41   META_PREF_RAISE_ON_CLICK,
42   META_PREF_ACTION_DOUBLE_CLICK_TITLEBAR,
43   META_PREF_ACTION_MIDDLE_CLICK_TITLEBAR,
44   META_PREF_ACTION_RIGHT_CLICK_TITLEBAR,
45   META_PREF_AUTO_RAISE,
46   META_PREF_AUTO_RAISE_DELAY,
47   META_PREF_THEME_NAME,
48   META_PREF_THEME_TYPE,
49   META_PREF_TITLEBAR_FONT,
50   META_PREF_NUM_WORKSPACES,
51   META_PREF_KEYBINDINGS,
52   META_PREF_DISABLE_WORKAROUNDS,
53   META_PREF_BUTTON_LAYOUT,
54   META_PREF_WORKSPACE_NAMES,
55   META_PREF_VISUAL_BELL,
56   META_PREF_AUDIBLE_BELL,
57   META_PREF_VISUAL_BELL_TYPE,
58   META_PREF_GNOME_ACCESSIBILITY,
59   META_PREF_GNOME_ANIMATIONS,
60   META_PREF_CURSOR_THEME,
61   META_PREF_CURSOR_SIZE,
62   META_PREF_COMPOSITOR,
63   META_PREF_RESIZE_WITH_RIGHT_BUTTON,
64   META_PREF_EDGE_TILING,
65   META_PREF_FORCE_FULLSCREEN,
66   META_PREF_PLACEMENT_MODE,
67   META_PREF_ALT_TAB_THUMBNAILS
68 } MetaPreference;
69 
70 typedef enum
71 {
72   META_PLACEMENT_MODE_SMART,
73   META_PLACEMENT_MODE_CASCADE,
74   META_PLACEMENT_MODE_CENTER,
75   META_PLACEMENT_MODE_ORIGIN,
76   META_PLACEMENT_MODE_RANDOM
77 } MetaPlacementMode;
78 
79 typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
80                                        gpointer       data);
81 
82 void meta_prefs_add_listener    (MetaPrefsChangedFunc func,
83                                  gpointer             data);
84 void meta_prefs_remove_listener (MetaPrefsChangedFunc func,
85                                  gpointer             data);
86 
87 void meta_prefs_init (void);
88 const char* meta_preference_to_string (MetaPreference pref);
89 
90 MetaVirtualModifier         meta_prefs_get_mouse_button_mods  (void);
91 guint                       meta_prefs_get_mouse_button_resize (void);
92 guint                       meta_prefs_get_mouse_button_menu  (void);
93 GDesktopFocusMode           meta_prefs_get_focus_mode         (void);
94 GDesktopFocusNewWindows     meta_prefs_get_focus_new_windows  (void);
95 gboolean                    meta_prefs_get_attach_modal_dialogs (void);
96 gboolean                    meta_prefs_get_raise_on_click     (void);
97 
98 const gchar                *meta_prefs_get_theme_name         (void);
99 MetaThemeType               meta_prefs_get_theme_type         (void);
100 
101 /* returns NULL if GTK default should be used */
102 const PangoFontDescription* meta_prefs_get_titlebar_font      (void);
103 int                         meta_prefs_get_num_workspaces     (void);
104 gboolean                    meta_prefs_get_disable_workarounds (void);
105 gboolean                    meta_prefs_get_auto_raise         (void);
106 int                         meta_prefs_get_auto_raise_delay   (void);
107 gboolean                    meta_prefs_get_gnome_accessibility (void);
108 gboolean                    meta_prefs_get_gnome_animations   (void);
109 gboolean                    meta_prefs_get_edge_tiling        (void);
110 
111 const char*                 meta_prefs_get_screenshot_command (void);
112 
113 const char*                 meta_prefs_get_window_screenshot_command (void);
114 
115 const char*                 meta_prefs_get_terminal_command   (void);
116 
117 const gchar*                meta_prefs_get_button_layout (void);
118 
119 /* Double, right, middle click can be configured to any titlebar meta-action */
120 GDesktopTitlebarAction       meta_prefs_get_action_double_click_titlebar (void);
121 GDesktopTitlebarAction       meta_prefs_get_action_middle_click_titlebar (void);
122 GDesktopTitlebarAction       meta_prefs_get_action_right_click_titlebar (void);
123 
124 void meta_prefs_set_num_workspaces (int n_workspaces);
125 
126 const char* meta_prefs_get_workspace_name    (int         i);
127 void        meta_prefs_change_workspace_name (int         i,
128                                               const char *name);
129 
130 const char* meta_prefs_get_cursor_theme      (void);
131 int         meta_prefs_get_cursor_size       (void);
132 gboolean    meta_prefs_get_force_fullscreen  (void);
133 
134 MetaPlacementMode meta_prefs_get_placement_mode (void);
135 
136 gboolean    meta_prefs_get_alt_tab_thumbnails (void);
137 
138 MetaCompositorType meta_prefs_get_compositor (void);
139 
140 void               meta_prefs_set_compositor (MetaCompositorType compositor);
141 
142 void meta_prefs_set_force_fullscreen (gboolean whether);
143 
144 /* XXX FIXME This should be x-macroed, but isn't yet because it would be
145  * difficult (or perhaps impossible) to add the suffixes using the current
146  * system.  It needs some more thought, perhaps after the current system
147  * evolves a little.
148  */
149 typedef enum _MetaKeyBindingAction
150 {
151   META_KEYBINDING_ACTION_NONE = -1,
152   META_KEYBINDING_ACTION_WORKSPACE_1,
153   META_KEYBINDING_ACTION_WORKSPACE_2,
154   META_KEYBINDING_ACTION_WORKSPACE_3,
155   META_KEYBINDING_ACTION_WORKSPACE_4,
156   META_KEYBINDING_ACTION_WORKSPACE_5,
157   META_KEYBINDING_ACTION_WORKSPACE_6,
158   META_KEYBINDING_ACTION_WORKSPACE_7,
159   META_KEYBINDING_ACTION_WORKSPACE_8,
160   META_KEYBINDING_ACTION_WORKSPACE_9,
161   META_KEYBINDING_ACTION_WORKSPACE_10,
162   META_KEYBINDING_ACTION_WORKSPACE_11,
163   META_KEYBINDING_ACTION_WORKSPACE_12,
164   META_KEYBINDING_ACTION_WORKSPACE_LEFT,
165   META_KEYBINDING_ACTION_WORKSPACE_RIGHT,
166   META_KEYBINDING_ACTION_WORKSPACE_UP,
167   META_KEYBINDING_ACTION_WORKSPACE_DOWN,
168   META_KEYBINDING_ACTION_SWITCH_APPLICATIONS,
169   META_KEYBINDING_ACTION_SWITCH_APPLICATIONS_BACKWARD,
170   META_KEYBINDING_ACTION_SWITCH_GROUP,
171   META_KEYBINDING_ACTION_SWITCH_GROUP_BACKWARD,
172   META_KEYBINDING_ACTION_SWITCH_WINDOWS,
173   META_KEYBINDING_ACTION_SWITCH_WINDOWS_BACKWARD,
174   META_KEYBINDING_ACTION_SWITCH_PANELS,
175   META_KEYBINDING_ACTION_SWITCH_PANELS_BACKWARD,
176   META_KEYBINDING_ACTION_CYCLE_GROUP,
177   META_KEYBINDING_ACTION_CYCLE_GROUP_BACKWARD,
178   META_KEYBINDING_ACTION_CYCLE_WINDOWS,
179   META_KEYBINDING_ACTION_CYCLE_WINDOWS_BACKWARD,
180   META_KEYBINDING_ACTION_CYCLE_PANELS,
181   META_KEYBINDING_ACTION_CYCLE_PANELS_BACKWARD,
182   META_KEYBINDING_ACTION_SHOW_DESKTOP,
183   META_KEYBINDING_ACTION_PANEL_MAIN_MENU,
184   META_KEYBINDING_ACTION_PANEL_RUN_DIALOG,
185   META_KEYBINDING_ACTION_SET_SPEW_MARK,
186   META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU,
187   META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN,
188   META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED,
189   META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT,
190   META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT,
191   META_KEYBINDING_ACTION_TOGGLE_ABOVE,
192   META_KEYBINDING_ACTION_MAXIMIZE,
193   META_KEYBINDING_ACTION_UNMAXIMIZE,
194   META_KEYBINDING_ACTION_TOGGLE_SHADED,
195   META_KEYBINDING_ACTION_MINIMIZE,
196   META_KEYBINDING_ACTION_CLOSE,
197   META_KEYBINDING_ACTION_BEGIN_MOVE,
198   META_KEYBINDING_ACTION_BEGIN_RESIZE,
199   META_KEYBINDING_ACTION_TOGGLE_ON_ALL_WORKSPACES,
200   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_1,
201   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_2,
202   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_3,
203   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_4,
204   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_5,
205   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_6,
206   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_7,
207   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_8,
208   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_9,
209   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_10,
210   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_11,
211   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_12,
212   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_LEFT,
213   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT,
214   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP,
215   META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN,
216   META_KEYBINDING_ACTION_RAISE_OR_LOWER,
217   META_KEYBINDING_ACTION_RAISE,
218   META_KEYBINDING_ACTION_LOWER,
219   META_KEYBINDING_ACTION_MAXIMIZE_VERTICALLY,
220   META_KEYBINDING_ACTION_MAXIMIZE_HORIZONTALLY,
221   META_KEYBINDING_ACTION_MOVE_TO_CORNER_NW,
222   META_KEYBINDING_ACTION_MOVE_TO_CORNER_NE,
223   META_KEYBINDING_ACTION_MOVE_TO_CORNER_SW,
224   META_KEYBINDING_ACTION_MOVE_TO_CORNER_SE,
225   META_KEYBINDING_ACTION_MOVE_TO_SIDE_N,
226   META_KEYBINDING_ACTION_MOVE_TO_SIDE_S,
227   META_KEYBINDING_ACTION_MOVE_TO_SIDE_E,
228   META_KEYBINDING_ACTION_MOVE_TO_SIDE_W,
229   META_KEYBINDING_ACTION_MOVE_TO_CENTER,
230 } MetaKeyBindingAction;
231 
232 typedef enum
233 {
234   META_KEY_BINDING_NONE,
235   META_KEY_BINDING_PER_WINDOW  = 1 << 0,
236   META_KEY_BINDING_REVERSES    = 1 << 1,
237   META_KEY_BINDING_IS_REVERSED = 1 << 2
238 } MetaKeyBindingFlags;
239 
240 typedef struct
241 {
242   unsigned int keysym;
243   unsigned int keycode;
244   MetaVirtualModifier modifiers;
245 } MetaKeyCombo;
246 
247 /**
248  * MetaKeyHandlerFunc: (skip)
249  *
250  */
251 typedef void (* MetaKeyHandlerFunc) (MetaDisplay    *display,
252                                      MetaScreen     *screen,
253                                      MetaWindow     *window,
254                                      XEvent         *event,
255                                      MetaKeyBinding *binding);
256 
257 typedef struct _MetaKeyHandler MetaKeyHandler;
258 
259 typedef struct
260 {
261   char *name;
262   char *schema;
263 
264   MetaKeyBindingAction action;
265 
266   /**
267    * A list of MetaKeyCombos. Each of them is bound to
268    * this keypref. If one has keysym==modifiers==0, it is
269    * ignored. For historical reasons, the first entry is
270    * governed by the pref FOO and the remainder are
271    * governed by the pref FOO_list.
272    */
273   GSList *bindings;
274 
275   /** for keybindings that can have shift or not like Alt+Tab */
276   gboolean      add_shift:1;
277 
278   /** for keybindings that apply only to a window */
279   gboolean      per_window:1;
280 } MetaKeyPref;
281 
282 GList *meta_prefs_get_keybindings (void);
283 
284 MetaKeyBindingAction meta_prefs_get_keybinding_action (const char *name);
285 
286 void meta_prefs_get_window_binding (const char          *name,
287                                     unsigned int        *keysym,
288                                     MetaVirtualModifier *modifiers);
289 
290 gboolean           meta_prefs_get_visual_bell      (void);
291 gboolean           meta_prefs_bell_is_audible      (void);
292 GDesktopVisualBellType meta_prefs_get_visual_bell_type (void);
293 
294 #endif
295