summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-07-20 15:45:48 +0000
committerHavoc Pennington <hp@src.gnome.org>2003-07-20 15:45:48 +0000
commitf143efa498a8b41d8f85e6b12316607a983452cf (patch)
treeed97b7fab9ca11e27e8cde218c08d4d4e307aff3
parentf7e42bc4c445d120bbde017dbd55aae65e635a5b (diff)
downloadmetacity-f143efa498a8b41d8f85e6b12316607a983452cf.tar.gz
"Reduced resources" mode based on wireframe patch from Erwann Chenede.
2003-07-18 Havoc Pennington <hp@redhat.com> "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
-rw-r--r--ChangeLog25
-rw-r--r--src/display.c40
-rw-r--r--src/display.h4
-rw-r--r--src/effects.c41
-rw-r--r--src/effects.h8
-rw-r--r--src/frames.c7
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 <hp@redhat.com>
+
+ "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 <hp@redhat.com>
* 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 <X11/Xatom.h>
#include <X11/cursorfont.h>
#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;
}