mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 15:40:41 -05:00
Actually commit the stuff mentioned in the last ChangeLog entry.
2005-05-26 Ray Strode <rstrode@redhat.com> Actually commit the stuff mentioned in the last ChangeLog entry.
This commit is contained in:
parent
2e0d27d0f1
commit
7b416a0a2d
@ -1,3 +1,8 @@
|
||||
2005-05-26 Ray Strode <rstrode@redhat.com>
|
||||
|
||||
Actually commit the stuff mentioned in the last
|
||||
ChangeLog entry.
|
||||
|
||||
2005-05-26 Ray Strode <rstrode@redhat.com>
|
||||
|
||||
Add a resize popup when resizing constrained
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -28,6 +28,8 @@
|
||||
#include <X11/extensions/shape.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
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);
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
155
src/window.c
155
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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user