1 /*
2 * Copyright (c) 2008 Stephan Arts <stephan@xfce.org>
3 * Copyright (c) 2008 Jannis Pohlmann <jannis@xfce.org>
4 * Copyright (c) 2008 Olivier Fourdan <olivier@xfce.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either opt_version 2 of the License, or
9 * (at your option) any later opt_version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., Inc., 51 Franklin Street, Fifth Floor, Boston,
19 * MA 02110-1301, USA.
20 */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #ifdef HAVE_STRING_H
27 #include <string.h>
28 #endif
29
30 #include <glib.h>
31
32 #if defined (GETTEXT_PACKAGE)
33 #include <glib/gi18n-lib.h>
34 #else
35 #include <glib/gi18n.h>
36 #endif
37
38 #include <gdk/gdk.h>
39 #include <gdk/gdkx.h>
40 #include <gtk/gtk.h>
41 #include <gtk/gtkx.h>
42
43 #include <libxfce4ui/libxfce4ui.h>
44 #include <xfconf/xfconf.h>
45
46 #include <common/xfwm-common.h>
47
48 #include "xfwm4-tweaks-dialog_ui.h"
49 #include "range-debouncer.h"
50
51 static Window opt_socket_id = 0;
52 static gboolean opt_version = FALSE;
53
54 static const gchar *const modifier_list[] = {
55 N_("None"),
56 "Alt",
57 "Control",
58 "Hyper",
59 "Meta",
60 "Shift",
61 "Super",
62 "Mod1",
63 "Mod2",
64 "Mod3",
65 "Mod4",
66 "Mod5",
67 NULL
68 };
69
70 static void
cb_easy_click_combo_box_changed(GtkComboBox * combo,XfconfChannel * channel)71 cb_easy_click_combo_box_changed (GtkComboBox *combo, XfconfChannel *channel)
72 {
73 gint n;
74
75 n = 0;
76 while (modifier_list[n])
77 {
78 if (gtk_combo_box_get_active (combo) == n)
79 {
80 xfconf_channel_set_string (channel, "/general/easy_click", _(modifier_list[n]));
81 }
82 n++;
83 }
84 }
85
86 static void
cb_use_compositing_check_button_toggled(GtkToggleButton * toggle,GtkWidget * box)87 cb_use_compositing_check_button_toggled (GtkToggleButton *toggle, GtkWidget *box)
88 {
89 gtk_widget_set_sensitive (box, gtk_toggle_button_get_active (toggle));
90 }
91 #if 0
92 static void
93 cb_prevent_focus_stealing_check_button_toggled (GtkToggleButton *toggle, GtkWidget *box)
94 {
95 gtk_widget_set_sensitive (box, gtk_toggle_button_get_active (toggle));
96 }
97 #endif
98 static void
cb_activate_action_bring_radio_toggled(GtkToggleButton * toggle,XfconfChannel * channel)99 cb_activate_action_bring_radio_toggled (GtkToggleButton *toggle, XfconfChannel *channel)
100 {
101 if (gtk_toggle_button_get_active (toggle))
102 {
103 xfconf_channel_set_string (channel, "/general/activate_action", "bring");
104 }
105 }
106
107 static void
cb_activate_action_switch_radio_toggled(GtkToggleButton * toggle,XfconfChannel * channel)108 cb_activate_action_switch_radio_toggled (GtkToggleButton *toggle, XfconfChannel *channel)
109 {
110 if (gtk_toggle_button_get_active (toggle))
111 {
112 xfconf_channel_set_string (channel, "/general/activate_action", "switch");
113 }
114 }
115
116 static void
cb_activate_action_none_radio_toggled(GtkToggleButton * toggle,XfconfChannel * channel)117 cb_activate_action_none_radio_toggled (GtkToggleButton *toggle, XfconfChannel *channel)
118 {
119 if (gtk_toggle_button_get_active (toggle))
120 {
121 xfconf_channel_set_string (channel, "/general/activate_action", "none");
122 }
123 }
124
125 static void
cb_activate_placement_center_radio_toggled(GtkToggleButton * toggle,XfconfChannel * channel)126 cb_activate_placement_center_radio_toggled (GtkToggleButton *toggle, XfconfChannel *channel)
127 {
128 if (gtk_toggle_button_get_active (toggle))
129 {
130 xfconf_channel_set_string (channel, "/general/placement_mode", "center");
131 }
132 }
133
134 static void
cb_activate_placement_mouse_radio_toggled(GtkToggleButton * toggle,XfconfChannel * channel)135 cb_activate_placement_mouse_radio_toggled (GtkToggleButton *toggle, XfconfChannel *channel)
136 {
137 if (gtk_toggle_button_get_active (toggle))
138 {
139 xfconf_channel_set_string (channel, "/general/placement_mode", "mouse");
140 }
141 }
142
143 static void
cb_urgent_blink_button_toggled(GtkToggleButton * toggle,GtkWidget * repeat_urgent_blink)144 cb_urgent_blink_button_toggled (GtkToggleButton *toggle, GtkWidget *repeat_urgent_blink)
145 {
146 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (repeat_urgent_blink), FALSE);
147 gtk_widget_set_sensitive (repeat_urgent_blink, gtk_toggle_button_get_active (toggle));
148 }
149
150 static void
cb_borderless_maximize_button_toggled(GtkToggleButton * toggle,GtkWidget * titleless_maximize_check)151 cb_borderless_maximize_button_toggled (GtkToggleButton *toggle, GtkWidget *titleless_maximize_check)
152 {
153 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (titleless_maximize_check), FALSE);
154 gtk_widget_set_sensitive (titleless_maximize_check, gtk_toggle_button_get_active (toggle));
155 }
156
157 static void
wm_tweaks_dialog_configure_widgets(GtkBuilder * builder)158 wm_tweaks_dialog_configure_widgets (GtkBuilder *builder)
159 {
160 GtkWidget *vbox;
161 GtkTreeIter iter;
162 GtkListStore *list_store;
163 GtkCellRenderer *renderer;
164 XfconfChannel *xfwm4_channel = xfconf_channel_new ("xfwm4");
165 gchar *easy_click = NULL;
166 gchar *activate_action = NULL;
167 gchar *default_placement = NULL;
168 gboolean modifier_set = FALSE;
169 guint n;
170
171 /* Cycling tab */
172 GtkWidget *cycle_workspaces_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_workspaces_check"));
173 GtkWidget *cycle_hidden_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_hidden_check"));
174 GtkWidget *cycle_minimum_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_minimum_check"));
175 GtkWidget *cycle_minimized_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_minimized_check"));
176 GtkWidget *cycle_draw_frame = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_draw_frame"));
177 GtkWidget *cycle_raise = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_raise"));
178 GtkWidget *cycle_tabwin_mode = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_tabwin_mode"));
179
180 /* Focus tab */
181 GtkWidget *prevent_focus_stealing_check = GTK_WIDGET (gtk_builder_get_object (builder, "prevent_focus_stealing_check"));
182 GtkWidget *focus_hint_check = GTK_WIDGET (gtk_builder_get_object (builder, "focus_hint_check"));
183
184 GtkWidget *activate_action_bring_option = GTK_WIDGET (gtk_builder_get_object (builder, "activate_action_bring_option"));
185 GtkWidget *activate_action_switch_option = GTK_WIDGET (gtk_builder_get_object (builder, "activate_action_switch_option"));
186 GtkWidget *activate_action_none_option = GTK_WIDGET (gtk_builder_get_object (builder, "activate_action_none_option"));
187
188 /* Accessibility tab */
189 GtkWidget *easy_click_combo_box = GTK_WIDGET (gtk_builder_get_object (builder, "easy_click_combo_box"));
190 GtkWidget *raise_with_any_button_check = GTK_WIDGET (gtk_builder_get_object (builder, "raise_with_any_button_check"));
191 GtkWidget *borderless_maximize_check = GTK_WIDGET (gtk_builder_get_object (builder, "borderless_maximize_check"));
192 GtkWidget *titleless_maximize_check = GTK_WIDGET (gtk_builder_get_object (builder, "titleless_maximize_check"));
193 GtkWidget *tile_on_move_check = GTK_WIDGET (gtk_builder_get_object (builder, "tile_on_move_check"));
194 GtkWidget *snap_resist_check = GTK_WIDGET (gtk_builder_get_object (builder, "snap_resist_check"));
195 GtkWidget *urgent_blink = GTK_WIDGET (gtk_builder_get_object (builder, "urgent_blink"));
196 GtkWidget *repeat_urgent_blink = GTK_WIDGET (gtk_builder_get_object (builder, "repeat_urgent_blink"));
197 GtkWidget *mousewheel_rollup = GTK_WIDGET (gtk_builder_get_object (builder, "mousewheel_rollup"));
198
199 /* Workspaces tab */
200 GtkWidget *scroll_workspaces_check = GTK_WIDGET (gtk_builder_get_object (builder, "scroll_workspaces_check"));
201 GtkWidget *toggle_workspaces_check = GTK_WIDGET (gtk_builder_get_object (builder, "toggle_workspaces_check"));
202 GtkWidget *wrap_layout_check = GTK_WIDGET (gtk_builder_get_object (builder, "wrap_layout_check"));
203 GtkWidget *wrap_cycle_check = GTK_WIDGET (gtk_builder_get_object (builder, "wrap_cycle_check"));
204
205 /* Placement tab */
206 GtkWidget *placement_ratio_scale = GTK_WIDGET (gtk_builder_get_object (builder, "placement_ratio_scale"));
207 GtkWidget *placement_center_option = GTK_WIDGET (gtk_builder_get_object (builder, "placement_center_option"));
208 GtkWidget *placement_mouse_option = GTK_WIDGET (gtk_builder_get_object (builder, "placement_mouse_option"));
209
210 /* Compositing tab */
211 GtkWidget *use_compositing_check = GTK_WIDGET (gtk_builder_get_object (builder, "use_compositing_check"));
212 GtkWidget *use_compositing_box = GTK_WIDGET (gtk_builder_get_object (builder, "use_compositing_box"));
213
214 GtkWidget *unredirect_overlays_check = GTK_WIDGET (gtk_builder_get_object (builder, "unredirect_overlays_check"));
215 GtkWidget *cycle_preview_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_preview_check"));
216 GtkWidget *show_frame_shadow_check = GTK_WIDGET (gtk_builder_get_object (builder, "show_frame_shadow_check"));
217 GtkWidget *show_popup_shadow_check = GTK_WIDGET (gtk_builder_get_object (builder, "show_popup_shadow_check"));
218 GtkWidget *show_dock_shadow_check = GTK_WIDGET (gtk_builder_get_object (builder, "show_dock_shadow_check"));
219 GtkWidget *zoom_desktop_check = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_desktop_check"));
220 GtkWidget *zoom_pointer_check = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_pointer_check"));
221
222 GtkWidget *frame_opacity_scale = GTK_WIDGET (gtk_builder_get_object (builder, "frame_opacity_scale"));
223 GtkWidget *inactive_opacity_scale = GTK_WIDGET (gtk_builder_get_object (builder, "inactive_opacity_scale"));
224 GtkWidget *move_opacity_scale = GTK_WIDGET (gtk_builder_get_object (builder, "move_opacity_scale"));
225 GtkWidget *popup_opacity_scale = GTK_WIDGET (gtk_builder_get_object (builder, "popup_opacity_scale"));
226 GtkWidget *resize_opacity_scale = GTK_WIDGET (gtk_builder_get_object (builder, "resize_opacity_scale"));
227
228
229 /* Fill combo-box */
230 list_store = gtk_list_store_new (1, G_TYPE_STRING);
231
232 easy_click = xfconf_channel_get_string (xfwm4_channel, "/general/easy_click", "Alt");
233 gtk_cell_layout_clear (GTK_CELL_LAYOUT (easy_click_combo_box));
234 renderer = gtk_cell_renderer_text_new ();
235 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (easy_click_combo_box), renderer, TRUE);
236 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (easy_click_combo_box), renderer, "text", 0);
237 gtk_combo_box_set_model (GTK_COMBO_BOX (easy_click_combo_box), GTK_TREE_MODEL (list_store));
238 for (n = 0; modifier_list[n]; n++)
239 {
240 gtk_list_store_append (list_store, &iter);
241 gtk_list_store_set (list_store, &iter, 0, N_(modifier_list[n]), -1);
242 if (!modifier_set && !strcmp (easy_click, modifier_list[n]))
243 {
244 gtk_combo_box_set_active (GTK_COMBO_BOX (easy_click_combo_box), n);
245 modifier_set = TRUE;
246 }
247 }
248 /* If not specified, set to "None" */
249 if (!modifier_set)
250 gtk_combo_box_set_active (GTK_COMBO_BOX (easy_click_combo_box), 0);
251
252 activate_action = xfconf_channel_get_string (xfwm4_channel, "/general/activate_action", "bring");
253 if (!strcmp (activate_action, "switch"))
254 {
255 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (activate_action_bring_option), FALSE);
256 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (activate_action_switch_option), TRUE);
257 }
258 if (!strcmp (activate_action, "none"))
259 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (activate_action_none_option), TRUE);
260
261 default_placement = xfconf_channel_get_string (xfwm4_channel, "/general/placement_mode", "center");
262 if (!strcmp (default_placement, "mouse"))
263 {
264 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (placement_center_option), FALSE);
265 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (placement_mouse_option), TRUE);
266 }
267
268 /* not so easy properties */
269 g_signal_connect (G_OBJECT (activate_action_bring_option),
270 "toggled",
271 G_CALLBACK (cb_activate_action_bring_radio_toggled),
272 xfwm4_channel);
273 g_signal_connect (G_OBJECT (activate_action_switch_option),
274 "toggled",
275 G_CALLBACK (cb_activate_action_switch_radio_toggled),
276 xfwm4_channel);
277 g_signal_connect (G_OBJECT (activate_action_none_option),
278 "toggled",
279 G_CALLBACK (cb_activate_action_none_radio_toggled),
280 xfwm4_channel);
281 g_signal_connect (G_OBJECT (borderless_maximize_check),
282 "toggled",
283 G_CALLBACK (cb_borderless_maximize_button_toggled),
284 titleless_maximize_check);
285 g_signal_connect (G_OBJECT (placement_center_option),
286 "toggled",
287 G_CALLBACK (cb_activate_placement_center_radio_toggled),
288 xfwm4_channel);
289 g_signal_connect (G_OBJECT (placement_mouse_option),
290 "toggled",
291 G_CALLBACK (cb_activate_placement_mouse_radio_toggled),
292 xfwm4_channel);
293 g_signal_connect (G_OBJECT (use_compositing_check),
294 "toggled",
295 G_CALLBACK (cb_use_compositing_check_button_toggled),
296 use_compositing_box);
297 g_signal_connect (G_OBJECT (easy_click_combo_box),
298 "changed",
299 G_CALLBACK (cb_easy_click_combo_box_changed),
300 xfwm4_channel);
301 g_signal_connect (G_OBJECT (urgent_blink),
302 "toggled",
303 G_CALLBACK (cb_urgent_blink_button_toggled),
304 repeat_urgent_blink);
305
306 /* Bind easy properties */
307 /* Cycling tab */
308 xfconf_g_property_bind (xfwm4_channel,
309 "/general/cycle_minimum",
310 G_TYPE_BOOLEAN,
311 (GObject *)cycle_minimum_check, "active");
312 xfconf_g_property_bind (xfwm4_channel,
313 "/general/cycle_minimized",
314 G_TYPE_BOOLEAN,
315 (GObject *)cycle_minimized_check, "active");
316 xfconf_g_property_bind (xfwm4_channel,
317 "/general/cycle_hidden",
318 G_TYPE_BOOLEAN,
319 (GObject *)cycle_hidden_check, "active");
320 xfconf_g_property_bind (xfwm4_channel,
321 "/general/cycle_workspaces",
322 G_TYPE_BOOLEAN,
323 (GObject *)cycle_workspaces_check, "active");
324 xfconf_g_property_bind (xfwm4_channel,
325 "/general/cycle_draw_frame",
326 G_TYPE_BOOLEAN,
327 (GObject *)cycle_draw_frame, "active");
328 xfconf_g_property_bind (xfwm4_channel,
329 "/general/cycle_raise",
330 G_TYPE_BOOLEAN,
331 (GObject *)cycle_raise, "active");
332 xfconf_g_property_bind (xfwm4_channel,
333 "/general/cycle_tabwin_mode",
334 G_TYPE_INT,
335 (GObject *)cycle_tabwin_mode, "active");
336
337 /* Focus tab */
338 xfconf_g_property_bind (xfwm4_channel,
339 "/general/prevent_focus_stealing",
340 G_TYPE_BOOLEAN,
341 (GObject *)prevent_focus_stealing_check, "active");
342 xfconf_g_property_bind (xfwm4_channel,
343 "/general/focus_hint",
344 G_TYPE_BOOLEAN,
345 (GObject *)focus_hint_check, "active");
346
347 /* Accessibility tab */
348 xfconf_g_property_bind (xfwm4_channel,
349 "/general/raise_with_any_button",
350 G_TYPE_BOOLEAN,
351 (GObject *)raise_with_any_button_check, "active");
352 xfconf_g_property_bind (xfwm4_channel,
353 "/general/borderless_maximize",
354 G_TYPE_BOOLEAN,
355 (GObject *)borderless_maximize_check, "active");
356 xfconf_g_property_bind (xfwm4_channel,
357 "/general/titleless_maximize",
358 G_TYPE_BOOLEAN,
359 (GObject *)titleless_maximize_check, "active");
360 xfconf_g_property_bind (xfwm4_channel,
361 "/general/tile_on_move",
362 G_TYPE_BOOLEAN,
363 (GObject *)tile_on_move_check, "active");
364 xfconf_g_property_bind (xfwm4_channel,
365 "/general/snap_resist",
366 G_TYPE_BOOLEAN,
367 (GObject *)snap_resist_check, "active");
368 xfconf_g_property_bind (xfwm4_channel,
369 "/general/urgent_blink",
370 G_TYPE_BOOLEAN,
371 (GObject *)urgent_blink, "active");
372 xfconf_g_property_bind (xfwm4_channel,
373 "/general/repeat_urgent_blink",
374 G_TYPE_BOOLEAN,
375 (GObject *)repeat_urgent_blink, "active");
376 xfconf_g_property_bind (xfwm4_channel,
377 "/general/mousewheel_rollup",
378 G_TYPE_BOOLEAN,
379 (GObject *)mousewheel_rollup, "active");
380 gtk_widget_set_sensitive (repeat_urgent_blink,
381 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (urgent_blink)));
382 gtk_widget_set_sensitive (titleless_maximize_check,
383 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (borderless_maximize_check)));
384
385 /* Workspaces tab */
386 xfconf_g_property_bind (xfwm4_channel,
387 "/general/toggle_workspaces",
388 G_TYPE_BOOLEAN,
389 (GObject *)toggle_workspaces_check, "active");
390 xfconf_g_property_bind (xfwm4_channel,
391 "/general/scroll_workspaces",
392 G_TYPE_BOOLEAN,
393 (GObject *)scroll_workspaces_check, "active");
394 xfconf_g_property_bind (xfwm4_channel,
395 "/general/wrap_layout",
396 G_TYPE_BOOLEAN,
397 (GObject *)wrap_layout_check, "active");
398 xfconf_g_property_bind (xfwm4_channel,
399 "/general/wrap_cycle",
400 G_TYPE_BOOLEAN,
401 (GObject *)wrap_cycle_check, "active");
402
403 /* Placement tab */
404 xfconf_g_property_bind (xfwm4_channel,
405 "/general/placement_ratio",
406 G_TYPE_INT,
407 (GObject *) gtk_range_get_adjustment (GTK_RANGE (placement_ratio_scale)), "value");
408
409 /* Compositing tab */
410 xfconf_g_property_bind (xfwm4_channel,
411 "/general/use_compositing",
412 G_TYPE_BOOLEAN,
413 (GObject *)use_compositing_check, "active");
414 xfconf_g_property_bind (xfwm4_channel,
415 "/general/unredirect_overlays",
416 G_TYPE_BOOLEAN,
417 (GObject *)unredirect_overlays_check, "active");
418 xfconf_g_property_bind (xfwm4_channel,
419 "/general/cycle_preview",
420 G_TYPE_BOOLEAN,
421 (GObject *)cycle_preview_check, "active");
422 xfconf_g_property_bind (xfwm4_channel,
423 "/general/show_frame_shadow",
424 G_TYPE_BOOLEAN,
425 (GObject *)show_frame_shadow_check, "active");
426 xfconf_g_property_bind (xfwm4_channel,
427 "/general/show_popup_shadow",
428 G_TYPE_BOOLEAN,
429 (GObject *)show_popup_shadow_check, "active");
430 xfconf_g_property_bind (xfwm4_channel,
431 "/general/show_dock_shadow",
432 G_TYPE_BOOLEAN,
433 (GObject *)show_dock_shadow_check, "active");
434 xfconf_g_property_bind (xfwm4_channel,
435 "/general/zoom_desktop",
436 G_TYPE_BOOLEAN,
437 (GObject *)zoom_desktop_check, "active");
438 xfconf_g_property_bind (xfwm4_channel,
439 "/general/zoom_pointer",
440 G_TYPE_BOOLEAN,
441 (GObject *)zoom_pointer_check, "active");
442 xfconf_g_property_bind (xfwm4_channel,
443 "/general/frame_opacity",
444 G_TYPE_INT,
445 (GObject *) range_debouncer_bind (GTK_RANGE (frame_opacity_scale)), "value");
446 xfconf_g_property_bind (xfwm4_channel,
447 "/general/resize_opacity",
448 G_TYPE_INT,
449 (GObject *) range_debouncer_bind (GTK_RANGE (resize_opacity_scale)), "value");
450 xfconf_g_property_bind (xfwm4_channel,
451 "/general/move_opacity",
452 G_TYPE_INT,
453 (GObject *) range_debouncer_bind (GTK_RANGE (move_opacity_scale)), "value");
454 xfconf_g_property_bind (xfwm4_channel,
455 "/general/inactive_opacity",
456 G_TYPE_INT,
457 (GObject *) range_debouncer_bind (GTK_RANGE (inactive_opacity_scale)), "value");
458 xfconf_g_property_bind (xfwm4_channel,
459 "/general/popup_opacity",
460 G_TYPE_INT,
461 (GObject *) range_debouncer_bind (GTK_RANGE (popup_opacity_scale)), "value");
462
463 vbox = GTK_WIDGET (gtk_builder_get_object (builder, "main-vbox"));
464 gtk_widget_show_all (vbox);
465
466 g_free (easy_click);
467 g_free (activate_action);
468 }
469
470 static void
wm_tweaks_dialog_response(GtkWidget * dialog,gint response_id)471 wm_tweaks_dialog_response (GtkWidget *dialog,
472 gint response_id)
473 {
474 if (response_id == GTK_RESPONSE_HELP)
475 {
476 xfce_dialog_show_help (GTK_WINDOW (dialog), "xfwm4",
477 "wmtweaks", NULL);
478 }
479 else
480 {
481 gtk_main_quit ();
482 }
483 }
484
485 static GOptionEntry entries[] =
486 {
487 { "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &opt_socket_id, N_ ("Session manager socket"), N_ ("SOCKET ID") },
488 { "version", 'v', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_version, N_ ("Version information"), NULL },
489 { NULL }
490 };
491
492 int
main(int argc,gchar ** argv)493 main (int argc, gchar **argv)
494 {
495 GtkWidget *dialog;
496 GtkWidget *plug;
497 GtkWidget *plug_child;
498 GtkBuilder *builder;
499 GError *cli_error = NULL;
500 const gchar *wm_name;
501
502 #ifdef ENABLE_NLS
503 xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
504 #endif
505
506 if (!gtk_init_with_args (&argc, &argv, _ ("."), entries, PACKAGE, &cli_error))
507 {
508 if (cli_error != NULL)
509 {
510 g_print (_ ("%s: %s\nTry %s --help to see a full list of available command line options.\n"), PACKAGE, cli_error->message, PACKAGE_NAME);
511 g_error_free (cli_error);
512 return 1;
513 }
514 }
515
516 wm_name = gdk_x11_screen_get_window_manager_name (gdk_screen_get_default ());
517 if (G_UNLIKELY (g_ascii_strcasecmp (wm_name, "Xfwm4")))
518 {
519 g_print ("These settings cannot work with your current window manager (%s)\n", wm_name);
520 return 1;
521 }
522
523 if (opt_version)
524 {
525 g_print ("%s\n", PACKAGE_STRING);
526 return 0;
527 }
528
529 xfconf_init (NULL);
530
531 builder = gtk_builder_new ();
532
533 if (xfce_titled_dialog_get_type () == 0)
534 return 1;
535
536 gtk_builder_add_from_string (builder, tweaks_dialog_ui, tweaks_dialog_ui_length, NULL);
537
538 if (builder)
539 {
540 wm_tweaks_dialog_configure_widgets (builder);
541
542 if (opt_socket_id == 0)
543 {
544 dialog = GTK_WIDGET (gtk_builder_get_object (builder, "main-dialog"));
545 gtk_widget_show (dialog);
546 g_signal_connect (dialog, "response", G_CALLBACK (wm_tweaks_dialog_response), NULL);
547
548 /* To prevent the settings dialog to be saved in the session */
549 gdk_x11_set_sm_client_id ("FAKE ID");
550
551 gtk_main ();
552
553 gtk_widget_destroy (dialog);
554 }
555 else
556 {
557 /* Create plug widget */
558 plug = gtk_plug_new (opt_socket_id);
559 g_signal_connect (plug, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
560 gtk_widget_show (plug);
561
562 /* Get plug child widget */
563 plug_child = GTK_WIDGET (gtk_builder_get_object (builder, "plug-child"));
564 xfwm_widget_reparent (plug_child, plug);
565 gtk_widget_show (plug_child);
566
567 /* To prevent the settings dialog to be saved in the session */
568 gdk_x11_set_sm_client_id ("FAKE ID");
569
570 /* Stop startup notification */
571 gdk_notify_startup_complete ();
572
573 /* Enter main loop */
574 gtk_main ();
575 }
576
577 g_object_unref (builder);
578 }
579
580 xfconf_shutdown ();
581
582 return 0;
583 }
584