~ubuntu-branches/ubuntu/precise/xfwm4/precise-updates

« back to all changes in this revision

Viewing changes to src/settings.c

  • Committer: Bazaar Package Importer
  • Author(s): Jérôme Guelfucci, Jérôme Guelfucci, Lionel Le Folgoc
  • Date: 2009-01-30 18:28:59 UTC
  • mfrom: (1.1.21 upstream)
  • Revision ID: james.westby@ubuntu.com-20090130182859-1tci3n1f1hhppvc2
Tags: 4.5.99.1-0ubuntu1
[ Jérôme Guelfucci ]
* Merge with Debian Xfce UNRELEASED, remaining Ubuntu changes:
  - debian/xfwm4.1: update bug reporting address (LP instead of Debian BTS).

[ Lionel Le Folgoc ]
* debian/control: use our Vcs-* fields.
* Bugs fixed by this new release:
  - "User interface of focused application is covered by another application's
    new window in Xfce" (LP: #250101)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*      $Id: settings.c 25819 2007-06-16 23:17:22Z olivier $
 
1
/*      $Id$
2
2
 
3
3
        This program is free software; you can redistribute it and/or modify
4
4
        it under the terms of the GNU General Public License as published by
12
12
 
13
13
        You should have received a copy of the GNU General Public License
14
14
        along with this program; if not, write to the Free Software
15
 
        Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
15
        Foundation, Inc., Inc., 51 Franklin Street, Fifth Floor, Boston,
 
16
        MA 02110-1301, USA.
 
17
 
16
18
 
17
19
        oroborus - (c) 2001 Ken Lynch
18
 
        xfwm4    - (c) 2002-2006 Olivier Fourdan
 
20
        xfwm4    - (c) 2002-2009 Olivier Fourdan,
 
21
                       2008 Jannis Pohlmann
 
22
 
19
23
 */
20
24
 
21
25
#ifdef HAVE_CONFIG_H
22
 
#include <config.h>
 
26
#include "config.h"
23
27
#endif
24
28
 
25
29
#include <glib.h>
28
32
#include <gdk/gdkx.h>
29
33
#include <gtk/gtk.h>
30
34
#include <libxfce4util/libxfce4util.h>
31
 
#include <libxfce4mcs/mcs-client.h>
 
35
#include <xfconf/xfconf.h>
 
36
#include <libxfce4kbd-private/xfce-shortcuts-provider.h>
32
37
 
33
38
#include "screen.h"
34
39
#include "hints.h"
39
44
#include "compositor.h"
40
45
#include "ui_style.h"
41
46
 
42
 
#define CHANNEL1                "xfwm4"
43
 
#define CHANNEL2                "margins"
44
 
#define CHANNEL3                "workspaces"
45
 
#define CHANNEL4                "xfwm4_keys"
46
 
#define CHANNEL5                "wmtweaks"
47
 
 
48
 
#define DEFAULT_KEYTHEME        "Default"
49
 
#define KEYTHEMERC              "keythemerc"
 
47
#define CHANNEL_XFWM            "xfwm4"
50
48
#define THEMERC                 "themerc"
51
 
 
52
 
#define TOINT(x)                (x ? atoi(x) : 0)
53
49
#define XPM_COLOR_SYMBOL_SIZE   22
54
50
 
55
51
/* Forward static decls. */
58
54
static void              set_settings_margin  (ScreenInfo *,
59
55
                                               int ,
60
56
                                               int);
61
 
static void              notify_cb            (const char *,
62
 
                                               const char *,
63
 
                                               McsAction,
64
 
                                               McsSetting *,
65
 
                                               void *);
66
 
static GdkFilterReturn   client_event_filter  (GdkXEvent *,
67
 
                                               GdkEvent *,
68
 
                                               gpointer);
69
 
static void              watch_cb             (Window,
70
 
                                               Bool,
71
 
                                               long,
72
 
                                               void *);
73
57
static void              loadRcData           (ScreenInfo *,
74
58
                                               Settings *);
75
 
static void              loadMcsData          (ScreenInfo *,
76
 
                                               Settings *);
77
59
static void              loadTheme            (ScreenInfo *,
78
60
                                               Settings *);
79
 
static gboolean          loadKeyBindings      (ScreenInfo *,
80
 
                                               Settings *);
 
61
static void              loadKeyBindings      (ScreenInfo *);
81
62
static void              unloadTheme          (ScreenInfo *);
 
63
static void              unloadKeyBindings    (ScreenInfo *);
82
64
static void              unloadSettings       (ScreenInfo *);
83
65
static gboolean          reloadScreenSettings (ScreenInfo *,
84
66
                                               int);
 
67
static void              parseShortcut        (ScreenInfo *,
 
68
                                               int,
 
69
                                               const gchar *,
 
70
                                               GList *);
 
71
static const gchar      *getShortcut          (const gchar *,
 
72
                                               GList *);
 
73
static void              cb_xfwm4_channel_property_changed (XfconfChannel *,
 
74
                                                           const gchar *,
 
75
                                                           const GValue *,
 
76
                                                           ScreenInfo *);
 
77
static void              cb_keys_changed      (GdkKeymap *,
 
78
                                               ScreenInfo *);
 
79
static void              cb_shortcut_added    (XfceShortcutsProvider *,
 
80
                                               const gchar *,
 
81
                                               ScreenInfo *);
 
82
static void              cb_shortcut_removed  (XfceShortcutsProvider *,
 
83
                                               const gchar *,
 
84
                                               ScreenInfo *);
85
85
 
86
86
static void
87
87
update_grabs (ScreenInfo *screen_info)
138
138
}
139
139
 
140
140
static void
141
 
set_easy_click (ScreenInfo *screen_info, char *modifier)
 
141
set_easy_click (ScreenInfo *screen_info, const char *modifier)
142
142
{
 
143
    gchar *modstr;
 
144
 
143
145
    g_return_if_fail (screen_info != NULL);
144
146
    g_return_if_fail (modifier != NULL);
145
147
 
149
151
    }
150
152
    else
151
153
    {
152
 
        screen_info->params->easy_click = getModifierMap (modifier);
 
154
        modstr = g_strdup_printf ("<%s>", modifier);
 
155
        screen_info->params->easy_click = getModifierMap (modstr);
 
156
        g_free (modstr);
153
157
    }
154
158
}
155
159
 
174
178
}
175
179
 
176
180
static void
177
 
notify_cb (const char *name, const char *channel_name, McsAction action, McsSetting * setting, void *data)
 
181
set_placement_mode (ScreenInfo *screen_info, const char *value)
178
182
{
179
 
    ScreenInfo *screen_info;
180
 
 
181
 
    screen_info = (ScreenInfo *) data;
182
183
    g_return_if_fail (screen_info != NULL);
183
 
 
184
 
    if (!g_ascii_strcasecmp (CHANNEL1, channel_name))
185
 
    {
186
 
        switch (action)
187
 
        {
188
 
            case MCS_ACTION_NEW:
189
 
                /* The following is to reduce initial startup time and reload */
190
 
                if (!screen_info->mcs_initted)
191
 
                {
192
 
                    return;
193
 
                }
194
 
            case MCS_ACTION_CHANGED:
195
 
                if (setting->type == MCS_TYPE_INT)
196
 
                {
197
 
                    if (!strcmp (name, "Xfwm/BoxMove"))
198
 
                    {
199
 
                        screen_info->params->box_move = setting->data.v_int;
200
 
                    }
201
 
                    else if (!strcmp (name, "Xfwm/BoxResize"))
202
 
                    {
203
 
                        screen_info->params->box_resize = setting->data.v_int;
204
 
                    }
205
 
                    else if (!strcmp (name, "Xfwm/ClickToFocus"))
206
 
                    {
207
 
                        screen_info->params->click_to_focus = setting->data.v_int;
208
 
                        update_grabs (screen_info);
209
 
                    }
210
 
                    else if (!strcmp (name, "Xfwm/FocusNewWindow"))
211
 
                    {
212
 
                        screen_info->params->focus_new = setting->data.v_int;
213
 
                    }
214
 
                    else if (!strcmp (name, "Xfwm/FocusRaise"))
215
 
                    {
216
 
                        screen_info->params->raise_on_focus = setting->data.v_int;
217
 
                    }
218
 
                    else if (!strcmp (name, "Xfwm/RaiseDelay"))
219
 
                    {
220
 
                        screen_info->params->raise_delay = setting->data.v_int;
221
 
                    }
222
 
                    else if (!strcmp (name, "Xfwm/RaiseOnClick"))
223
 
                    {
224
 
                        screen_info->params->raise_on_click = setting->data.v_int;
225
 
                        update_grabs (screen_info);
226
 
                    }
227
 
                    else if (!strcmp (name, "Xfwm/SnapToBorder"))
228
 
                    {
229
 
                        screen_info->params->snap_to_border = setting->data.v_int;
230
 
                    }
231
 
                    else if (!strcmp (name, "Xfwm/SnapToWindows"))
232
 
                    {
233
 
                        screen_info->params->snap_to_windows = setting->data.v_int;
234
 
                    }
235
 
                    else if (!strcmp (name, "Xfwm/SnapWidth"))
236
 
                    {
237
 
                        screen_info->params->snap_width = setting->data.v_int;
238
 
                    }
239
 
                    else if (!strcmp (name, "Xfwm/WrapWorkspaces"))
240
 
                    {
241
 
                        screen_info->params->wrap_workspaces = setting->data.v_int;
242
 
                        placeSidewalks (screen_info, screen_info->params->wrap_workspaces);
243
 
                    }
244
 
                    else if (!strcmp (name, "Xfwm/WrapWindows"))
245
 
                    {
246
 
                        screen_info->params->wrap_windows = setting->data.v_int;
247
 
                    }
248
 
                    else if (!strcmp (name, "Xfwm/WrapResistance"))
249
 
                    {
250
 
                        screen_info->params->wrap_resistance = setting->data.v_int;
251
 
                    }
252
 
                }
253
 
                else if (setting->type == MCS_TYPE_STRING)
254
 
                {
255
 
                    if (!strcmp (name, "Xfwm/DblClickAction"))
256
 
                    {
257
 
                        reloadScreenSettings (screen_info, NO_UPDATE_FLAG);
258
 
                    }
259
 
                    else if (!strcmp (name, "Xfwm/ThemeName"))
260
 
                    {
261
 
                        reloadScreenSettings (screen_info, UPDATE_MAXIMIZE | UPDATE_GRAVITY | UPDATE_CACHE);
262
 
                    }
263
 
                    else if (!strcmp (name, "Xfwm/ButtonLayout"))
264
 
                    {
265
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
266
 
                    }
267
 
                    if (!strcmp (name, "Xfwm/TitleAlign"))
268
 
                    {
269
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
270
 
                    }
271
 
                    if (!strcmp (name, "Xfwm/TitleFont"))
272
 
                    {
273
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
274
 
                    }
275
 
                }
276
 
                break;
277
 
            case MCS_ACTION_DELETED:
278
 
            default:
279
 
                break;
280
 
        }
281
 
    }
282
 
    else if (!g_ascii_strcasecmp (CHANNEL2, channel_name))
283
 
    {
284
 
        switch (action)
285
 
        {
286
 
            case MCS_ACTION_NEW:
287
 
                /* The following is to reduce initial startup time and reloads */
288
 
                if (!screen_info->mcs_initted)
289
 
                {
290
 
                    return;
291
 
                }
292
 
            case MCS_ACTION_CHANGED:
293
 
                if (setting->type == MCS_TYPE_INT)
294
 
                {
295
 
                    if (!strcmp (name, "Xfwm/LeftMargin"))
296
 
                    {
297
 
                        set_settings_margin (screen_info, STRUTS_LEFT, setting->data.v_int);
298
 
                    }
299
 
                    else if (!strcmp (name, "Xfwm/RightMargin"))
300
 
                    {
301
 
                        set_settings_margin (screen_info, STRUTS_RIGHT, setting->data.v_int);
302
 
                    }
303
 
                    else if (!strcmp (name, "Xfwm/BottomMargin"))
304
 
                    {
305
 
                        set_settings_margin (screen_info, STRUTS_BOTTOM, setting->data.v_int);
306
 
                    }
307
 
                    else if (!strcmp (name, "Xfwm/TopMargin"))
308
 
                    {
309
 
                        set_settings_margin (screen_info, STRUTS_TOP, setting->data.v_int);
310
 
                    }
311
 
                }
312
 
                break;
313
 
            case MCS_ACTION_DELETED:
314
 
            default:
315
 
                break;
316
 
        }
317
 
    }
318
 
    else if (!g_ascii_strcasecmp (CHANNEL3, channel_name))
319
 
    {
320
 
        switch (action)
321
 
        {
322
 
            case MCS_ACTION_NEW:
323
 
                /* The following is to reduce initial startup time and reloads */
324
 
                if (!screen_info->mcs_initted)
325
 
                {
326
 
                    return;
327
 
                }
328
 
            case MCS_ACTION_CHANGED:
329
 
                if (setting->type == MCS_TYPE_INT)
330
 
                {
331
 
                    if (!strcmp (name, "Xfwm/WorkspaceCount"))
332
 
                    {
333
 
                        workspaceSetCount(screen_info, setting->data.v_int);
334
 
                    }
335
 
                }
336
 
                break;
337
 
            case MCS_ACTION_DELETED:
338
 
            default:
339
 
                break;
340
 
        }
341
 
    }
342
 
    else if (!g_ascii_strcasecmp (CHANNEL4, channel_name))
343
 
    {
344
 
        switch (action)
345
 
        {
346
 
            case MCS_ACTION_NEW:
347
 
                /* The following is to reduce initial startup time and reloads */
348
 
                if (!screen_info->mcs_initted)
349
 
                {
350
 
                    return;
351
 
                }
352
 
            case MCS_ACTION_CHANGED:
353
 
                if (setting->type == MCS_TYPE_STRING)
354
 
                {
355
 
                    if (!strcmp (name, "Xfwm/KeyThemeName"))
356
 
                    {
357
 
                        reloadScreenSettings (screen_info, NO_UPDATE_FLAG);
358
 
                    }
359
 
                }
360
 
                break;
361
 
            case MCS_ACTION_DELETED:
362
 
            default:
363
 
                break;
364
 
        }
365
 
    }
366
 
    else if (!g_ascii_strcasecmp (CHANNEL5, channel_name))
367
 
    {
368
 
        switch (action)
369
 
        {
370
 
            case MCS_ACTION_NEW:
371
 
                /* The following is to reduce initial startup time and reloads */
372
 
                if (!screen_info->mcs_initted)
373
 
                {
374
 
                    return;
375
 
                }
376
 
            case MCS_ACTION_CHANGED:
377
 
                if (setting->type == MCS_TYPE_INT)
378
 
                {
379
 
                    if (!strcmp (name, "Xfwm/BorderlessMaximize"))
380
 
                    {
381
 
                        screen_info->params->borderless_maximize = setting->data.v_int;
382
 
                        reloadScreenSettings (screen_info, UPDATE_MAXIMIZE);
383
 
                    }
384
 
                    else if (!strcmp (name, "Xfwm/CycleMinimum"))
385
 
                    {
386
 
                        screen_info->params->cycle_minimum = setting->data.v_int;
387
 
                    }
388
 
                    else if (!strcmp (name, "Xfwm/CycleHidden"))
389
 
                    {
390
 
                        screen_info->params->cycle_hidden = setting->data.v_int;
391
 
                    }
392
 
                    else if (!strcmp (name, "Xfwm/CycleWorkspaces"))
393
 
                    {
394
 
                        screen_info->params->cycle_workspaces = setting->data.v_int;
395
 
                    }
396
 
                    else if (!strcmp (name, "Xfwm/FocusHint"))
397
 
                    {
398
 
                        screen_info->params->focus_hint = setting->data.v_int;
399
 
                    }
400
 
                    else if (!strcmp (name, "Xfwm/FrameOpacity"))
401
 
                    {
402
 
                        screen_info->params->frame_opacity = setting->data.v_int;
403
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME);
404
 
                    }
405
 
                    else if (!strcmp (name, "Xfwm/InactiveOpacity"))
406
 
                    {
407
 
                        screen_info->params->inactive_opacity = setting->data.v_int;
408
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME);
409
 
                        clientUpdateOpacity (screen_info, clientGetFocus ());
410
 
                    }
411
 
                    else if (!strcmp (name, "Xfwm/MoveOpacity"))
412
 
                    {
413
 
                        screen_info->params->move_opacity = setting->data.v_int;
414
 
                    }
415
 
                    else if (!strcmp (name, "Xfwm/ResizeOpacity"))
416
 
                    {
417
 
                        screen_info->params->resize_opacity = setting->data.v_int;
418
 
                    }
419
 
                    else if (!strcmp (name, "Xfwm/PopupOpacity"))
420
 
                    {
421
 
                        screen_info->params->popup_opacity = setting->data.v_int;
422
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME);
423
 
                    }
424
 
                    else if (!strcmp (name, "Xfwm/PlacementRatio"))
425
 
                    {
426
 
                        screen_info->params->placement_ratio = setting->data.v_int;
427
 
                    }
428
 
                    else if (!strcmp (name, "Xfwm/ShowFrameShadow"))
429
 
                    {
430
 
                        screen_info->params->show_frame_shadow = setting->data.v_int;
431
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME);
432
 
                    }
433
 
                    else if (!strcmp (name, "Xfwm/ShowPopupShadow"))
434
 
                    {
435
 
                        screen_info->params->show_popup_shadow = setting->data.v_int;
436
 
                        reloadScreenSettings (screen_info, UPDATE_FRAME);
437
 
                    }
438
 
                    else if (!strcmp (name, "Xfwm/SnapResist"))
439
 
                    {
440
 
                        screen_info->params->snap_resist = setting->data.v_int;
441
 
                    }
442
 
                    else if (!strcmp (name, "Xfwm/PreventFocusStealing"))
443
 
                    {
444
 
                        screen_info->params->prevent_focus_stealing = setting->data.v_int;
445
 
                    }
446
 
                    else if (!strcmp (name, "Xfwm/RaiseWithAnyButton"))
447
 
                    {
448
 
                        screen_info->params->raise_with_any_button = setting->data.v_int;
449
 
                        update_grabs (screen_info);
450
 
                    }
451
 
                    else if (!strcmp (name, "Xfwm/RestoreOnMove"))
452
 
                    {
453
 
                        screen_info->params->restore_on_move = setting->data.v_int;
454
 
                    }
455
 
                    else if (!strcmp (name, "Xfwm/ScrollWorkspaces"))
456
 
                    {
457
 
                        screen_info->params->scroll_workspaces = setting->data.v_int;
458
 
                    }
459
 
                    else if (!strcmp (name, "Xfwm/ToggleWorkspaces"))
460
 
                    {
461
 
                        screen_info->params->toggle_workspaces = setting->data.v_int;
462
 
                    }
463
 
                    else if (!strcmp (name, "Xfwm/UnredirectOverlays"))
464
 
                    {
465
 
                        screen_info->params->unredirect_overlays = setting->data.v_int;
466
 
                    }
467
 
                    else if (!strcmp (name, "Xfwm/UseCompositing"))
468
 
                    {
469
 
                        screen_info->params->use_compositing = setting->data.v_int;
470
 
                        compositorActivateScreen (screen_info,
471
 
                                                  screen_info->params->use_compositing);
472
 
                    }
473
 
                    else if (!strcmp (name, "Xfwm/WrapLayout"))
474
 
                    {
475
 
                        screen_info->params->wrap_layout = setting->data.v_int;
476
 
                    }
477
 
                    else if (!strcmp (name, "Xfwm/WrapCycle"))
478
 
                    {
479
 
                        screen_info->params->wrap_cycle = setting->data.v_int;
480
 
                    }
481
 
                }
482
 
                else if (setting->type == MCS_TYPE_STRING)
483
 
                {
484
 
                    if (!strcmp (name, "Xfwm/EasyClick"))
485
 
                    {
486
 
                        reloadScreenSettings (screen_info, UPDATE_BUTTON_GRABS);
487
 
                    }
488
 
                    else if (!strcmp (name, "Xfwm/ActivateAction"))
489
 
                    {
490
 
                        set_activate_action (screen_info, setting->data.v_string);
491
 
                    }
492
 
                }
493
 
                break;
494
 
            case MCS_ACTION_DELETED:
495
 
            default:
496
 
                break;
497
 
        }
498
 
    }
499
 
}
500
 
 
501
 
static GdkFilterReturn
502
 
client_event_filter (GdkXEvent * xevent, GdkEvent * event, gpointer data)
503
 
{
504
 
    ScreenInfo *screen_info;
505
 
 
506
 
    screen_info = (ScreenInfo *) data;
507
 
    g_return_val_if_fail (screen_info != NULL, GDK_FILTER_CONTINUE);
508
 
 
509
 
    if (mcs_client_process_event (screen_info->mcs_client, (XEvent *) xevent))
510
 
    {
511
 
        return GDK_FILTER_REMOVE;
512
 
    }
513
 
    else
514
 
    {
515
 
        return GDK_FILTER_CONTINUE;
516
 
    }
517
 
}
518
 
 
519
 
static void
520
 
watch_cb (Window window, Bool is_start, long mask, void *cb_data)
521
 
{
522
 
    GdkWindow *gdkwin;
523
 
 
524
 
    gdkwin = gdk_window_lookup (window);
525
 
 
526
 
    if (is_start)
527
 
    {
528
 
        if (!gdkwin)
529
 
        {
530
 
            gdkwin = gdk_window_foreign_new (window);
531
 
        }
532
 
        else
533
 
        {
534
 
            g_object_ref (gdkwin);
535
 
        }
536
 
        gdk_window_add_filter (gdkwin, client_event_filter, cb_data);
537
 
    }
538
 
    else
539
 
    {
540
 
        g_assert (gdkwin);
541
 
        gdk_window_remove_filter (gdkwin, client_event_filter, cb_data);
542
 
        g_object_unref (gdkwin);
 
184
    g_return_if_fail (value != NULL);
 
185
 
 
186
    if (!g_ascii_strcasecmp ("mouse", value))
 
187
    {
 
188
        screen_info->params->placement_mode = PLACE_MOUSE;
 
189
    }
 
190
    else
 
191
    {
 
192
        screen_info->params->placement_mode = PLACE_CENTER;
543
193
    }
544
194
}
545
195
 
547
197
loadRcData (ScreenInfo *screen_info, Settings *rc)
548
198
{
549
199
    gchar *homedir;
550
 
    gchar *keythemevalue;
551
 
    gchar *keytheme;
552
 
    gchar *system_keytheme;
553
200
 
554
201
    if (!parseRc ("defaults", PACKAGE_DATADIR, rc))
555
202
    {
556
203
        g_warning ("Missing defaults file");
557
204
        exit (1);
558
205
    }
559
 
    keythemevalue = getValue ("keytheme", rc);
560
 
    if (keythemevalue)
561
 
    {
562
 
        system_keytheme = getSystemThemeDir ();
563
 
        parseRc (KEYTHEMERC, system_keytheme, rc);
564
 
 
565
 
        keytheme = getThemeDir (keythemevalue, KEYTHEMERC);
566
 
        if (keytheme)
567
 
        {
568
 
            /* If there is a custom key theme, merge it with system defaults */
569
 
            parseRc (KEYTHEMERC, keytheme, rc);
570
 
            g_free (keytheme);
571
 
        }
572
 
        g_free (system_keytheme);
573
 
    }
574
206
    homedir = xfce_resource_save_location (XFCE_RESOURCE_CONFIG,
575
207
                                           "xfce4" G_DIR_SEPARATOR_S "xfwm4",
576
208
                                           FALSE);
579
211
}
580
212
 
581
213
static void
582
 
loadMcsData (ScreenInfo *screen_info, Settings *rc)
 
214
loadXfconfData (ScreenInfo *screen_info, Settings *rc)
583
215
{
584
 
    McsSetting *setting;
585
 
 
586
 
    if (screen_info->mcs_client)
 
216
    gint i;
 
217
    for (i = XPM_COLOR_SYMBOL_SIZE; rc[i].option; ++i)
587
218
    {
588
 
        /* "Regular" channel */
589
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ClickToFocus", CHANNEL1,
590
 
                &setting) == MCS_SUCCESS)
591
 
        {
592
 
            setBooleanValueFromInt ("click_to_focus", setting->data.v_int, rc);
593
 
            mcs_setting_free (setting);
594
 
        }
595
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusNewWindow", CHANNEL1,
596
 
                &setting) == MCS_SUCCESS)
597
 
        {
598
 
            setBooleanValueFromInt ("focus_new", setting->data.v_int, rc);
599
 
            mcs_setting_free (setting);
600
 
        }
601
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusRaise", CHANNEL1,
602
 
                &setting) == MCS_SUCCESS)
603
 
        {
604
 
            setBooleanValueFromInt ("raise_on_focus", setting->data.v_int, rc);
605
 
            mcs_setting_free (setting);
606
 
        }
607
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseDelay", CHANNEL1,
608
 
                &setting) == MCS_SUCCESS)
609
 
        {
610
 
            setIntValueFromInt ("raise_delay", setting->data.v_int, rc);
611
 
            mcs_setting_free (setting);
612
 
        }
613
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseOnClick", CHANNEL1,
614
 
                &setting) == MCS_SUCCESS)
615
 
        {
616
 
            setBooleanValueFromInt ("raise_on_click", setting->data.v_int, rc);
617
 
            mcs_setting_free (setting);
618
 
        }
619
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapToBorder", CHANNEL1,
620
 
                &setting) == MCS_SUCCESS)
621
 
        {
622
 
            setBooleanValueFromInt ("snap_to_border", setting->data.v_int, rc);
623
 
            mcs_setting_free (setting);
624
 
        }
625
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapToWindows", CHANNEL1,
626
 
                &setting) == MCS_SUCCESS)
627
 
        {
628
 
            setBooleanValueFromInt ("snap_to_windows", setting->data.v_int, rc);
629
 
            mcs_setting_free (setting);
630
 
        }
631
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapWidth", CHANNEL1,
632
 
                &setting) == MCS_SUCCESS)
633
 
        {
634
 
            setIntValueFromInt ("snap_width", setting->data.v_int, rc);
635
 
            mcs_setting_free (setting);
636
 
        }
637
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapWorkspaces", CHANNEL1,
638
 
                &setting) == MCS_SUCCESS)
639
 
        {
640
 
            setBooleanValueFromInt ("wrap_workspaces", setting->data.v_int, rc);
641
 
            mcs_setting_free (setting);
642
 
        }
643
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapWindows", CHANNEL1,
644
 
                &setting) == MCS_SUCCESS)
645
 
        {
646
 
            setBooleanValueFromInt ("wrap_windows", setting->data.v_int, rc);
647
 
            mcs_setting_free (setting);
648
 
        }
649
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapResistance", CHANNEL1,
650
 
                &setting) == MCS_SUCCESS)
651
 
        {
652
 
            setIntValueFromInt ("wrap_resistance", setting->data.v_int, rc);
653
 
            mcs_setting_free (setting);
654
 
        }
655
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BoxMove", CHANNEL1,
656
 
                &setting) == MCS_SUCCESS)
657
 
        {
658
 
            setBooleanValueFromInt ("box_move", setting->data.v_int, rc);
659
 
            mcs_setting_free (setting);
660
 
        }
661
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BoxResize", CHANNEL1,
662
 
                &setting) == MCS_SUCCESS)
663
 
        {
664
 
            setBooleanValueFromInt ("box_resize", setting->data.v_int, rc);
665
 
            mcs_setting_free (setting);
666
 
        }
667
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/DblClickAction", CHANNEL1,
668
 
                &setting) == MCS_SUCCESS)
669
 
        {
670
 
            setValue ("double_click_action", setting->data.v_string, rc);
671
 
            mcs_setting_free (setting);
672
 
        }
673
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ThemeName", CHANNEL1,
674
 
                &setting) == MCS_SUCCESS)
675
 
        {
676
 
            setValue ("theme", setting->data.v_string, rc);
677
 
            mcs_setting_free (setting);
678
 
        }
679
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ButtonLayout", CHANNEL1,
680
 
                &setting) == MCS_SUCCESS)
681
 
        {
682
 
            setValue ("button_layout", setting->data.v_string, rc);
683
 
            mcs_setting_free (setting);
684
 
        }
685
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/TitleAlign", CHANNEL1,
686
 
                &setting) == MCS_SUCCESS)
687
 
        {
688
 
            setValue ("title_alignment", setting->data.v_string, rc);
689
 
            mcs_setting_free (setting);
690
 
        }
691
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/TitleFont", CHANNEL1,
692
 
                &setting) == MCS_SUCCESS)
693
 
        {
694
 
            setValue ("title_font", setting->data.v_string, rc);
695
 
            mcs_setting_free (setting);
696
 
        }
697
 
 
698
 
        /* Margins channel */
699
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/LeftMargin", CHANNEL2,
700
 
                &setting) == MCS_SUCCESS)
701
 
        {
702
 
            setIntValueFromInt ("margin_left", setting->data.v_int, rc);
703
 
            mcs_setting_free (setting);
704
 
        }
705
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RightMargin", CHANNEL2,
706
 
                &setting) == MCS_SUCCESS)
707
 
        {
708
 
            setIntValueFromInt ("margin_right", setting->data.v_int, rc);
709
 
            mcs_setting_free (setting);
710
 
        }
711
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BottomMargin", CHANNEL2,
712
 
                &setting) == MCS_SUCCESS)
713
 
        {
714
 
            setIntValueFromInt ("margin_bottom", setting->data.v_int, rc);
715
 
            mcs_setting_free (setting);
716
 
        }
717
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/TopMargin", CHANNEL2,
718
 
                &setting) == MCS_SUCCESS)
719
 
        {
720
 
            setIntValueFromInt ("margin_top", setting->data.v_int, rc);
721
 
            mcs_setting_free (setting);
722
 
        }
723
 
 
724
 
        /* Workspaces channel */
725
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WorkspaceCount", CHANNEL3,
726
 
                &setting) == MCS_SUCCESS)
727
 
        {
728
 
            setIntValueFromInt ("workspace_count", setting->data.v_int, rc);
729
 
            mcs_setting_free (setting);
730
 
        }
731
 
 
732
 
        /* Keyboard theme channel */
733
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/KeyThemeName", CHANNEL4,
734
 
                &setting) == MCS_SUCCESS)
735
 
        {
736
 
            setValue ("keytheme", setting->data.v_string, rc);
737
 
            mcs_setting_free (setting);
738
 
        }
739
 
 
740
 
        /* Tweaks channel */
741
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ActivateAction", CHANNEL5,
742
 
                &setting) == MCS_SUCCESS)
743
 
        {
744
 
            setValue ("activate_action", setting->data.v_string, rc);
745
 
            mcs_setting_free (setting);
746
 
        }
747
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BorderlessMaximize", CHANNEL5,
748
 
                &setting) == MCS_SUCCESS)
749
 
        {
750
 
            setBooleanValueFromInt ("borderless_maximize", setting->data.v_int, rc);
751
 
            mcs_setting_free (setting);
752
 
        }
753
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleMinimum", CHANNEL5,
754
 
                &setting) == MCS_SUCCESS)
755
 
        {
756
 
            setBooleanValueFromInt ("cycle_minimum", setting->data.v_int, rc);
757
 
            mcs_setting_free (setting);
758
 
        }
759
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleHidden", CHANNEL5,
760
 
                &setting) == MCS_SUCCESS)
761
 
        {
762
 
            setBooleanValueFromInt ("cycle_hidden", setting->data.v_int, rc);
763
 
            mcs_setting_free (setting);
764
 
        }
765
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleWorkspaces", CHANNEL5,
766
 
                &setting) == MCS_SUCCESS)
767
 
        {
768
 
            setBooleanValueFromInt ("cycle_workspaces", setting->data.v_int, rc);
769
 
            mcs_setting_free (setting);
770
 
        }
771
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/EasyClick", CHANNEL5,
772
 
                &setting) == MCS_SUCCESS)
773
 
        {
774
 
            setValue ("easy_click", setting->data.v_string, rc);
775
 
            mcs_setting_free (setting);
776
 
        }
777
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusHint", CHANNEL5,
778
 
                &setting) == MCS_SUCCESS)
779
 
        {
780
 
            setBooleanValueFromInt ("focus_hint", setting->data.v_int, rc);
781
 
            mcs_setting_free (setting);
782
 
        }
783
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FrameOpacity", CHANNEL5,
784
 
                &setting) == MCS_SUCCESS)
785
 
        {
786
 
            setIntValueFromInt ("frame_opacity", setting->data.v_int, rc);
787
 
            mcs_setting_free (setting);
788
 
        }
789
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PlacementRatio", CHANNEL5,
790
 
                &setting) == MCS_SUCCESS)
791
 
        {
792
 
            setIntValueFromInt ("placement_ratio", setting->data.v_int, rc);
793
 
            mcs_setting_free (setting);
794
 
        }
795
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/InactiveOpacity", CHANNEL5,
796
 
                &setting) == MCS_SUCCESS)
797
 
        {
798
 
            setIntValueFromInt ("inactive_opacity", setting->data.v_int, rc);
799
 
            mcs_setting_free (setting);
800
 
        }
801
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/MoveOpacity", CHANNEL5,
802
 
                &setting) == MCS_SUCCESS)
803
 
        {
804
 
            setIntValueFromInt ("move_opacity", setting->data.v_int, rc);
805
 
            mcs_setting_free (setting);
806
 
        }
807
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ResizeOpacity", CHANNEL5,
808
 
                &setting) == MCS_SUCCESS)
809
 
        {
810
 
            setIntValueFromInt ("resize_opacity", setting->data.v_int, rc);
811
 
            mcs_setting_free (setting);
812
 
        }
813
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PopupOpacity", CHANNEL5,
814
 
                &setting) == MCS_SUCCESS)
815
 
        {
816
 
            setIntValueFromInt ("popup_opacity", setting->data.v_int, rc);
817
 
            mcs_setting_free (setting);
818
 
        }
819
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShowFrameShadow", CHANNEL5,
820
 
                &setting) == MCS_SUCCESS)
821
 
        {
822
 
            setBooleanValueFromInt ("show_frame_shadow", setting->data.v_int, rc);
823
 
            mcs_setting_free (setting);
824
 
        }
825
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShowPopupShadow", CHANNEL5,
826
 
                &setting) == MCS_SUCCESS)
827
 
        {
828
 
            setBooleanValueFromInt ("show_popup_shadow", setting->data.v_int, rc);
829
 
            mcs_setting_free (setting);
830
 
        }
831
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapResist", CHANNEL5,
832
 
                &setting) == MCS_SUCCESS)
833
 
        {
834
 
            setBooleanValueFromInt ("snap_resist", setting->data.v_int, rc);
835
 
            mcs_setting_free (setting);
836
 
        }
837
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PreventFocusStealing", CHANNEL5,
838
 
                &setting) == MCS_SUCCESS)
839
 
        {
840
 
            setBooleanValueFromInt ("prevent_focus_stealing", setting->data.v_int, rc);
841
 
            mcs_setting_free (setting);
842
 
        }
843
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseWithAnyButton", CHANNEL5,
844
 
                &setting) == MCS_SUCCESS)
845
 
        {
846
 
            setBooleanValueFromInt ("raise_with_any_button", setting->data.v_int, rc);
847
 
            mcs_setting_free (setting);
848
 
        }
849
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RestoreOnMove", CHANNEL5,
850
 
                &setting) == MCS_SUCCESS)
851
 
        {
852
 
            setBooleanValueFromInt ("restore_on_move", setting->data.v_int, rc);
853
 
            mcs_setting_free (setting);
854
 
        }
855
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ScrollWorkspaces", CHANNEL5,
856
 
                &setting) == MCS_SUCCESS)
857
 
        {
858
 
            setBooleanValueFromInt ("scroll_workspaces", setting->data.v_int, rc);
859
 
            mcs_setting_free (setting);
860
 
        }
861
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ToggleWorkspaces", CHANNEL5,
862
 
                &setting) == MCS_SUCCESS)
863
 
        {
864
 
            setBooleanValueFromInt ("toggle_workspaces", setting->data.v_int, rc);
865
 
            mcs_setting_free (setting);
866
 
        }
867
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/UnredirectOverlays", CHANNEL5,
868
 
                &setting) == MCS_SUCCESS)
869
 
        {
870
 
            setBooleanValueFromInt ("unredirect_overlays", setting->data.v_int, rc);
871
 
            mcs_setting_free (setting);
872
 
        }
873
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/UseCompositing", CHANNEL5,
874
 
                &setting) == MCS_SUCCESS)
875
 
        {
876
 
            setBooleanValueFromInt ("use_compositing", setting->data.v_int, rc);
877
 
            mcs_setting_free (setting);
878
 
        }
879
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapLayout", CHANNEL5,
880
 
                &setting) == MCS_SUCCESS)
881
 
        {
882
 
            setBooleanValueFromInt ("wrap_layout", setting->data.v_int, rc);
883
 
            mcs_setting_free (setting);
884
 
        }
885
 
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapCycle", CHANNEL5,
886
 
                &setting) == MCS_SUCCESS)
887
 
        {
888
 
            setBooleanValueFromInt ("wrap_cycle", setting->data.v_int, rc);
889
 
            mcs_setting_free (setting);
890
 
        }
 
219
        gchar *property_name = g_strconcat("/general/", rc[i].option, NULL);
 
220
        if(xfconf_channel_has_property(screen_info->xfwm4_channel, property_name))
 
221
        {
 
222
            if(rc[i].value)
 
223
            {
 
224
                g_value_unset(rc[i].value);
 
225
                g_free(rc[i].value);
 
226
            }
 
227
            rc[i].value = g_new0(GValue, 1);
 
228
 
 
229
            if(!xfconf_channel_get_property(screen_info->xfwm4_channel, property_name, rc[i].value))
 
230
            {
 
231
               g_warning("get prop failed");
 
232
            }
 
233
        }
 
234
        else
 
235
        {
 
236
            if (rc[i].value)
 
237
                xfconf_channel_set_property(screen_info->xfwm4_channel, property_name, rc[i].value);
 
238
        }
 
239
        g_free(property_name);
891
240
    }
 
241
 
892
242
}
893
243
 
894
244
/* Simple helper function to avoid copy/paste of code */
901
251
        color->allocated = FALSE;
902
252
    }
903
253
 
904
 
    if (gdk_color_parse (rc[id].value, &color->col))
 
254
    /** do a direct value_get_string */
 
255
    if (gdk_color_parse (g_value_get_string(rc[id].value), &color->col))
905
256
    {
906
257
        if (gdk_colormap_alloc_color (gdk_screen_get_rgb_colormap (screen_info->gscr),
907
258
                                      &color->col, FALSE, FALSE))
918
269
        else
919
270
        {
920
271
            gdk_beep ();
921
 
            g_message (_("%s: Cannot allocate color %s\n"), g_get_prgname (), rc[id].value);
 
272
            if (G_VALUE_TYPE(rc[id].value) == G_TYPE_STRING)
 
273
                g_message (_("%s: Cannot allocate color %s\n"), g_get_prgname (), g_value_get_string(rc[id].value));
 
274
            else
 
275
                g_critical (_("%s: Cannot allocate color: GValue for color is not of type STRING"), g_get_prgname ());
922
276
        }
923
277
    }
924
278
    else
925
279
    {
926
280
        gdk_beep ();
927
 
        g_message (_("%s: Cannot parse color %s\n"), g_get_prgname (), rc[id].value);
 
281
        if (G_VALUE_TYPE(rc[id].value) == G_TYPE_STRING)
 
282
            g_message (_("%s: Cannot parse color %s\n"), g_get_prgname (), g_value_get_string(rc[id].value));
 
283
        else
 
284
            g_critical (_("%s: Cannot parse color: GValue for color is not of type STRING"), g_get_prgname ());
928
285
    }
929
286
}
930
287
 
933
290
{
934
291
    const gchar *val;
935
292
 
936
 
    val = getValue (name, rc);
 
293
    val = getStringValue (name, rc);
937
294
    if (!g_ascii_strcasecmp ("true", val) || !g_ascii_strcasecmp ("under", val))
938
295
    {
939
296
        return TITLE_SHADOW_UNDER;
945
302
    return TITLE_SHADOW_NONE;
946
303
}
947
304
 
 
305
static int
 
306
getFontHeight (const PangoFontDescription *desc, PangoContext *context)
 
307
{
 
308
    PangoFontMetrics *metrics;
 
309
    PangoLanguage *language;
 
310
    int height;
 
311
 
 
312
    g_return_val_if_fail (desc, 0);
 
313
    g_return_val_if_fail (context, 0);
 
314
 
 
315
    language = pango_context_get_language (context);
 
316
    metrics = pango_context_get_metrics (context, desc, language);
 
317
    height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) +
 
318
                           pango_font_metrics_get_descent (metrics));
 
319
    pango_font_metrics_unref (metrics);
 
320
 
 
321
    return height;
 
322
}
 
323
 
 
324
 
948
325
static void
949
326
loadTheme (ScreenInfo *screen_info, Settings *rc)
950
327
{
 
328
    static const char *side_names[] = {
 
329
        "left",
 
330
        "right",
 
331
        "bottom"
 
332
    };
 
333
 
 
334
    static const char *corner_names[] = {
 
335
        "bottom-left",
 
336
        "bottom-right",
 
337
        "top-left",
 
338
        "top-right"
 
339
    };
 
340
 
 
341
    static const char *button_names[] = {
 
342
        "menu",
 
343
        "stick",
 
344
        "shade",
 
345
        "hide",
 
346
        "maximize",
 
347
        "close"
 
348
    };
 
349
 
 
350
    static const char *button_state_names[] = {
 
351
        "active",
 
352
        "inactive",
 
353
        "prelight",
 
354
        "pressed",
 
355
        "toggled-active",
 
356
        "toggled-inactive",
 
357
        "toggled-prelight",
 
358
        "toggled-pressed"
 
359
    };
 
360
 
 
361
    gchar imagename[30];
951
362
    GValue tmp_val = { 0, };
952
363
    DisplayInfo *display_info;
953
364
    xfwmColorSymbol colsym[ XPM_COLOR_SYMBOL_SIZE + 1 ];
954
365
    GtkWidget *widget;
955
366
    gchar *theme;
956
 
    gchar *font;
 
367
    const gchar *font;
957
368
    PangoFontDescription *desc;
958
 
    guint i;
 
369
    PangoContext *context;
 
370
    guint i, j;
959
371
 
960
372
    widget = myScreenGetGtkWidget (screen_info);
961
373
    display_info = screen_info->display_info;
962
374
 
963
375
    desc = NULL;
964
 
 
965
 
    rc[0].value  = getUIStyle (widget, "fg",    "selected");
966
 
    rc[1].value  = getUIStyle (widget, "fg",    "insensitive");
967
 
    rc[2].value  = getUIStyle (widget, "dark",  "selected");
968
 
    rc[3].value  = getUIStyle (widget, "dark",  "insensitive");
969
 
    rc[4].value  = getUIStyle (widget, "fg",    "normal");
970
 
    rc[5].value  = getUIStyle (widget, "fg",    "normal");
971
 
    rc[6].value  = getUIStyle (widget, "bg",    "selected");
972
 
    rc[7].value  = getUIStyle (widget, "light", "selected");
973
 
    rc[8].value  = getUIStyle (widget, "dark",  "selected");
974
 
    rc[9].value  = getUIStyle (widget, "mid",   "selected");
975
 
    rc[10].value = getUIStyle (widget, "bg",    "normal");
976
 
    rc[11].value = getUIStyle (widget, "light", "normal");
977
 
    rc[12].value = getUIStyle (widget, "dark",  "normal");
978
 
    rc[13].value = getUIStyle (widget, "mid",   "normal");
979
 
    rc[14].value = getUIStyle (widget, "bg",    "insensitive");
980
 
    rc[15].value = getUIStyle (widget, "light", "insensitive");
981
 
    rc[16].value = getUIStyle (widget, "dark",  "insensitive");
982
 
    rc[17].value = getUIStyle (widget, "mid",   "insensitive");
983
 
    rc[18].value = getUIStyle (widget, "bg",    "normal");
984
 
    rc[19].value = getUIStyle (widget, "light", "normal");
985
 
    rc[20].value = getUIStyle (widget, "dark",  "normal");
986
 
    rc[21].value = getUIStyle (widget, "mid",   "normal");
987
 
 
988
 
 
989
 
    theme = getThemeDir (getValue ("theme", rc), THEMERC);
 
376
    context = NULL;
 
377
 
 
378
    setStringValue (rc[0].option, getUIStyle (widget, "fg",    "selected"), rc);
 
379
    setStringValue (rc[1].option, getUIStyle (widget, "fg",    "insensitive"), rc);
 
380
    setStringValue (rc[2].option, getUIStyle (widget, "dark",  "selected"), rc);
 
381
    setStringValue (rc[3].option, getUIStyle (widget, "dark",  "insensitive"), rc);
 
382
    setStringValue (rc[4].option, getUIStyle (widget, "fg",    "normal"), rc);
 
383
    setStringValue (rc[5].option, getUIStyle (widget, "fg",    "normal"), rc);
 
384
    setStringValue (rc[6].option, getUIStyle (widget, "bg",    "selected"), rc);
 
385
    setStringValue (rc[7].option, getUIStyle (widget, "light", "selected"), rc);
 
386
    setStringValue (rc[8].option, getUIStyle (widget, "dark",  "selected"), rc);
 
387
    setStringValue (rc[9].option, getUIStyle (widget, "mid",   "selected"), rc);
 
388
    setStringValue (rc[10].option, getUIStyle (widget, "bg",    "normal"), rc);
 
389
    setStringValue (rc[11].option, getUIStyle (widget, "light", "normal"), rc);
 
390
    setStringValue (rc[12].option, getUIStyle (widget, "dark",  "normal"), rc);
 
391
    setStringValue (rc[13].option, getUIStyle (widget, "mid",   "normal"), rc);
 
392
    setStringValue (rc[14].option, getUIStyle (widget, "bg",    "insensitive"), rc);
 
393
    setStringValue (rc[15].option, getUIStyle (widget, "light", "insensitive"), rc);
 
394
    setStringValue (rc[16].option, getUIStyle (widget, "dark",  "insensitive"), rc);
 
395
    setStringValue (rc[17].option, getUIStyle (widget, "mid",   "insensitive"), rc);
 
396
    setStringValue (rc[18].option, getUIStyle (widget, "bg",    "normal"), rc);
 
397
    setStringValue (rc[19].option, getUIStyle (widget, "light", "normal"), rc);
 
398
    setStringValue (rc[20].option, getUIStyle (widget, "dark",  "normal"), rc);
 
399
    setStringValue (rc[21].option, getUIStyle (widget, "mid",   "normal"), rc);
 
400
 
 
401
 
 
402
    theme = getThemeDir (getStringValue ("theme", rc), THEMERC);
990
403
    parseRc (THEMERC, theme, rc);
991
404
 
992
405
    screen_info->params->shadow_delta_x =
993
 
        - (TOINT (getValue ("shadow_delta_x", rc)));
 
406
        - getIntValue ("shadow_delta_x", rc);
994
407
    screen_info->params->shadow_delta_y =
995
 
        - (TOINT (getValue ("shadow_delta_y", rc)));
 
408
        - getIntValue ("shadow_delta_y", rc);
996
409
    screen_info->params->shadow_delta_width =
997
 
        - (TOINT (getValue ("shadow_delta_width", rc)));
 
410
        - getIntValue ("shadow_delta_width", rc);
998
411
    screen_info->params->shadow_delta_height =
999
 
        - (TOINT (getValue ("shadow_delta_height", rc)));
 
412
        - getIntValue ("shadow_delta_height", rc);
1000
413
 
1001
414
    for (i = 0; i < XPM_COLOR_SYMBOL_SIZE; i++)
1002
415
    {
1003
416
        colsym[i].name = rc[i].option;
1004
 
        colsym[i].value = rc[i].value;
 
417
        colsym[i].value = g_value_get_string(rc[i].value);
1005
418
    }
1006
419
    colsym[XPM_COLOR_SYMBOL_SIZE].name = NULL;
1007
420
    colsym[XPM_COLOR_SYMBOL_SIZE].value = NULL;
1008
421
 
1009
 
    display_info->dbl_click_time = abs (TOINT (getValue ("dbl_click_time", rc)));
 
422
    display_info->dbl_click_time = abs (getIntValue ("dbl_click_time", rc));
1010
423
    g_value_init (&tmp_val, G_TYPE_INT);
1011
424
    if (gdk_setting_get ("gtk-double-click-time", &tmp_val))
1012
425
    {
1013
426
        display_info->dbl_click_time = abs (g_value_get_int (&tmp_val));
1014
427
    }
1015
428
 
1016
 
    font = getValue ("title_font", rc);
 
429
    screen_info->font_height = 0;
 
430
    font = getStringValue ("title_font", rc);
1017
431
    if (font && strlen (font))
1018
432
    {
1019
433
        desc = pango_font_description_from_string (font);
 
434
        context = getUIPangoContext (widget);
1020
435
        if (desc)
1021
436
        {
1022
437
            gtk_widget_modify_font (widget, desc);
 
438
            screen_info->font_height = getFontHeight (desc, context);
1023
439
            pango_font_description_free (desc);
1024
440
        }
1025
441
    }
1043
459
    screen_info->white_gc = widget->style->white_gc;
1044
460
    g_object_ref (G_OBJECT (widget->style->white_gc));
1045
461
 
1046
 
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_LEFT][ACTIVE], theme,
1047
 
        "left-active", colsym);
1048
 
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_LEFT][INACTIVE], theme,
1049
 
        "left-inactive", colsym);
1050
 
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_RIGHT][ACTIVE], theme,
1051
 
        "right-active", colsym);
1052
 
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_RIGHT][INACTIVE], theme,
1053
 
        "right-inactive", colsym);
1054
 
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_BOTTOM][ACTIVE], theme,
1055
 
        "bottom-active", colsym);
1056
 
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_BOTTOM][INACTIVE], theme,
1057
 
        "bottom-inactive", colsym);
1058
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_LEFT][ACTIVE], theme,
1059
 
        "top-left-active", colsym);
1060
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_LEFT][INACTIVE], theme,
1061
 
        "top-left-inactive", colsym);
1062
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_RIGHT][ACTIVE], theme,
1063
 
        "top-right-active", colsym);
1064
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_RIGHT][INACTIVE], theme,
1065
 
        "top-right-inactive", colsym);
1066
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_LEFT][ACTIVE], theme,
1067
 
        "bottom-left-active", colsym);
1068
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_LEFT][INACTIVE], theme,
1069
 
        "bottom-left-inactive", colsym);
1070
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_RIGHT][ACTIVE], theme,
1071
 
        "bottom-right-active", colsym);
1072
 
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_RIGHT][INACTIVE], theme,
1073
 
        "bottom-right-inactive", colsym);
1074
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[HIDE_BUTTON][ACTIVE], theme,
1075
 
        "hide-active", colsym);
1076
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[HIDE_BUTTON][INACTIVE], theme,
1077
 
        "hide-inactive", colsym);
1078
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[HIDE_BUTTON][PRESSED], theme,
1079
 
        "hide-pressed", colsym);
1080
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[CLOSE_BUTTON][ACTIVE], theme,
1081
 
        "close-active", colsym);
1082
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[CLOSE_BUTTON][INACTIVE], theme,
1083
 
        "close-inactive", colsym);
1084
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[CLOSE_BUTTON][PRESSED], theme,
1085
 
        "close-pressed", colsym);
1086
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][ACTIVE], theme,
1087
 
        "maximize-active", colsym);
1088
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][INACTIVE], theme,
1089
 
        "maximize-inactive", colsym);
1090
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][PRESSED], theme,
1091
 
        "maximize-pressed", colsym);
1092
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][ACTIVE], theme,
1093
 
        "shade-active", colsym);
1094
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][INACTIVE], theme,
1095
 
        "shade-inactive", colsym);
1096
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][PRESSED], theme,
1097
 
        "shade-pressed", colsym);
1098
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][ACTIVE], theme,
1099
 
        "stick-active", colsym);
1100
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][INACTIVE], theme,
1101
 
        "stick-inactive", colsym);
1102
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][PRESSED], theme,
1103
 
        "stick-pressed", colsym);
1104
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MENU_BUTTON][ACTIVE], theme,
1105
 
        "menu-active", colsym);
1106
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MENU_BUTTON][INACTIVE], theme,
1107
 
        "menu-inactive", colsym);
1108
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MENU_BUTTON][PRESSED], theme,
1109
 
        "menu-pressed", colsym);
1110
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][T_ACTIVE], theme,
1111
 
        "shade-toggled-active", colsym);
1112
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][T_INACTIVE], theme,
1113
 
        "shade-toggled-inactive", colsym);
1114
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][T_PRESSED], theme,
1115
 
        "shade-toggled-pressed", colsym);
1116
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][T_ACTIVE], theme,
1117
 
        "stick-toggled-active", colsym);
1118
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][T_INACTIVE], theme,
1119
 
        "stick-toggled-inactive", colsym);
1120
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][T_PRESSED], theme,
1121
 
        "stick-toggled-pressed", colsym);
1122
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][T_ACTIVE], theme,
1123
 
        "maximize-toggled-active", colsym);
1124
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][T_INACTIVE], theme,
1125
 
        "maximize-toggled-inactive", colsym);
1126
 
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][T_PRESSED], theme,
1127
 
        "maximize-toggled-pressed", colsym);
1128
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_1][ACTIVE], theme,
1129
 
        "title-1-active", colsym);
1130
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_1][INACTIVE], theme,
1131
 
        "title-1-inactive", colsym);
1132
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_2][ACTIVE], theme,
1133
 
        "title-2-active", colsym);
1134
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_2][INACTIVE], theme,
1135
 
        "title-2-inactive", colsym);
1136
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_3][ACTIVE], theme,
1137
 
        "title-3-active", colsym);
1138
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_3][INACTIVE], theme,
1139
 
        "title-3-inactive", colsym);
1140
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_4][ACTIVE], theme,
1141
 
        "title-4-active", colsym);
1142
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_4][INACTIVE], theme,
1143
 
        "title-4-inactive", colsym);
1144
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_5][ACTIVE], theme,
1145
 
        "title-5-active", colsym);
1146
 
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_5][INACTIVE], theme,
1147
 
        "title-5-inactive", colsym);
 
462
    for (i = 0; i < SIDE_TOP; i++) /* Keep SIDE_TOP for later */
 
463
    {
 
464
        g_snprintf(imagename, sizeof (imagename), "%s-active", side_names[i]);
 
465
        xfwmPixmapLoad (screen_info, &screen_info->sides[i][ACTIVE], theme, imagename, colsym);
 
466
 
 
467
        g_snprintf(imagename, sizeof (imagename), "%s-inactive", side_names[i]);
 
468
        xfwmPixmapLoad (screen_info, &screen_info->sides[i][INACTIVE], theme, imagename, colsym);
 
469
    }
 
470
    for (i = 0; i < CORNER_COUNT; i++)
 
471
    {
 
472
        g_snprintf(imagename, sizeof (imagename), "%s-active", corner_names[i]);
 
473
        xfwmPixmapLoad (screen_info, &screen_info->corners[i][ACTIVE], theme, imagename, colsym);
 
474
 
 
475
        g_snprintf(imagename, sizeof (imagename), "%s-inactive", corner_names[i]);
 
476
        xfwmPixmapLoad (screen_info, &screen_info->corners[i][INACTIVE], theme, imagename, colsym);
 
477
    }
 
478
    for (i = 0; i < BUTTON_COUNT; i++)
 
479
    {
 
480
        for (j = 0; j < STATE_COUNT; j++)
 
481
        {
 
482
            g_snprintf(imagename, sizeof (imagename), "%s-%s", button_names[i], button_state_names[j]);
 
483
            xfwmPixmapLoad (screen_info, &screen_info->buttons[i][j], theme, imagename, colsym);
 
484
        }
 
485
    }
 
486
    for (i = 0; i < TITLE_COUNT; i++)
 
487
    {
 
488
        g_snprintf(imagename, sizeof (imagename), "title-%d-active", i + 1);
 
489
        xfwmPixmapLoad (screen_info, &screen_info->title[i][ACTIVE], theme, imagename, colsym);
 
490
 
 
491
        g_snprintf(imagename, sizeof (imagename), "title-%d-inactive", i + 1);
 
492
        xfwmPixmapLoad (screen_info, &screen_info->title[i][INACTIVE], theme, imagename, colsym);
 
493
 
 
494
        g_snprintf(imagename, sizeof (imagename), "top-%d-active", i + 1);
 
495
        xfwmPixmapLoad (screen_info, &screen_info->top[i][ACTIVE], theme, imagename, colsym);
 
496
 
 
497
        g_snprintf(imagename, sizeof (imagename), "top-%d-inactive", i + 1);
 
498
        xfwmPixmapLoad (screen_info, &screen_info->top[i][INACTIVE], theme, imagename, colsym);
 
499
    }
1148
500
 
1149
501
    screen_info->box_gc = createGC (screen_info, "#FFFFFF", GXxor, NULL, 2, TRUE);
1150
502
 
1151
 
    if (!g_ascii_strcasecmp ("left", getValue ("title_alignment", rc)))
 
503
    if (!g_ascii_strcasecmp ("left", getStringValue ("title_alignment", rc)))
1152
504
    {
1153
505
        screen_info->params->title_alignment = ALIGN_LEFT;
1154
506
    }
1155
 
    else if (!g_ascii_strcasecmp ("right", getValue ("title_alignment", rc)))
 
507
    else if (!g_ascii_strcasecmp ("right", getStringValue ("title_alignment", rc)))
1156
508
    {
1157
509
        screen_info->params->title_alignment = ALIGN_RIGHT;
1158
510
    }
1162
514
    }
1163
515
 
1164
516
    screen_info->params->full_width_title =
1165
 
        !g_ascii_strcasecmp ("true", getValue ("full_width_title", rc));
 
517
        getBoolValue ("full_width_title", rc);
1166
518
    screen_info->params->title_shadow[ACTIVE] = getTitleShadow (rc, "title_shadow_active");
1167
519
    screen_info->params->title_shadow[INACTIVE] = getTitleShadow (rc, "title_shadow_inactive");
1168
520
 
1169
 
    strncpy (screen_info->params->button_layout, getValue ("button_layout", rc), BUTTON_COUNT + 1);
1170
 
    screen_info->params->button_spacing = TOINT (getValue ("button_spacing", rc));
1171
 
    screen_info->params->button_offset = TOINT (getValue ("button_offset", rc));
1172
 
    screen_info->params->maximized_offset = TOINT (getValue ("maximized_offset", rc));
 
521
    strncpy (screen_info->params->button_layout, getStringValue ("button_layout", rc), BUTTON_STRING_COUNT);
 
522
    screen_info->params->button_spacing = getIntValue ("button_spacing", rc);
 
523
    screen_info->params->button_offset = getIntValue ("button_offset", rc);
 
524
    screen_info->params->maximized_offset = getIntValue ("maximized_offset", rc);
1173
525
    screen_info->params->title_vertical_offset_active =
1174
 
        TOINT (getValue ("title_vertical_offset_active", rc));
 
526
        getIntValue ("title_vertical_offset_active", rc);
1175
527
    screen_info->params->title_vertical_offset_inactive =
1176
 
        TOINT (getValue ("title_vertical_offset_inactive", rc));
 
528
        getIntValue ("title_vertical_offset_inactive", rc);
1177
529
    screen_info->params->title_horizontal_offset =
1178
 
        TOINT (getValue ("title_horizontal_offset", rc));
 
530
        getIntValue ("title_horizontal_offset", rc);
1179
531
 
1180
532
    g_free (theme);
1181
533
}
1182
534
 
1183
 
static gboolean
1184
 
loadKeyBindings (ScreenInfo *screen_info, Settings *rc)
 
535
static void
 
536
loadKeyBindings (ScreenInfo *screen_info)
1185
537
{
 
538
    GList *shortcuts;
 
539
    gchar keyname[30];
1186
540
    Display *dpy;
1187
 
    gchar *keytheme;
1188
 
    gchar *keythemevalue;
 
541
    guint i;
1189
542
 
1190
543
    dpy = myScreenGetXDisplay (screen_info);
1191
 
    /*
1192
 
       Load defaults keytheme so that even if there are
1193
 
       missing shortcuts in an older user defined key theme
1194
 
       the missing keys will be taken from the default
1195
 
     */
1196
 
    keytheme = getThemeDir (DEFAULT_KEYTHEME, KEYTHEMERC);
1197
 
    parseRc (KEYTHEMERC, keytheme, rc);
1198
 
    g_free (keytheme);
1199
 
 
1200
 
    keythemevalue = getValue ("keytheme", rc);
1201
 
    if (keythemevalue)
 
544
 
 
545
    shortcuts = xfce_shortcuts_provider_get_shortcuts (screen_info->shortcuts_provider);
 
546
 
 
547
    parseShortcut (screen_info, KEY_CANCEL, "cancel_key", shortcuts);
 
548
    parseShortcut (screen_info, KEY_DOWN, "down_key", shortcuts);
 
549
    parseShortcut (screen_info, KEY_LEFT, "left_key", shortcuts);
 
550
    parseShortcut (screen_info, KEY_RIGHT, "right_key", shortcuts);
 
551
    parseShortcut (screen_info, KEY_UP, "up_key", shortcuts);
 
552
    parseShortcut (screen_info, KEY_ADD_WORKSPACE, "add_workspace_key", shortcuts);
 
553
    parseShortcut (screen_info, KEY_ADD_ADJACENT_WORKSPACE, "add_adjacent_workspace_key", shortcuts);
 
554
    parseShortcut (screen_info, KEY_CLOSE_WINDOW, "close_window_key", shortcuts);
 
555
    parseShortcut (screen_info, KEY_CYCLE_WINDOWS, "cycle_windows_key", shortcuts);
 
556
    parseShortcut (screen_info, KEY_CYCLE_REVERSE_WINDOWS, "cycle_reverse_windows_key", shortcuts);
 
557
    parseShortcut (screen_info, KEY_DEL_WORKSPACE, "del_workspace_key", shortcuts);
 
558
    parseShortcut (screen_info, KEY_DEL_ACTIVE_WORKSPACE, "del_active_workspace_key", shortcuts);
 
559
    parseShortcut (screen_info, KEY_DOWN_WORKSPACE, "down_workspace_key", shortcuts);
 
560
    parseShortcut (screen_info, KEY_FILL_HORIZ, "fill_horiz_key", shortcuts);
 
561
    parseShortcut (screen_info, KEY_FILL_VERT, "fill_vert_key", shortcuts);
 
562
    parseShortcut (screen_info, KEY_FILL_WINDOW, "fill_window_key", shortcuts);
 
563
    parseShortcut (screen_info, KEY_HIDE_WINDOW, "hide_window_key", shortcuts);
 
564
    parseShortcut (screen_info, KEY_LEFT_WORKSPACE, "left_workspace_key", shortcuts);
 
565
    parseShortcut (screen_info, KEY_LOWER_WINDOW, "lower_window_key", shortcuts);
 
566
    parseShortcut (screen_info, KEY_MOVE, "move_window_key", shortcuts);
 
567
    parseShortcut (screen_info, KEY_MAXIMIZE_HORIZ, "maximize_horiz_key", shortcuts);
 
568
    parseShortcut (screen_info, KEY_MAXIMIZE_VERT, "maximize_vert_key", shortcuts);
 
569
    parseShortcut (screen_info, KEY_MAXIMIZE_WINDOW, "maximize_window_key", shortcuts);
 
570
    parseShortcut (screen_info, KEY_MOVE_DOWN_WORKSPACE, "move_window_down_workspace_key", shortcuts);
 
571
    parseShortcut (screen_info, KEY_MOVE_LEFT_WORKSPACE, "move_window_left_workspace_key", shortcuts);
 
572
    parseShortcut (screen_info, KEY_MOVE_NEXT_WORKSPACE, "move_window_next_workspace_key", shortcuts);
 
573
    parseShortcut (screen_info, KEY_MOVE_PREV_WORKSPACE, "move_window_prev_workspace_key", shortcuts);
 
574
    parseShortcut (screen_info, KEY_MOVE_RIGHT_WORKSPACE, "move_window_right_workspace_key", shortcuts);
 
575
    parseShortcut (screen_info, KEY_MOVE_UP_WORKSPACE, "move_window_up_workspace_key", shortcuts);
 
576
    parseShortcut (screen_info, KEY_NEXT_WORKSPACE, "next_workspace_key", shortcuts);
 
577
    parseShortcut (screen_info, KEY_POPUP_MENU, "popup_menu_key", shortcuts);
 
578
    parseShortcut (screen_info, KEY_PREV_WORKSPACE, "prev_workspace_key", shortcuts);
 
579
    parseShortcut (screen_info, KEY_RAISE_WINDOW, "raise_window_key", shortcuts);
 
580
    parseShortcut (screen_info, KEY_RESIZE, "resize_window_key", shortcuts);
 
581
    parseShortcut (screen_info, KEY_RIGHT_WORKSPACE, "right_workspace_key", shortcuts);
 
582
    parseShortcut (screen_info, KEY_SHADE_WINDOW, "shade_window_key", shortcuts);
 
583
    parseShortcut (screen_info, KEY_SHOW_DESKTOP, "show_desktop_key", shortcuts);
 
584
    parseShortcut (screen_info, KEY_STICK_WINDOW, "stick_window_key", shortcuts);
 
585
    parseShortcut (screen_info, KEY_TOGGLE_ABOVE, "above_key", shortcuts);
 
586
    parseShortcut (screen_info, KEY_TOGGLE_FULLSCREEN, "fullscreen_key", shortcuts);
 
587
    parseShortcut (screen_info, KEY_UP_WORKSPACE, "up_workspace_key", shortcuts);
 
588
 
 
589
    for (i = 0; i < 12; i++)
1202
590
    {
1203
 
        keytheme = getThemeDir (keythemevalue, KEYTHEMERC);
1204
 
        if (!parseRc (KEYTHEMERC, keytheme, rc))
1205
 
        {
1206
 
            g_warning ("Specified key theme \"%s\" missing, using default", keythemevalue);
1207
 
        }
1208
 
        g_free (keytheme);
 
591
        g_snprintf(keyname, sizeof (keyname), "move_window_workspace_%d_key", i + 1);
 
592
        parseShortcut (screen_info, KEY_MOVE_WORKSPACE_1 + i, keyname, shortcuts);
1209
593
 
1210
 
        if (!checkRc (rc))
1211
 
        {
1212
 
            g_warning ("Missing values in defaults file");
1213
 
            return FALSE;
1214
 
        }
 
594
        g_snprintf(keyname, sizeof (keyname), "workspace_%d_key", i + 1);
 
595
        parseShortcut (screen_info, KEY_WORKSPACE_1 + i, keyname, shortcuts);
1215
596
    }
1216
597
 
1217
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_ADD_WORKSPACE], getValue ("add_workspace_key", rc));
1218
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_CANCEL], getValue ("cancel_key", rc));
1219
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_CLOSE_WINDOW], getValue ("close_window_key", rc));
1220
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], getValue ("cycle_windows_key", rc));
1221
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], getValue ("del_workspace_key", rc));
1222
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], getValue ("down_workspace_key", rc));
1223
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_HIDE_WINDOW], getValue ("hide_window_key", rc));
1224
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_LEFT_WORKSPACE], getValue ("left_workspace_key", rc));
1225
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_LOWER_WINDOW], getValue ("lower_window_key", rc));
1226
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_HORIZ], getValue ("maximize_horiz_key", rc));
1227
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_VERT], getValue ("maximize_vert_key", rc));
1228
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_WINDOW], getValue ("maximize_window_key", rc));
1229
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_DOWN], getValue ("move_window_down_key", rc));
1230
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_DOWN_WORKSPACE], getValue ("move_window_down_workspace_key", rc));
1231
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_LEFT], getValue ("move_window_left_key", rc));
1232
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_LEFT_WORKSPACE], getValue ("move_window_left_workspace_key", rc));
1233
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_NEXT_WORKSPACE], getValue ("move_window_next_workspace_key", rc));
1234
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_PREV_WORKSPACE], getValue ("move_window_prev_workspace_key", rc));
1235
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_RIGHT], getValue ("move_window_right_key", rc));
1236
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_RIGHT_WORKSPACE], getValue ("move_window_right_workspace_key", rc));
1237
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_UP], getValue ("move_window_up_key", rc));
1238
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_UP_WORKSPACE], getValue ("move_window_up_workspace_key", rc));
1239
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_1], getValue ("move_window_workspace_1_key", rc));
1240
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_2], getValue ("move_window_workspace_2_key", rc));
1241
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_3], getValue ("move_window_workspace_3_key", rc));
1242
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_4], getValue ("move_window_workspace_4_key", rc));
1243
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_5], getValue ("move_window_workspace_5_key", rc));
1244
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_6], getValue ("move_window_workspace_6_key", rc));
1245
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_7], getValue ("move_window_workspace_7_key", rc));
1246
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_8], getValue ("move_window_workspace_8_key", rc));
1247
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_9], getValue ("move_window_workspace_9_key", rc));
1248
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_10], getValue ("move_window_workspace_10_key", rc));
1249
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_11], getValue ("move_window_workspace_11_key", rc));
1250
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_12], getValue ("move_window_workspace_12_key", rc));
1251
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_NEXT_WORKSPACE], getValue ("next_workspace_key", rc));
1252
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_POPUP_MENU], getValue ("popup_menu_key", rc));
1253
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_PREV_WORKSPACE], getValue ("prev_workspace_key", rc));
1254
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_RAISE_WINDOW], getValue ("raise_window_key", rc));
1255
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_RESIZE_DOWN], getValue ("resize_window_down_key", rc));
1256
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_RESIZE_LEFT], getValue ("resize_window_left_key", rc));
1257
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_RESIZE_RIGHT], getValue ("resize_window_right_key", rc));
1258
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_RESIZE_UP], getValue ("resize_window_up_key", rc));
1259
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_RIGHT_WORKSPACE], getValue ("right_workspace_key", rc));
1260
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_SHADE_WINDOW], getValue ("shade_window_key", rc));
1261
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_SHOW_DESKTOP], getValue("show_desktop_key", rc));
1262
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_STICK_WINDOW], getValue ("stick_window_key", rc));
1263
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_TOGGLE_FULLSCREEN], getValue ("fullscreen_key", rc));
1264
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_UP_WORKSPACE], getValue ("up_workspace_key", rc));
1265
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_1], getValue ("workspace_1_key", rc));
1266
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_2], getValue ("workspace_2_key", rc));
1267
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_3], getValue ("workspace_3_key", rc));
1268
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_4], getValue ("workspace_4_key", rc));
1269
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_5], getValue ("workspace_5_key", rc));
1270
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_6], getValue ("workspace_6_key", rc));
1271
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_7], getValue ("workspace_7_key", rc));
1272
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_8], getValue ("workspace_8_key", rc));
1273
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_9], getValue ("workspace_9_key", rc));
1274
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_10], getValue ("workspace_10_key", rc));
1275
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_11], getValue ("workspace_11_key", rc));
1276
 
    parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_12], getValue ("workspace_12_key", rc));
 
598
    xfce_shortcuts_free (shortcuts);
1277
599
 
1278
600
    myScreenUngrabKeys (screen_info);
1279
601
    myScreenGrabKeys (screen_info);
1280
602
 
1281
 
    return TRUE;
 
603
    return;
1282
604
}
1283
605
 
1284
606
gboolean
1287
609
    const gchar *value;
1288
610
    Settings rc[] = {
1289
611
        /* Do not change the order of the following parameters */
1290
 
        {"active_text_color", NULL, FALSE},
1291
 
        {"inactive_text_color", NULL, FALSE},
1292
 
        {"active_text_shadow_color", NULL, FALSE},
1293
 
        {"inactive_text_shadow_color", NULL, FALSE},
1294
 
        {"active_border_color", NULL, FALSE},
1295
 
        {"inactive_border_color", NULL, FALSE},
1296
 
        {"active_color_1", NULL, FALSE},
1297
 
        {"active_hilight_1", NULL, FALSE},
1298
 
        {"active_shadow_1", NULL, FALSE},
1299
 
        {"active_mid_1", NULL, FALSE},
1300
 
        {"active_color_2", NULL, FALSE},
1301
 
        {"active_hilight_2", NULL, FALSE},
1302
 
        {"active_shadow_2", NULL, FALSE},
1303
 
        {"active_mid_2", NULL, FALSE},
1304
 
        {"inactive_color_1", NULL, FALSE},
1305
 
        {"inactive_hilight_1", NULL, FALSE},
1306
 
        {"inactive_shadow_1", NULL, FALSE},
1307
 
        {"inactive_mid_1", NULL, FALSE},
1308
 
        {"inactive_color_2", NULL, FALSE},
1309
 
        {"inactive_hilight_2", NULL, FALSE},
1310
 
        {"inactive_shadow_2", NULL, FALSE},
1311
 
        {"inactive_mid_2", NULL, FALSE},
 
612
        {"active_text_color", NULL, G_TYPE_STRING, FALSE},
 
613
        {"inactive_text_color", NULL, G_TYPE_STRING, FALSE},
 
614
        {"active_text_shadow_color", NULL, G_TYPE_STRING, FALSE},
 
615
        {"inactive_text_shadow_color", NULL, G_TYPE_STRING, FALSE},
 
616
        {"active_border_color", NULL, G_TYPE_STRING, FALSE},
 
617
        {"inactive_border_color", NULL, G_TYPE_STRING, FALSE},
 
618
        {"active_color_1", NULL, G_TYPE_STRING, FALSE},
 
619
        {"active_hilight_1", NULL, G_TYPE_STRING, FALSE},
 
620
        {"active_shadow_1", NULL, G_TYPE_STRING, FALSE},
 
621
        {"active_mid_1", NULL, G_TYPE_STRING, FALSE},
 
622
        {"active_color_2", NULL, G_TYPE_STRING, FALSE},
 
623
        {"active_hilight_2", NULL, G_TYPE_STRING, FALSE},
 
624
        {"active_shadow_2", NULL, G_TYPE_STRING, FALSE},
 
625
        {"active_mid_2", NULL, G_TYPE_STRING, FALSE},
 
626
        {"inactive_color_1", NULL, G_TYPE_STRING, FALSE},
 
627
        {"inactive_hilight_1", NULL, G_TYPE_STRING, FALSE},
 
628
        {"inactive_shadow_1", NULL, G_TYPE_STRING, FALSE},
 
629
        {"inactive_mid_1", NULL, G_TYPE_STRING, FALSE},
 
630
        {"inactive_color_2", NULL, G_TYPE_STRING, FALSE},
 
631
        {"inactive_hilight_2", NULL, G_TYPE_STRING, FALSE},
 
632
        {"inactive_shadow_2", NULL, G_TYPE_STRING, FALSE},
 
633
        {"inactive_mid_2", NULL, G_TYPE_STRING, FALSE},
1312
634
        /* You can change the order of the following parameters */
1313
 
        {"activate_action", NULL, TRUE},
1314
 
        {"borderless_maximize", NULL, TRUE},
1315
 
        {"box_move", NULL, TRUE},
1316
 
        {"box_resize", NULL, TRUE},
1317
 
        {"button_layout", NULL, TRUE},
1318
 
        {"button_offset", NULL, TRUE},
1319
 
        {"button_spacing", NULL, TRUE},
1320
 
        {"click_to_focus", NULL, TRUE},
1321
 
        {"cycle_hidden", NULL, TRUE},
1322
 
        {"cycle_minimum", NULL, TRUE},
1323
 
        {"cycle_workspaces", NULL, TRUE},
1324
 
        {"dbl_click_time", NULL, TRUE},
1325
 
        {"double_click_action", NULL, TRUE},
1326
 
        {"easy_click", NULL, TRUE},
1327
 
        {"focus_hint", NULL, TRUE},
1328
 
        {"focus_new", NULL, TRUE},
1329
 
        {"frame_opacity", NULL, TRUE},
1330
 
        {"full_width_title", NULL, TRUE},
1331
 
        {"inactive_opacity", NULL, TRUE},
1332
 
        {"keytheme", NULL, TRUE},
1333
 
        {"margin_bottom", NULL, FALSE},
1334
 
        {"margin_left", NULL, FALSE},
1335
 
        {"margin_right", NULL, FALSE},
1336
 
        {"margin_top", NULL, FALSE},
1337
 
        {"maximized_offset", NULL, TRUE},
1338
 
        {"move_opacity", NULL, TRUE},
1339
 
        {"placement_ratio", NULL, TRUE},
1340
 
        {"popup_opacity", NULL, TRUE},
1341
 
        {"prevent_focus_stealing", NULL, TRUE},
1342
 
        {"raise_delay", NULL, TRUE},
1343
 
        {"raise_on_click", NULL, TRUE},
1344
 
        {"raise_on_focus", NULL, TRUE},
1345
 
        {"raise_with_any_button", NULL, TRUE},
1346
 
        {"resize_opacity", NULL, TRUE},
1347
 
        {"restore_on_move", NULL, TRUE},
1348
 
        {"scroll_workspaces", NULL, TRUE},
1349
 
        {"shadow_delta_height", NULL, TRUE},
1350
 
        {"shadow_delta_width", NULL, TRUE},
1351
 
        {"shadow_delta_x", NULL, TRUE},
1352
 
        {"shadow_delta_y", NULL, TRUE},
1353
 
        {"show_app_icon", NULL, TRUE},
1354
 
        {"show_frame_shadow", NULL, TRUE},
1355
 
        {"show_popup_shadow", NULL, TRUE},
1356
 
        {"snap_resist", NULL, TRUE},
1357
 
        {"snap_to_border", NULL, TRUE},
1358
 
        {"snap_to_windows", NULL, TRUE},
1359
 
        {"snap_width", NULL, TRUE},
1360
 
        {"theme", NULL, TRUE},
1361
 
        {"title_alignment", NULL, TRUE},
1362
 
        {"title_font", NULL, FALSE},
1363
 
        {"title_horizontal_offset", NULL, TRUE},
1364
 
        {"title_shadow_active", NULL, TRUE},
1365
 
        {"title_shadow_inactive", NULL, TRUE},
1366
 
        {"title_vertical_offset_active", NULL, TRUE},
1367
 
        {"title_vertical_offset_inactive", NULL, TRUE},
1368
 
        {"toggle_workspaces", NULL, TRUE},
1369
 
        {"unredirect_overlays", NULL, TRUE},
1370
 
        {"use_compositing", NULL, TRUE},
1371
 
        {"workspace_count", NULL, TRUE},
1372
 
        {"wrap_cycle", NULL, TRUE},
1373
 
        {"wrap_layout", NULL, TRUE},
1374
 
        {"wrap_resistance", NULL, TRUE},
1375
 
        {"wrap_windows", NULL, TRUE},
1376
 
        {"wrap_workspaces", NULL, TRUE},
1377
 
        /* Keys */
1378
 
        {"add_workspace_key", NULL, TRUE},
1379
 
        {"cancel_key", NULL, TRUE},
1380
 
        {"close_window_key", NULL, TRUE},
1381
 
        {"cycle_windows_key", NULL, TRUE},
1382
 
        {"del_workspace_key", NULL, TRUE},
1383
 
        {"down_workspace_key", NULL, TRUE},
1384
 
        {"fullscreen_key", NULL, TRUE},
1385
 
        {"hide_window_key", NULL, TRUE},
1386
 
        {"left_workspace_key", NULL, TRUE},
1387
 
        {"lower_window_key", NULL, TRUE},
1388
 
        {"maximize_horiz_key", NULL, TRUE},
1389
 
        {"maximize_vert_key", NULL, TRUE},
1390
 
        {"maximize_window_key", NULL, TRUE},
1391
 
        {"move_window_down_key", NULL, TRUE},
1392
 
        {"move_window_down_workspace_key", NULL, TRUE},
1393
 
        {"move_window_left_key", NULL, TRUE},
1394
 
        {"move_window_left_workspace_key", NULL, TRUE},
1395
 
        {"move_window_next_workspace_key", NULL, TRUE},
1396
 
        {"move_window_prev_workspace_key", NULL, TRUE},
1397
 
        {"popup_menu_key", NULL, TRUE},
1398
 
        {"move_window_right_key", NULL, TRUE},
1399
 
        {"move_window_right_workspace_key", NULL, TRUE},
1400
 
        {"move_window_up_key", NULL, TRUE},
1401
 
        {"move_window_up_workspace_key", NULL, TRUE},
1402
 
        {"move_window_workspace_1_key", NULL, TRUE},
1403
 
        {"move_window_workspace_2_key", NULL, TRUE},
1404
 
        {"move_window_workspace_3_key", NULL, TRUE},
1405
 
        {"move_window_workspace_4_key", NULL, TRUE},
1406
 
        {"move_window_workspace_5_key", NULL, TRUE},
1407
 
        {"move_window_workspace_6_key", NULL, TRUE},
1408
 
        {"move_window_workspace_7_key", NULL, TRUE},
1409
 
        {"move_window_workspace_8_key", NULL, TRUE},
1410
 
        {"move_window_workspace_9_key", NULL, TRUE},
1411
 
        {"move_window_workspace_10_key", NULL, TRUE},
1412
 
        {"move_window_workspace_11_key", NULL, TRUE},
1413
 
        {"move_window_workspace_12_key", NULL, TRUE},
1414
 
        {"next_workspace_key", NULL, TRUE},
1415
 
        {"prev_workspace_key", NULL, TRUE},
1416
 
        {"raise_window_key", NULL, TRUE},
1417
 
        {"resize_window_down_key", NULL, TRUE},
1418
 
        {"resize_window_left_key", NULL, TRUE},
1419
 
        {"resize_window_right_key", NULL, TRUE},
1420
 
        {"resize_window_up_key", NULL, TRUE},
1421
 
        {"right_workspace_key", NULL, TRUE},
1422
 
        {"shade_window_key", NULL, TRUE},
1423
 
        {"show_desktop_key", NULL, FALSE},
1424
 
        {"stick_window_key", NULL, TRUE},
1425
 
        {"up_workspace_key", NULL, TRUE},
1426
 
        {"workspace_1_key", NULL, TRUE},
1427
 
        {"workspace_2_key", NULL, TRUE},
1428
 
        {"workspace_3_key", NULL, TRUE},
1429
 
        {"workspace_4_key", NULL, TRUE},
1430
 
        {"workspace_5_key", NULL, TRUE},
1431
 
        {"workspace_6_key", NULL, TRUE},
1432
 
        {"workspace_7_key", NULL, TRUE},
1433
 
        {"workspace_8_key", NULL, TRUE},
1434
 
        {"workspace_9_key", NULL, TRUE},
1435
 
        {"workspace_10_key", NULL, TRUE},
1436
 
        {"workspace_11_key", NULL, TRUE},
1437
 
        {"workspace_12_key", NULL, TRUE},
1438
 
        {NULL, NULL, FALSE}
 
635
        {"activate_action", NULL, G_TYPE_STRING, TRUE},
 
636
        {"borderless_maximize", NULL, G_TYPE_BOOLEAN, TRUE},
 
637
        {"box_move", NULL, G_TYPE_BOOLEAN, TRUE},
 
638
        {"box_resize", NULL, G_TYPE_BOOLEAN, TRUE},
 
639
        {"button_layout", NULL, G_TYPE_STRING, TRUE},
 
640
        {"button_offset", NULL, G_TYPE_INT, TRUE},
 
641
        {"button_spacing", NULL, G_TYPE_INT, TRUE},
 
642
        {"click_to_focus", NULL, G_TYPE_BOOLEAN, TRUE},
 
643
        {"focus_delay", NULL, G_TYPE_INT, TRUE},
 
644
        {"cycle_draw_frame", NULL, G_TYPE_BOOLEAN, TRUE},
 
645
        {"cycle_hidden", NULL, G_TYPE_BOOLEAN, TRUE},
 
646
        {"cycle_minimum", NULL, G_TYPE_BOOLEAN, TRUE},
 
647
        {"cycle_workspaces", NULL, G_TYPE_BOOLEAN, TRUE},
 
648
        {"dbl_click_time", NULL, G_TYPE_INT, TRUE},
 
649
        {"double_click_action", NULL, G_TYPE_STRING, TRUE},
 
650
        {"easy_click", NULL, G_TYPE_STRING, TRUE},
 
651
        {"focus_hint", NULL, G_TYPE_BOOLEAN, TRUE},
 
652
        {"focus_new", NULL, G_TYPE_BOOLEAN,TRUE},
 
653
        {"frame_opacity", NULL, G_TYPE_INT, TRUE},
 
654
        {"full_width_title", NULL, G_TYPE_BOOLEAN, TRUE},
 
655
        {"inactive_opacity", NULL, G_TYPE_INT, TRUE},
 
656
        {"margin_bottom", NULL, G_TYPE_INT, FALSE},
 
657
        {"margin_left", NULL, G_TYPE_INT, FALSE},
 
658
        {"margin_right", NULL, G_TYPE_INT, FALSE},
 
659
        {"margin_top", NULL, G_TYPE_INT, FALSE},
 
660
        {"maximized_offset", NULL, G_TYPE_INT, TRUE},
 
661
        {"move_opacity", NULL, G_TYPE_INT, TRUE},
 
662
        {"placement_ratio", NULL, G_TYPE_INT, TRUE},
 
663
        {"placement_mode", NULL, G_TYPE_STRING, TRUE},
 
664
        {"popup_opacity", NULL, G_TYPE_INT, TRUE},
 
665
        {"prevent_focus_stealing", NULL, G_TYPE_BOOLEAN, TRUE},
 
666
        {"raise_delay", NULL, G_TYPE_INT, TRUE},
 
667
        {"raise_on_click", NULL, G_TYPE_BOOLEAN, TRUE},
 
668
        {"raise_on_focus", NULL, G_TYPE_BOOLEAN, TRUE},
 
669
        {"raise_with_any_button", NULL, G_TYPE_BOOLEAN, TRUE},
 
670
        {"repeat_urgent_blink", NULL, G_TYPE_BOOLEAN, TRUE},
 
671
        {"resize_opacity", NULL, G_TYPE_INT, TRUE},
 
672
        {"restore_on_move", NULL, G_TYPE_BOOLEAN, TRUE},
 
673
        {"scroll_workspaces", NULL, G_TYPE_BOOLEAN, TRUE},
 
674
        {"shadow_delta_height", NULL, G_TYPE_INT, TRUE},
 
675
        {"shadow_delta_width", NULL, G_TYPE_INT, TRUE},
 
676
        {"shadow_delta_x", NULL, G_TYPE_INT, TRUE},
 
677
        {"shadow_delta_y", NULL, G_TYPE_INT, TRUE},
 
678
        {"shadow_opacity", NULL, G_TYPE_INT, TRUE},
 
679
        {"show_app_icon", NULL, G_TYPE_BOOLEAN, TRUE},
 
680
        {"show_dock_shadow", NULL, G_TYPE_BOOLEAN, TRUE},
 
681
        {"show_frame_shadow", NULL, G_TYPE_BOOLEAN, TRUE},
 
682
        {"show_popup_shadow", NULL, G_TYPE_BOOLEAN, TRUE},
 
683
        {"snap_resist", NULL, G_TYPE_BOOLEAN, TRUE},
 
684
        {"snap_to_border", NULL, G_TYPE_BOOLEAN, TRUE},
 
685
        {"snap_to_windows", NULL, G_TYPE_BOOLEAN, TRUE},
 
686
        {"snap_width", NULL, G_TYPE_INT, TRUE},
 
687
        {"theme", NULL, G_TYPE_STRING, TRUE},
 
688
        {"title_alignment", NULL, G_TYPE_STRING, TRUE},
 
689
        {"title_font", NULL, G_TYPE_STRING, FALSE},
 
690
        {"title_horizontal_offset", NULL, G_TYPE_INT, TRUE},
 
691
        {"title_shadow_active", NULL, G_TYPE_STRING, TRUE},
 
692
        {"title_shadow_inactive", NULL, G_TYPE_STRING, TRUE},
 
693
        {"title_vertical_offset_active", NULL, G_TYPE_INT, TRUE},
 
694
        {"title_vertical_offset_inactive", NULL, G_TYPE_INT, TRUE},
 
695
        {"toggle_workspaces", NULL, G_TYPE_BOOLEAN, TRUE},
 
696
        {"unredirect_overlays", NULL, G_TYPE_BOOLEAN, TRUE},
 
697
        {"urgent_blink", NULL, G_TYPE_BOOLEAN, TRUE},
 
698
        {"use_compositing", NULL, G_TYPE_BOOLEAN, TRUE},
 
699
        {"workspace_count", NULL, G_TYPE_INT, TRUE},
 
700
        {"wrap_cycle", NULL, G_TYPE_BOOLEAN, TRUE},
 
701
        {"wrap_layout", NULL, G_TYPE_BOOLEAN, TRUE},
 
702
        {"wrap_resistance", NULL, G_TYPE_INT, TRUE},
 
703
        {"wrap_windows", NULL, G_TYPE_BOOLEAN, TRUE},
 
704
        {"wrap_workspaces", NULL, G_TYPE_BOOLEAN, TRUE},
 
705
        {NULL, NULL, G_TYPE_INVALID, FALSE}
1439
706
    };
1440
707
 
1441
708
    TRACE ("entering loadSettings");
1442
709
 
1443
710
    loadRcData (screen_info, rc);
1444
 
    loadMcsData (screen_info, rc);
 
711
    loadRcData (screen_info, rc);
 
712
    loadXfconfData (screen_info, rc);
1445
713
    loadTheme (screen_info, rc);
1446
714
    update_grabs (screen_info);
1447
715
 
1448
 
    if (!loadKeyBindings (screen_info, rc))
1449
 
    {
1450
 
        freeRc (rc);
1451
 
        return FALSE;
1452
 
    }
 
716
    loadKeyBindings (screen_info);
1453
717
 
1454
718
    screen_info->params->borderless_maximize =
1455
 
        !g_ascii_strcasecmp ("true", getValue ("borderless_maximize", rc));
 
719
        getBoolValue ("borderless_maximize", rc);
1456
720
    screen_info->params->box_resize =
1457
 
        !g_ascii_strcasecmp ("true", getValue ("box_resize", rc));
 
721
        getBoolValue ("box_resize", rc);
1458
722
    screen_info->params->box_move =
1459
 
        !g_ascii_strcasecmp ("true", getValue ("box_move", rc));
 
723
        getBoolValue ("box_move", rc);
1460
724
    screen_info->params->click_to_focus =
1461
 
        !g_ascii_strcasecmp ("true", getValue ("click_to_focus", rc));
 
725
        getBoolValue ("click_to_focus", rc);
1462
726
    screen_info->params->cycle_minimum =
1463
 
        !g_ascii_strcasecmp ("true", getValue ("cycle_minimum", rc));
 
727
        getBoolValue ("cycle_minimum", rc);
 
728
    screen_info->params->cycle_draw_frame =
 
729
        getBoolValue ("cycle_draw_frame", rc);
1464
730
    screen_info->params->cycle_hidden =
1465
 
        !g_ascii_strcasecmp ("true", getValue ("cycle_hidden", rc));
 
731
        getBoolValue ("cycle_hidden", rc);
1466
732
    screen_info->params->cycle_workspaces =
1467
 
        !g_ascii_strcasecmp ("true", getValue ("cycle_workspaces", rc));
 
733
        getBoolValue ("cycle_workspaces", rc);
1468
734
    screen_info->params->focus_hint =
1469
 
        !g_ascii_strcasecmp ("true", getValue ("focus_hint", rc));
 
735
        getBoolValue ("focus_hint", rc);
1470
736
    screen_info->params->focus_new =
1471
 
        !g_ascii_strcasecmp ("true", getValue ("focus_new", rc));
 
737
        getBoolValue ("focus_new", rc);
1472
738
    screen_info->params->raise_on_focus =
1473
 
        !g_ascii_strcasecmp ("true", getValue ("raise_on_focus", rc));
 
739
        getBoolValue ("raise_on_focus", rc);
1474
740
    screen_info->params->prevent_focus_stealing =
1475
 
        !g_ascii_strcasecmp ("true", getValue ("prevent_focus_stealing", rc));
 
741
        getBoolValue ("prevent_focus_stealing", rc);
1476
742
    screen_info->params->raise_delay =
1477
 
        abs (TOINT (getValue ("raise_delay", rc)));
 
743
        getIntValue ("raise_delay", rc);
 
744
    screen_info->params->focus_delay =
 
745
        getIntValue ("focus_delay", rc);
1478
746
    screen_info->params->raise_on_click =
1479
 
        !g_ascii_strcasecmp ("true", getValue ("raise_on_click", rc));
 
747
        getBoolValue ("raise_on_click", rc);
1480
748
    screen_info->params->raise_with_any_button =
1481
 
        !g_ascii_strcasecmp ("true", getValue ("raise_with_any_button", rc));
 
749
        getBoolValue ("raise_with_any_button", rc);
 
750
    screen_info->params->repeat_urgent_blink =
 
751
        getBoolValue ("repeat_urgent_blink", rc);
 
752
    screen_info->params->urgent_blink =
 
753
        getBoolValue ("urgent_blink", rc);
1482
754
    screen_info->params->restore_on_move =
1483
 
        !g_ascii_strcasecmp ("true", getValue ("restore_on_move", rc));
 
755
        getBoolValue ("restore_on_move", rc);
1484
756
    screen_info->params->frame_opacity =
1485
 
        abs (TOINT (getValue ("frame_opacity", rc)));
 
757
        CLAMP (getIntValue ("frame_opacity", rc), 0, 100);
1486
758
    screen_info->params->inactive_opacity =
1487
 
        abs (TOINT (getValue ("inactive_opacity", rc)));
 
759
        CLAMP (getIntValue ("inactive_opacity", rc), 0, 100);
1488
760
    screen_info->params->move_opacity =
1489
 
        abs (TOINT (getValue ("move_opacity", rc)));
 
761
        CLAMP (getIntValue ("move_opacity", rc), 0, 100);
1490
762
    screen_info->params->resize_opacity =
1491
 
        abs (TOINT (getValue ("resize_opacity", rc)));
 
763
        CLAMP (getIntValue ("resize_opacity", rc), 0, 100);
1492
764
    screen_info->params->popup_opacity =
1493
 
        abs (TOINT (getValue ("popup_opacity", rc)));
 
765
        CLAMP (getIntValue ("popup_opacity", rc), 0, 100);
1494
766
    screen_info->params->placement_ratio =
1495
 
        abs (TOINT (getValue ("placement_ratio", rc)));
 
767
        CLAMP (getIntValue ("placement_ratio", rc), 0, 100);
 
768
    screen_info->params->shadow_opacity =
 
769
        CLAMP (getIntValue ("shadow_opacity", rc), 0, 100);
1496
770
    screen_info->params->show_app_icon =
1497
 
        !g_ascii_strcasecmp ("true", getValue ("show_app_icon", rc));
 
771
        getBoolValue ("show_app_icon", rc);
 
772
    screen_info->params->show_dock_shadow =
 
773
        getBoolValue ("show_dock_shadow", rc);
1498
774
    screen_info->params->show_frame_shadow =
1499
 
        !g_ascii_strcasecmp ("true", getValue ("show_frame_shadow", rc));
 
775
        getBoolValue ("show_frame_shadow", rc);
1500
776
    screen_info->params->show_popup_shadow =
1501
 
        !g_ascii_strcasecmp ("true", getValue ("show_popup_shadow", rc));
 
777
        getBoolValue ("show_popup_shadow", rc);
1502
778
    screen_info->params->snap_to_border =
1503
 
        !g_ascii_strcasecmp ("true", getValue ("snap_to_border", rc));
 
779
        getBoolValue ("snap_to_border", rc);
1504
780
    screen_info->params->snap_to_windows =
1505
 
        !g_ascii_strcasecmp ("true", getValue ("snap_to_windows", rc));
 
781
        getBoolValue ("snap_to_windows", rc);
1506
782
    screen_info->params->snap_resist =
1507
 
        !g_ascii_strcasecmp ("true", getValue ("snap_resist", rc));
 
783
        getBoolValue ("snap_resist", rc);
1508
784
    screen_info->params->snap_width =
1509
 
        abs (TOINT (getValue ("snap_width", rc)));
1510
 
 
1511
 
    set_settings_margin (screen_info, STRUTS_LEFT,   TOINT (getValue ("margin_left", rc)));
1512
 
    set_settings_margin (screen_info, STRUTS_RIGHT,  TOINT (getValue ("margin_right", rc)));
1513
 
    set_settings_margin (screen_info, STRUTS_BOTTOM, TOINT (getValue ("margin_bottom", rc)));
1514
 
    set_settings_margin (screen_info, STRUTS_TOP,    TOINT (getValue ("margin_top", rc)));
1515
 
 
1516
 
    set_easy_click (screen_info, getValue ("easy_click", rc));
1517
 
    
1518
 
    value = getValue ("activate_action", rc);
 
785
        getIntValue ("snap_width", rc);
 
786
    screen_info->params->toggle_workspaces =
 
787
        getBoolValue ("toggle_workspaces", rc);
 
788
    screen_info->params->unredirect_overlays =
 
789
        getBoolValue ("unredirect_overlays", rc);
 
790
    screen_info->params->use_compositing =
 
791
        getBoolValue ("use_compositing", rc);
 
792
    screen_info->params->wrap_workspaces =
 
793
        getBoolValue ("wrap_workspaces", rc);
 
794
 
 
795
    screen_info->params->wrap_layout =
 
796
        getBoolValue ("wrap_layout", rc);
 
797
    screen_info->params->wrap_windows =
 
798
        getBoolValue ("wrap_windows", rc);
 
799
    screen_info->params->wrap_cycle =
 
800
        getBoolValue ("wrap_cycle", rc);
 
801
    screen_info->params->scroll_workspaces =
 
802
        getBoolValue ("scroll_workspaces", rc);
 
803
    screen_info->params->wrap_resistance =
 
804
        getIntValue ("wrap_resistance", rc);
 
805
 
 
806
    set_settings_margin (screen_info, STRUTS_LEFT,   getIntValue ("margin_left", rc));
 
807
    set_settings_margin (screen_info, STRUTS_RIGHT,  getIntValue ("margin_right", rc));
 
808
    set_settings_margin (screen_info, STRUTS_BOTTOM, getIntValue ("margin_bottom", rc));
 
809
    set_settings_margin (screen_info, STRUTS_TOP,    getIntValue ("margin_top", rc));
 
810
 
 
811
    set_easy_click (screen_info, getStringValue ("easy_click", rc));
 
812
 
 
813
    value = getStringValue ("placement_mode", rc);
 
814
    set_placement_mode (screen_info, value);
 
815
 
 
816
    value = getStringValue ("activate_action", rc);
1519
817
    set_activate_action (screen_info, value);
1520
818
 
1521
 
    value = getValue ("double_click_action", rc);
 
819
    value = getStringValue ("double_click_action", rc);
1522
820
    if (!g_ascii_strcasecmp ("shade", value))
1523
821
    {
1524
822
        screen_info->params->double_click_action = DBL_CLICK_ACTION_SHADE;
1531
829
    {
1532
830
        screen_info->params->double_click_action = DBL_CLICK_ACTION_MAXIMIZE;
1533
831
    }
 
832
    else if (!g_ascii_strcasecmp ("fill", value))
 
833
    {
 
834
        screen_info->params->double_click_action = DBL_CLICK_ACTION_FILL;
 
835
    }
1534
836
    else
1535
837
    {
1536
838
        screen_info->params->double_click_action = DBL_CLICK_ACTION_NONE;
1539
841
    if (screen_info->workspace_count < 0)
1540
842
    {
1541
843
        gint workspace_count;
1542
 
        workspace_count = abs (TOINT (getValue ("workspace_count", rc)));
1543
 
        if (workspace_count < 0)
1544
 
        {
1545
 
            workspace_count = 0;
1546
 
        }
 
844
        workspace_count = MAX (getIntValue ("workspace_count", rc), 0);
1547
845
        workspaceSetCount (screen_info, workspace_count);
1548
846
    }
1549
847
 
1550
 
    screen_info->params->toggle_workspaces =
1551
 
        !g_ascii_strcasecmp ("true", getValue ("toggle_workspaces", rc));
1552
 
    screen_info->params->unredirect_overlays =
1553
 
        !g_ascii_strcasecmp ("true", getValue ("unredirect_overlays", rc));
1554
 
    screen_info->params->use_compositing =
1555
 
        !g_ascii_strcasecmp ("true", getValue ("use_compositing", rc));
1556
 
    screen_info->params->wrap_workspaces =
1557
 
        !g_ascii_strcasecmp ("true", getValue ("wrap_workspaces", rc));
1558
 
    screen_info->params->wrap_layout =
1559
 
        !g_ascii_strcasecmp ("true", getValue ("wrap_layout", rc));
1560
 
    screen_info->params->wrap_windows =
1561
 
        !g_ascii_strcasecmp ("true", getValue ("wrap_windows", rc));
1562
 
    screen_info->params->wrap_cycle =
1563
 
        !g_ascii_strcasecmp ("true", getValue ("wrap_cycle", rc));
1564
 
    screen_info->params->scroll_workspaces =
1565
 
        !g_ascii_strcasecmp ("true", getValue ("scroll_workspaces", rc));
1566
 
    screen_info->params->wrap_resistance =
1567
 
        abs (TOINT (getValue ("wrap_resistance", rc)));
1568
 
 
1569
848
    freeRc (rc);
1570
849
    return TRUE;
1571
850
}
1573
852
static void
1574
853
unloadTheme (ScreenInfo *screen_info)
1575
854
{
1576
 
    int i;
 
855
    int i, j;
1577
856
 
1578
857
    TRACE ("entering unloadTheme");
1579
858
 
1580
 
    for (i = 0; i < 3; i++)
 
859
    for (i = 0; i < SIDE_COUNT; i++)
1581
860
    {
1582
861
        xfwmPixmapFree (&screen_info->sides[i][ACTIVE]);
1583
862
        xfwmPixmapFree (&screen_info->sides[i][INACTIVE]);
1584
863
    }
1585
 
    for (i = 0; i < 4; i++)
 
864
    for (i = 0; i < CORNER_COUNT; i++)
1586
865
    {
1587
866
        xfwmPixmapFree (&screen_info->corners[i][ACTIVE]);
1588
867
        xfwmPixmapFree (&screen_info->corners[i][INACTIVE]);
1589
868
    }
1590
 
    for (i = 0; i < BUTTON_LAST; i++)
 
869
    for (i = 0; i < BUTTON_COUNT; i++)
1591
870
    {
1592
 
        xfwmPixmapFree (&screen_info->buttons[i][ACTIVE]);
1593
 
        xfwmPixmapFree (&screen_info->buttons[i][INACTIVE]);
1594
 
        xfwmPixmapFree (&screen_info->buttons[i][PRESSED]);
1595
 
        xfwmPixmapFree (&screen_info->buttons[i][T_ACTIVE]);
1596
 
        xfwmPixmapFree (&screen_info->buttons[i][T_INACTIVE]);
1597
 
        xfwmPixmapFree (&screen_info->buttons[i][T_PRESSED]);
 
871
        for (j = 0; j < STATE_COUNT; j++)
 
872
        {
 
873
            xfwmPixmapFree (&screen_info->buttons[i][j]);
 
874
        }
1598
875
    }
1599
 
    for (i = 0; i < 5; i++)
 
876
    for (i = 0; i < TITLE_COUNT; i++)
1600
877
    {
1601
878
        xfwmPixmapFree (&screen_info->title[i][ACTIVE]);
1602
879
        xfwmPixmapFree (&screen_info->title[i][INACTIVE]);
 
880
        xfwmPixmapFree (&screen_info->top[i][ACTIVE]);
 
881
        xfwmPixmapFree (&screen_info->top[i][INACTIVE]);
1603
882
    }
1604
883
    if (screen_info->box_gc != None)
1605
884
    {
1608
887
    }
1609
888
}
1610
889
 
 
890
 
 
891
static void
 
892
unloadKeyBindings (ScreenInfo *screen_info)
 
893
{
 
894
    int i;
 
895
 
 
896
    g_return_if_fail (screen_info);
 
897
 
 
898
    for (i = 0; i < KEY_COUNT; ++i)
 
899
    {
 
900
        g_free (screen_info->params->keys[i].internal_name);
 
901
    }
 
902
}
 
903
 
1611
904
static void
1612
905
unloadSettings (ScreenInfo *screen_info)
1613
906
{
1616
909
    TRACE ("entering unloadSettings");
1617
910
 
1618
911
    unloadTheme (screen_info);
 
912
    unloadKeyBindings (screen_info);
1619
913
}
1620
914
 
1621
915
static gboolean
1665
959
gboolean
1666
960
initSettings (ScreenInfo *screen_info)
1667
961
{
 
962
    GdkKeymap *keymap;
1668
963
    DisplayInfo *display_info;
1669
964
    char **names;
1670
965
    long val;
1674
969
 
1675
970
    TRACE ("entering initSettings");
1676
971
 
 
972
    if (!xfconf_init (NULL))
 
973
    {
 
974
        g_critical ("Xfconf could not be initialized");
 
975
        return FALSE;
 
976
    }
 
977
 
1677
978
    display_info = screen_info->display_info;
1678
979
    names = NULL;
1679
980
    val = 0;
1680
981
    i = 0;
1681
982
 
1682
 
    if (!mcs_client_check_manager (myScreenGetXDisplay (screen_info), screen_info->screen, "xfce-mcs-manager"))
1683
 
    {
1684
 
        g_warning ("MCS manager not running, startup delayed for 5 seconds");
1685
 
        sleep (5);
1686
 
    }
1687
 
 
1688
 
    screen_info->mcs_client = mcs_client_new (myScreenGetXDisplay (screen_info), screen_info->screen, notify_cb, watch_cb, (gpointer) screen_info);
1689
 
    if (screen_info->mcs_client)
1690
 
    {
1691
 
        mcs_client_add_channel (screen_info->mcs_client, CHANNEL1);
1692
 
        mcs_client_add_channel (screen_info->mcs_client, CHANNEL2);
1693
 
        mcs_client_add_channel (screen_info->mcs_client, CHANNEL3);
1694
 
        mcs_client_add_channel (screen_info->mcs_client, CHANNEL4);
1695
 
        mcs_client_add_channel (screen_info->mcs_client, CHANNEL5);
1696
 
        mcs_client_set_raw_channel (screen_info->mcs_client, CHANNEL4, TRUE);
1697
 
    }
1698
 
    else
1699
 
    {
1700
 
        g_warning ("Cannot create MCS client channel");
1701
 
    }
1702
 
    screen_info->mcs_initted = TRUE;
 
983
    screen_info->xfwm4_channel = xfconf_channel_new(CHANNEL_XFWM);
 
984
    g_signal_connect (screen_info->xfwm4_channel, "property-changed",
 
985
                      G_CALLBACK (cb_xfwm4_channel_property_changed), screen_info);
 
986
 
 
987
    keymap = gdk_keymap_get_default ();
 
988
    g_signal_connect (keymap, "keys-changed",
 
989
                      G_CALLBACK (cb_keys_changed), screen_info);
 
990
 
 
991
    screen_info->shortcuts_provider = xfce_shortcuts_provider_new ("xfwm4");
 
992
    g_signal_connect (screen_info->shortcuts_provider, "shortcut-added",
 
993
                      G_CALLBACK (cb_shortcut_added), screen_info);
 
994
    g_signal_connect (screen_info->shortcuts_provider, "shortcut-removed",
 
995
                      G_CALLBACK (cb_shortcut_removed), screen_info);
1703
996
 
1704
997
    if (!loadSettings (screen_info))
1705
998
    {
1735
1028
{
1736
1029
    g_return_if_fail (screen_info);
1737
1030
 
1738
 
    if (screen_info->mcs_client)
1739
 
    {
1740
 
        mcs_client_destroy (screen_info->mcs_client);
1741
 
        screen_info->mcs_client = NULL;
1742
 
    }
1743
1031
    unloadSettings (screen_info);
1744
1032
}
 
1033
 
 
1034
static void
 
1035
cb_xfwm4_channel_property_changed(XfconfChannel *channel, const gchar *property_name, const GValue *value, ScreenInfo *screen_info)
 
1036
{
 
1037
    if (g_str_has_prefix(property_name, "/general/") == TRUE)
 
1038
    {
 
1039
        const gchar *name = &property_name[9];
 
1040
        switch (G_VALUE_TYPE(value))
 
1041
        {
 
1042
            case G_TYPE_STRING:
 
1043
                if (!strcmp (name, "double_click_action"))
 
1044
                {
 
1045
                    reloadScreenSettings (screen_info, NO_UPDATE_FLAG);
 
1046
                }
 
1047
                else if (!strcmp (name, "theme"))
 
1048
                {
 
1049
                    reloadScreenSettings(screen_info, UPDATE_MAXIMIZE | UPDATE_GRAVITY | UPDATE_CACHE);
 
1050
                }
 
1051
                else if (!strcmp (name, "button_layout"))
 
1052
                {
 
1053
                    reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
 
1054
                }
 
1055
                else if (!strcmp (name, "title_alignment"))
 
1056
                {
 
1057
                    reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
 
1058
                }
 
1059
                else if (!strcmp (name, "title_font"))
 
1060
                {
 
1061
                    reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
 
1062
                }
 
1063
                 else if (!strcmp (name, "easy_click"))
 
1064
                {
 
1065
                    reloadScreenSettings (screen_info, UPDATE_BUTTON_GRABS);
 
1066
                }
 
1067
                else if (!strcmp (name, "activate_action"))
 
1068
                {
 
1069
                    set_activate_action (screen_info, g_value_get_string (value));
 
1070
                }
 
1071
                else if (!strcmp (name, "placement_mode"))
 
1072
                {
 
1073
                    set_placement_mode (screen_info, g_value_get_string (value));
 
1074
                }
 
1075
                else if ((!strcmp (name, "title_shadow_active"))
 
1076
                      || (!strcmp (name, "title_shadow_inactive")))
 
1077
                {
 
1078
                    /* These properties are not configurable via xfconf */
 
1079
                }
 
1080
                else
 
1081
                {
 
1082
                    g_warning("The property '%s' is not supported", property_name);
 
1083
                }
 
1084
                break;
 
1085
            case G_TYPE_INT:
 
1086
                if (!strcmp (name, "raise_delay"))
 
1087
                {
 
1088
                    screen_info->params->raise_delay = g_value_get_int (value);
 
1089
                }
 
1090
                else if (!strcmp (name, "focus_delay"))
 
1091
                {
 
1092
                    screen_info->params->focus_delay = g_value_get_int (value);
 
1093
                }
 
1094
                else if (!strcmp (name, "snap_width"))
 
1095
                {
 
1096
                    screen_info->params->snap_width = g_value_get_int (value);
 
1097
                }
 
1098
                else if (!strcmp (name, "wrap_resistance"))
 
1099
                {
 
1100
                    screen_info->params->wrap_resistance = g_value_get_int (value);
 
1101
                }
 
1102
                else if (!strcmp (name, "margin_left"))
 
1103
                {
 
1104
                    set_settings_margin (screen_info, STRUTS_LEFT, g_value_get_int (value));
 
1105
                }
 
1106
                else if (!strcmp (name, "margin_right"))
 
1107
                {
 
1108
                    set_settings_margin (screen_info, STRUTS_RIGHT, g_value_get_int (value));
 
1109
                }
 
1110
                else if (!strcmp (name, "margin_bottom"))
 
1111
                {
 
1112
                    set_settings_margin (screen_info, STRUTS_BOTTOM, g_value_get_int (value));
 
1113
                }
 
1114
                else if (!strcmp (name, "margin_top"))
 
1115
                {
 
1116
                    set_settings_margin (screen_info, STRUTS_TOP, g_value_get_int (value));
 
1117
                }
 
1118
                else if (!strcmp (name, "workspace_count"))
 
1119
                {
 
1120
                    workspaceSetCount(screen_info, g_value_get_int (value));
 
1121
                }
 
1122
                else if (!strcmp (name, "frame_opacity"))
 
1123
                {
 
1124
                    screen_info->params->frame_opacity = g_value_get_int(value);
 
1125
                    reloadScreenSettings (screen_info, UPDATE_FRAME);
 
1126
                }
 
1127
                else if (!strcmp (name, "inactive_opacity"))
 
1128
                {
 
1129
                    screen_info->params->inactive_opacity = g_value_get_int(value);
 
1130
                    reloadScreenSettings (screen_info, UPDATE_FRAME);
 
1131
                    clientUpdateAllOpacity (screen_info);
 
1132
                }
 
1133
                else if (!strcmp (name, "move_opacity"))
 
1134
                {
 
1135
                    screen_info->params->move_opacity = g_value_get_int (value);
 
1136
                }
 
1137
                else if (!strcmp (name, "resize_opacity"))
 
1138
                {
 
1139
                    screen_info->params->resize_opacity = g_value_get_int (value);
 
1140
                }
 
1141
                else if (!strcmp (name, "popup_opacity"))
 
1142
                {
 
1143
                    screen_info->params->popup_opacity = g_value_get_int (value);
 
1144
                    reloadScreenSettings (screen_info, UPDATE_FRAME);
 
1145
                }
 
1146
                else if (!strcmp (name, "placement_ratio"))
 
1147
                {
 
1148
                    screen_info->params->placement_ratio = g_value_get_int (value);
 
1149
                }
 
1150
                else if ((!strcmp (name, "button_offset"))
 
1151
                      || (!strcmp (name, "button_spacing"))
 
1152
                      || (!strcmp (name, "dbl_click_time"))
 
1153
                      || (!strcmp (name, "maximized_offset"))
 
1154
                      || (!strcmp (name, "shadow_delta_height"))
 
1155
                      || (!strcmp (name, "shadow_delta_width"))
 
1156
                      || (!strcmp (name, "shadow_delta_x"))
 
1157
                      || (!strcmp (name, "shadow_delta_y"))
 
1158
                      || (!strcmp (name, "shadow_opacity"))
 
1159
                      || (!strcmp (name, "title_horizontal_offset"))
 
1160
                      || (!strcmp (name, "title_vertical_offset_active"))
 
1161
                      || (!strcmp (name, "title_vertical_offset_inactive")))
 
1162
                {
 
1163
                    /* These properties are not configurable via xfconf */
 
1164
                }
 
1165
                else
 
1166
                {
 
1167
                    g_warning("The property '%s' is not supported", property_name);
 
1168
                }
 
1169
                break;
 
1170
            case G_TYPE_BOOLEAN:
 
1171
                if (!strcmp (name, "box_move"))
 
1172
                {
 
1173
                    screen_info->params->box_move = g_value_get_boolean (value);
 
1174
                }
 
1175
                else if (!strcmp (name, "box_resize"))
 
1176
                {
 
1177
                    screen_info->params->box_resize = g_value_get_boolean (value);
 
1178
                }
 
1179
                else if (!strcmp (name, "click_to_focus"))
 
1180
                {
 
1181
                    screen_info->params->click_to_focus = g_value_get_boolean (value);
 
1182
                    update_grabs (screen_info);
 
1183
                }
 
1184
                else if (!strcmp (name, "focus_new"))
 
1185
                {
 
1186
                    screen_info->params->focus_new = g_value_get_boolean (value);
 
1187
                }
 
1188
                else if (!strcmp (name, "raise_on_focus"))
 
1189
                {
 
1190
                    screen_info->params->raise_on_focus = g_value_get_boolean (value);
 
1191
                }
 
1192
                else if (!strcmp (name, "raise_on_click"))
 
1193
                {
 
1194
                    screen_info->params->raise_on_click = g_value_get_boolean (value);
 
1195
                    update_grabs (screen_info);
 
1196
                }
 
1197
                else if (!strcmp (name, "repeat_urgent_blink"))
 
1198
                {
 
1199
                    screen_info->params->repeat_urgent_blink = g_value_get_boolean (value);
 
1200
                }
 
1201
                else if (!strcmp (name, "urgent_blink"))
 
1202
                {
 
1203
                    screen_info->params->urgent_blink = g_value_get_boolean (value);
 
1204
                }
 
1205
                else if (!strcmp (name, "snap_to_border"))
 
1206
                {
 
1207
                    screen_info->params->snap_to_border = g_value_get_boolean (value);
 
1208
                }
 
1209
                else if (!strcmp (name, "snap_to_windows"))
 
1210
                {
 
1211
                    screen_info->params->snap_to_windows = g_value_get_boolean (value);
 
1212
                }
 
1213
                else if (!strcmp (name, "wrap_workspaces"))
 
1214
                {
 
1215
                    screen_info->params->wrap_workspaces = g_value_get_boolean (value);
 
1216
                    placeSidewalks (screen_info, screen_info->params->wrap_workspaces);
 
1217
                }
 
1218
                else if (!strcmp (name, "wrap_windows"))
 
1219
                {
 
1220
                    screen_info->params->wrap_windows = g_value_get_boolean (value);
 
1221
                }
 
1222
                else if (!strcmp (name, "borderless_maximize"))
 
1223
                {
 
1224
                    screen_info->params->borderless_maximize = g_value_get_boolean (value);
 
1225
                    reloadScreenSettings (screen_info, UPDATE_MAXIMIZE);
 
1226
                }
 
1227
                else if (!strcmp (name, "cycle_minimum"))
 
1228
                {
 
1229
                    screen_info->params->cycle_minimum = g_value_get_boolean (value);
 
1230
                }
 
1231
                else if (!strcmp (name, "cycle_draw_frame"))
 
1232
                {
 
1233
                    screen_info->params->cycle_draw_frame = g_value_get_boolean (value);
 
1234
                }
 
1235
                else if (!strcmp (name, "cycle_hidden"))
 
1236
                {
 
1237
                    screen_info->params->cycle_hidden = g_value_get_boolean (value);
 
1238
                }
 
1239
                else if (!strcmp (name, "cycle_workspaces"))
 
1240
                {
 
1241
                    screen_info->params->cycle_workspaces = g_value_get_boolean (value);
 
1242
                }
 
1243
                else if (!strcmp (name, "focus_hint"))
 
1244
                {
 
1245
                    screen_info->params->focus_hint = g_value_get_boolean (value);
 
1246
                }
 
1247
                else if (!strcmp (name, "show_dock_shadow"))
 
1248
                {
 
1249
                    screen_info->params->show_dock_shadow = g_value_get_boolean (value);
 
1250
                    reloadScreenSettings (screen_info, UPDATE_FRAME);
 
1251
                }
 
1252
                else if (!strcmp (name, "show_frame_shadow"))
 
1253
                {
 
1254
                    screen_info->params->show_frame_shadow = g_value_get_boolean (value);
 
1255
                    reloadScreenSettings (screen_info, UPDATE_FRAME);
 
1256
                }
 
1257
                else if (!strcmp (name, "show_popup_shadow"))
 
1258
                {
 
1259
                    screen_info->params->show_popup_shadow = g_value_get_boolean (value);
 
1260
                    reloadScreenSettings (screen_info, UPDATE_FRAME);
 
1261
                }
 
1262
                else if (!strcmp (name, "snap_resist"))
 
1263
                {
 
1264
                    screen_info->params->snap_resist = g_value_get_boolean (value);
 
1265
                }
 
1266
                else if (!strcmp (name, "prevent_focus_stealing"))
 
1267
                {
 
1268
                    screen_info->params->prevent_focus_stealing = g_value_get_boolean (value);
 
1269
                }
 
1270
                else if (!strcmp (name, "raise_with_any_button"))
 
1271
                {
 
1272
                    screen_info->params->raise_with_any_button = g_value_get_boolean (value);
 
1273
                    update_grabs (screen_info);
 
1274
                }
 
1275
                else if (!strcmp (name, "restore_on_move"))
 
1276
                {
 
1277
                    screen_info->params->restore_on_move = g_value_get_boolean (value);
 
1278
                }
 
1279
                else if (!strcmp (name, "scroll_workspaces"))
 
1280
                {
 
1281
                    screen_info->params->scroll_workspaces = g_value_get_boolean (value);
 
1282
                }
 
1283
                else if (!strcmp (name, "toggle_workspaces"))
 
1284
                {
 
1285
                    screen_info->params->toggle_workspaces = g_value_get_boolean (value);
 
1286
                }
 
1287
                else if (!strcmp (name, "unredirect_overlays"))
 
1288
                {
 
1289
                    screen_info->params->unredirect_overlays = g_value_get_boolean (value);
 
1290
                }
 
1291
                else if (!strcmp (name, "use_compositing"))
 
1292
                {
 
1293
                    screen_info->params->use_compositing = g_value_get_boolean (value);
 
1294
                    compositorActivateScreen (screen_info,
 
1295
                                              screen_info->params->use_compositing);
 
1296
                }
 
1297
                else if (!strcmp (name, "wrap_layout"))
 
1298
                {
 
1299
                    screen_info->params->wrap_layout = g_value_get_boolean (value);
 
1300
                }
 
1301
                else if (!strcmp (name, "wrap_cycle"))
 
1302
                {
 
1303
                    screen_info->params->wrap_cycle = g_value_get_boolean (value);
 
1304
                }
 
1305
                else if ((!strcmp (name, "full_width_title"))
 
1306
                      || (!strcmp (name, "show_app_icon")))
 
1307
                {
 
1308
                    /* These properties are not configurable via xfconf */
 
1309
                }
 
1310
                else
 
1311
                {
 
1312
                    g_warning("The property '%s' is not supported", property_name);
 
1313
                }
 
1314
                break;
 
1315
            default:
 
1316
                if (!strcmp (name, "workspace_names"))
 
1317
                {
 
1318
                    /* These properties are not configurable via xfconf */
 
1319
                }
 
1320
                else
 
1321
                {
 
1322
                    g_warning("The property '%s' is not supported", property_name);
 
1323
                }
 
1324
                break;
 
1325
        }
 
1326
    }
 
1327
}
 
1328
 
 
1329
static void
 
1330
cb_keys_changed (GdkKeymap *keymap, ScreenInfo *screen_info)
 
1331
{
 
1332
    initModifiers (myScreenGetXDisplay (screen_info));
 
1333
    reloadSettings (screen_info->display_info, UPDATE_BUTTON_GRABS);
 
1334
}
 
1335
 
 
1336
static void
 
1337
cb_shortcut_added (XfceShortcutsProvider *provider, const gchar *shortcut,
 
1338
                   ScreenInfo *screen_info)
 
1339
{
 
1340
    XfceShortcut *sc;
 
1341
    Display *dpy;
 
1342
    int i;
 
1343
 
 
1344
    g_return_if_fail (XFCE_IS_SHORTCUTS_PROVIDER (provider));
 
1345
    g_return_if_fail (shortcut);
 
1346
    g_return_if_fail (screen_info);
 
1347
 
 
1348
    sc = xfce_shortcuts_provider_get_shortcut (provider, shortcut);
 
1349
 
 
1350
    if (sc == NULL)
 
1351
    {
 
1352
        return;
 
1353
    }
 
1354
 
 
1355
    dpy = myScreenGetXDisplay (screen_info);
 
1356
 
 
1357
    for (i = 0; i < KEY_COUNT; ++i)
 
1358
    {
 
1359
        if (g_str_equal (screen_info->params->keys[i].internal_name, sc->command))
 
1360
        {
 
1361
            parseKeyString (dpy, &screen_info->params->keys[i], shortcut);
 
1362
 
 
1363
            myScreenUngrabKeys (screen_info);
 
1364
            myScreenGrabKeys (screen_info);
 
1365
            break;
 
1366
        }
 
1367
    }
 
1368
 
 
1369
    xfce_shortcut_free (sc);
 
1370
}
 
1371
 
 
1372
static void
 
1373
cb_shortcut_removed (XfceShortcutsProvider *provider, const gchar *shortcut,
 
1374
                     ScreenInfo *screen_info)
 
1375
{
 
1376
    MyKey key;
 
1377
    Display *dpy;
 
1378
    int i;
 
1379
 
 
1380
    g_return_if_fail (XFCE_IS_SHORTCUTS_PROVIDER (provider));
 
1381
    g_return_if_fail (screen_info);
 
1382
    g_return_if_fail (shortcut);
 
1383
 
 
1384
    dpy = myScreenGetXDisplay (screen_info);
 
1385
 
 
1386
    parseKeyString (dpy, &key, shortcut);
 
1387
 
 
1388
    for (i = 0; i < KEY_COUNT; ++i)
 
1389
    {
 
1390
        if (screen_info->params->keys[i].keycode == key.keycode &&
 
1391
            screen_info->params->keys[i].modifier == key.modifier)
 
1392
        {
 
1393
            screen_info->params->keys[i].keycode = 0;
 
1394
            screen_info->params->keys[i].modifier = 0;
 
1395
 
 
1396
            myScreenUngrabKeys (screen_info);
 
1397
            myScreenGrabKeys (screen_info);
 
1398
            break;
 
1399
        }
 
1400
    }
 
1401
}
 
1402
 
 
1403
static void
 
1404
parseShortcut (ScreenInfo *screen_info, int index, const gchar *name,
 
1405
               GList *shortcuts)
 
1406
{
 
1407
    Display *dpy;
 
1408
    const gchar *shortcut;
 
1409
 
 
1410
    g_return_if_fail (screen_info);
 
1411
    g_return_if_fail (index >= 0 && index < KEY_COUNT);
 
1412
 
 
1413
    dpy = myScreenGetXDisplay (screen_info);
 
1414
    shortcut = getShortcut (name, shortcuts);
 
1415
    parseKeyString (dpy, &screen_info->params->keys[index], shortcut);
 
1416
 
 
1417
    screen_info->params->keys[index].internal_name = g_strdup (name);
 
1418
}
 
1419
 
 
1420
static const gchar *
 
1421
getShortcut (const gchar *name, GList *shortcuts)
 
1422
{
 
1423
    XfceShortcut *shortcut;
 
1424
    GList *iter;
 
1425
    const gchar *result = NULL;
 
1426
 
 
1427
    for (iter = shortcuts; iter != NULL; iter = g_list_next (iter))
 
1428
    {
 
1429
        shortcut = iter->data;
 
1430
 
 
1431
        if (g_str_equal (shortcut->command, name))
 
1432
        {
 
1433
            result = shortcut->shortcut;
 
1434
            break;
 
1435
        }
 
1436
    }
 
1437
 
 
1438
    return result;
 
1439
}