~ubuntu-branches/ubuntu/oneiric/xfce4-panel/oneiric

« back to all changes in this revision

Viewing changes to .pc/01_fix-transparency-migration.patch/migrate/migrate-46.c

  • Committer: Bazaar Package Importer
  • Author(s): Lionel Le Folgoc
  • Date: 2011-06-19 17:52:17 UTC
  • mfrom: (4.2.8 sid)
  • Revision ID: james.westby@ubuntu.com-20110619175217-54qvmlck97fbhny5
Tags: 4.8.3-3ubuntu1
* Merge from Debian unstable, remaining Ubuntu changes:
  - debian/patches:
    + xubuntu_support-multiple-vendor-default-configs.patch: search for
      the default.xml default config in XDG_CONFIG_DIRS as well, and do
      not display the chooser dialog in this case. lp: #747137
    + series: refreshed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2009-2010 Nick Schermer <nick@xfce.org>
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundatoin; either version 2 of the License, or
 
7
 * (at your option) any later version.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
 * GNU General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU General Public License along
 
15
 * with this program; if not, write to the Free Software Foundatoin, Inc.,
 
16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
17
 */
 
18
 
 
19
#ifdef HAVE_CONFIG_H
 
20
#include <config.h>
 
21
#endif
 
22
 
 
23
#ifdef HAVE_STDLIB_H
 
24
#include <stdlib.h>
 
25
#endif
 
26
#ifdef HAVE_STRING_H
 
27
#include <string.h>
 
28
#endif
 
29
 
 
30
#include <gtk/gtk.h>
 
31
#include <xfconf/xfconf.h>
 
32
#include <libxfce4util/libxfce4util.h>
 
33
#include <migrate/migrate-46.h>
 
34
#include <libxfce4panel/xfce-panel-macros.h>
 
35
 
 
36
 
 
37
 
 
38
#define LAUNCHER_FOLDER "launcher"
 
39
 
 
40
 
 
41
 
 
42
typedef enum
 
43
{
 
44
  START,
 
45
  PANELS,
 
46
  PANEL,
 
47
  PROPERTIES,
 
48
  ITEMS,
 
49
  UNKNOWN
 
50
}
 
51
ParserState;
 
52
 
 
53
typedef enum
 
54
{
 
55
  /* no snapping */
 
56
  SNAP_POSITION_NONE, /* snapping */
 
57
 
 
58
  /* right edge */
 
59
  SNAP_POSITION_E,    /* right */
 
60
  SNAP_POSITION_NE,   /* top right */
 
61
  SNAP_POSITION_EC,   /* right center */
 
62
  SNAP_POSITION_SE,   /* bottom right */
 
63
 
 
64
  /* left edge */
 
65
  SNAP_POSITION_W,    /* left */
 
66
  SNAP_POSITION_NW,   /* top left */
 
67
  SNAP_POSITION_WC,   /* left center */
 
68
  SNAP_POSITION_SW,   /* bottom left */
 
69
 
 
70
  /* top and bottom */
 
71
  SNAP_POSITION_NC,   /* top center */
 
72
  SNAP_POSITION_SC,   /* bottom center */
 
73
  SNAP_POSITION_N,    /* top */
 
74
  SNAP_POSITION_S,    /* bottom */
 
75
}
 
76
SnapPosition;
 
77
 
 
78
typedef struct
 
79
{
 
80
  ParserState         state;
 
81
  guint               plugin_id_counter;
 
82
  guint               panel_id_counter;
 
83
  XfconfChannel      *channel;
 
84
 
 
85
  GPtrArray          *panel_plugin_ids;
 
86
  gint                panel_yoffset;
 
87
  gint                panel_xoffset;
 
88
  XfceScreenPosition  panel_screen_position;
 
89
  guint               panel_transparency;
 
90
  gboolean            panel_activetrans;
 
91
}
 
92
ConfigParser;
 
93
 
 
94
 
 
95
 
 
96
static void
 
97
migrate_46_panel_screen_position (XfceScreenPosition  screen_position,
 
98
                                  SnapPosition       *snap_position,
 
99
                                  gboolean           *horizontal)
 
100
{
 
101
  /* defaults */
 
102
  *horizontal = FALSE;
 
103
  *snap_position = SNAP_POSITION_NONE;
 
104
 
 
105
  switch (screen_position)
 
106
    {
 
107
    /* top */
 
108
    case XFCE_SCREEN_POSITION_NW_H:
 
109
      *horizontal = TRUE;
 
110
      *snap_position = SNAP_POSITION_NW;
 
111
      break;
 
112
 
 
113
    case XFCE_SCREEN_POSITION_N:
 
114
      *horizontal = TRUE;
 
115
      *snap_position = SNAP_POSITION_NC;
 
116
      break;
 
117
 
 
118
    case XFCE_SCREEN_POSITION_NE_H:
 
119
      *horizontal = TRUE;
 
120
      *snap_position = SNAP_POSITION_NE;
 
121
      break;
 
122
 
 
123
    /* left */
 
124
    case XFCE_SCREEN_POSITION_NW_V:
 
125
      *snap_position = SNAP_POSITION_NW;
 
126
      break;
 
127
 
 
128
    case XFCE_SCREEN_POSITION_W:
 
129
      *snap_position = SNAP_POSITION_WC;
 
130
      break;
 
131
 
 
132
    case XFCE_SCREEN_POSITION_SW_V:
 
133
      *snap_position = SNAP_POSITION_SW;
 
134
      break;
 
135
 
 
136
    /* right */
 
137
    case XFCE_SCREEN_POSITION_NE_V:
 
138
      *snap_position = SNAP_POSITION_NE;
 
139
      break;
 
140
 
 
141
    case XFCE_SCREEN_POSITION_E:
 
142
      *snap_position = SNAP_POSITION_EC;
 
143
      break;
 
144
 
 
145
    case XFCE_SCREEN_POSITION_SE_V:
 
146
      *snap_position = SNAP_POSITION_SE;
 
147
      break;
 
148
 
 
149
    /* bottom */
 
150
    case XFCE_SCREEN_POSITION_SW_H:
 
151
      *horizontal = TRUE;
 
152
      *snap_position = SNAP_POSITION_SW;
 
153
      break;
 
154
 
 
155
    case XFCE_SCREEN_POSITION_S:
 
156
      *horizontal = TRUE;
 
157
      *snap_position = SNAP_POSITION_SC;
 
158
      break;
 
159
 
 
160
    case XFCE_SCREEN_POSITION_SE_H:
 
161
      *horizontal = TRUE;
 
162
      *snap_position = SNAP_POSITION_SE;
 
163
      break;
 
164
 
 
165
    /* floating */
 
166
    case XFCE_SCREEN_POSITION_FLOATING_H:
 
167
      *horizontal = TRUE;
 
168
      break;
 
169
 
 
170
    default:
 
171
      break;
 
172
    }
 
173
}
 
174
 
 
175
 
 
176
 
 
177
static void
 
178
migrate_46_panel_set_property (ConfigParser  *parser,
 
179
                               const gchar   *property_name,
 
180
                               const gchar   *value,
 
181
                               GError       **error)
 
182
{
 
183
  gchar       prop[128];
 
184
  GdkDisplay *display;
 
185
  gchar      *name;
 
186
  gint        num;
 
187
 
 
188
  if (strcmp (property_name, "size") == 0)
 
189
    {
 
190
      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/size", parser->panel_id_counter);
 
191
      xfconf_channel_set_uint (parser->channel, prop, CLAMP (atoi (value), 16, 128));
 
192
    }
 
193
  else if (strcmp (property_name, "fullwidth") == 0)
 
194
    {
 
195
      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/length", parser->panel_id_counter);
 
196
      xfconf_channel_set_uint (parser->channel, prop, (atoi (value) != 0) ? 100 : 0);
 
197
    }
 
198
  else if (strcmp (property_name, "screen-position") == 0)
 
199
    {
 
200
      parser->panel_screen_position = CLAMP (atoi (value),
 
201
                                             XFCE_SCREEN_POSITION_NONE,
 
202
                                             XFCE_SCREEN_POSITION_FLOATING_V);
 
203
    }
 
204
  else if (strcmp (property_name, "xoffset") == 0)
 
205
    {
 
206
      parser->panel_xoffset = MAX (0, atoi (value));
 
207
    }
 
208
  else if (strcmp (property_name, "yoffset") == 0)
 
209
    {
 
210
      parser->panel_yoffset = MAX (0, atoi (value));
 
211
    }
 
212
  else if (strcmp (property_name, "monitor") == 0)
 
213
    {
 
214
      /* in 4.4 and 4.6 we only use monitor and make no difference between monitors
 
215
       * and screen's, so check the setup of the user to properly convert this */
 
216
      num = MAX (0, atoi (value));
 
217
      if (G_LIKELY (num > 0))
 
218
        {
 
219
          display = gdk_display_get_default ();
 
220
          if (display != NULL && gdk_display_get_n_screens (display) > 1)
 
221
            name = g_strdup_printf ("screen-%d", num);
 
222
          else
 
223
            name = g_strdup_printf ("monitor-%d", num);
 
224
 
 
225
          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/output", parser->panel_id_counter);
 
226
          xfconf_channel_set_string (parser->channel, prop, name);
 
227
          g_free (name);
 
228
        }
 
229
    }
 
230
  else if (strcmp (property_name, "handlestyle") == 0)
 
231
    {
 
232
      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/locked", parser->panel_id_counter);
 
233
      xfconf_channel_set_bool (parser->channel, prop, atoi (value) == 0);
 
234
    }
 
235
  else if (strcmp (property_name, "autohide") == 0)
 
236
    {
 
237
      g_snprintf (prop, sizeof (prop), "/panels/panel-%u/autohide", parser->panel_id_counter);
 
238
      xfconf_channel_set_bool (parser->channel, prop, (atoi (value) == 1));
 
239
    }
 
240
  else if (strcmp (property_name, "transparency") == 0)
 
241
    {
 
242
      parser->panel_transparency = CLAMP (atoi (value), 0, 100);
 
243
    }
 
244
  else if (strcmp (property_name, "activetrans") == 0)
 
245
    {
 
246
      parser->panel_activetrans = (atoi (value) == 1);
 
247
    }
 
248
  else
 
249
    {
 
250
      g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR,
 
251
                   "Unknown property \"%s\" in #%d \"panel\" element",
 
252
                   property_name, parser->panel_id_counter);
 
253
    }
 
254
}
 
255
 
 
256
 
 
257
 
 
258
#define migrate_46_plugin_string(old_name, new_name, fallback) \
 
259
  if (xfce_rc_has_entry (rc, old_name)) \
 
260
    xfconf_channel_set_string (channel, "/" new_name, \
 
261
        xfce_rc_read_entry (rc, old_name, fallback))
 
262
 
 
263
#define migrate_46_plugin_bool(old_name, new_name, fallback) \
 
264
  if (xfce_rc_has_entry (rc, old_name)) \
 
265
    xfconf_channel_set_bool (channel, "/" new_name, \
 
266
        xfce_rc_read_bool_entry (rc, old_name, fallback))
 
267
 
 
268
#define migrate_46_plugin_uint(old_name, new_name, fallback) \
 
269
  if (xfce_rc_has_entry (rc, old_name)) \
 
270
    xfconf_channel_set_uint (channel, "/" new_name, \
 
271
        xfce_rc_read_int_entry (rc, old_name, fallback))
 
272
 
 
273
 
 
274
 
 
275
static void
 
276
migrate_46_plugin_actions (XfconfChannel *channel,
 
277
                           XfceRc        *rc)
 
278
{
 
279
  gint type;
 
280
 
 
281
  if (!xfce_rc_has_entry (rc, "type"))
 
282
    return;
 
283
 
 
284
  type = xfce_rc_read_int_entry (rc, "types", 0);
 
285
  switch (type)
 
286
    {
 
287
    case 0: /* ACTION_QUIT */
 
288
      xfconf_channel_set_uint (channel, "/first-action", 0);
 
289
      break;
 
290
 
 
291
    case 1: /* ACTION_LOCK */
 
292
      xfconf_channel_set_uint (channel, "/first-action", 2);
 
293
      break;
 
294
 
 
295
    default: /* ACTION_QUIT_LOCK */
 
296
      xfconf_channel_set_uint (channel, "/first-action", 0);
 
297
      xfconf_channel_set_uint (channel, "/second-action", 2);
 
298
      break;
 
299
    }
 
300
}
 
301
 
 
302
 
 
303
 
 
304
static void
 
305
migrate_46_plugin_clock (XfconfChannel *channel,
 
306
                         XfceRc        *rc)
 
307
{
 
308
  gint type;
 
309
 
 
310
  if (xfce_rc_has_entry (rc, "ClockType"))
 
311
    {
 
312
      type = xfce_rc_read_int_entry (rc, "ClockType", 0);
 
313
      if (type == 4) /* XFCE_CLOCK_LCD */
 
314
        type++; /* Skip CLOCK_PLUGIN_MODE_FUZZY */
 
315
      xfconf_channel_set_uint (channel, "/mode", type);
 
316
    }
 
317
 
 
318
  migrate_46_plugin_string ("DigitalFormat", "digital-format", "%R");
 
319
  migrate_46_plugin_string ("TooltipFormat", "tooltip-format", "%A %d %B %Y");
 
320
 
 
321
  migrate_46_plugin_bool ("ShowFrame", "show-frame", TRUE);
 
322
  migrate_46_plugin_bool ("ShowSeconds", "show-seconds", FALSE);
 
323
  migrate_46_plugin_bool ("ShowMilitary", "show-military", FALSE);
 
324
  migrate_46_plugin_bool ("ShowMeridiem", "show-meridiem", TRUE);
 
325
  migrate_46_plugin_bool ("FlashSeparators", "flash-separators", FALSE);
 
326
  migrate_46_plugin_bool ("TrueBinary", "true-binary", FALSE);
 
327
}
 
328
 
 
329
 
 
330
 
 
331
static void
 
332
migrate_46_plugin_iconbox (XfconfChannel *channel,
 
333
                           XfceRc        *rc)
 
334
{
 
335
  /* tasklist in iconbox mode */
 
336
  xfconf_channel_set_uint (channel, "/show-labels", FALSE);
 
337
 
 
338
  migrate_46_plugin_bool ("only_hidden", "show-only-minimized", FALSE);
 
339
  migrate_46_plugin_bool ("all_workspaces", "include-all-workspaces", TRUE);
 
340
 
 
341
  /* TODO
 
342
   * xfce_rc_write_int_entry (rc, "expand", iconbox->expand); */
 
343
}
 
344
 
 
345
 
 
346
 
 
347
static void
 
348
migrate_46_plugin_launcher (XfconfChannel  *channel,
 
349
                            XfceRc         *rc,
 
350
                            guint           plugin_id,
 
351
                            GError        **error)
 
352
{
 
353
  guint      i;
 
354
  gchar      buf[128];
 
355
  XfceRc    *new_desktop;
 
356
  gchar     *path;
 
357
  GTimeVal   timeval;
 
358
  GPtrArray *array;
 
359
  GValue    *value;
 
360
  gchar     *filename;
 
361
 
 
362
  if (xfce_rc_has_group (rc, "Global"))
 
363
    {
 
364
      xfce_rc_set_group (rc, "Global");
 
365
 
 
366
      migrate_46_plugin_bool ("MoveFirst", "move-first", FALSE);
 
367
      migrate_46_plugin_bool ("ArrowPosition", "arrow-position", 0);
 
368
    }
 
369
 
 
370
  g_get_current_time (&timeval);
 
371
  array = g_ptr_array_new ();
 
372
 
 
373
  for (i = 0; i < 100 /* arbitrary */; i++)
 
374
    {
 
375
      g_snprintf (buf, sizeof (buf), "Entry %d", i);
 
376
      if (!xfce_rc_has_group (rc, buf))
 
377
        break;
 
378
 
 
379
      xfce_rc_set_group (rc, buf);
 
380
 
 
381
      g_snprintf (buf, sizeof (buf), "xfce4" G_DIR_SEPARATOR_S "panel"
 
382
                  G_DIR_SEPARATOR_S LAUNCHER_FOLDER "-%d" G_DIR_SEPARATOR_S "%ld%d.desktop",
 
383
                  plugin_id, timeval.tv_sec, i);
 
384
      path = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, buf, TRUE);
 
385
      if (G_UNLIKELY (path == NULL))
 
386
        {
 
387
          g_set_error (error, G_FILE_ERROR_FAILED, G_FILE_ERROR,
 
388
                       "Failed to create new launcher desktop file in \"%s\"", buf);
 
389
          break;
 
390
        }
 
391
      else if (g_file_test (path, G_FILE_TEST_EXISTS))
 
392
        {
 
393
          g_set_error (error, G_FILE_ERROR_EXIST, G_FILE_ERROR,
 
394
                       "Deasktop item \"%s\" already exists", path);
 
395
          g_free (path);
 
396
          break;
 
397
        }
 
398
 
 
399
      new_desktop = xfce_rc_simple_open (path, FALSE);
 
400
      if (G_UNLIKELY (new_desktop == NULL))
 
401
        {
 
402
          g_set_error (error, G_FILE_ERROR_FAILED, G_FILE_ERROR,
 
403
                       "Failed to create new desktop file \"%s\"", path);
 
404
          g_free (path);
 
405
          break;
 
406
        }
 
407
 
 
408
 
 
409
      xfce_rc_set_group (new_desktop, G_KEY_FILE_DESKTOP_GROUP);
 
410
 
 
411
      xfce_rc_write_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_TYPE,
 
412
          G_KEY_FILE_DESKTOP_TYPE_APPLICATION);
 
413
      xfce_rc_write_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_NAME,
 
414
          xfce_rc_read_entry (rc, "Name", ""));
 
415
      xfce_rc_write_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_COMMENT,
 
416
          xfce_rc_read_entry (rc, "Comment", ""));
 
417
      xfce_rc_write_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_ICON,
 
418
          xfce_rc_read_entry (rc, "Icon", ""));
 
419
      xfce_rc_write_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_EXEC,
 
420
          xfce_rc_read_entry (rc, "Exec", ""));
 
421
      xfce_rc_write_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_PATH,
 
422
          xfce_rc_read_entry (rc, "Path", ""));
 
423
      xfce_rc_write_bool_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_TERMINAL,
 
424
          xfce_rc_read_bool_entry (rc, "Terminal", FALSE));
 
425
      xfce_rc_write_bool_entry (new_desktop, G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY,
 
426
          xfce_rc_read_bool_entry (rc, "StartupNotify", FALSE));
 
427
 
 
428
      xfce_rc_flush (new_desktop);
 
429
      if (xfce_rc_is_dirty (new_desktop))
 
430
        {
 
431
          g_set_error (error, G_FILE_ERROR_FAILED, G_FILE_ERROR,
 
432
                       "Failed to flush desktop file \"%s\"", path);
 
433
          g_free (path);
 
434
          xfce_rc_close (new_desktop);
 
435
          break;
 
436
        }
 
437
 
 
438
      g_free (path);
 
439
      xfce_rc_close (new_desktop);
 
440
 
 
441
      value = g_new0 (GValue, 1);
 
442
      g_value_init (value, G_TYPE_STRING);
 
443
      filename = g_strdup_printf ("%ld%d.desktop", timeval.tv_sec, i);
 
444
      g_value_take_string (value, filename);
 
445
      g_ptr_array_add (array, value);
 
446
    }
 
447
 
 
448
  xfconf_channel_set_arrayv (channel, "/items", array);
 
449
  xfconf_array_free (array);
 
450
}
 
451
 
 
452
 
 
453
 
 
454
static void
 
455
migrate_46_plugin_pager (XfconfChannel *channel,
 
456
                         XfceRc        *rc)
 
457
{
 
458
  migrate_46_plugin_uint ("rows", "rows", 1);
 
459
  migrate_46_plugin_bool ("show-names", "show-names", FALSE);
 
460
  migrate_46_plugin_bool ("scrolling", "workspace-scrolling", TRUE);
 
461
}
 
462
 
 
463
 
 
464
 
 
465
static void
 
466
migrate_46_plugin_separator (XfconfChannel *channel,
 
467
                             XfceRc        *rc)
 
468
{
 
469
  gint  type;
 
470
  guint style;
 
471
 
 
472
  if (!xfce_rc_has_entry (rc, "separator-type"))
 
473
    return;
 
474
 
 
475
  type = xfce_rc_read_int_entry (rc, "separator-type", 0);
 
476
  switch (type)
 
477
    {
 
478
    case 0: /* SEP_SPACE */
 
479
      style = 0; /* SEPARATOR_PLUGIN_STYLE_TRANSPARENT */
 
480
      break;
 
481
 
 
482
    case 1: /* SEP_EXPAND */
 
483
      style = 0; /* SEPARATOR_PLUGIN_STYLE_TRANSPARENT */
 
484
      xfconf_channel_set_bool (channel, "/expand", TRUE);
 
485
      break;
 
486
 
 
487
    case 2: /* SEP_LINE */
 
488
      style = 1; /* SEPARATOR_PLUGIN_STYLE_SEPARATOR */
 
489
      break;
 
490
 
 
491
    case 3: /* SEP_HANDLE */
 
492
      style = 2; /* SEPARATOR_PLUGIN_STYLE_HANDLE */
 
493
      break;
 
494
 
 
495
    default: /* SEP_DOTS */
 
496
      style = 3; /* SEPARATOR_PLUGIN_STYLE_DOTS */
 
497
      break;
 
498
    }
 
499
 
 
500
  xfconf_channel_set_uint (channel, "/style", style);
 
501
}
 
502
 
 
503
 
 
504
 
 
505
static void
 
506
migrate_46_plugin_showdesktop (XfconfChannel *channel,
 
507
                               XfceRc        *rc)
 
508
{
 
509
  /* no settings */
 
510
}
 
511
 
 
512
 
 
513
 
 
514
static void
 
515
migrate_46_plugin_systray (XfconfChannel *channel,
 
516
                           XfceRc        *rc)
 
517
{
 
518
  if (xfce_rc_has_group (rc, "Global"))
 
519
    {
 
520
      xfce_rc_set_group (rc, "Global");
 
521
 
 
522
      migrate_46_plugin_bool ("ShowFrame", "show-frame", TRUE);
 
523
      migrate_46_plugin_uint ("Rows", "rows", 1);
 
524
    }
 
525
 
 
526
  if (xfce_rc_has_group (rc, "Applications"))
 
527
    {
 
528
      xfce_rc_set_group (rc, "Applications");
 
529
 
 
530
      /* TODO */
 
531
      /* xfce_rc_read_bool_entry (rc, appname, hidden); */
 
532
    }
 
533
}
 
534
 
 
535
 
 
536
 
 
537
static void
 
538
migrate_46_plugin_tasklist (XfconfChannel *channel,
 
539
                            XfceRc        *rc)
 
540
{
 
541
  migrate_46_plugin_uint ("grouping", "grouping", 0);
 
542
  migrate_46_plugin_bool ("all_workspaces", "include-all-workspaces", TRUE);
 
543
  migrate_46_plugin_bool ("flat_buttons", "flat-buttons", FALSE);
 
544
  migrate_46_plugin_bool ("show_handles", "show-handle", TRUE);
 
545
 
 
546
  /* TODO
 
547
   * xfce_rc_write_int_entry (rc, "width", tasklist->width);
 
548
   * xfce_rc_write_bool_entry (rc, "fixed_width", tasklist->fixed_width);
 
549
   * xfce_rc_write_bool_entry (rc, "expand", tasklist->expand); */
 
550
}
 
551
 
 
552
 
 
553
 
 
554
static void
 
555
migrate_46_plugin_windowlist (XfconfChannel *channel,
 
556
                              XfceRc        *rc)
 
557
{
 
558
  if (xfce_rc_has_entry (rc, "urgency_notify"))
 
559
    xfconf_channel_set_bool (channel, "/urgentcy-notification",
 
560
      xfce_rc_read_int_entry (rc, "button_layout", 0) > 0);
 
561
 
 
562
  migrate_46_plugin_uint ("button_layout", "style", 0);
 
563
  migrate_46_plugin_bool ("show_all_workspaces", "all-workspaces", TRUE);
 
564
  migrate_46_plugin_bool ("show_workspace_actions", "workspace-actions", FALSE);
 
565
 
 
566
  /* TODO
 
567
   * xfce_rc_read_bool_entry (rc, "show_window_icons", TRUE); */
 
568
}
 
569
 
 
570
 
 
571
 
 
572
static void
 
573
migrate_46_plugin_xfce4_menu (XfconfChannel *channel,
 
574
                              XfceRc        *rc)
 
575
{
 
576
  migrate_46_plugin_bool ("show_menu_icons", "show-menu-icons", TRUE);
 
577
  migrate_46_plugin_bool ("show_button_title", "show-button-title", TRUE);
 
578
  migrate_46_plugin_string ("menu_file", "custom-menu-file", "");
 
579
  migrate_46_plugin_string ("icon_file", "button-icon", "xfce4-panel-menu");
 
580
  migrate_46_plugin_string ("button_title", "button-title", "");
 
581
 
 
582
  if (xfce_rc_has_entry (rc, "use_default_menu"))
 
583
    xfconf_channel_set_bool (channel, "/custom-menu",
 
584
       !xfce_rc_read_bool_entry (rc, "use_default_menu", TRUE));
 
585
}
 
586
 
 
587
 
 
588
 
 
589
static void
 
590
migrate_46_panel_add_plugin (ConfigParser  *parser,
 
591
                             const gchar   *name,
 
592
                             const gchar   *id,
 
593
                             GError       **error)
 
594
{
 
595
  XfconfChannel *channel;
 
596
  gchar          base[256];
 
597
  XfceRc        *rc;
 
598
  const gchar   *plugin_name = name;
 
599
 
 
600
  g_return_if_fail (XFCONF_IS_CHANNEL (parser->channel));
 
601
 
 
602
  /* open the old rc file of the plugin */
 
603
  g_snprintf (base, sizeof (base), "xfce4" G_DIR_SEPARATOR_S
 
604
             "panel" G_DIR_SEPARATOR_S "%s-%s.rc", name, id);
 
605
  rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, base, TRUE);
 
606
 
 
607
  /* open a panel with the propert base for the plugin */
 
608
  g_snprintf (base, sizeof (base), "/plugins/plugin-%d", parser->plugin_id_counter);
 
609
  channel = xfconf_channel_new_with_property_base (XFCE_PANEL_CHANNEL_NAME, base);
 
610
 
 
611
  if (strcmp (name, "actions") == 0)
 
612
    {
 
613
      if (G_LIKELY (rc != NULL))
 
614
        migrate_46_plugin_actions (channel, rc);
 
615
    }
 
616
  else if (strcmp (name, "clock") == 0)
 
617
    {
 
618
      if (G_LIKELY (rc != NULL))
 
619
        migrate_46_plugin_clock (channel, rc);
 
620
    }
 
621
  else if (strcmp (name, "iconbox") == 0)
 
622
    {
 
623
      plugin_name = "tasklist";
 
624
      if (G_LIKELY (rc != NULL))
 
625
        migrate_46_plugin_iconbox (channel, rc);
 
626
    }
 
627
  else if (strcmp (name, "launcher") == 0)
 
628
    {
 
629
      if (G_LIKELY (rc != NULL))
 
630
        migrate_46_plugin_launcher (channel, rc, parser->plugin_id_counter, error);
 
631
    }
 
632
  else if (strcmp (name, "pager") == 0)
 
633
    {
 
634
      if (G_LIKELY (rc != NULL))
 
635
        migrate_46_plugin_pager (channel, rc);
 
636
    }
 
637
  else if (strcmp (name, "separator") == 0)
 
638
    {
 
639
      if (G_LIKELY (rc != NULL))
 
640
        migrate_46_plugin_separator (channel, rc);
 
641
    }
 
642
  else if (strcmp (name, "showdesktop") == 0)
 
643
    {
 
644
      if (G_LIKELY (rc != NULL))
 
645
        migrate_46_plugin_showdesktop (channel, rc);
 
646
    }
 
647
  else if (strcmp (name, "systray") == 0)
 
648
    {
 
649
      if (G_LIKELY (rc != NULL))
 
650
        migrate_46_plugin_systray (channel, rc);
 
651
    }
 
652
  else if (strcmp (name, "tasklist") == 0)
 
653
    {
 
654
      if (G_LIKELY (rc != NULL))
 
655
        migrate_46_plugin_tasklist (channel, rc);
 
656
    }
 
657
  else if (strcmp (name, "windowlist") == 0)
 
658
    {
 
659
      plugin_name = "windowmenu";
 
660
      if (G_LIKELY (rc != NULL))
 
661
        migrate_46_plugin_windowlist (channel, rc);
 
662
    }
 
663
  else if (strcmp (name, "xfce4-menu") == 0)
 
664
    {
 
665
      plugin_name = "applicationsmenu";
 
666
      if (G_LIKELY (rc != NULL))
 
667
        migrate_46_plugin_xfce4_menu (channel, rc);
 
668
    }
 
669
  else
 
670
    {
 
671
      /* handle other "external" plugins */
 
672
    }
 
673
 
 
674
  /* close plugin configs */
 
675
  g_object_unref (G_OBJECT (channel));
 
676
  if (G_LIKELY (rc != NULL))
 
677
    xfce_rc_close (rc);
 
678
 
 
679
  /* store the (new) plugin name */
 
680
  xfconf_channel_set_string (parser->channel, base, plugin_name);
 
681
}
 
682
 
 
683
 
 
684
 
 
685
static void
 
686
migrate_46_start_element_handler (GMarkupParseContext  *context,
 
687
                                  const gchar          *element_name,
 
688
                                  const gchar         **attribute_names,
 
689
                                  const gchar         **attribute_values,
 
690
                                  gpointer              user_data,
 
691
                                  GError              **error)
 
692
{
 
693
  ConfigParser *parser = user_data;
 
694
  guint         i;
 
695
  const gchar  *name, *id, *value;
 
696
  GValue       *id_value;
 
697
 
 
698
  g_return_if_fail (XFCONF_IS_CHANNEL (parser->channel));
 
699
 
 
700
  switch (parser->state)
 
701
    {
 
702
    case START:
 
703
      if (strcmp (element_name, "panels") == 0)
 
704
        parser->state = PANELS;
 
705
      break;
 
706
 
 
707
    case PANELS:
 
708
      if (strcmp (element_name, "panel") == 0)
 
709
        {
 
710
          parser->state = PANEL;
 
711
 
 
712
          /* intialize new ids array */
 
713
          parser->panel_plugin_ids = g_ptr_array_new ();
 
714
 
 
715
          /* set defaults */
 
716
          parser->panel_screen_position = XFCE_SCREEN_POSITION_NONE;
 
717
          parser->panel_xoffset = 100;
 
718
          parser->panel_yoffset = 100;
 
719
          parser->panel_transparency = 100;
 
720
          parser->panel_activetrans = FALSE;
 
721
        }
 
722
      break;
 
723
 
 
724
    case PANEL:
 
725
      if (strcmp (element_name, "properties") == 0)
 
726
        parser->state = PROPERTIES;
 
727
      else if (strcmp (element_name, "items") == 0)
 
728
        parser->state = ITEMS;
 
729
      break;
 
730
 
 
731
    case PROPERTIES:
 
732
      if (strcmp (element_name, "property") == 0)
 
733
        {
 
734
          name = NULL;
 
735
          value = NULL;
 
736
 
 
737
          for (i = 0; attribute_names[i] != NULL; i++)
 
738
            {
 
739
              if (strcmp (attribute_names[i], "name") == 0)
 
740
                name = attribute_values[i];
 
741
              else if (strcmp (attribute_names[i], "value") == 0)
 
742
                value = attribute_values[i];
 
743
            }
 
744
 
 
745
          if (G_LIKELY (name != NULL && value != NULL))
 
746
            {
 
747
              migrate_46_panel_set_property (parser, name, value, error);
 
748
            }
 
749
          else
 
750
            {
 
751
              g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR,
 
752
                          "Unknown property name (%s) or value (%s) in element",
 
753
                           name, value);
 
754
            }
 
755
        }
 
756
      break;
 
757
 
 
758
    case ITEMS:
 
759
      if (strcmp (element_name, "item") == 0)
 
760
        {
 
761
          name = id = NULL;
 
762
 
 
763
          for (i = 0; attribute_names[i] != NULL; i++)
 
764
            {
 
765
              if (strcmp (attribute_names[i], "name") == 0)
 
766
                name = attribute_values[i];
 
767
              else if (strcmp (attribute_names[i], "id") == 0)
 
768
                id = attribute_values[i];
 
769
            }
 
770
 
 
771
          if (G_LIKELY (name != NULL && id != NULL))
 
772
            {
 
773
              parser->plugin_id_counter++;
 
774
              migrate_46_panel_add_plugin (parser, name, id, error);
 
775
 
 
776
              id_value = g_new0 (GValue, 1);
 
777
              g_value_init (id_value, G_TYPE_INT);
 
778
              g_value_set_int (id_value, parser->plugin_id_counter);
 
779
              g_ptr_array_add (parser->panel_plugin_ids, id_value);
 
780
            }
 
781
          else
 
782
            {
 
783
              g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, G_MARKUP_ERROR,
 
784
                          "Unknown item name (%s) or id (%s) in element",
 
785
                           name, id);
 
786
            }
 
787
        }
 
788
      break;
 
789
 
 
790
    default:
 
791
      g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ELEMENT, G_MARKUP_ERROR,
 
792
                   "Unknown start element \"%s\"", element_name);
 
793
      break;
 
794
    }
 
795
}
 
796
 
 
797
 
 
798
 
 
799
static void
 
800
migrate_46_end_element_handler (GMarkupParseContext  *context,
 
801
                                const gchar          *element_name,
 
802
                                gpointer              user_data,
 
803
                                GError              **error)
 
804
{
 
805
  ConfigParser *parser = user_data;
 
806
  SnapPosition  snap_position;
 
807
  gboolean      horizontal;
 
808
  gchar         prop[128];
 
809
  gchar        *position;
 
810
 
 
811
  g_return_if_fail (XFCONF_IS_CHANNEL (parser->channel));
 
812
 
 
813
  switch (parser->state)
 
814
    {
 
815
    case START:
 
816
      g_set_error (error, G_MARKUP_ERROR_PARSE, G_MARKUP_ERROR,
 
817
                   "Unexpected end element \"%s\"", element_name);
 
818
      break;
 
819
 
 
820
    case PANEL:
 
821
      if (strcmp ("panel", element_name) == 0)
 
822
        {
 
823
          parser->state = PANELS;
 
824
 
 
825
          /* store ids array */
 
826
          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/plugin-ids", parser->panel_id_counter);
 
827
          xfconf_channel_set_arrayv (parser->channel, prop, parser->panel_plugin_ids);
 
828
          xfconf_array_free (parser->panel_plugin_ids);
 
829
 
 
830
          /* translate the old screen position to a snap position and orientation */
 
831
          migrate_46_panel_screen_position (parser->panel_screen_position,
 
832
                                            &snap_position, &horizontal);
 
833
 
 
834
          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/horizontal", parser->panel_id_counter);
 
835
          xfconf_channel_set_bool (parser->channel, prop, horizontal);
 
836
 
 
837
          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/position", parser->panel_id_counter);
 
838
          position = g_strdup_printf ("p=%d;x=%d;y=%d",
 
839
                                      snap_position,
 
840
                                      parser->panel_xoffset,
 
841
                                      parser->panel_yoffset);
 
842
          xfconf_channel_set_string (parser->channel, prop, position);
 
843
          g_free (position);
 
844
 
 
845
          /* set transparency */
 
846
          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/leave-opacity", parser->panel_id_counter);
 
847
          xfconf_channel_set_uint (parser->channel, prop,  parser->panel_transparency);
 
848
 
 
849
          g_snprintf (prop, sizeof (prop), "/panels/panel-%u/enter-opacity", parser->panel_id_counter);
 
850
          xfconf_channel_set_uint (parser->channel, prop,  parser->panel_activetrans ?
 
851
                                   parser->panel_transparency : 100);
 
852
 
 
853
          /* prepare for the next panel */
 
854
          parser->panel_id_counter++;
 
855
        }
 
856
      break;
 
857
 
 
858
    case PANELS:
 
859
      if (strcmp ("panels", element_name) == 0)
 
860
        {
 
861
          parser->state = START;
 
862
          xfconf_channel_set_uint (parser->channel, "/panels", parser->panel_id_counter);
 
863
        }
 
864
      break;
 
865
 
 
866
    case PROPERTIES:
 
867
      if (strcmp ("properties", element_name) == 0)
 
868
        parser->state = PANEL;
 
869
      break;
 
870
 
 
871
    case ITEMS:
 
872
      if (strcmp ("items", element_name) == 0)
 
873
        parser->state = PANEL;
 
874
      break;
 
875
 
 
876
    default:
 
877
      g_set_error (error, G_MARKUP_ERROR_UNKNOWN_ELEMENT, G_MARKUP_ERROR,
 
878
                   "Unknown end element \"%s\"", element_name);
 
879
      break;
 
880
    }
 
881
}
 
882
 
 
883
 
 
884
 
 
885
static GMarkupParser markup_parser =
 
886
{
 
887
  migrate_46_start_element_handler,
 
888
  migrate_46_end_element_handler,
 
889
  NULL,
 
890
  NULL,
 
891
  NULL
 
892
};
 
893
 
 
894
 
 
895
 
 
896
gboolean
 
897
migrate_46 (const gchar  *filename,
 
898
            GError      **error)
 
899
{
 
900
  gsize                length;
 
901
  gchar               *contents;
 
902
  GMarkupParseContext *context;
 
903
  ConfigParser        *parser;
 
904
  gboolean             succeed = FALSE;
 
905
 
 
906
  g_return_val_if_fail (filename != NULL, FALSE);
 
907
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
908
 
 
909
  if (!g_file_get_contents (filename, &contents, &length, error))
 
910
    return FALSE;
 
911
 
 
912
  parser = g_slice_new0 (ConfigParser);
 
913
  parser->state = START;
 
914
  parser->plugin_id_counter = 0;
 
915
  parser->panel_id_counter = 0;
 
916
  parser->channel = xfconf_channel_new (XFCE_PANEL_CHANNEL_NAME);
 
917
 
 
918
  context = g_markup_parse_context_new (&markup_parser, 0, parser, NULL);
 
919
 
 
920
  if (g_markup_parse_context_parse (context, contents, length, error))
 
921
    {
 
922
      /* check if the entire file is parsed */
 
923
      if (g_markup_parse_context_end_parse (context, error))
 
924
        succeed = TRUE;
 
925
    }
 
926
 
 
927
  /* if parsing failed somehow, empty the channel so no broken config is left */
 
928
  if (!succeed)
 
929
    xfconf_channel_reset_property (parser->channel, "/", TRUE);
 
930
 
 
931
  g_free (contents);
 
932
  g_markup_parse_context_free (context);
 
933
  g_object_unref (G_OBJECT (parser->channel));
 
934
  g_slice_free (ConfigParser, parser);
 
935
 
 
936
  return succeed;
 
937
}