From 7fbbd0200fc914b6d1899564344e758b408b90af Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 5 May 2002 00:21:17 +0000 Subject: [PATCH] disable automatic GTK double buffering, since it resulted in gigantic 2002-05-04 Havoc Pennington * src/frames.c (meta_frames_init): disable automatic GTK double buffering, since it resulted in gigantic backing pixmaps the size of the whole screen. (meta_frames_paint_to_drawable): change to take a region argument; punch the client area out of the expose region, then iterate over rectangles in the region and draw each, manually doing begin_paint_rect. Results in 4 long thin backing pixmaps per frame repaint, instead of one large backing pixmap. Suggested by Owen. --- ChangeLog | 12 +++++++++ src/frames.c | 70 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index e89b290c9..5c1255040 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2002-05-04 Havoc Pennington + + * src/frames.c (meta_frames_init): disable automatic GTK double + buffering, since it resulted in gigantic backing pixmaps the size + of the whole screen. + (meta_frames_paint_to_drawable): change to take a region argument; + punch the client area out of the expose region, then iterate over + rectangles in the region and draw each, manually doing + begin_paint_rect. Results in 4 long thin backing pixmaps + per frame repaint, instead of one large backing pixmap. + Suggested by Owen. + 2002-05-05 Bastien Nocera * src/workspace.c: (meta_workspace_get_neighbor): diff --git a/src/frames.c b/src/frames.c index 67f63def1..ab56bd541 100644 --- a/src/frames.c +++ b/src/frames.c @@ -56,7 +56,7 @@ static gboolean meta_frames_leave_notify_event (GtkWidget *widget, static void meta_frames_paint_to_drawable (MetaFrames *frames, MetaUIFrame *frame, GdkDrawable *drawable, - GdkRectangle *area); + GdkRegion *region); static void meta_frames_calc_geometry (MetaFrames *frames, MetaUIFrame *frame, @@ -166,6 +166,8 @@ meta_frames_init (MetaFrames *frames) frames->tooltip_timeout = 0; frames->expose_delay_count = 0; + + gtk_widget_set_double_buffered (GTK_WIDGET (frames), FALSE); } static void @@ -1275,7 +1277,7 @@ meta_frames_expose_event (GtkWidget *widget, return TRUE; } - meta_frames_paint_to_drawable (frames, frame, frame->window, &event->area); + meta_frames_paint_to_drawable (frames, frame, frame->window, event->region); return TRUE; } @@ -1284,7 +1286,7 @@ static void meta_frames_paint_to_drawable (MetaFrames *frames, MetaUIFrame *frame, GdkDrawable *drawable, - GdkRectangle *area) + GdkRegion *region) { GtkWidget *widget; MetaFrameFlags flags; @@ -1295,6 +1297,12 @@ meta_frames_paint_to_drawable (MetaFrames *frames, MetaButtonState button_states[META_BUTTON_TYPE_LAST]; Window grab_frame; int i; + int top, bottom, left, right; + GdkRegion *edges; + GdkRegion *client; + GdkRectangle area; + GdkRectangle *areas; + int n_areas; widget = GTK_WIDGET (frames); @@ -1364,19 +1372,51 @@ meta_frames_paint_to_drawable (MetaFrames *frames, &w, &h); meta_frames_ensure_layout (frames, frame); + + meta_theme_get_frame_borders (meta_theme_get_current (), + type, frame->text_height, flags, + &top, &bottom, &left, &right); + + /* Repaint each side of the frame */ - meta_theme_draw_frame (meta_theme_get_current (), - widget, - drawable, - area, - 0, 0, - type, - flags, - w, h, - frame->layout, - frame->text_height, - button_states, - mini_icon, icon); + edges = gdk_region_copy (region); + area.x = left; + area.y = top; + area.width = w; + area.height = h; + client = gdk_region_rectangle (&area); + gdk_region_subtract (edges, client); + gdk_region_destroy (client); + + gdk_region_get_rectangles (edges, &areas, &n_areas); + + i = 0; + while (i < n_areas) + { + if (GDK_IS_WINDOW (drawable)) + gdk_window_begin_paint_rect (drawable, &areas[i]); + + meta_theme_draw_frame (meta_theme_get_current (), + widget, + drawable, + &areas[i], + 0, 0, + type, + flags, + w, h, + frame->layout, + frame->text_height, + button_states, + mini_icon, icon); + + if (GDK_IS_WINDOW (drawable)) + gdk_window_end_paint (drawable); + + ++i; + } + + gdk_region_destroy (edges); + g_free (areas); } static gboolean