39
#include "gtk-compat.h"
40
#include "gdk-compat.h"
39
43
#include <X11/extensions/shape.h>
42
46
#define DEFAULT_INNER_BUTTON_BORDER 3
44
static void meta_frames_class_init (MetaFramesClass *klass);
45
static void meta_frames_init (MetaFrames *frames);
46
48
static void meta_frames_destroy (GtkObject *object);
47
49
static void meta_frames_finalize (GObject *object);
48
50
static void meta_frames_style_set (GtkWidget *widget,
106
108
static void invalidate_whole_window (MetaFrames *frames,
107
109
MetaUIFrame *frame);
109
static GtkWidgetClass *parent_class = NULL;
111
G_DEFINE_TYPE (MetaFrames, meta_frames, GTK_TYPE_WINDOW);
112
meta_frames_get_type (void)
114
meta_frames_constructor (GType gtype,
116
GObjectConstructParam *properties)
114
static GType frames_type = 0;
118
static const GtkTypeInfo frames_info =
122
sizeof (MetaFramesClass),
123
(GtkClassInitFunc) meta_frames_class_init,
124
(GtkObjectInitFunc) meta_frames_init,
125
/* reserved_1 */ NULL,
126
/* reserved_2 */ NULL,
127
(GtkClassInitFunc) NULL,
130
frames_type = gtk_type_unique (GTK_TYPE_WINDOW, &frames_info);
119
GObjectClass *gobject_class;
121
gobject_class = G_OBJECT_CLASS (meta_frames_parent_class);
122
object = gobject_class->constructor (gtype, n_properties, properties);
124
g_object_set (object,
125
"type", GTK_WINDOW_POPUP,
144
139
object_class = (GtkObjectClass*) class;
145
140
widget_class = (GtkWidgetClass*) class;
147
parent_class = g_type_class_peek_parent (class);
142
gobject_class->constructor = meta_frames_constructor;
149
143
gobject_class->finalize = meta_frames_finalize;
150
144
object_class->destroy = meta_frames_destroy;
204
198
meta_frames_init (MetaFrames *frames)
206
GTK_WINDOW (frames)->type = GTK_WINDOW_POPUP;
208
200
frames->text_heights = g_hash_table_new (NULL, NULL);
210
202
frames->frames = g_hash_table_new (unsigned_long_hash, unsigned_long_equal);
448
440
g_hash_table_foreach (frames->frames,
449
441
reattach_style_func, frames);
451
GTK_WIDGET_CLASS (parent_class)->style_set (widget, prev_style);
443
GTK_WIDGET_CLASS (meta_frames_parent_class)->style_set (widget, prev_style);
459
451
MetaFrameFlags flags;
460
452
MetaFrameType type;
461
453
MetaFrameStyle *style;
463
g_return_if_fail (GTK_WIDGET_REALIZED (frames));
465
455
widget = GTK_WIDGET (frames);
457
g_return_if_fail (gtk_widget_get_realized (widget));
467
459
meta_core_get (gdk_display, frame->xwindow,
468
460
META_CORE_GET_FRAME_FLAGS, &flags,
502
494
frame->layout = gtk_widget_create_pango_layout (widget, frame->title);
496
pango_layout_set_ellipsize (frame->layout, PANGO_ELLIPSIZE_END);
504
497
pango_layout_set_auto_dir (frame->layout, FALSE);
506
499
font_desc = meta_gtk_widget_get_font_desc (widget, scale,
593
586
gtk_style_detach (frame->style);
595
588
/* Weirdly, gtk_style_attach() steals a reference count from the style passed in */
596
g_object_ref (GTK_WIDGET (frames)->style);
597
frame->style = gtk_style_attach (GTK_WIDGET (frames)->style, frame->window);
589
g_object_ref (gtk_widget_get_style (GTK_WIDGET (frames)));
590
frame->style = gtk_style_attach (gtk_widget_get_style (GTK_WIDGET (frames)),
685
679
meta_frames_realize (GtkWidget *widget)
687
if (GTK_WIDGET_CLASS (parent_class)->realize)
688
GTK_WIDGET_CLASS (parent_class)->realize (widget);
681
if (GTK_WIDGET_CLASS (meta_frames_parent_class)->realize)
682
GTK_WIDGET_CLASS (meta_frames_parent_class)->realize (widget);
692
686
meta_frames_unrealize (GtkWidget *widget)
694
if (GTK_WIDGET_CLASS (parent_class)->unrealize)
695
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
688
if (GTK_WIDGET_CLASS (meta_frames_parent_class)->unrealize)
689
GTK_WIDGET_CLASS (meta_frames_parent_class)->unrealize (widget);
698
692
static MetaUIFrame*
2015
2009
get_bg_gc (GdkWindow *window, int x_offset, int y_offset)
2017
GdkWindowObject *private = (GdkWindowObject *)window;
2011
GdkWindow *parent = gdk_window_get_parent (window);
2012
GdkPixmap *back_pixmap;
2013
gboolean parent_relative;
2018
2014
guint gc_mask = 0;
2019
2015
GdkGCValues gc_values;
2021
if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG && private->parent)
2017
gdk_window_get_back_pixmap (window, &back_pixmap, &parent_relative);
2018
if (parent_relative && parent)
2023
return get_bg_gc (GDK_WINDOW (private->parent),
2024
x_offset + private->x,
2025
y_offset + private->y);
2020
gint window_x, window_y;
2022
gdk_window_get_position (window, &window_x, &window_y);
2023
return get_bg_gc (parent,
2024
x_offset + window_x,
2025
y_offset + window_y);
2027
else if (private->bg_pixmap &&
2028
private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
2029
private->bg_pixmap != GDK_NO_BG)
2027
else if (back_pixmap)
2031
2029
gc_values.fill = GDK_TILED;
2032
gc_values.tile = private->bg_pixmap;
2030
gc_values.tile = back_pixmap;
2033
2031
gc_values.ts_x_origin = x_offset;
2034
2032
gc_values.ts_y_origin = y_offset;
2042
2041
GdkGC *gc = gdk_gc_new (window);
2044
gdk_gc_set_foreground (gc, &(private->bg_color));
2043
gdk_window_get_background (window, &bg_color);
2044
gdk_gc_set_foreground (gc, &bg_color);
2083
2083
clear_backing (result, frame->window, rectangle.x, rectangle.y);
2085
region = gdk_region_rectangle (&rectangle);
2085
region = meta_region_new_from_rectangle (&rectangle);
2087
2087
meta_frames_paint_to_drawable (frames, frame, result, region,
2088
2088
-rectangle.x, -rectangle.y);
2090
gdk_region_destroy (region);
2090
meta_region_destroy (region);
2174
clip_to_screen (GdkRegion *region, MetaUIFrame *frame)
2174
clip_to_screen (MetaRegion *region, MetaUIFrame *frame)
2176
2176
GdkRectangle frame_area;
2177
2177
GdkRectangle screen_area = { 0, 0, 0, 0 };
2178
GdkRegion *tmp_region;
2178
MetaRegion *tmp_region;
2180
2180
/* Chop off stuff outside the screen; this optimization
2181
2181
* is crucial to handle huge client windows,
2190
2190
META_CORE_GET_SCREEN_HEIGHT, &screen_area.height,
2191
2191
META_CORE_GET_END);
2193
gdk_region_offset (region, frame_area.x, frame_area.y);
2195
tmp_region = gdk_region_rectangle (&frame_area);
2196
gdk_region_intersect (region, tmp_region);
2197
gdk_region_destroy (tmp_region);
2199
gdk_region_offset (region, - frame_area.x, - frame_area.y);
2193
meta_region_translate (region, frame_area.x, frame_area.y);
2195
tmp_region = meta_region_new_from_rectangle (&frame_area);
2196
meta_region_intersect (region, tmp_region);
2197
meta_region_destroy (tmp_region);
2199
meta_region_translate (region, - frame_area.x, - frame_area.y);
2203
subtract_from_region (GdkRegion *region, GdkDrawable *drawable,
2203
subtract_from_region (MetaRegion *region, GdkDrawable *drawable,
2204
2204
gint x, gint y)
2206
2206
GdkRectangle rect;
2207
GdkRegion *reg_rect;
2207
MetaRegion *reg_rect;
2209
2209
gdk_drawable_get_size (drawable, &rect.width, &rect.height);
2213
reg_rect = gdk_region_rectangle (&rect);
2214
gdk_region_subtract (region, reg_rect);
2215
gdk_region_destroy (reg_rect);
2213
reg_rect = meta_region_new_from_rectangle (&rect);
2214
meta_region_subtract (region, reg_rect);
2215
meta_region_destroy (reg_rect);
2219
2219
cached_pixels_draw (CachedPixels *pixels,
2269
2269
populate_cache (frames, frame);
2271
region = gdk_region_copy (event->region);
2271
region = meta_region_copy (event->region);
2273
2273
pixels = get_cache (frames, frame);
2277
2277
clip_to_screen (region, frame);
2278
2278
meta_frames_paint_to_drawable (frames, frame, frame->window, region, 0, 0);
2280
gdk_region_destroy (region);
2280
meta_region_destroy (region);
2424
2424
GdkRectangle area, *areas;
2426
2426
int screen_width, screen_height;
2427
GdkRegion *edges, *tmp_region;
2427
MetaRegion *edges, *tmp_region;
2428
2428
int top, bottom, left, right;
2430
2430
/* Repaint each side of the frame */
2438
2438
META_CORE_GET_SCREEN_HEIGHT, &screen_height,
2439
2439
META_CORE_GET_END);
2441
edges = gdk_region_copy (region);
2441
edges = meta_region_copy (region);
2443
2443
/* Punch out the client area */
2447
2447
area.width = w;
2448
2448
area.height = h;
2449
tmp_region = gdk_region_rectangle (&area);
2450
gdk_region_subtract (edges, tmp_region);
2451
gdk_region_destroy (tmp_region);
2449
tmp_region = meta_region_new_from_rectangle (&area);
2450
meta_region_subtract (edges, tmp_region);
2451
meta_region_destroy (tmp_region);
2453
2453
/* Now draw remaining portion of region */
2455
gdk_region_get_rectangles (edges, &areas, &n_areas);
2455
meta_region_get_rectangles (edges, &areas, &n_areas);
2457
2457
for (i = 0; i < n_areas; i++)
2558
2558
/* Set A in ARGB to window_background_alpha, if we have ARGB */
2560
2560
visual = gtk_widget_get_visual (GTK_WIDGET (frames));
2561
if (visual->depth == 32) /* we have ARGB */
2561
if (gdk_visual_get_depth (visual) == 32) /* we have ARGB */
2563
2563
color.pixel = (color.pixel & 0xffffff) &
2564
2564
style->window_background_alpha << 24;