From f143efa498a8b41d8f85e6b12316607a983452cf Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 20 Jul 2003 15:45:48 +0000 Subject: "Reduced resources" mode based on wireframe patch from Erwann Chenede. 2003-07-18 Havoc Pennington "Reduced resources" mode based on wireframe patch from Erwann Chenede. Still pretty buggy. (This is on a branch only for now, due to feature freeze.) * src/keybindings.c (process_keyboard_move_grab) (process_keyboard_resize_grab): add gruesome wireframe hacks * src/display.c (meta_display_end_grab_op): end wireframe (meta_display_begin_grab_op): begin wireframe * src/effects.c (meta_effects_end_wireframe) (meta_effects_update_wireframe, meta_effects_begin_wireframe): routines to draw the wireframe stuff * src/window.c (window_should_be_showing): hide window when doing wireframe, commented out as it breaks grab * src/window.c (meta_window_refresh_resize_popup): handle wireframe * src/screen.c (meta_screen_new): create a screen->root_xor_gc for use in drawing wireframes * src/frames.c (meta_frames_push_delay_exposes): repaint everything before we delay --- ChangeLog | 25 +++++++++++++++++++++++++ src/display.c | 40 +++++++++++++++++++++++++++++++++++++++- src/display.h | 4 +++- src/effects.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/effects.h | 8 ++++++++ src/frames.c | 7 +++++++ 6 files changed, 123 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4fb9569e..854dce79 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2003-07-18 Havoc Pennington + + "Reduced resources" mode based on wireframe patch from + Erwann Chenede. Still pretty buggy. + + * src/keybindings.c (process_keyboard_move_grab) + (process_keyboard_resize_grab): add gruesome wireframe hacks + + * src/display.c (meta_display_end_grab_op): end wireframe + (meta_display_begin_grab_op): begin wireframe + + * src/effects.c (meta_effects_end_wireframe) + (meta_effects_update_wireframe, meta_effects_begin_wireframe): + routines to draw the wireframe stuff + + * src/window.c (window_should_be_showing): hide window when + doing wireframe, commented out as it breaks grab + * src/window.c (meta_window_refresh_resize_popup): handle wireframe + + * src/screen.c (meta_screen_new): create a screen->root_xor_gc + for use in drawing wireframes + + * src/frames.c (meta_frames_push_delay_exposes): repaint + everything before we delay + 2003-07-15 Havoc Pennington * NEWS: update diff --git a/src/display.c b/src/display.c index 2856dbc7..a2cefb46 100644 --- a/src/display.c +++ b/src/display.c @@ -35,6 +35,7 @@ #include "resizepopup.h" #include "workspace.h" #include "bell.h" +#include "effects.h" #include #include #ifdef HAVE_SOLARIS_XINERAMA @@ -2858,8 +2859,31 @@ meta_display_begin_grab_op (MetaDisplay *display, &display->grab_initial_window_pos.x, &display->grab_initial_window_pos.y); + display->grab_wireframe_active = + meta_grab_op_is_resizing (display->grab_op) || + meta_grab_op_is_moving (display->grab_op); + + if (display->grab_wireframe_active) + { + /* FIXME we should really display the outer frame rect, + * but that complicates all the move/resize code since + * it works in terms of window rect. + */ + display->grab_wireframe_rect = window->rect; + if (window->frame) + { + display->grab_wireframe_rect.x += window->frame->rect.x; + display->grab_wireframe_rect.y += window->frame->rect.y; + } + + meta_window_calc_showing (display->grab_window); + meta_effects_begin_wireframe (display->grab_window->screen, + &display->grab_wireframe_rect); + } + #ifdef HAVE_XSYNC - if (meta_grab_op_is_resizing (display->grab_op) && + if (!display->grab_wireframe_active && + meta_grab_op_is_resizing (display->grab_op) && display->grab_window->update_counter != None) { XSyncAlarmAttributes values; @@ -2989,6 +3013,20 @@ meta_display_end_grab_op (MetaDisplay *display, display->grab_update_alarm); } #endif /* HAVE_XSYNC */ + + if (display->grab_wireframe_active) + { + display->grab_wireframe_active = FALSE; + meta_effects_end_wireframe (display->grab_window->screen, + &display->grab_wireframe_rect); + meta_window_move_resize (display->grab_window, + TRUE, + display->grab_wireframe_rect.x, + display->grab_wireframe_rect.y, + display->grab_wireframe_rect.width, + display->grab_wireframe_rect.height); + meta_window_calc_showing (display->grab_window); + } display->grab_window = NULL; display->grab_screen = NULL; diff --git a/src/display.h b/src/display.h index 4c880025..16a11646 100644 --- a/src/display.h +++ b/src/display.h @@ -238,11 +238,13 @@ struct _MetaDisplay gulong grab_mask; guint grab_have_pointer : 1; guint grab_have_keyboard : 1; + guint grab_wireframe_active : 1; + MetaRectangle grab_wireframe_rect; MetaRectangle grab_initial_window_pos; MetaResizePopup *grab_resize_popup; GTimeVal grab_last_moveresize_time; Time grab_motion_notify_time; - + /* we use property updates as sentinels for certain window focus events * to avoid some race conditions on EnterNotify events */ diff --git a/src/effects.c b/src/effects.c index 18fa5947..0ed4fae7 100644 --- a/src/effects.c +++ b/src/effects.c @@ -409,5 +409,46 @@ meta_effects_draw_box_animation (MetaScreen *screen, XFlush (context->screen->display->xdisplay); } +void +meta_effects_begin_wireframe (MetaScreen *screen, + const MetaRectangle *rect) +{ + /* Grab the X server to avoid screen dirt */ + meta_display_grab (screen->display); + meta_ui_push_delay_exposes (screen->ui); + + meta_effects_update_wireframe (screen, NULL, rect); +} + +void +meta_effects_update_wireframe (MetaScreen *screen, + const MetaRectangle *old_rect, + const MetaRectangle *new_rect) +{ + if (old_rect) + XDrawRectangle (screen->display->xdisplay, + screen->xroot, + screen->root_xor_gc, + old_rect->x, old_rect->y, + old_rect->width, old_rect->height); + + if (new_rect) + XDrawRectangle (screen->display->xdisplay, + screen->xroot, + screen->root_xor_gc, + new_rect->x, new_rect->y, + new_rect->width, new_rect->height); + + XFlush (screen->display->xdisplay); +} +void +meta_effects_end_wireframe (MetaScreen *screen, + const MetaRectangle *old_rect) +{ + meta_effects_update_wireframe (screen, old_rect, NULL); + + meta_display_ungrab (screen->display); + meta_ui_pop_delay_exposes (screen->ui); +} diff --git a/src/effects.h b/src/effects.h index 744ffc12..82dc0c51 100644 --- a/src/effects.h +++ b/src/effects.h @@ -41,4 +41,12 @@ void meta_effects_draw_box_animation (MetaScreen *screen, double seconds_duration, MetaBoxAnimType anim_type); +void meta_effects_begin_wireframe (MetaScreen *screen, + const MetaRectangle *rect); +void meta_effects_update_wireframe (MetaScreen *screen, + const MetaRectangle *old_rect, + const MetaRectangle *new_rect); +void meta_effects_end_wireframe (MetaScreen *screen, + const MetaRectangle *old_rect); + #endif /* META_EFFECTS_H */ diff --git a/src/frames.c b/src/frames.c index 2805d9e0..c2b66084 100644 --- a/src/frames.c +++ b/src/frames.c @@ -2093,6 +2093,13 @@ get_control (MetaFrames *frames, void meta_frames_push_delay_exposes (MetaFrames *frames) { + if (frames->expose_delay_count == 0) + { + /* Make sure we've repainted things */ + gdk_window_process_all_updates (); + XFlush (gdk_display); + } + frames->expose_delay_count += 1; } -- cgit v1.2.1