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>
17
#ifndef GDK_DISABLE_DEPRECATED
18
#define GDK_DISABLE_DEPRECATED
21
#define create_foreign_window(xid) \
22
gdk_x11_foreign_new_for_display (gdk_display_get_default (), \
26
#define create_foreign_window(xid) \
27
gdk_window_foreign_new (xid)
29
#ifdef GTK_DISABLE_DEPRECATED
30
#undef GTK_DISABLE_DEPRECATED
39
#ifdef USE_GCONF_UNITY_WINDOW_DECORATOR
40
#include <gconf/gconf-client.h>
44
#define DBUS_API_SUBJECT_TO_CHANGE
45
#include <dbus/dbus.h>
46
#include <dbus/dbus-glib-lowlevel.h>
49
#define WNCK_I_KNOW_THIS_IS_UNSTABLE
50
#include <libwnck/libwnck.h>
51
#include <libwnck/window-action-menu.h>
53
#ifndef HAVE_LIBWNCK_2_19_4
54
#define wnck_window_get_client_window_geometry wnck_window_get_geometry
58
#include <cairo-xlib.h>
60
#if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 1, 0)
61
#define CAIRO_EXTEND_PAD CAIRO_EXTEND_NONE
64
#include <pango/pango-context.h>
65
#include <pango/pangocairo.h>
72
#include <sys/types.h>
76
#define _(x) gettext (x)
80
#include <metacity-private/theme.h>
83
#define METACITY_GCONF_DIR "/apps/metacity/general"
85
#define COMPIZ_USE_SYSTEM_FONT_KEY \
86
METACITY_GCONF_DIR "/titlebar_uses_system_font"
88
#define COMPIZ_TITLEBAR_FONT_KEY \
89
METACITY_GCONF_DIR "/titlebar_font"
91
#define COMPIZ_DOUBLE_CLICK_TITLEBAR_KEY \
92
METACITY_GCONF_DIR "/action_double_click_titlebar"
94
#define COMPIZ_MIDDLE_CLICK_TITLEBAR_KEY \
95
METACITY_GCONF_DIR "/action_middle_click_titlebar"
97
#define COMPIZ_RIGHT_CLICK_TITLEBAR_KEY \
98
METACITY_GCONF_DIR "/action_right_click_titlebar"
100
#define COMPIZ_GCONF_DIR1 "/apps/compiz/plugins/decoration/allscreens/options"
102
#define COMPIZ_SHADOW_RADIUS_KEY \
103
COMPIZ_GCONF_DIR1 "/shadow_radius"
105
#define COMPIZ_SHADOW_OPACITY_KEY \
106
COMPIZ_GCONF_DIR1 "/shadow_opacity"
108
#define COMPIZ_SHADOW_COLOR_KEY \
109
COMPIZ_GCONF_DIR1 "/shadow_color"
111
#define COMPIZ_SHADOW_OFFSET_X_KEY \
112
COMPIZ_GCONF_DIR1 "/shadow_x_offset"
114
#define COMPIZ_SHADOW_OFFSET_Y_KEY \
115
COMPIZ_GCONF_DIR1 "/shadow_y_offset"
117
#define META_THEME_KEY \
118
METACITY_GCONF_DIR "/theme"
120
#define META_BUTTON_LAYOUT_KEY \
121
METACITY_GCONF_DIR "/button_layout"
123
#define GCONF_DIR "/apps/gwd"
125
#define USE_META_THEME_KEY \
126
GCONF_DIR "/use_metacity_theme"
128
#define META_THEME_OPACITY_KEY \
129
GCONF_DIR "/metacity_theme_opacity"
131
#define META_THEME_SHADE_OPACITY_KEY \
132
GCONF_DIR "/metacity_theme_shade_opacity"
134
#define META_THEME_ACTIVE_OPACITY_KEY \
135
GCONF_DIR "/metacity_theme_active_opacity"
137
#define META_THEME_ACTIVE_SHADE_OPACITY_KEY \
138
GCONF_DIR "/metacity_theme_active_shade_opacity"
140
#define BLUR_TYPE_KEY \
141
GCONF_DIR "/blur_type"
143
#define WHEEL_ACTION_KEY \
144
GCONF_DIR "/mouse_wheel_action"
146
#define DBUS_DEST "org.freedesktop.compiz"
147
#define DBUS_PATH "/org/freedesktop/compiz/decor/screen0"
148
#define DBUS_INTERFACE "org.freedesktop.compiz"
149
#define DBUS_METHOD_GET "get"
151
#define STROKE_ALPHA 0.6
153
#define ICON_SPACE 20
155
#define DOUBLE_CLICK_DISTANCE 8.0
157
#define WM_MOVERESIZE_SIZE_TOPLEFT 0
158
#define WM_MOVERESIZE_SIZE_TOP 1
159
#define WM_MOVERESIZE_SIZE_TOPRIGHT 2
160
#define WM_MOVERESIZE_SIZE_RIGHT 3
161
#define WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4
162
#define WM_MOVERESIZE_SIZE_BOTTOM 5
163
#define WM_MOVERESIZE_SIZE_BOTTOMLEFT 6
164
#define WM_MOVERESIZE_SIZE_LEFT 7
165
#define WM_MOVERESIZE_MOVE 8
166
#define WM_MOVERESIZE_SIZE_KEYBOARD 9
167
#define WM_MOVERESIZE_MOVE_KEYBOARD 10
169
#define SHADOW_RADIUS 8.0
170
#define SHADOW_OPACITY 0.5
171
#define SHADOW_OFFSET_X 1
172
#define SHADOW_OFFSET_Y 1
173
#define SHADOW_COLOR_RED 0x0000
174
#define SHADOW_COLOR_GREEN 0x0000
175
#define SHADOW_COLOR_BLUE 0x0000
177
#define SHADOW_TYPE_ACTIVE_NORMAL 1
178
#define SHADOW_TYPE_ACTIVE_MAX 2
179
#define SHADOW_TYPE_INACTIVE_NORMAL 3
180
#define SHADOW_TYPE_INACTIVE_MAX 4
182
#define META_OPACITY 0.75
183
#define META_SHADE_OPACITY TRUE
184
#define META_ACTIVE_OPACITY 1.0
185
#define META_ACTIVE_SHADE_OPACITY TRUE
187
#define META_MAXIMIZED (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | \
188
WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)
190
#define CMDLINE_OPACITY (1 << 0)
191
#define CMDLINE_OPACITY_SHADE (1 << 1)
192
#define CMDLINE_ACTIVE_OPACITY (1 << 2)
193
#define CMDLINE_ACTIVE_OPACITY_SHADE (1 << 3)
194
#define CMDLINE_BLUR (1 << 4)
195
#define CMDLINE_THEME (1 << 5)
197
#define MWM_HINTS_DECORATIONS (1L << 1)
199
#define MWM_DECOR_ALL (1L << 0)
200
#define MWM_DECOR_BORDER (1L << 1)
201
#define MWM_DECOR_HANDLE (1L << 2)
202
#define MWM_DECOR_TITLE (1L << 3)
203
#define MWM_DECOR_MENU (1L << 4)
204
#define MWM_DECOR_MINIMIZE (1L << 5)
205
#define MWM_DECOR_MAXIMIZE (1L << 6)
207
#define PROP_MOTIF_WM_HINT_ELEMENTS 3
209
/* to save some memory, value is specific to current decorations */
210
#define TRANSLUCENT_CORNER_SIZE 3
214
unsigned long functions;
215
unsigned long decorations;
221
CLICK_ACTION_MAXIMIZE,
222
CLICK_ACTION_MINIMIZE,
233
#define DOUBLE_CLICK_ACTION_DEFAULT CLICK_ACTION_MAXIMIZE
234
#define MIDDLE_CLICK_ACTION_DEFAULT CLICK_ACTION_LOWER
235
#define RIGHT_CLICK_ACTION_DEFAULT CLICK_ACTION_MENU
236
#define WHEEL_ACTION_DEFAULT WHEEL_ACTION_NONE
238
int double_click_action;
239
int middle_click_action;
240
int right_click_action;
243
extern gboolean minimal;
244
extern double decoration_alpha;
246
#define SWITCHER_SPACE 40
248
extern decor_extents_t _shadow_extents;
249
extern decor_extents_t _win_extents;
250
extern decor_extents_t _max_win_extents;
251
extern decor_extents_t _default_win_extents;
252
extern decor_extents_t _switcher_extents;
254
extern int titlebar_height;
255
extern int max_titlebar_height;
257
extern decor_context_t window_active_context;
258
extern decor_context_t window_inactive_context;
259
extern decor_context_t window_context_no_shadow;
260
extern decor_context_t max_window_active_context;
261
extern decor_context_t max_window_inactive_context;
262
extern decor_context_t max_window_context_no_shadow;
263
extern decor_context_t switcher_context;
264
extern decor_context_t shadow_context;
266
extern gdouble shadow_radius;
267
extern gdouble shadow_opacity;
268
extern gushort shadow_color[3];
269
extern gint shadow_offset_x;
270
extern gint shadow_offset_y;
273
extern double meta_opacity;
274
extern gboolean meta_shade_opacity;
275
extern double meta_active_opacity;
276
extern gboolean meta_active_shade_opacity;
278
extern gboolean meta_button_layout_set;
279
extern MetaButtonLayout meta_button_layout;
282
extern guint cmdline_options;
284
extern decor_shadow_t *no_border_shadow;
285
extern decor_shadow_t *border_active_shadow;
286
extern decor_shadow_t *border_inactive_shadow;
287
extern decor_shadow_t *border_no_shadow;
288
extern decor_shadow_t *max_border_active_shadow;
289
extern decor_shadow_t *max_border_inactive_shadow;
290
extern decor_shadow_t *max_border_no_shadow;
291
extern decor_shadow_t *switcher_shadow;
293
extern GdkPixmap *decor_normal_pixmap;
294
extern GdkPixmap *decor_active_pixmap;
296
extern Atom frame_input_window_atom;
297
extern Atom frame_output_window_atom;
298
extern Atom win_decor_atom;
299
extern Atom win_blur_decor_atom;
300
extern Atom wm_move_resize_atom;
301
extern Atom restack_window_atom;
302
extern Atom select_window_atom;
303
extern Atom mwm_hints_atom;
304
extern Atom switcher_fg_atom;
306
extern Atom toolkit_action_atom;
307
extern Atom toolkit_action_window_menu_atom;
308
extern Atom toolkit_action_force_quit_dialog_atom;
310
extern Time dm_sn_timestamp;
312
#define C(name) { 0, XC_ ## name }
319
extern struct _cursor cursor[3][3];
321
#define BUTTON_CLOSE 0
324
#define BUTTON_MENU 3
325
#define BUTTON_SHADE 4
326
#define BUTTON_ABOVE 5
327
#define BUTTON_STICK 6
328
#define BUTTON_UNSHADE 7
329
#define BUTTON_UNABOVE 8
330
#define BUTTON_UNSTICK 9
331
#define BUTTON_NUM 10
335
int xw, yh, ww, hh, yth, hth;
338
extern struct _pos pos[3][3], bpos[];
340
typedef struct _decor_color {
347
#define IN_EVENT_WINDOW (1 << 0)
348
#define PRESSED_EVENT_WINDOW (1 << 1)
350
typedef struct _decor_event {
360
typedef enum _decor_event_type {
368
typedef void (*event_callback) (WnckWindow *win,
369
decor_event *gtkwd_event,
370
decor_event_type gtkwd_type);
375
event_callback callback;
378
typedef struct _decor {
380
event_window event_windows[3][3];
381
event_window button_windows[BUTTON_NUM];
382
Box *last_pos_entered;
383
guint button_states[BUTTON_NUM];
385
GdkPixmap *buffer_pixmap;
386
GdkWindow *frame_window;
387
GtkWidget *decor_window;
388
GtkWidget *decor_event_box;
389
GtkWidget *decor_image;
391
decor_layout_t border_layout;
392
decor_context_t *context;
393
decor_shadow_t *shadow;
404
cairo_pattern_t *icon;
405
GdkPixmap *icon_pixmap;
406
GdkPixbuf *icon_pixbuf;
407
WnckWindowState state;
408
WnckWindowActions actions;
410
GtkWidget *force_quit_dialog;
411
GSList *transient_windows;
412
WnckWindow *transient_parent;
414
void (*draw) (struct _decor *d);
417
void (*theme_draw_window_decoration) (decor_t *d);
418
gboolean (*theme_calc_decoration_size) (decor_t *d,
424
void (*theme_update_border_extents) (gint text_height);
425
void (*theme_get_event_window_position) (decor_t *d,
434
gboolean (*theme_get_button_position) (decor_t *d,
443
decor_shadow_t * (*theme_update_shadow) (gint shadow_type);
445
void (*theme_get_shadow) (decor_t *d,
448
void (*theme_get_border_extents) (decor_extents_t *extents,
449
decor_extents_t *frame_extents,
450
decor_extents_t *extents_max,
451
decor_extents_t *frame_extents_max);
453
extern char *program_name;
455
extern GtkWidget *style_window_rgba;
456
extern GtkWidget *style_window_rgb;
457
extern GtkWidget *switcher_label;
459
extern GHashTable *frame_table;
460
extern GtkWidget *action_menu;
461
extern gboolean action_menu_mapped;
462
extern decor_color_t _title_color[2];
463
extern PangoContext *pango_context;
464
extern gint double_click_timeout;
466
extern GSList *draw_list;
467
extern guint draw_idle_id;
469
extern PangoFontDescription *titlebar_font;
470
extern gboolean use_system_font;
471
extern gint text_height;
473
#define BLUR_TYPE_NONE 0
474
#define BLUR_TYPE_TITLEBAR 1
475
#define BLUR_TYPE_ALL 2
477
extern gint blur_type;
479
extern GdkPixmap *switcher_pixmap;
480
extern GdkPixmap *switcher_buffer_pixmap;
481
extern gint switcher_width;
482
extern gint switcher_height;
483
extern Window switcher_selected_window;
484
extern decor_t *switcher_window;
486
extern XRenderPictFormat *xformat_rgba;
487
extern XRenderPictFormat *xformat_rgb;
489
extern Atom compiz_shadow_info_atom;
490
extern Atom compiz_shadow_color_atom;
492
/* gtk-window-decorator.c */
495
dist (double x1, double y1,
496
double x2, double y2);
501
update_window_decoration_size (WnckWindow *win);
504
update_window_decoration_name (WnckWindow *win);
507
max_window_name_width (WnckWindow *win);
510
update_default_decorations (GdkScreen *screen);
513
update_window_decoration_state (WnckWindow *win);
516
update_window_decoration_actions (WnckWindow *win);
519
update_window_decoration_icon (WnckWindow *win);
522
update_event_windows (WnckWindow *win);
525
update_shadow (void);
528
shadow_property_changed (WnckScreen *screen);
531
update_titlebar_font (void);
534
update_window_decoration_name (WnckWindow *win);
537
update_window_decoration (WnckWindow *win);
540
queue_decor_draw (decor_t *d);
543
copy_to_front_buffer (decor_t *d);
546
draw_border_shape (Display *xdisplay,
558
decorations_changed (WnckScreen *screen);
561
connect_screen (WnckScreen *screen);
564
add_frame_window (WnckWindow *win,
569
remove_frame_window (WnckWindow *win);
572
restack_window (WnckWindow *win,
575
void connect_window (WnckWindow *win);
580
decor_update_blur_property (decor_t *d,
585
Region bottom_region,
595
decor_update_window_property (decor_t *d);
598
decor_update_switcher_property (decor_t *d);
602
#define CORNER_TOPLEFT (1 << 0)
603
#define CORNER_TOPRIGHT (1 << 1)
604
#define CORNER_BOTTOMRIGHT (1 << 2)
605
#define CORNER_BOTTOMLEFT (1 << 3)
607
#define SHADE_LEFT (1 << 0)
608
#define SHADE_RIGHT (1 << 1)
609
#define SHADE_TOP (1 << 2)
610
#define SHADE_BOTTOM (1 << 3)
613
draw_shadow_background (decor_t *d,
619
draw_window_decoration (decor_t *d);
622
fill_rounded_rectangle (cairo_t *cr,
636
rounded_rectangle (cairo_t *cr,
645
calc_decoration_size (decor_t *d,
653
update_border_extents (gint text_height);
656
get_border_extents (decor_extents_t *extents,
657
decor_extents_t *frame_extents,
658
decor_extents_t *extents_max,
659
decor_extents_t *frame_extents_max);
662
get_button_position (decor_t *d,
672
get_event_window_position (decor_t *d,
683
cairo_update_shadow (gint shadow_type);
686
get_shadow (decor_t *, gint shadow_type);
691
gdk_cairo_set_source_color_alpha (cairo_t *cr,
696
create_gdk_window (Window xframe);
699
get_colormap_for_drawable (GdkDrawable *d);
702
get_format_for_drawable (decor_t *d, GdkDrawable *drawable);
705
create_pixmap (int w,
710
pixmap_new_from_pixbuf (GdkPixbuf *pixbuf, int depth);
715
meta_draw_window_decoration (decor_t *d);
718
meta_get_decoration_geometry (decor_t *d,
720
MetaFrameFlags *flags,
721
MetaFrameGeometry *fgeom,
722
MetaButtonLayout *button_layout,
726
meta_calc_button_size (decor_t *d);
729
meta_calc_decoration_size (decor_t *d,
737
meta_get_button_position (decor_t *d,
747
meta_button_present (MetaButtonLayout *button_layout,
748
MetaButtonFunction function);
751
meta_get_event_window_position (decor_t *d,
761
meta_update_border_extents (gint text_height);
764
meta_get_border_extents (decor_extents_t *extents,
765
decor_extents_t *frame_extents,
766
decor_extents_t *extents_max,
767
decor_extents_t *frame_extents_max);
770
meta_update_button_layout (const char *value);
773
meta_update_shadow (gint shadow_type);
776
meta_get_shadow (decor_t *, gint shadow_type);
781
#define SWITCHER_ALPHA 0xa0a0
784
draw_switcher_decoration (decor_t *d);
787
update_switcher_window (Window popup,
791
switcher_window_opened (Window popup, Window selected);
794
switcher_window_closed ();
799
move_resize_window (WnckWindow *win,
801
decor_event *gtkwd_event);
804
common_button_event (WnckWindow *win,
805
decor_event *gtkwd_event,
806
decor_event_type gtkwd_type,
811
close_button_event (WnckWindow *win,
812
decor_event *gtkwd_event,
813
decor_event_type gtkwd_type);
816
max_button_event (WnckWindow *win,
817
decor_event *gtkwd_event,
818
decor_event_type gtkwd_type);
821
min_button_event (WnckWindow *win,
822
decor_event *gtkwd_event,
823
decor_event_type gtkwd_type);
826
menu_button_event (WnckWindow *win,
827
decor_event *gtkwd_event,
828
decor_event_type gtkwd_type);
831
shade_button_event (WnckWindow *win,
832
decor_event *gtkwd_event,
833
decor_event_type gtkwd_type);
836
above_button_event (WnckWindow *win,
837
decor_event *gtkwd_event,
838
decor_event_type gtkwd_type);
841
stick_button_event (WnckWindow *win,
842
decor_event *gtkwd_event,
843
decor_event_type gtkwd_type);
845
unshade_button_event (WnckWindow *win,
846
decor_event *gtkwd_event,
847
decor_event_type gtkwd_type);
850
unabove_button_event (WnckWindow *win,
851
decor_event *gtkwd_event,
852
decor_event_type gtkwd_type);
855
unstick_button_event (WnckWindow *win,
856
decor_event *gtkwd_event,
857
decor_event_type gtkwd_type);
860
handle_title_button_event (WnckWindow *win,
862
decor_event *gtkwd_event);
865
handle_mouse_wheel_title_event (WnckWindow *win,
866
unsigned int button);
869
title_event (WnckWindow *win,
870
decor_event *gtkwd_event,
871
decor_event_type gtkwd_type);
874
frame_common_event (WnckWindow *win,
876
decor_event *gtkwd_event,
877
decor_event_type gtkwd_type);
880
top_left_event (WnckWindow *win,
881
decor_event *gtkwd_event,
882
decor_event_type gtkwd_type);
885
top_event (WnckWindow *win,
886
decor_event *gtkwd_event,
887
decor_event_type gtkwd_type);
890
top_right_event (WnckWindow *win,
891
decor_event *gtkwd_event,
892
decor_event_type gtkwd_type);
895
left_event (WnckWindow *win,
896
decor_event *gtkwd_event,
897
decor_event_type gtkwd_type);
899
right_event (WnckWindow *win,
900
decor_event *gtkwd_event,
901
decor_event_type gtkwd_type);
904
bottom_left_event (WnckWindow *win,
905
decor_event *gtkwd_event,
906
decor_event_type gtkwd_type);
909
bottom_event (WnckWindow *win,
910
decor_event *gtkwd_event,
911
decor_event_type gtkwd_type);
913
bottom_right_event (WnckWindow *win,
914
decor_event *gtkwd_event,
915
decor_event_type gtkwd_type);
918
frame_window_realized (GtkWidget *widget,
922
find_event_callback_for_point (decor_t *d,
927
BoxPtr *entered_box);
930
find_leave_event_callback (decor_t *d);
933
frame_handle_button_press (GtkWidget *widget,
934
GdkEventButton *event,
938
frame_handle_button_release (GtkWidget *widget,
939
GdkEventButton *event,
943
frame_handle_motion (GtkWidget *widget,
944
GdkEventMotion *event,
948
selection_event_filter_func (GdkXEvent *gdkxevent,
953
event_filter_func (GdkXEvent *gdkxevent,
960
show_force_quit_dialog (WnckWindow *win,
964
hide_force_quit_dialog (WnckWindow *win);
969
action_menu_map (WnckWindow *win,
979
dist (double x1, double y1,
980
double x2, double y2);
983
shade (const decor_color_t *a,
988
get_window_prop (Window xwindow,
993
get_mwm_prop (Window xwindow);
999
update_style (GtkWidget *widget);
1002
style_changed (GtkWidget *widget);
1007
init_settings (WnckScreen *screen);