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