diff --git a/ChangeLog b/ChangeLog index 989b014d3..4789026cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-05-26 Ray Strode + + Actually commit the stuff mentioned in the last + ChangeLog entry. + 2005-05-26 Ray Strode Add a resize popup when resizing constrained diff --git a/src/display.c b/src/display.c index af83c7a3b..358024fd8 100644 --- a/src/display.c +++ b/src/display.c @@ -3265,23 +3265,8 @@ meta_display_begin_grab_op (MetaDisplay *display, if (display->grab_wireframe_active) { - MetaRectangle xor_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_window_get_xor_rect (window, &display->grab_wireframe_rect, - &xor_rect); - - meta_effects_begin_wireframe (display->grab_window->screen, - &xor_rect); - display->grab_wireframe_last_xor_rect = xor_rect; + meta_window_begin_wireframe (window); } #ifdef HAVE_XSYNC @@ -3432,8 +3417,8 @@ meta_display_end_grab_op (MetaDisplay *display, if (display->grab_wireframe_active) { display->grab_wireframe_active = FALSE; - meta_effects_end_wireframe (display->grab_window->screen, - &display->grab_wireframe_last_xor_rect); + meta_window_end_wireframe (display->grab_window); + if (!display->grab_was_cancelled) meta_window_move_resize (display->grab_window, TRUE, diff --git a/src/display.h b/src/display.h index 1136c72d5..bd6f49eab 100644 --- a/src/display.h +++ b/src/display.h @@ -274,6 +274,8 @@ struct _MetaDisplay MetaResizePopup *grab_resize_popup; GTimeVal grab_last_moveresize_time; Time grab_motion_notify_time; + int grab_wireframe_last_display_width; + int grab_wireframe_last_display_height; GList* grab_old_window_stacking; /* we use property updates as sentinels for certain window focus events diff --git a/src/effects.c b/src/effects.c index 0f5ccd4f3..2d1baf4ed 100644 --- a/src/effects.c +++ b/src/effects.c @@ -28,6 +28,8 @@ #include #endif +#include + typedef enum { META_ANIMATION_DRAW_ROOT, @@ -429,18 +431,24 @@ meta_effects_draw_box_animation (MetaScreen *screen, void meta_effects_begin_wireframe (MetaScreen *screen, - const MetaRectangle *rect) + const MetaRectangle *rect, + int width, + int height) { /* 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); + meta_effects_update_wireframe (screen, + NULL, -1, -1, + rect, width, height); } static void draw_xor_rect (MetaScreen *screen, - const MetaRectangle *rect) + const MetaRectangle *rect, + int width, + int height) { /* The lines in the center can't overlap the rectangle or each * other, or the XOR gets reversed. So we have to draw things @@ -461,7 +469,69 @@ draw_xor_rect (MetaScreen *screen, if (rect->width < (LINE_WIDTH * 4) || rect->height < (LINE_WIDTH * 4)) return; - + + if ((width >= 0) && (height >= 0)) + { + int box_width, box_height; + XGCValues gc_values = { 0 }; + + if (XGetGCValues (screen->display->xdisplay, + screen->root_xor_gc, + GCFont, &gc_values)) + { + char *text; + int text_length; + + XFontStruct *font_struct; + int text_width, text_height; + int box_x, box_y; + + font_struct = XQueryFont (screen->display->xdisplay, + gc_values.font); + + if (font_struct != NULL) + { + text = g_strdup_printf ("%d x %d", width, height); + text_length = strlen (text); + + text_width = text_length * font_struct->max_bounds.width; + text_height = font_struct->max_bounds.descent + + font_struct->max_bounds.ascent; + + box_width = text_width + 2 * LINE_WIDTH; + box_height = text_height + 2 * LINE_WIDTH; + + box_x = rect->x + (rect->width - box_width) / 2; + box_y = rect->y + (rect->height - box_height) / 2; + + if ((box_width < rect->width) && + (box_height < rect->height)) + { + XFillRectangle (screen->display->xdisplay, + screen->xroot, + screen->root_xor_gc, + box_x, box_y, + box_width, box_height); + XDrawString (screen->display->xdisplay, + screen->xroot, + screen->root_xor_gc, + box_x + LINE_WIDTH, + box_y + LINE_WIDTH + font_struct->max_bounds.ascent, + text, text_length); + } + + g_free (text); + } + } + + if ((box_width + LINE_WIDTH) >= (rect->width / 3)) + return; + + if ((box_height + LINE_WIDTH) >= (rect->height / 3)) + return; + + } + /* Two vertical lines at 1/3 and 2/3 */ segments[0].x1 = rect->x + rect->width / 3; segments[0].y1 = rect->y + LINE_WIDTH / 2 + LINE_WIDTH % 2; @@ -511,22 +581,30 @@ draw_xor_rect (MetaScreen *screen, void meta_effects_update_wireframe (MetaScreen *screen, const MetaRectangle *old_rect, - const MetaRectangle *new_rect) + int old_width, + int old_height, + const MetaRectangle *new_rect, + int new_width, + int new_height) { if (old_rect) - draw_xor_rect (screen, old_rect); + draw_xor_rect (screen, old_rect, old_width, old_height); if (new_rect) - draw_xor_rect (screen, new_rect); + draw_xor_rect (screen, new_rect, new_width, new_height); XFlush (screen->display->xdisplay); } void meta_effects_end_wireframe (MetaScreen *screen, - const MetaRectangle *old_rect) + const MetaRectangle *old_rect, + int old_width, + int old_height) { - meta_effects_update_wireframe (screen, old_rect, NULL); + meta_effects_update_wireframe (screen, + old_rect, old_width, old_height, + NULL, -1, -1); meta_display_ungrab (screen->display); meta_ui_pop_delay_exposes (screen->ui); diff --git a/src/effects.h b/src/effects.h index 38cec4bfc..eb312cb8d 100644 --- a/src/effects.h +++ b/src/effects.h @@ -42,11 +42,19 @@ void meta_effects_draw_box_animation (MetaScreen *screen, MetaBoxAnimType anim_type); void meta_effects_begin_wireframe (MetaScreen *screen, - const MetaRectangle *rect); + const MetaRectangle *rect, + int width, + int height); void meta_effects_update_wireframe (MetaScreen *screen, const MetaRectangle *old_rect, - const MetaRectangle *new_rect); + int old_width, + int old_height, + const MetaRectangle *new_rect, + int new_width, + int new_height); void meta_effects_end_wireframe (MetaScreen *screen, - const MetaRectangle *old_rect); + const MetaRectangle *old_rect, + int width, + int height); #endif /* META_EFFECTS_H */ diff --git a/src/keybindings.c b/src/keybindings.c index ffbab6b4b..d39ee5292 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -1825,18 +1825,9 @@ process_keyboard_move_grab (MetaDisplay *display, x, y); if (display->grab_wireframe_active) { - MetaRectangle new_xor; - - display->grab_wireframe_rect.x = x; - display->grab_wireframe_rect.y = y; - - meta_window_get_xor_rect (window, &display->grab_wireframe_rect, - &new_xor); - - meta_effects_update_wireframe (window->screen, - &display->grab_wireframe_last_xor_rect, - &new_xor); - display->grab_wireframe_last_xor_rect = new_xor; + meta_window_update_wireframe (window, x, y, + display->grab_wireframe_rect.width, + display->grab_wireframe_rect.height); } else { @@ -2286,24 +2277,7 @@ process_keyboard_resize_grab (MetaDisplay *display, if (display->grab_wireframe_active) { - MetaRectangle new_xor; - - window->display->grab_wireframe_rect.x = x; - window->display->grab_wireframe_rect.y = y; - window->display->grab_wireframe_rect.width = width; - window->display->grab_wireframe_rect.height = height; - - meta_window_get_xor_rect (window, - &window->display->grab_wireframe_rect, - &new_xor); - - meta_effects_update_wireframe (window->screen, - &window->display->grab_wireframe_last_xor_rect, - &new_xor); - window->display->grab_wireframe_last_xor_rect = new_xor; - - /* do this after drawing the wires, so we don't draw over it */ - meta_window_refresh_resize_popup (window); + meta_window_update_wireframe (window, x, y, width, height); } else { diff --git a/src/screen.c b/src/screen.c index 8bba50667..5da715531 100644 --- a/src/screen.c +++ b/src/screen.c @@ -551,10 +551,12 @@ meta_screen_new (MetaDisplay *display, gc_values.subwindow_mode = IncludeInferiors; gc_values.function = GXinvert; gc_values.line_width = META_WIREFRAME_XOR_LINE_WIDTH; + gc_values.font = XLoadFont (screen->display->xdisplay, + "-misc-fixed-*-*-*-*-16-*-*-*-*-*-*-*"); screen->root_xor_gc = XCreateGC (screen->display->xdisplay, screen->xroot, - GCSubwindowMode | GCFunction | GCLineWidth, + GCSubwindowMode | GCFunction | GCLineWidth | GCFont, &gc_values); } diff --git a/src/window.c b/src/window.c index 31930431d..c6afcc8e7 100644 --- a/src/window.c +++ b/src/window.c @@ -2892,7 +2892,10 @@ meta_window_move_resize_internal (MetaWindow *window, meta_topic (META_DEBUG_GEOMETRY, "Size/position not modified\n"); } - meta_window_refresh_resize_popup (window); + if (window->display->grab_wireframe_active) + meta_window_update_wireframe (window, root_x_nw, root_y_nw, w, h); + else + meta_window_refresh_resize_popup (window); /* Invariants leaving this function are: * a) window->rect and frame->rect reflect the actual @@ -3343,6 +3346,105 @@ meta_window_get_xor_rect (MetaWindow *window, *xor_rect = *grab_wireframe_rect; } +/* Figure out the numbers that show up in the + * resize popup when in reduced resources mode. + */ +static void +meta_window_get_wireframe_geometry (MetaWindow *window, + int *width, + int *height) +{ + + if (!window->display->grab_wireframe_active) + return; + + if ((width == NULL) || (height == NULL)) + return; + + if ((window->display->grab_window->size_hints.width_inc <= 1) || + (window->display->grab_window->size_hints.height_inc <= 1)) + { + *width = -1; + *height = -1; + return; + } + + *width = window->display->grab_wireframe_rect.width - + window->display->grab_window->size_hints.base_width; + *width /= window->display->grab_window->size_hints.width_inc; + + *height = window->display->grab_wireframe_rect.height - + window->display->grab_window->size_hints.base_height; + *height /= window->display->grab_window->size_hints.height_inc; +} + +void +meta_window_begin_wireframe (MetaWindow *window) +{ + + MetaRectangle new_xor; + int display_width, display_height; + + window->display->grab_wireframe_rect = window->rect; + + if (window->frame) + { + window->display->grab_wireframe_rect.x += window->frame->rect.x; + window->display->grab_wireframe_rect.y += window->frame->rect.y; + } + + meta_window_get_xor_rect (window, &window->display->grab_wireframe_rect, + &new_xor); + meta_window_get_wireframe_geometry (window, &display_width, &display_height); + + meta_effects_begin_wireframe (window->screen, + &new_xor, display_width, display_height); + + window->display->grab_wireframe_last_xor_rect = new_xor; + window->display->grab_wireframe_last_display_width = display_width; + window->display->grab_wireframe_last_display_height = display_height; +} + +void +meta_window_update_wireframe (MetaWindow *window, + int x, + int y, + int width, + int height) +{ + + MetaRectangle new_xor; + int display_width, display_height; + + window->display->grab_wireframe_rect.x = x; + window->display->grab_wireframe_rect.y = y; + window->display->grab_wireframe_rect.width = width; + window->display->grab_wireframe_rect.height = height; + + meta_window_get_xor_rect (window, &window->display->grab_wireframe_rect, + &new_xor); + meta_window_get_wireframe_geometry (window, &display_width, &display_height); + + meta_effects_update_wireframe (window->screen, + &window->display->grab_wireframe_last_xor_rect, + window->display->grab_wireframe_last_display_width, + window->display->grab_wireframe_last_display_height, + &new_xor, display_width, display_height); + + window->display->grab_wireframe_last_xor_rect = new_xor; + window->display->grab_wireframe_last_display_width = display_width; + window->display->grab_wireframe_last_display_height = display_height; +} + +void +meta_window_end_wireframe (MetaWindow *window) +{ + meta_effects_end_wireframe (window->display->grab_window->screen, + &window->display->grab_wireframe_last_xor_rect, + window->display->grab_wireframe_last_display_width, + window->display->grab_wireframe_last_display_height); +} + const char* meta_window_get_startup_id (MetaWindow *window) { @@ -6386,19 +6488,9 @@ update_move (MetaWindow *window, /* FIXME Horribly broken, does not honor position * constraints */ - MetaRectangle new_xor; - - window->display->grab_wireframe_rect.x = new_x; - window->display->grab_wireframe_rect.y = new_y; - - meta_window_get_xor_rect (window, - &window->display->grab_wireframe_rect, - &new_xor); - - meta_effects_update_wireframe (window->screen, - &window->display->grab_wireframe_last_xor_rect, - &new_xor); - window->display->grab_wireframe_last_xor_rect = new_xor; + meta_window_update_wireframe (window, new_x, new_y, + window->display->grab_wireframe_rect.width, + window->display->grab_wireframe_rect.height); } else { @@ -6536,6 +6628,9 @@ update_resize (MetaWindow *window, if (window->display->grab_wireframe_active) { + if ((new_x + new_w <= new_x) || (new_y + new_h <= new_y)) + return; + /* FIXME This is crap. For example, the wireframe isn't * constrained in the way that a real resize would be. An * obvious elegant solution is to unmap the window during @@ -6543,26 +6638,7 @@ update_resize (MetaWindow *window, * confuses broken clients that have problems with opaque * resize, they probably don't track their visibility. */ - MetaRectangle new_xor; - - if ((new_x + new_w <= new_x) || (new_y + new_h <= new_y)) - return; - - window->display->grab_wireframe_rect.x = new_x; - window->display->grab_wireframe_rect.y = new_y; - window->display->grab_wireframe_rect.width = new_w; - window->display->grab_wireframe_rect.height = new_h; - - meta_window_get_xor_rect (window, &window->display->grab_wireframe_rect, - &new_xor); - - meta_effects_update_wireframe (window->screen, - &window->display->grab_wireframe_last_xor_rect, - &new_xor); - window->display->grab_wireframe_last_xor_rect = new_xor; - - /* do this after drawing the wires, so we don't draw over it */ - meta_window_refresh_resize_popup (window); + meta_window_update_wireframe (window, new_x, new_y, new_w, new_h); } else { @@ -6955,12 +7031,15 @@ meta_window_refresh_resize_popup (MetaWindow *window) if (window->display->grab_window != window) return; - /* FIXME for now we bail out when doing wireframe, because our - * server grab keeps us from being able to redraw the stuff - * underneath the resize popup. + /* We shouldn't ever get called when the wireframe is active + * because that's handled by a different code path in effects.c */ if (window->display->grab_wireframe_active) - return; + { + meta_topic (META_DEBUG_WINDOW_OPS, + "refresh_resize_popup called when wireframe active\n"); + return; + } switch (window->display->grab_op) { diff --git a/src/window.h b/src/window.h index e9efa0c4e..a934bed0c 100644 --- a/src/window.h +++ b/src/window.h @@ -432,6 +432,14 @@ void meta_window_get_outer_rect (MetaWindow *window, void meta_window_get_xor_rect (MetaWindow *window, const MetaRectangle *grab_wireframe_rect, MetaRectangle *xor_rect); +void meta_window_begin_wireframe (MetaWindow *window); +void meta_window_update_wireframe (MetaWindow *window, + int x, + int y, + int width, + int height); +void meta_window_end_wireframe (MetaWindow *window); + void meta_window_delete (MetaWindow *window, Time timestamp); void meta_window_kill (MetaWindow *window);