1
#ifndef _GTK_WINDOW_DECORATOR_H
2
#define _GTK_WINDOW_DECORATOR_H
7
#include <decoration.h>
10
#include <X11/Xatom.h>
11
#include <X11/cursorfont.h>
12
#include <X11/extensions/Xrender.h>
13
#include <X11/Xregion.h>
15
#ifndef GDK_DISABLE_DEPRECATED
16
#define GDK_DISABLE_DEPRECATED
19
#ifndef GTK_DISABLE_DEPRECATED
20
#define GTK_DISABLE_DEPRECATED
27
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
28
#include <gconf/gconf-client.h>
32
#define DBUS_API_SUBJECT_TO_CHANGE
33
#include <dbus/dbus.h>
34
#include <dbus/dbus-glib-lowlevel.h>
37
#define WNCK_I_KNOW_THIS_IS_UNSTABLE
38
#include <libwnck/libwnck.h>
39
#include <libwnck/window-action-menu.h>
41
#ifndef HAVE_LIBWNCK_2_19_4
42
#define wnck_window_get_client_window_geometry wnck_window_get_geometry
46
#include <cairo-xlib.h>
48
#if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 1, 0)
49
#define CAIRO_EXTEND_PAD CAIRO_EXTEND_NONE
52
#include <pango/pango-context.h>
53
#include <pango/pangocairo.h>
60
#include <sys/types.h>
64
#define _(x) gettext (x)
68
#include <metacity-private/theme.h>
71
#define METACITY_GCONF_DIR "/apps/metacity/general"
73
#define COMPIZ_USE_SYSTEM_FONT_KEY \
74
METACITY_GCONF_DIR "/titlebar_uses_system_font"
76
#define COMPIZ_TITLEBAR_FONT_KEY \
77
METACITY_GCONF_DIR "/titlebar_font"
79
#define COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY \
80
METACITY_GCONF_DIR "/action_double_click_titlebar"
82
#define COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY \
83
METACITY_GCONF_DIR "/action_middle_click_titlebar"
85
#define COMPIZ_RIGHT_CLICK_TITLEBAR_KEY \
86
METACITY_GCONF_DIR "/action_right_click_titlebar"
88
#define COMPIZ_GCONF_DIR1 "/apps/compiz/plugins/decoration/allscreens/options"
90
#define COMPIZ_SHADOW_RADIUS_KEY \
91
COMPIZ_GCONF_DIR1 "/shadow_radius"
93
#define COMPIZ_SHADOW_OPACITY_KEY \
94
COMPIZ_GCONF_DIR1 "/shadow_opacity"
96
#define COMPIZ_SHADOW_COLOR_KEY \
97
COMPIZ_GCONF_DIR1 "/shadow_color"
99
#define COMPIZ_SHADOW_OFFSET_X_KEY \
100
COMPIZ_GCONF_DIR1 "/shadow_x_offset"
102
#define COMPIZ_SHADOW_OFFSET_Y_KEY \
103
COMPIZ_GCONF_DIR1 "/shadow_y_offset"
105
#define META_THEME_KEY \
106
METACITY_GCONF_DIR "/theme"
108
#define META_BUTTON_LAYOUT_KEY \
109
METACITY_GCONF_DIR "/button_layout"
111
#define GCONF_DIR "/apps/gwd"
113
#define USE_META_THEME_KEY \
114
GCONF_DIR "/use_metacity_theme"
116
#define META_THEME_OPACITY_KEY \
117
GCONF_DIR "/metacity_theme_opacity"
119
#define META_THEME_SHADE_OPACITY_KEY \
120
GCONF_DIR "/metacity_theme_shade_opacity"
122
#define META_THEME_ACTIVE_OPACITY_KEY \
123
GCONF_DIR "/metacity_theme_active_opacity"
125
#define META_THEME_ACTIVE_SHADE_OPACITY_KEY \
126
GCONF_DIR "/metacity_theme_active_shade_opacity"
128
#define BLUR_TYPE_KEY \
129
GCONF_DIR "/blur_type"
131
#define WHEEL_ACTION_KEY \
132
GCONF_DIR "/mouse_wheel_action"
134
#define DBUS_DEST "org.freedesktop.compiz"
135
#define DBUS_PATH "/org/freedesktop/compiz/decor/screen0"
136
#define DBUS_INTERFACE "org.freedesktop.compiz"
137
#define DBUS_METHOD_GET "get"
139
#define STROKE_ALPHA 0.6
141
#define ICON_SPACE 20
143
#define DOUBLE_CLICK_DISTANCE 8.0
145
#define WM_MOVERESIZE_SIZE_TOPLEFT 0
146
#define WM_MOVERESIZE_SIZE_TOP 1
147
#define WM_MOVERESIZE_SIZE_TOPRIGHT 2
148
#define WM_MOVERESIZE_SIZE_RIGHT 3
149
#define WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4
150
#define WM_MOVERESIZE_SIZE_BOTTOM 5
151
#define WM_MOVERESIZE_SIZE_BOTTOMLEFT 6
152
#define WM_MOVERESIZE_SIZE_LEFT 7
153
#define WM_MOVERESIZE_MOVE 8
154
#define WM_MOVERESIZE_SIZE_KEYBOARD 9
155
#define WM_MOVERESIZE_MOVE_KEYBOARD 10
157
#define SHADOW_RADIUS 8.0
158
#define SHADOW_OPACITY 0.5
159
#define SHADOW_OFFSET_X 1
160
#define SHADOW_OFFSET_Y 1
161
#define SHADOW_COLOR_RED 0x0000
162
#define SHADOW_COLOR_GREEN 0x0000
163
#define SHADOW_COLOR_BLUE 0x0000
165
#define SHADOW_TYPE_ACTIVE_NORMAL 1
166
#define SHADOW_TYPE_ACTIVE_MAX 2
167
#define SHADOW_TYPE_INACTIVE_NORMAL 3
168
#define SHADOW_TYPE_INACTIVE_MAX 4
170
#define META_OPACITY 0.75
171
#define META_SHADE_OPACITY TRUE
172
#define META_ACTIVE_OPACITY 1.0
173
#define META_ACTIVE_SHADE_OPACITY TRUE
175
#define META_MAXIMIZED (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | \
176
WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)
178
#define CMDLINE_OPACITY (1 << 0)
179
#define CMDLINE_OPACITY_SHADE (1 << 1)
180
#define CMDLINE_ACTIVE_OPACITY (1 << 2)
181
#define CMDLINE_ACTIVE_OPACITY_SHADE (1 << 3)
182
#define CMDLINE_BLUR (1 << 4)
183
#define CMDLINE_THEME (1 << 5)
185
#define MWM_HINTS_DECORATIONS (1L << 1)
187
#define MWM_DECOR_ALL (1L << 0)
188
#define MWM_DECOR_BORDER (1L << 1)
189
#define MWM_DECOR_HANDLE (1L << 2)
190
#define MWM_DECOR_TITLE (1L << 3)
191
#define MWM_DECOR_MENU (1L << 4)
192
#define MWM_DECOR_MINIMIZE (1L << 5)
193
#define MWM_DECOR_MAXIMIZE (1L << 6)
195
#define PROP_MOTIF_WM_HINT_ELEMENTS 3
197
/* to save some memory, value is specific to current decorations */
198
#define TRANSLUCENT_CORNER_SIZE 3
202
unsigned long functions;
203
unsigned long decorations;
209
CLICK_ACTION_MAXIMIZE,
210
CLICK_ACTION_MINIMIZE,
221
#define DOUBLE_CLICK_ACTION_DEFAULT CLICK_ACTION_MAXIMIZE
222
#define MIDDLE_CLICK_ACTION_DEFAULT CLICK_ACTION_LOWER
223
#define RIGHT_CLICK_ACTION_DEFAULT CLICK_ACTION_MENU
224
#define WHEEL_ACTION_DEFAULT WHEEL_ACTION_NONE
226
int double_click_action;
227
int middle_click_action;
228
int right_click_action;
231
extern gboolean minimal;
232
extern double decoration_alpha;
234
#define SWITCHER_SPACE 40
236
extern decor_extents_t _shadow_extents;
237
extern decor_extents_t _win_extents;
238
extern decor_extents_t _max_win_extents;
239
extern decor_extents_t _default_win_extents;
240
extern decor_extents_t _switcher_extents;
242
extern int titlebar_height;
243
extern int max_titlebar_height;
245
extern decor_context_t window_active_context;
246
extern decor_context_t window_inactive_context;
247
extern decor_context_t window_context_no_shadow;
248
extern decor_context_t max_window_active_context;
249
extern decor_context_t max_window_inactive_context;
250
extern decor_context_t max_window_context_no_shadow;
251
extern decor_context_t switcher_context;
252
extern decor_context_t shadow_context;
254
extern gdouble shadow_radius;
255
extern gdouble shadow_opacity;
256
extern gushort shadow_color[3];
257
extern gint shadow_offset_x;
258
extern gint shadow_offset_y;
261
extern double meta_opacity;
262
extern gboolean meta_shade_opacity;
263
extern double meta_active_opacity;
264
extern gboolean meta_active_shade_opacity;
266
extern gboolean meta_button_layout_set;
267
extern MetaButtonLayout meta_button_layout;
270
extern guint cmdline_options;
272
extern decor_shadow_t *no_border_shadow;
273
extern decor_shadow_t *border_active_shadow;
274
extern decor_shadow_t *border_inactive_shadow;
275
extern decor_shadow_t *border_no_shadow;
276
extern decor_shadow_t *max_border_active_shadow;
277
extern decor_shadow_t *max_border_inactive_shadow;
278
extern decor_shadow_t *max_border_no_shadow;
279
extern decor_shadow_t *switcher_shadow;
281
extern GdkPixmap *decor_normal_pixmap;
282
extern GdkPixmap *decor_active_pixmap;
284
extern Atom frame_input_window_atom;
285
extern Atom frame_output_window_atom;
286
extern Atom win_decor_atom;
287
extern Atom win_blur_decor_atom;
288
extern Atom wm_move_resize_atom;
289
extern Atom restack_window_atom;
290
extern Atom select_window_atom;
291
extern Atom mwm_hints_atom;
292
extern Atom switcher_fg_atom;
294
extern Atom toolkit_action_atom;
295
extern Atom toolkit_action_window_menu_atom;
296
extern Atom toolkit_action_force_quit_dialog_atom;
298
extern Time dm_sn_timestamp;
300
#define C(name) { 0, XC_ ## name }
307
extern struct _cursor cursor[3][3];
309
#define BUTTON_CLOSE 0
312
#define BUTTON_MENU 3
313
#define BUTTON_SHADE 4
314
#define BUTTON_ABOVE 5
315
#define BUTTON_STICK 6
316
#define BUTTON_UNSHADE 7
317
#define BUTTON_UNABOVE 8
318
#define BUTTON_UNSTICK 9
319
#define BUTTON_NUM 10
323
int xw, yh, ww, hh, yth, hth;
326
extern struct _pos pos[3][3], bpos[];
328
typedef struct _decor_color {
335
#define IN_EVENT_WINDOW (1 << 0)
336
#define PRESSED_EVENT_WINDOW (1 << 1)
338
typedef struct _decor_event {
348
typedef enum _decor_event_type {
356
typedef void (*event_callback) (WnckWindow *win,
357
decor_event *gtkwd_event,
358
decor_event_type gtkwd_type);
363
event_callback callback;
366
typedef struct _decor {
368
event_window event_windows[3][3];
369
event_window button_windows[BUTTON_NUM];
370
Box *last_pos_entered;
371
guint button_states[BUTTON_NUM];
373
GdkPixmap *buffer_pixmap;
374
GdkWindow *frame_window;
375
GtkWidget *decor_window;
376
GtkWidget *decor_event_box;
377
GtkWidget *decor_image;
379
decor_layout_t border_layout;
380
decor_context_t *context;
381
decor_shadow_t *shadow;
392
cairo_pattern_t *icon;
393
GdkPixmap *icon_pixmap;
394
GdkPixbuf *icon_pixbuf;
395
WnckWindowState state;
396
WnckWindowActions actions;
398
GtkWidget *force_quit_dialog;
399
GSList *transient_windows;
400
WnckWindow *transient_parent;
402
void (*draw) (struct _decor *d);
405
void (*theme_draw_window_decoration) (decor_t *d);
406
gboolean (*theme_calc_decoration_size) (decor_t *d,
412
void (*theme_update_border_extents) (gint text_height);
413
void (*theme_get_event_window_position) (decor_t *d,
422
gboolean (*theme_get_button_position) (decor_t *d,
431
decor_shadow_t * (*theme_update_shadow) (gint shadow_type);
433
void (*theme_get_shadow) (decor_t *d,
436
extern char *program_name;
438
extern GtkWidget *style_window_rgba;
439
extern GtkWidget *style_window_rgb;
440
extern GtkWidget *switcher_label;
442
extern GHashTable *frame_table;
443
extern GtkWidget *action_menu;
444
extern gboolean action_menu_mapped;
445
extern decor_color_t _title_color[2];
446
extern PangoContext *pango_context;
447
extern gint double_click_timeout;
449
extern GSList *draw_list;
450
extern guint draw_idle_id;
452
extern PangoFontDescription *titlebar_font;
453
extern gboolean use_system_font;
454
extern gint text_height;
456
#define BLUR_TYPE_NONE 0
457
#define BLUR_TYPE_TITLEBAR 1
458
#define BLUR_TYPE_ALL 2
460
extern gint blur_type;
462
extern GdkPixmap *switcher_pixmap;
463
extern GdkPixmap *switcher_buffer_pixmap;
464
extern gint switcher_width;
465
extern gint switcher_height;
466
extern Window switcher_selected_window;
467
extern decor_t *switcher_window;
469
extern XRenderPictFormat *xformat_rgba;
470
extern XRenderPictFormat *xformat_rgb;
472
extern Atom compiz_shadow_info_atom;
473
extern Atom compiz_shadow_color_atom;
475
/* gtk-window-decorator.c */
478
dist (double x1, double y1,
479
double x2, double y2);
484
update_window_decoration_size (WnckWindow *win);
487
update_window_decoration_name (WnckWindow *win);
490
max_window_name_width (WnckWindow *win);
493
update_default_decorations (GdkScreen *screen);
496
update_window_decoration_state (WnckWindow *win);
499
update_window_decoration_actions (WnckWindow *win);
502
update_window_decoration_icon (WnckWindow *win);
505
update_event_windows (WnckWindow *win);
508
update_shadow (void);
511
shadow_property_changed (WnckScreen *screen);
514
update_titlebar_font (void);
517
update_window_decoration_name (WnckWindow *win);
520
update_window_decoration (WnckWindow *win);
523
queue_decor_draw (decor_t *d);
526
copy_to_front_buffer (decor_t *d);
529
draw_border_shape (Display *xdisplay,
541
decorations_changed (WnckScreen *screen);
544
connect_screen (WnckScreen *screen);
547
add_frame_window (WnckWindow *win,
552
remove_frame_window (WnckWindow *win);
555
restack_window (WnckWindow *win,
558
void connect_window (WnckWindow *win);
563
decor_update_blur_property (decor_t *d,
568
Region bottom_region,
578
decor_update_window_property (decor_t *d);
581
decor_update_switcher_property (decor_t *d);
585
#define CORNER_TOPLEFT (1 << 0)
586
#define CORNER_TOPRIGHT (1 << 1)
587
#define CORNER_BOTTOMRIGHT (1 << 2)
588
#define CORNER_BOTTOMLEFT (1 << 3)
590
#define SHADE_LEFT (1 << 0)
591
#define SHADE_RIGHT (1 << 1)
592
#define SHADE_TOP (1 << 2)
593
#define SHADE_BOTTOM (1 << 3)
596
draw_shadow_background (decor_t *d,
602
draw_window_decoration (decor_t *d);
605
fill_rounded_rectangle (cairo_t *cr,
619
rounded_rectangle (cairo_t *cr,
628
calc_decoration_size (decor_t *d,
636
update_border_extents (gint text_height);
639
get_button_position (decor_t *d,
649
get_event_window_position (decor_t *d,
660
cairo_update_shadow (gint shadow_type);
663
get_shadow (decor_t *, gint shadow_type);
668
gdk_cairo_set_source_color_alpha (cairo_t *cr,
673
create_gdk_window (Window xframe);
676
get_colormap_for_drawable (GdkDrawable *d);
679
get_format_for_drawable (decor_t *d, GdkDrawable *drawable);
682
create_pixmap (int w,
687
pixmap_new_from_pixbuf (GdkPixbuf *pixbuf, int depth);
692
meta_draw_window_decoration (decor_t *d);
695
meta_get_decoration_geometry (decor_t *d,
697
MetaFrameFlags *flags,
698
MetaFrameGeometry *fgeom,
699
MetaButtonLayout *button_layout,
703
meta_calc_button_size (decor_t *d);
706
meta_calc_decoration_size (decor_t *d,
714
meta_get_button_position (decor_t *d,
724
meta_button_present (MetaButtonLayout *button_layout,
725
MetaButtonFunction function);
728
meta_get_event_window_position (decor_t *d,
738
meta_update_border_extents (gint text_height);
741
meta_update_button_layout (const char *value);
744
meta_update_shadow (gint shadow_type);
747
meta_get_shadow (decor_t *, gint shadow_type);
752
#define SWITCHER_ALPHA 0xa0a0
755
draw_switcher_decoration (decor_t *d);
758
update_switcher_window (Window popup,
762
switcher_window_opened (Window popup, Window selected);
765
switcher_window_closed ();
770
move_resize_window (WnckWindow *win,
772
decor_event *gtkwd_event);
775
common_button_event (WnckWindow *win,
776
decor_event *gtkwd_event,
777
decor_event_type gtkwd_type,
782
close_button_event (WnckWindow *win,
783
decor_event *gtkwd_event,
784
decor_event_type gtkwd_type);
787
max_button_event (WnckWindow *win,
788
decor_event *gtkwd_event,
789
decor_event_type gtkwd_type);
792
min_button_event (WnckWindow *win,
793
decor_event *gtkwd_event,
794
decor_event_type gtkwd_type);
797
menu_button_event (WnckWindow *win,
798
decor_event *gtkwd_event,
799
decor_event_type gtkwd_type);
802
shade_button_event (WnckWindow *win,
803
decor_event *gtkwd_event,
804
decor_event_type gtkwd_type);
807
above_button_event (WnckWindow *win,
808
decor_event *gtkwd_event,
809
decor_event_type gtkwd_type);
812
stick_button_event (WnckWindow *win,
813
decor_event *gtkwd_event,
814
decor_event_type gtkwd_type);
816
unshade_button_event (WnckWindow *win,
817
decor_event *gtkwd_event,
818
decor_event_type gtkwd_type);
821
unabove_button_event (WnckWindow *win,
822
decor_event *gtkwd_event,
823
decor_event_type gtkwd_type);
826
unstick_button_event (WnckWindow *win,
827
decor_event *gtkwd_event,
828
decor_event_type gtkwd_type);
831
handle_title_button_event (WnckWindow *win,
833
decor_event *gtkwd_event);
836
handle_mouse_wheel_title_event (WnckWindow *win,
837
unsigned int button);
840
title_event (WnckWindow *win,
841
decor_event *gtkwd_event,
842
decor_event_type gtkwd_type);
845
frame_common_event (WnckWindow *win,
847
decor_event *gtkwd_event,
848
decor_event_type gtkwd_type);
851
top_left_event (WnckWindow *win,
852
decor_event *gtkwd_event,
853
decor_event_type gtkwd_type);
856
top_event (WnckWindow *win,
857
decor_event *gtkwd_event,
858
decor_event_type gtkwd_type);
861
top_right_event (WnckWindow *win,
862
decor_event *gtkwd_event,
863
decor_event_type gtkwd_type);
866
left_event (WnckWindow *win,
867
decor_event *gtkwd_event,
868
decor_event_type gtkwd_type);
870
right_event (WnckWindow *win,
871
decor_event *gtkwd_event,
872
decor_event_type gtkwd_type);
875
bottom_left_event (WnckWindow *win,
876
decor_event *gtkwd_event,
877
decor_event_type gtkwd_type);
880
bottom_event (WnckWindow *win,
881
decor_event *gtkwd_event,
882
decor_event_type gtkwd_type);
884
bottom_right_event (WnckWindow *win,
885
decor_event *gtkwd_event,
886
decor_event_type gtkwd_type);
889
frame_window_realized (GtkWidget *widget,
893
find_event_callback_for_point (decor_t *d,
898
BoxPtr *entered_box);
901
find_leave_event_callback (decor_t *d);
904
frame_handle_button_press (GtkWidget *widget,
905
GdkEventButton *event,
909
frame_handle_button_release (GtkWidget *widget,
910
GdkEventButton *event,
914
frame_handle_motion (GtkWidget *widget,
915
GdkEventMotion *event,
919
selection_event_filter_func (GdkXEvent *gdkxevent,
924
event_filter_func (GdkXEvent *gdkxevent,
931
show_force_quit_dialog (WnckWindow *win,
935
hide_force_quit_dialog (WnckWindow *win);
940
action_menu_map (WnckWindow *win,
950
dist (double x1, double y1,
951
double x2, double y2);
954
shade (const decor_color_t *a,
959
get_window_prop (Window xwindow,
964
get_mwm_prop (Window xwindow);
970
update_style (GtkWidget *widget);
973
style_changed (GtkWidget *widget);
978
init_settings (WnckScreen *screen);