1
#include "gtk-window-decorator.h"
3
/* TODO: Trash all of this and use a window property
4
* instead - much much cleaner!
8
shadow_property_changed (WnckScreen *s)
10
GdkDisplay *display = gdk_display_get_default ();
11
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
12
GdkScreen *screen = gdk_display_get_default_screen (display);
13
Window root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen));
16
unsigned long n, left;
17
unsigned char *prop_data;
18
gboolean changed = FALSE;
19
XTextProperty shadow_color_xtp;
21
result = XGetWindowProperty (xdisplay, root, compiz_shadow_info_atom,
22
0, 32768, 0, XA_INTEGER, &actual,
23
&format, &n, &left, &prop_data);
25
if (result != Success)
30
long *data = (long *) prop_data;
31
gdouble radius = data[0];
32
gdouble opacity = data[1];
36
/* Radius and Opacity are multiplied by 1000 to keep precision,
37
* divide by that much to get our real radius and opacity
42
changed = radius != shadow_radius ||
43
opacity != shadow_opacity ||
44
x_off != shadow_offset_x ||
45
y_off != shadow_offset_y;
47
shadow_radius = (gdouble) MAX (0.0, MIN (radius, 48.0));
48
shadow_opacity = (gdouble) MAX (0.0, MIN (opacity, 6.0));
49
shadow_offset_x = (gint) MAX (-16, MIN (x_off, 16));
50
shadow_offset_y = (gint) MAX (-16, MIN (y_off, 16));
55
result = XGetTextProperty (xdisplay, root, &shadow_color_xtp,
56
compiz_shadow_color_atom);
58
if (shadow_color_xtp.value)
63
XTextPropertyToStringList (&shadow_color_xtp, &t_data, &ret_count);
69
if (sscanf (t_data[0], "#%2x%2x%2x%2x",
70
&c[0], &c[1], &c[2], &c[3]) == 4)
72
shadow_color[0] = c[0] << 8 | c[0];
73
shadow_color[1] = c[1] << 8 | c[1];
74
shadow_color[2] = c[2] << 8 | c[2];
79
XFree (shadow_color_xtp.value);
81
XFreeStringList (t_data);
85
decorations_changed (s);
88
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
90
blur_settings_changed (GConfClient *client)
93
int new_type = blur_type;
95
if (cmdline_options & CMDLINE_BLUR)
98
type = gconf_client_get_string (client,
104
if (strcmp (type, "titlebar") == 0)
105
new_type = BLUR_TYPE_TITLEBAR;
106
else if (strcmp (type, "all") == 0)
107
new_type = BLUR_TYPE_ALL;
108
else if (strcmp (type, "none") == 0)
109
new_type = BLUR_TYPE_NONE;
114
if (new_type != blur_type)
116
blur_type = new_type;
124
theme_changed (GConfClient *client)
128
gboolean use_meta_theme;
130
if (cmdline_options & CMDLINE_THEME)
133
use_meta_theme = gconf_client_get_bool (client,
141
theme = gconf_client_get_string (client,
147
meta_theme_set_current (theme, TRUE);
148
if (!meta_theme_get_current ())
149
use_meta_theme = FALSE;
155
use_meta_theme = FALSE;
161
theme_draw_window_decoration = meta_draw_window_decoration;
162
theme_calc_decoration_size = meta_calc_decoration_size;
163
theme_update_border_extents = meta_update_border_extents;
164
theme_get_event_window_position = meta_get_event_window_position;
165
theme_get_button_position = meta_get_button_position;
166
theme_update_shadow = meta_update_shadow;
167
theme_get_shadow = meta_get_shadow;
171
theme_draw_window_decoration = draw_window_decoration;
172
theme_calc_decoration_size = calc_decoration_size;
173
theme_update_border_extents = update_border_extents;
174
theme_get_event_window_position = get_event_window_position;
175
theme_get_button_position = get_button_position;
176
theme_update_shadow = cairo_update_shadow;
177
theme_get_shadow = get_shadow;
182
theme_draw_window_decoration = draw_window_decoration;
183
theme_calc_decoration_size = calc_decoration_size;
184
theme_update_border_extents = update_border_extents;
185
theme_get_event_window_position = get_event_window_position;
186
theme_get_button_position = get_button_position;
194
theme_opacity_changed (GConfClient *client)
198
gboolean shade_opacity, changed = FALSE;
201
opacity = gconf_client_get_float (client,
202
META_THEME_OPACITY_KEY,
205
if (!(cmdline_options & CMDLINE_OPACITY) &&
206
opacity != meta_opacity)
208
meta_opacity = opacity;
214
shade_opacity = gconf_client_get_bool (client,
215
META_THEME_SHADE_OPACITY_KEY,
218
if (!(cmdline_options & CMDLINE_OPACITY_SHADE) &&
219
shade_opacity != meta_shade_opacity)
221
meta_shade_opacity = shade_opacity;
226
opacity = gconf_client_get_float (client,
227
META_THEME_ACTIVE_OPACITY_KEY,
230
if (!(cmdline_options & CMDLINE_ACTIVE_OPACITY) &&
231
opacity != meta_active_opacity)
233
meta_active_opacity = opacity;
240
gconf_client_get_bool (client,
241
META_THEME_ACTIVE_SHADE_OPACITY_KEY,
244
if (!(cmdline_options & CMDLINE_ACTIVE_OPACITY_SHADE) &&
245
shade_opacity != meta_active_shade_opacity)
247
meta_active_shade_opacity = shade_opacity;
260
button_layout_changed (GConfClient *client)
264
gchar *button_layout;
266
button_layout = gconf_client_get_string (client,
267
META_BUTTON_LAYOUT_KEY,
272
meta_update_button_layout (button_layout);
274
meta_button_layout_set = TRUE;
276
g_free (button_layout);
281
if (meta_button_layout_set)
283
meta_button_layout_set = FALSE;
292
titlebar_font_changed (GConfClient *client)
296
str = gconf_client_get_string (client,
297
COMPIZ_TITLEBAR_FONT_KEY,
300
str = g_strdup ("Sans Bold 12");
303
pango_font_description_free (titlebar_font);
305
titlebar_font = pango_font_description_from_string (str);
311
titlebar_click_action_changed (GConfClient *client,
318
*action_value = default_value;
320
action = gconf_client_get_string (client, key, NULL);
323
if (strcmp (action, "toggle_shade") == 0)
324
*action_value = CLICK_ACTION_SHADE;
325
else if (strcmp (action, "toggle_maximize") == 0)
326
*action_value = CLICK_ACTION_MAXIMIZE;
327
else if (strcmp (action, "minimize") == 0)
328
*action_value = CLICK_ACTION_MINIMIZE;
329
else if (strcmp (action, "raise") == 0)
330
*action_value = CLICK_ACTION_RAISE;
331
else if (strcmp (action, "lower") == 0)
332
*action_value = CLICK_ACTION_LOWER;
333
else if (strcmp (action, "menu") == 0)
334
*action_value = CLICK_ACTION_MENU;
335
else if (strcmp (action, "none") == 0)
336
*action_value = CLICK_ACTION_NONE;
343
wheel_action_changed (GConfClient *client)
347
wheel_action = WHEEL_ACTION_DEFAULT;
349
action = gconf_client_get_string (client, WHEEL_ACTION_KEY, NULL);
352
if (strcmp (action, "shade") == 0)
353
wheel_action = WHEEL_ACTION_SHADE;
354
else if (strcmp (action, "none") == 0)
355
wheel_action = WHEEL_ACTION_NONE;
362
value_changed (GConfClient *client,
367
gboolean changed = FALSE;
369
if (strcmp (key, COMPIZ_USE_SYSTEM_FONT_KEY) == 0)
371
if (gconf_client_get_bool (client,
372
COMPIZ_USE_SYSTEM_FONT_KEY,
373
NULL) != use_system_font)
375
use_system_font = !use_system_font;
379
else if (strcmp (key, COMPIZ_TITLEBAR_FONT_KEY) == 0)
381
titlebar_font_changed (client);
382
changed = !use_system_font;
384
else if (strcmp (key, COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY) == 0)
386
titlebar_click_action_changed (client, key,
387
&double_click_action,
388
DOUBLE_CLICK_ACTION_DEFAULT);
390
else if (strcmp (key, COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY) == 0)
392
titlebar_click_action_changed (client, key,
393
&middle_click_action,
394
MIDDLE_CLICK_ACTION_DEFAULT);
396
else if (strcmp (key, COMPIZ_RIGHT_CLICK_TITLEBAR_KEY) == 0)
398
titlebar_click_action_changed (client, key,
400
RIGHT_CLICK_ACTION_DEFAULT);
402
else if (strcmp (key, WHEEL_ACTION_KEY) == 0)
404
wheel_action_changed (client);
406
else if (strcmp (key, BLUR_TYPE_KEY) == 0)
408
if (blur_settings_changed (client))
411
else if (strcmp (key, USE_META_THEME_KEY) == 0 ||
412
strcmp (key, META_THEME_KEY) == 0)
414
if (theme_changed (client))
417
else if (strcmp (key, META_BUTTON_LAYOUT_KEY) == 0)
419
if (button_layout_changed (client))
422
else if (strcmp (key, META_THEME_OPACITY_KEY) == 0 ||
423
strcmp (key, META_THEME_SHADE_OPACITY_KEY) == 0 ||
424
strcmp (key, META_THEME_ACTIVE_OPACITY_KEY) == 0 ||
425
strcmp (key, META_THEME_ACTIVE_SHADE_OPACITY_KEY) == 0)
427
if (theme_opacity_changed (client))
432
decorations_changed (data);
437
init_settings (WnckScreen *screen)
439
GtkSettings *settings;
440
GdkScreen *gdkscreen;
441
GdkColormap *colormap;
442
AtkObject *switcher_label_obj;
444
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
447
gconf = gconf_client_get_default ();
449
gconf_client_add_dir (gconf,
451
GCONF_CLIENT_PRELOAD_ONELEVEL,
454
gconf_client_add_dir (gconf,
456
GCONF_CLIENT_PRELOAD_ONELEVEL,
459
g_signal_connect (G_OBJECT (gconf),
461
G_CALLBACK (value_changed),
465
style_window_rgba = gtk_window_new (GTK_WINDOW_POPUP);
467
gdkscreen = gdk_display_get_default_screen (gdk_display_get_default ());
468
colormap = gdk_screen_get_rgba_colormap (gdkscreen);
470
gtk_widget_set_colormap (style_window_rgba, colormap);
472
gtk_widget_realize (style_window_rgba);
474
switcher_label = gtk_label_new ("");
475
switcher_label_obj = gtk_widget_get_accessible (switcher_label);
476
atk_object_set_role (switcher_label_obj, ATK_ROLE_STATUSBAR);
477
gtk_container_add (GTK_CONTAINER (style_window_rgba), switcher_label);
479
gtk_widget_set_size_request (style_window_rgba, 0, 0);
480
gtk_window_move (GTK_WINDOW (style_window_rgba), -100, -100);
481
gtk_widget_show_all (style_window_rgba);
483
g_signal_connect_object (style_window_rgba, "style-set",
484
G_CALLBACK (style_changed),
487
settings = gtk_widget_get_settings (style_window_rgba);
489
g_object_get (G_OBJECT (settings), "gtk-double-click-time",
490
&double_click_timeout, NULL);
492
pango_context = gtk_widget_create_pango_context (style_window_rgba);
494
style_window_rgb = gtk_window_new (GTK_WINDOW_POPUP);
496
gdkscreen = gdk_display_get_default_screen (gdk_display_get_default ());
497
colormap = gdk_screen_get_rgb_colormap (gdkscreen);
499
gtk_widget_set_colormap (style_window_rgb, colormap);
501
gtk_widget_realize (style_window_rgb);
503
switcher_label = gtk_label_new ("");
504
switcher_label_obj = gtk_widget_get_accessible (switcher_label);
505
atk_object_set_role (switcher_label_obj, ATK_ROLE_STATUSBAR);
506
gtk_container_add (GTK_CONTAINER (style_window_rgb), switcher_label);
508
gtk_widget_set_size_request (style_window_rgb, 0, 0);
509
gtk_window_move (GTK_WINDOW (style_window_rgb), -100, -100);
510
gtk_widget_show_all (style_window_rgb);
512
g_signal_connect_object (style_window_rgb, "style-set",
513
G_CALLBACK (style_changed),
516
settings = gtk_widget_get_settings (style_window_rgb);
518
g_object_get (G_OBJECT (settings), "gtk-double-click-time",
519
&double_click_timeout, NULL);
521
pango_context = gtk_widget_create_pango_context (style_window_rgb);
523
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
524
use_system_font = gconf_client_get_bool (gconf,
525
COMPIZ_USE_SYSTEM_FONT_KEY,
527
theme_changed (gconf);
528
theme_opacity_changed (gconf);
529
button_layout_changed (gconf);
532
update_style (style_window_rgba);
533
update_style (style_window_rgb);
534
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
535
titlebar_font_changed (gconf);
538
update_titlebar_font ();
540
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
541
titlebar_click_action_changed (gconf,
542
COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY,
543
&double_click_action,
544
DOUBLE_CLICK_ACTION_DEFAULT);
545
titlebar_click_action_changed (gconf,
546
COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY,
547
&middle_click_action,
548
MIDDLE_CLICK_ACTION_DEFAULT);
549
titlebar_click_action_changed (gconf,
550
COMPIZ_RIGHT_CLICK_TITLEBAR_KEY,
552
RIGHT_CLICK_ACTION_DEFAULT);
553
wheel_action_changed (gconf);
554
blur_settings_changed (gconf);
557
(*theme_update_border_extents) (text_height);
559
shadow_property_changed (screen);