mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
...
This commit is contained in:
parent
1d14da4890
commit
46edcc4832
214
src/window.c
214
src/window.c
@ -352,6 +352,7 @@ meta_window_new (MetaDisplay *display, Window xwindow,
|
|||||||
meta_window_ensure_frame (window);
|
meta_window_ensure_frame (window);
|
||||||
|
|
||||||
meta_window_grab_keys (window);
|
meta_window_grab_keys (window);
|
||||||
|
meta_display_grab_window_buttons (window->display, window->xwindow);
|
||||||
|
|
||||||
/* For the workspace, first honor hints,
|
/* For the workspace, first honor hints,
|
||||||
* if that fails put transients with parents,
|
* if that fails put transients with parents,
|
||||||
@ -506,6 +507,7 @@ meta_window_free (MetaWindow *window)
|
|||||||
meta_window_destroy_frame (window);
|
meta_window_destroy_frame (window);
|
||||||
|
|
||||||
meta_window_ungrab_keys (window);
|
meta_window_ungrab_keys (window);
|
||||||
|
meta_display_ungrab_window_buttons (window->display, window->xwindow);
|
||||||
|
|
||||||
meta_display_unregister_x_window (window->display, window->xwindow);
|
meta_display_unregister_x_window (window->display, window->xwindow);
|
||||||
|
|
||||||
@ -1977,6 +1979,11 @@ meta_window_notify_focus (MetaWindow *window,
|
|||||||
* we focus the frame for shaded windows
|
* we focus the frame for shaded windows
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* The event can be FocusIn, FocusOut, or UnmapNotify.
|
||||||
|
* On UnmapNotify we have to pretend it's focus out,
|
||||||
|
* because we won't get a focus out if it occurs, apparently.
|
||||||
|
*/
|
||||||
|
|
||||||
/* We don't ever want to set prev_focus_window to NULL,
|
/* We don't ever want to set prev_focus_window to NULL,
|
||||||
* though it may be NULL due to e.g. only one window ever
|
* though it may be NULL due to e.g. only one window ever
|
||||||
* getting focus, or a window disappearing.
|
* getting focus, or a window disappearing.
|
||||||
@ -1991,8 +1998,10 @@ meta_window_notify_focus (MetaWindow *window,
|
|||||||
* and prev_focus_window gets confused from what the
|
* and prev_focus_window gets confused from what the
|
||||||
* user expects once a keybinding is used.
|
* user expects once a keybinding is used.
|
||||||
*/
|
*/
|
||||||
if (event->xfocus.mode == NotifyGrab ||
|
if ((event->type == FocusIn ||
|
||||||
event->xfocus.mode == NotifyUngrab)
|
event->type == FocusOut) &&
|
||||||
|
(event->xfocus.mode == NotifyGrab ||
|
||||||
|
event->xfocus.mode == NotifyUngrab))
|
||||||
{
|
{
|
||||||
meta_verbose ("Ignoring focus event generated by a grab\n");
|
meta_verbose ("Ignoring focus event generated by a grab\n");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -2016,11 +2025,12 @@ meta_window_notify_focus (MetaWindow *window,
|
|||||||
if (window->frame)
|
if (window->frame)
|
||||||
meta_frame_queue_draw (window->frame);
|
meta_frame_queue_draw (window->frame);
|
||||||
}
|
}
|
||||||
else if (event->type == FocusOut)
|
else if (event->type == FocusOut ||
|
||||||
|
event->type == UnmapNotify)
|
||||||
{
|
{
|
||||||
if (window == window->display->focus_window)
|
if (window == window->display->focus_window)
|
||||||
{
|
{
|
||||||
meta_verbose ("%s is now the previous focus window due to being focused out\n",
|
meta_verbose ("%s is now the previous focus window due to being focused out or unmapped\n",
|
||||||
window->desc);
|
window->desc);
|
||||||
window->display->prev_focus_window = window;
|
window->display->prev_focus_window = window;
|
||||||
|
|
||||||
@ -3592,7 +3602,7 @@ menu_callback (MetaWindowMenu *menu,
|
|||||||
meta_display_begin_grab_op (window->display,
|
meta_display_begin_grab_op (window->display,
|
||||||
window,
|
window,
|
||||||
META_GRAB_OP_KEYBOARD_MOVING,
|
META_GRAB_OP_KEYBOARD_MOVING,
|
||||||
FALSE, 0, 0, None,
|
FALSE, 0, 0,
|
||||||
CurrentTime,
|
CurrentTime,
|
||||||
0, 0);
|
0, 0);
|
||||||
break;
|
break;
|
||||||
@ -3680,6 +3690,200 @@ meta_window_show_menu (MetaWindow *window,
|
|||||||
meta_ui_window_menu_popup (menu, root_x, root_y, button, timestamp);
|
meta_ui_window_menu_popup (menu, root_x, root_y, button, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
window_query_root_pointer (MetaWindow *window,
|
||||||
|
int *x, int *y)
|
||||||
|
{
|
||||||
|
Window root_return, child_return;
|
||||||
|
int root_x_return, root_y_return;
|
||||||
|
int win_x_return, win_y_return;
|
||||||
|
unsigned int mask_return;
|
||||||
|
|
||||||
|
XQueryPointer (window->display->xdisplay,
|
||||||
|
window->xwindow,
|
||||||
|
&root_return,
|
||||||
|
&child_return,
|
||||||
|
&root_x_return,
|
||||||
|
&root_y_return,
|
||||||
|
&win_x_return,
|
||||||
|
&win_y_return,
|
||||||
|
&mask_return);
|
||||||
|
|
||||||
|
if (x)
|
||||||
|
*x = root_x_return;
|
||||||
|
if (y)
|
||||||
|
*y = root_y_return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_move (MetaWindow *window,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
int dx, dy;
|
||||||
|
|
||||||
|
dx = x - window->display->grab_root_x;
|
||||||
|
dy = y - window->display->grab_root_y;
|
||||||
|
|
||||||
|
window->user_has_moved = TRUE;
|
||||||
|
meta_window_move (window,
|
||||||
|
window->display->grab_initial_window_pos.x + dx,
|
||||||
|
window->display->grab_initial_window_pos.y + dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_resize (MetaWindow *window,
|
||||||
|
int x, int y)
|
||||||
|
{
|
||||||
|
int dx, dy;
|
||||||
|
int new_w, new_h;
|
||||||
|
int gravity;
|
||||||
|
|
||||||
|
dx = x - window->display->grab_root_x;
|
||||||
|
dy = y - window->display->grab_root_y;
|
||||||
|
|
||||||
|
new_w = window->display->grab_initial_window_pos.width;
|
||||||
|
new_h = window->display->grab_initial_window_pos.height;
|
||||||
|
|
||||||
|
switch (window->display->grab_op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_RESIZING_SE:
|
||||||
|
case META_GRAB_OP_RESIZING_NE:
|
||||||
|
case META_GRAB_OP_RESIZING_E:
|
||||||
|
new_w += dx;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case META_GRAB_OP_RESIZING_NW:
|
||||||
|
case META_GRAB_OP_RESIZING_SW:
|
||||||
|
case META_GRAB_OP_RESIZING_W:
|
||||||
|
new_w -= dx;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (window->display->grab_op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_RESIZING_SE:
|
||||||
|
case META_GRAB_OP_RESIZING_S:
|
||||||
|
case META_GRAB_OP_RESIZING_SW:
|
||||||
|
new_h += dy;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case META_GRAB_OP_RESIZING_N:
|
||||||
|
case META_GRAB_OP_RESIZING_NE:
|
||||||
|
case META_GRAB_OP_RESIZING_NW:
|
||||||
|
new_h -= dy;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compute gravity of client during operation */
|
||||||
|
gravity = -1;
|
||||||
|
switch (window->display->grab_op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_RESIZING_SE:
|
||||||
|
gravity = NorthWestGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_S:
|
||||||
|
gravity = NorthGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_SW:
|
||||||
|
gravity = NorthEastGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_N:
|
||||||
|
gravity = SouthGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_NE:
|
||||||
|
gravity = SouthWestGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_NW:
|
||||||
|
gravity = SouthEastGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_E:
|
||||||
|
gravity = WestGravity;
|
||||||
|
break;
|
||||||
|
case META_GRAB_OP_RESIZING_W:
|
||||||
|
gravity = EastGravity;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
window->user_has_resized = TRUE;
|
||||||
|
meta_window_resize_with_gravity (window, new_w, new_h, gravity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_handle_mouse_grab_op_event (MetaWindow *window,
|
||||||
|
XEvent *event)
|
||||||
|
{
|
||||||
|
switch (event->type)
|
||||||
|
{
|
||||||
|
case ButtonRelease:
|
||||||
|
meta_display_end_grab_op (window->display, event->xbutton.time);
|
||||||
|
|
||||||
|
switch (window->display->grab_op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_MOVING:
|
||||||
|
update_move (window, event->xbutton.x_root, event->xbutton.y_root);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case META_GRAB_OP_RESIZING_E:
|
||||||
|
case META_GRAB_OP_RESIZING_W:
|
||||||
|
case META_GRAB_OP_RESIZING_S:
|
||||||
|
case META_GRAB_OP_RESIZING_N:
|
||||||
|
case META_GRAB_OP_RESIZING_SE:
|
||||||
|
case META_GRAB_OP_RESIZING_SW:
|
||||||
|
case META_GRAB_OP_RESIZING_NE:
|
||||||
|
case META_GRAB_OP_RESIZING_NW:
|
||||||
|
update_resize (window, event->xbutton.x_root, event->xbutton.y_root);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MotionNotify:
|
||||||
|
switch (window->display->grab_op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_MOVING:
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
window_query_root_pointer (window, &x, &y);
|
||||||
|
update_move (window, x, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case META_GRAB_OP_RESIZING_E:
|
||||||
|
case META_GRAB_OP_RESIZING_W:
|
||||||
|
case META_GRAB_OP_RESIZING_S:
|
||||||
|
case META_GRAB_OP_RESIZING_N:
|
||||||
|
case META_GRAB_OP_RESIZING_SE:
|
||||||
|
case META_GRAB_OP_RESIZING_SW:
|
||||||
|
case META_GRAB_OP_RESIZING_NE:
|
||||||
|
case META_GRAB_OP_RESIZING_NW:
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
window_query_root_pointer (window, &x, &y);
|
||||||
|
update_resize (window, x, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_window_shares_some_workspace (MetaWindow *window,
|
meta_window_shares_some_workspace (MetaWindow *window,
|
||||||
MetaWindow *with)
|
MetaWindow *with)
|
||||||
|
Loading…
Reference in New Issue
Block a user