diff options
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 630 |
1 files changed, 302 insertions, 328 deletions
diff --git a/src/window.c b/src/window.c index 807b10ac..a080becc 100644 --- a/src/window.c +++ b/src/window.c @@ -106,6 +106,7 @@ static void update_move (MetaWindow *window, int y); static gboolean update_move_timeout (gpointer data); static void update_resize (MetaWindow *window, + MetaDevInfo *dev, gboolean snap, int x, int y, @@ -493,9 +494,11 @@ meta_window_new_with_attrs (MetaDisplay *display, window->denied_focus_and_not_transient = FALSE; window->unmanaging = FALSE; window->is_in_queues = 0; - window->keys_grabbed = FALSE; +// window->keys_grabbed = FALSE; + meta_devices_list_create (&window->keys_grabbed); window->grab_on_frame = FALSE; - window->all_keys_grabbed = FALSE; +// window->all_keys_grabbed = FALSE; + meta_devices_list_create (&window->all_keys_grabbed); window->withdrawn = FALSE; window->initial_workspace_set = FALSE; window->initial_timestamp_set = FALSE; @@ -1025,9 +1028,9 @@ meta_window_free (MetaWindow *window, "Focusing default window since expected focus window freed %s\n", window->desc); window->display->expected_focus_window = NULL; - for (idev = 0; idev < window->display->devices->keybsUsed; idev++) + for (idev = 0; idev < window->focused_devices_used; idev++) meta_workspace_focus_default_window (window->screen->active_workspace, - &window->display->devices->keyboards[idev], + window->focused_devices[idev], window, timestamp); } @@ -1048,11 +1051,15 @@ meta_window_free (MetaWindow *window, window->desc); invalidate_work_areas (window); } - - if (window->display->grab_window == window) - meta_display_end_grab_op (window->display, NULL, timestamp); + + for (idev = 0; idev < window->display->devices->miceUsed; idev++) + if (window->display->devices->mice[idev].grab_op) + if (window->display->devices->mice[idev].grab_op->window == window) + meta_display_end_grab_op (window->display, + &window->display->devices->mice[idev], + timestamp); - g_assert (window->display->grab_window != window); +// g_assert (window->display->grab_window != window); if (window->display->focus_window == window) window->display->focus_window = NULL; @@ -1132,6 +1139,7 @@ meta_window_free (MetaWindow *window, } for (idev = 0; idev < window->display->devices->keybsUsed; idev++) +#warning UNGRAB STUFF HERE!!! { meta_window_ungrab_keys (window, &window->display->devices->keyboards[idev]); @@ -2593,10 +2601,10 @@ meta_window_unmaximize (MetaWindow *window, * the workspace, since that's where it was when the grab op * started. So we need to update the grab state. */ - if (meta_grab_op_is_moving (window->display->grab_op) && - window->display->grab_window == window) + if (meta_grab_op_is_moving (dev->grab_op->op) && + dev->grab_op->window == window) { - window->display->grab_anchor_window_pos = target_rect; + dev->grab_op->anchor_window_pos = target_rect; } meta_window_move_resize (window, @@ -2607,9 +2615,9 @@ meta_window_unmaximize (MetaWindow *window, target_rect.width, target_rect.height); - if (window->display->grab_wireframe_active) + if (dev->grab_op->wireframe_active) { - window->display->grab_wireframe_rect = target_rect; + dev->grab_op->wireframe_rect = target_rect; } recalc_window_features (window); @@ -3432,7 +3440,8 @@ meta_window_move_resize_internal (MetaWindow *window, if (configure_frame_first && window->frame) meta_frame_sync_to_window (window->frame, gravity, - need_move_frame, need_resize_frame); + need_move_frame, need_resize_frame, + (dev->grab_op) ? dev->grab_op->window : NULL); values.border_width = 0; values.x = client_move_x; @@ -3466,7 +3475,7 @@ meta_window_move_resize_internal (MetaWindow *window, #ifdef HAVE_XSYNC if (window->sync_request_counter != None && - window->display->grab_sync_request_alarm != None && + dev->grab_op->sync_request_alarm != None && window->sync_request_time.tv_usec == 0 && window->sync_request_time.tv_sec == 0) { @@ -3489,7 +3498,8 @@ meta_window_move_resize_internal (MetaWindow *window, if (!configure_frame_first && window->frame) meta_frame_sync_to_window (window->frame, gravity, - need_move_frame, need_resize_frame); + need_move_frame, need_resize_frame, + dev->grab_op->window); /* Put gravity back to be nice to lesser window managers */ if (use_static_gravity) @@ -3521,10 +3531,13 @@ meta_window_move_resize_internal (MetaWindow *window, meta_topic (META_DEBUG_GEOMETRY, "Size/position not modified\n"); } - if (window->display->grab_wireframe_active) - meta_window_update_wireframe (window, root_x_nw, root_y_nw, w, h); + if (dev->grab_op) + { + if (dev->grab_op->wireframe_active) + meta_window_update_wireframe (window, dev, root_x_nw, root_y_nw, w, h); + } else - meta_window_refresh_resize_popup (window); + meta_window_refresh_resize_popup (window, dev); /* Invariants leaving this function are: * a) window->rect and frame->rect reflect the actual @@ -3554,6 +3567,7 @@ meta_window_resize (MetaWindow *window, } void +/* XXX: consider changing the header! its all inside dev->! */ meta_window_move (MetaWindow *window, MetaDevInfo *dev, gboolean user_op, @@ -3572,6 +3586,7 @@ meta_window_move (MetaWindow *window, } void +/* XXX: consider changing prototype! */ meta_window_move_resize (MetaWindow *window, MetaDevInfo *dev, gboolean user_op, @@ -3834,94 +3849,98 @@ meta_window_get_xor_rect (MetaWindow *window, */ static void meta_window_get_wireframe_geometry (MetaWindow *window, + MetaDevInfo *dev, int *width, int *height) { - - if (!window->display->grab_wireframe_active) + /* Do I need to check if dev->grab_op ?? */ + if (!dev->grab_op->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)) + if ((dev->grab_op->window->size_hints.width_inc <= 1) || + (dev->grab_op->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; + *width = dev->grab_op->wireframe_rect.width - + dev->grab_op->window->size_hints.base_width; + *width /= dev->grab_op->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; + *height = dev->grab_op->wireframe_rect.height - + dev->grab_op->window->size_hints.base_height; + *height /= dev->grab_op->window->size_hints.height_inc; } /* XXX META_EFFECT_ALT_TAB, well, this and others */ void -meta_window_begin_wireframe (MetaWindow *window) +meta_window_begin_wireframe (MetaWindow *window, MetaDevInfo *dev) { MetaRectangle new_xor; int display_width, display_height; meta_window_get_client_root_coords (window, - &window->display->grab_wireframe_rect); + &dev->grab_op->wireframe_rect); - meta_window_get_xor_rect (window, &window->display->grab_wireframe_rect, + meta_window_get_xor_rect (window, &dev->grab_op->wireframe_rect, &new_xor); - meta_window_get_wireframe_geometry (window, &display_width, &display_height); + meta_window_get_wireframe_geometry (window, dev, + &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; + dev->grab_op->wireframe_last_xor_rect = new_xor; + dev->grab_op->wireframe_last_display_width = display_width; + dev->grab_op->wireframe_last_display_height = display_height; } void -meta_window_update_wireframe (MetaWindow *window, - int x, - int y, - int width, - int height) +meta_window_update_wireframe (MetaWindow *window, + MetaDevInfo *dev, + 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; + dev->grab_op->wireframe_rect.x = x; + dev->grab_op->wireframe_rect.y = y; + dev->grab_op->wireframe_rect.width = width; + dev->grab_op->wireframe_rect.height = height; - meta_window_get_xor_rect (window, &window->display->grab_wireframe_rect, + meta_window_get_xor_rect (window, &dev->grab_op->wireframe_rect, &new_xor); - meta_window_get_wireframe_geometry (window, &display_width, &display_height); + meta_window_get_wireframe_geometry (window, dev, + &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, + &dev->grab_op->wireframe_last_xor_rect, + dev->grab_op->wireframe_last_display_width, + dev->grab_op->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; + dev->grab_op->wireframe_last_xor_rect = new_xor; + dev->grab_op->wireframe_last_display_width = display_width; + dev->grab_op->wireframe_last_display_height = display_height; } void -meta_window_end_wireframe (MetaWindow *window) +meta_window_end_wireframe (MetaWindow *window, MetaDevInfo *dev) { - 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); + meta_effects_end_wireframe (dev->grab_op->window->screen, + &dev->grab_op->wireframe_last_xor_rect, + dev->grab_op->wireframe_last_display_width, + dev->grab_op->wireframe_last_display_height); } const char* @@ -3990,13 +4009,16 @@ meta_window_focus (MetaWindow *window, "Setting input focus to window %s, input: %d take_focus: %d\n", window->desc, window->input, window->take_focus); - if (window->display->grab_window && - window->display->grab_window->all_keys_grabbed) + if (dev->grab_op) { - meta_topic (META_DEBUG_FOCUS, - "Current focus window %s has global keygrab, not focusing window %s after all\n", - window->display->grab_window->desc, window->desc); - return; + if (dev->grab_op->window && + meta_devices_list_is_member(&dev->grab_op->window->all_keys_grabbed, dev)) + { + meta_topic (META_DEBUG_FOCUS, + "Current focus window %s has global keygrab, not focusing window %s after all\n", + dev->grab_op->window->desc, window->desc); + return; + } } modal_transient = get_modal_transient (window); @@ -4422,26 +4444,26 @@ meta_window_move_resize_request (MetaWindow *window, * app asked for the current size/position instead of the new one. */ in_grab_op = FALSE; - if (window->display->grab_op != META_GRAB_OP_NONE && - window == window->display->grab_window) - { - switch (window->display->grab_op) - { - case META_GRAB_OP_MOVING: - case META_GRAB_OP_RESIZING_SE: - case META_GRAB_OP_RESIZING_S: - case META_GRAB_OP_RESIZING_SW: - case META_GRAB_OP_RESIZING_N: - case META_GRAB_OP_RESIZING_NE: - case META_GRAB_OP_RESIZING_NW: - case META_GRAB_OP_RESIZING_W: - case META_GRAB_OP_RESIZING_E: - in_grab_op = TRUE; - break; - default: - break; - } - } + if (dev->grab_op != NULL) + if (window == dev->grab_op->window) + { + switch (dev->grab_op->op) + { + case META_GRAB_OP_MOVING: + case META_GRAB_OP_RESIZING_SE: + case META_GRAB_OP_RESIZING_S: + case META_GRAB_OP_RESIZING_SW: + case META_GRAB_OP_RESIZING_N: + case META_GRAB_OP_RESIZING_NE: + case META_GRAB_OP_RESIZING_NW: + case META_GRAB_OP_RESIZING_W: + case META_GRAB_OP_RESIZING_E: + in_grab_op = TRUE; + break; + default: + break; + } + } /* it's essential to use only the explicitly-set fields, * and otherwise use our current up-to-date position. @@ -5148,7 +5170,7 @@ meta_window_notify_focus (MetaWindow *window, XEvent *event) { - meta_warning("METAWINDOWNOTIFYFOCUSMETAWINDOWNOTIFYFOCUSMETAWINDOWNOTIFY\n"); +// meta_warning("METAWINDOWNOTIFYFOCUSMETAWINDOWNOTIFYFOCUSMETAWINDOWNOTIFY\n"); /* note the event can be on either the window or the frame, * we focus the frame for shaded windows */ @@ -6896,8 +6918,9 @@ time_diff (const GTimeVal *first, } static gboolean -check_moveresize_frequency (MetaWindow *window, - gdouble *remaining) +check_moveresize_frequency (MetaWindow *window, + MetaDevInfo *dev, + gdouble *remaining) { GTimeVal current_time; @@ -6905,7 +6928,7 @@ check_moveresize_frequency (MetaWindow *window, #ifdef HAVE_XSYNC if (!window->disable_sync && - window->display->grab_sync_request_alarm != None) + dev->grab_op->sync_request_alarm != None) { if (window->sync_request_time.tv_sec != 0 || window->sync_request_time.tv_usec != 0) @@ -6947,7 +6970,7 @@ check_moveresize_frequency (MetaWindow *window, const double ms_between_resizes = 1000.0 / max_resizes_per_second; double elapsed; - elapsed = time_diff (¤t_time, &window->display->grab_last_moveresize_time); + elapsed = time_diff (¤t_time, &dev->grab_op->last_moveresize_time); if (elapsed >= 0.0 && elapsed < ms_between_resizes) { @@ -6972,18 +6995,22 @@ check_moveresize_frequency (MetaWindow *window, static gboolean update_move_timeout (gpointer data) { - MetaWindow *window = data; - update_move (window, - /* XXX */ &window->display->devices->keyboards[0], - window->display->grab_last_user_action_was_snap, - window->display->grab_latest_motion_x, - window->display->grab_latest_motion_y); + ResizeMoveTimeoutData *rmtd = data; + + update_move (rmtd->window, + rmtd->dev, + rmtd->dev->grab_op->last_user_action_was_snap, + rmtd->dev->grab_op->latest_motion_x, + rmtd->dev->grab_op->latest_motion_y); + + g_free (rmtd); return FALSE; } static void +/* Change prototype? All except window is inside dev-> */ update_move (MetaWindow *window, MetaDevInfo *dev, gboolean snap, @@ -6996,21 +7023,21 @@ update_move (MetaWindow *window, int shake_threshold; MetaDisplay *display = window->display; - display->grab_latest_motion_x = x; - display->grab_latest_motion_y = y; + dev->grab_op->latest_motion_x = x; + dev->grab_op->latest_motion_y = y; - dx = x - display->grab_anchor_root_x; - dy = y - display->grab_anchor_root_y; + dx = x - dev->grab_op->anchor_root_x; + dy = y - dev->grab_op->anchor_root_y; - new_x = display->grab_anchor_window_pos.x + dx; - new_y = display->grab_anchor_window_pos.y + dy; + new_x = dev->grab_op->anchor_window_pos.x + dx; + new_y = dev->grab_op->anchor_window_pos.y + dy; meta_verbose ("x,y = %d,%d anchor ptr %d,%d anchor pos %d,%d dx,dy %d,%d\n", x, y, - display->grab_anchor_root_x, - display->grab_anchor_root_y, - display->grab_anchor_window_pos.x, - display->grab_anchor_window_pos.y, + dev->grab_op->anchor_root_x, + dev->grab_op->anchor_root_y, + dev->grab_op->anchor_window_pos.x, + dev->grab_op->anchor_window_pos.y, dx, dy); /* Don't bother doing anything if no move has been specified. (This @@ -7037,22 +7064,22 @@ update_move (MetaWindow *window, /* move the unmaximized window to the cursor */ prop = - ((double)(x - display->grab_initial_window_pos.x)) / - ((double)display->grab_initial_window_pos.width); + ((double)(x - dev->grab_op->initial_window_pos.x)) / + ((double)dev->grab_op->initial_window_pos.width); - display->grab_initial_window_pos.x = + dev->grab_op->initial_window_pos.x = x - window->saved_rect.width * prop; - display->grab_initial_window_pos.y = y; + dev->grab_op->initial_window_pos.y = y; if (window->frame) { - display->grab_initial_window_pos.y += window->frame->child_y / 2; + dev->grab_op->initial_window_pos.y += window->frame->child_y / 2; } - window->saved_rect.x = display->grab_initial_window_pos.x; - window->saved_rect.y = display->grab_initial_window_pos.y; - display->grab_anchor_root_x = x; - display->grab_anchor_root_y = y; + window->saved_rect.x = dev->grab_op->initial_window_pos.x; + window->saved_rect.y = dev->grab_op->initial_window_pos.y; + dev->grab_op->anchor_root_x = x; + dev->grab_op->anchor_root_y = y; meta_window_unmaximize (window, dev, META_MAXIMIZE_HORIZONTAL | @@ -7103,9 +7130,9 @@ update_move (MetaWindow *window, META_MAXIMIZE_VERTICAL); } - display->grab_initial_window_pos = work_area; - display->grab_anchor_root_x = x; - display->grab_anchor_root_y = y; + dev->grab_op->initial_window_pos = work_area; + dev->grab_op->anchor_root_x = x; + dev->grab_op->anchor_root_y = y; window->shaken_loose = FALSE; meta_window_maximize (window, dev, @@ -7117,8 +7144,8 @@ update_move (MetaWindow *window, } } - if (display->grab_wireframe_active) - old = display->grab_wireframe_rect; + if (dev->grab_op->wireframe_active) + old = dev->grab_op->wireframe_rect; else meta_window_get_client_root_coords (window, &old); @@ -7129,7 +7156,8 @@ update_move (MetaWindow *window, new_y = old.y; /* Do any edge resistance/snapping */ - meta_window_edge_resistance_for_move (window, + meta_window_edge_resistance_for_move (window, + dev, old.x, old.y, &new_x, @@ -7140,17 +7168,17 @@ update_move (MetaWindow *window, if (display->compositor) { - int root_x = new_x - display->grab_anchor_window_pos.x + display->grab_anchor_root_x; - int root_y = new_y - display->grab_anchor_window_pos.y + display->grab_anchor_root_y; + int root_x = new_x - dev->grab_op->anchor_window_pos.x + dev->grab_op->anchor_root_x; + int root_y = new_y - dev->grab_op->anchor_window_pos.y + dev->grab_op->anchor_root_y; meta_compositor_update_move (display->compositor, window, root_x, root_y); } - if (display->grab_wireframe_active) - meta_window_update_wireframe (window, new_x, new_y, - display->grab_wireframe_rect.width, - display->grab_wireframe_rect.height); + if (dev->grab_op->wireframe_active) + meta_window_update_wireframe (window, dev, new_x, new_y, + dev->grab_op->wireframe_rect.width, + dev->grab_op->wireframe_rect.height); else meta_window_move (window, dev, TRUE, new_x, new_y); } @@ -7158,18 +7186,21 @@ update_move (MetaWindow *window, static gboolean update_resize_timeout (gpointer data) { - MetaWindow *window = data; + ResizeMoveTimeoutData *rmtd = data; - update_resize (window, - window->display->grab_last_user_action_was_snap, - window->display->grab_latest_motion_x, - window->display->grab_latest_motion_y, + update_resize (rmtd->window, + rmtd->dev, + rmtd->dev->grab_op->last_user_action_was_snap, + rmtd->dev->grab_op->latest_motion_x, + rmtd->dev->grab_op->latest_motion_y, TRUE); return FALSE; } static void +/* Change prototupe? window + dev */ update_resize (MetaWindow *window, + MetaDevInfo *dev, gboolean snap, int x, int y, gboolean force) @@ -7181,14 +7212,14 @@ update_resize (MetaWindow *window, int new_x, new_y; double remaining; - window->display->grab_latest_motion_x = x; - window->display->grab_latest_motion_y = y; + dev->grab_op->latest_motion_x = x; + dev->grab_op->latest_motion_y = y; - dx = x - window->display->grab_anchor_root_x; - dy = y - window->display->grab_anchor_root_y; + dx = x - dev->grab_op->anchor_root_x; + dy = y - dev->grab_op->anchor_root_y; - new_w = window->display->grab_anchor_window_pos.width; - new_h = window->display->grab_anchor_window_pos.height; + new_w = dev->grab_op->anchor_window_pos.width; + new_h = dev->grab_op->anchor_window_pos.height; /* Don't bother doing anything if no move has been specified. (This * happens often, even in keyboard resizing, due to the warping of the @@ -7198,50 +7229,50 @@ update_resize (MetaWindow *window, return; /* FIXME this is only used in wireframe mode */ - new_x = window->display->grab_anchor_window_pos.x; - new_y = window->display->grab_anchor_window_pos.y; + new_x = dev->grab_op->anchor_window_pos.x; + new_y = dev->grab_op->anchor_window_pos.y; - if (window->display->grab_op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN) + if (dev->grab_op->op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN) { if ((dx > 0) && (dy > 0)) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_SE; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_SE; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if ((dx < 0) && (dy > 0)) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_SW; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_SW; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if ((dx > 0) && (dy < 0)) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_NE; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_NE; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if ((dx < 0) && (dy < 0)) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_NW; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_NW; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if (dx < 0) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_W; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_W; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if (dx > 0) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_E; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_E; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if (dy > 0) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_S; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_S; + meta_window_update_keyboard_resize (dev, window, TRUE); } else if (dy < 0) { - window->display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_N; - meta_window_update_keyboard_resize (window, TRUE); + dev->grab_op->op = META_GRAB_OP_KEYBOARD_RESIZING_N; + meta_window_update_keyboard_resize (dev, window, TRUE); } } @@ -7250,7 +7281,7 @@ update_resize (MetaWindow *window, * meta_rectangle_resize_with_gravity(). If we were to use that, we * could just increment new_w and new_h by dx and dy in all cases. */ - switch (window->display->grab_op) + switch (dev->grab_op->op) { case META_GRAB_OP_RESIZING_SE: case META_GRAB_OP_RESIZING_NE: @@ -7275,7 +7306,7 @@ update_resize (MetaWindow *window, break; } - switch (window->display->grab_op) + switch (dev->grab_op->op) { case META_GRAB_OP_RESIZING_SE: case META_GRAB_OP_RESIZING_S: @@ -7299,17 +7330,21 @@ update_resize (MetaWindow *window, break; } - if (!check_moveresize_frequency (window, &remaining) && !force) + if (!check_moveresize_frequency (window, dev, &remaining) && !force) { /* we are ignoring an event here, so we schedule a * compensation event when we would otherwise not ignore * an event. Otherwise we can become stuck if the user never * generates another event. */ - if (!window->display->grab_resize_timeout_id) + if (!dev->grab_op->resize_timeout_id) { - window->display->grab_resize_timeout_id = - g_timeout_add ((int)remaining, update_resize_timeout, window); + ResizeMoveTimeoutData *rmtd; + rmtd = g_new (ResizeMoveTimeoutData, 1); + rmtd->window = window; + rmtd->dev = dev; + dev->grab_op->resize_timeout_id = + g_timeout_add ((int)remaining, update_resize_timeout, rmtd); } return; @@ -7320,14 +7355,14 @@ update_resize (MetaWindow *window, meta_compositor_set_updates (window->display->compositor, window, TRUE); /* Remove any scheduled compensation events */ - if (window->display->grab_resize_timeout_id) + if (dev->grab_op->resize_timeout_id) { - g_source_remove (window->display->grab_resize_timeout_id); - window->display->grab_resize_timeout_id = 0; + g_source_remove (dev->grab_op->resize_timeout_id); + dev->grab_op->resize_timeout_id = 0; } - if (window->display->grab_wireframe_active) - old = window->display->grab_wireframe_rect; + if (dev->grab_op->wireframe_active) + old = dev->grab_op->wireframe_rect; else old = window->rect; /* Don't actually care about x,y */ @@ -7335,7 +7370,7 @@ update_resize (MetaWindow *window, * aspect ratio windows don't interact nicely with the above stuff. So, * to avoid some nasty flicker, we enforce that. */ - switch (window->display->grab_op) + switch (dev->grab_op->op) { case META_GRAB_OP_RESIZING_S: case META_GRAB_OP_RESIZING_N: @@ -7352,11 +7387,12 @@ update_resize (MetaWindow *window, } /* compute gravity of client during operation */ - gravity = meta_resize_gravity_from_grab_op (window->display->grab_op); + gravity = meta_resize_gravity_from_grab_op (dev->grab_op->op); g_assert (gravity >= 0); /* Do any edge resistance/snapping */ meta_window_edge_resistance_for_resize (window, + dev, old.width, old.height, &new_w, @@ -7366,7 +7402,7 @@ update_resize (MetaWindow *window, snap, FALSE); - if (window->display->grab_wireframe_active) + if (dev->grab_op->wireframe_active) { if ((new_x + new_w <= new_x) || (new_y + new_h <= new_y)) return; @@ -7378,7 +7414,7 @@ update_resize (MetaWindow *window, * confuses broken clients that have problems with opaque * resize, they probably don't track their visibility. */ - meta_window_update_wireframe (window, new_x, new_y, new_w, new_h); + meta_window_update_wireframe (window, dev, new_x, new_y, new_w, new_h); } else { @@ -7387,13 +7423,13 @@ update_resize (MetaWindow *window, */ if (old.width != new_w || old.height != new_h) meta_window_resize_with_gravity (window, - /* XXX Really not this */ &window->display->devices->keyboards[0], + /* XXX Really not this */ dev, TRUE, new_w, new_h, gravity); } /* Store the latest resize time, if we actually resized. */ if (window->rect.width != old.width || window->rect.height != old.height) - g_get_current_time (&window->display->grab_last_moveresize_time); + g_get_current_time (&dev->grab_op->last_moveresize_time); } typedef struct @@ -7426,38 +7462,33 @@ check_use_this_motion_notify (MetaWindow *window, { EventScannerData esd; XEvent useless; -#ifdef MPX XDeviceMotionEvent *xdme; + MetaDevInfo *dev; xdme = (XDeviceMotionEvent *) event; -#endif + dev = meta_devices_find_mouse_by_id (window->display, xdme->deviceid); /* This code is copied from Owen's GDK code. */ - if (window->display->grab_motion_notify_time != 0) + if (dev->grab_op->motion_notify_time != 0) { /* == is really the right test, but I'm all for paranoia */ -#ifdef MPX - if (window->display->grab_motion_notify_time <= + if (dev->grab_op->motion_notify_time <= xdme->time) -#else - if (window->display->grab_motion_notify_time <= - event->xmotion.time) -#endif { meta_topic (META_DEBUG_RESIZING, "Arrived at event with time %u (waiting for %u), using it\n", -#ifdef MPX (unsigned int)xdme->time, -#else - (unsigned int)event->xmotion.time, -#endif - window->display->grab_motion_notify_time); - window->display->grab_motion_notify_time = 0; + dev->grab_op->motion_notify_time); + dev->grab_op->motion_notify_time = 0; return TRUE; } else - return FALSE; /* haven't reached the saved timestamp yet */ + { + meta_warning("not using this motion notify event!!! name = %s\n", + dev->name); + return FALSE; /* haven't reached the saved timestamp yet */ + } } esd.current_event = event; @@ -7482,7 +7513,9 @@ check_use_this_motion_notify (MetaWindow *window, /* Save this timestamp, and ignore all motion notify * until we get to the one with this stamp. */ - window->display->grab_motion_notify_time = esd.last_time; + dev->grab_op->motion_notify_time = esd.last_time; + meta_warning("not using this motion notify event... name = %s\n", + dev->name); return FALSE; } } @@ -7494,10 +7527,22 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, #ifdef HAVE_XSYNC if (event->type == (window->display->xsync_event_base + XSyncAlarmNotify)) { + int idev; + MetaDevInfo *ptr_dev; + + /* XXX: Again, we're going to do what has already been done in + * event_callback. Consider changing this... */ + for (idev = 0; idev < window->display->devices->miceUsed; idev++) + if (window->display->devices->mice[idev].grab_op) + if (((XSyncAlarmNotifyEvent*)event)->alarm == + window->display->devices->mice[idev].grab_op->sync_request_alarm) + ptr_dev = &window->display->devices->mice[idev]; + + meta_topic (META_DEBUG_RESIZING, "Alarm event received last motion x = %d y = %d\n", - window->display->grab_latest_motion_x, - window->display->grab_latest_motion_y); + ptr_dev->grab_op->latest_motion_x, + ptr_dev->grab_op->latest_motion_y); /* If sync was previously disabled, turn it back on and hope * the application has come to its senses (maybe it was just @@ -7508,7 +7553,7 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, window->sync_request_time.tv_usec = 0; /* This means we are ready for another configure. */ - switch (window->display->grab_op) + switch (ptr_dev->grab_op->op) { case META_GRAB_OP_RESIZING_E: case META_GRAB_OP_RESIZING_W: @@ -7528,9 +7573,10 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, case META_GRAB_OP_KEYBOARD_RESIZING_NW: /* no pointer round trip here, to keep in sync */ update_resize (window, - window->display->grab_last_user_action_was_snap, - window->display->grab_latest_motion_x, - window->display->grab_latest_motion_y, + ptr_dev, + ptr_dev->grab_op->last_user_action_was_snap, + ptr_dev->grab_op->latest_motion_x, + ptr_dev->grab_op->latest_motion_y, TRUE); break; @@ -7544,22 +7590,13 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, if (event->type == window->display->dev_btn_release_type) { XDeviceButtonEvent *xdbe; /* XXX declare this somewhere else? */ -#if 0 - MetaDevInfo *dev; - int idev; - - xdbe = (XDeviceButtonReleasedEvent *) event; - for (idev = 0; idev < window->display->devices->keybsUsed; idev++) - if (xdbe->deviceid == window->display->devices->keyboards[idev].xdev->device_id) - dev = &window->display->devices->keyboards[idev]; -#endif - MetaDevInfo *dev; xdbe = (XDeviceButtonReleasedEvent *) event; dev = meta_devices_find_mouse_by_id (window->display, xdbe->deviceid); meta_display_check_threshold_reached (window->display, + dev, xdbe->x_root, xdbe->y_root); /* If the user was snap moving then ignore the button release @@ -7567,18 +7604,19 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, * mouse button and they almost certainly do not want a * non-snapped movement to occur from the button release. */ - if (!window->display->grab_last_user_action_was_snap) + if (!dev->grab_op->last_user_action_was_snap) { - if (meta_grab_op_is_moving (window->display->grab_op)) + if (meta_grab_op_is_moving (dev->grab_op->op)) { if (xdbe->root == window->screen->xroot) update_move (window, dev, xdbe->state & ShiftMask, xdbe->x_root, xdbe->y_root); } - else if (meta_grab_op_is_resizing (window->display->grab_op)) + else if (meta_grab_op_is_resizing (dev->grab_op->op)) { if (xdbe->root == window->screen->xroot) update_resize (window, + dev, xdbe->state & ShiftMask, xdbe->x_root, xdbe->y_root, @@ -7602,9 +7640,10 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, // meta_warning("xdme->x_root = %d, xdme->y_root = %d, xdme->x = %d, xdme->y = %d\n", xdme->x_root, xdme->y_root, xdme->x, xdme->y); meta_display_check_threshold_reached (window->display, + dev, xdme->x_root, xdme->y_root); - if (meta_grab_op_is_moving (window->display->grab_op)) + if (meta_grab_op_is_moving (dev->grab_op->op)) { if (xdme->root == window->screen->xroot) { @@ -7617,13 +7656,14 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, xdme->y_root); } } - else if (meta_grab_op_is_resizing (window->display->grab_op)) + else if (meta_grab_op_is_resizing (dev->grab_op->op)) { if (xdme->root == window->screen->xroot) { if (check_use_this_motion_notify (window, event)) update_resize (window, + dev, xdme->state & ShiftMask, xdme->x_root, xdme->y_root, @@ -7631,76 +7671,6 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, } } } - -#else - switch (event->type) - { - case ButtonRelease: - meta_display_check_threshold_reached (window->display, - event->xbutton.x_root, - event->xbutton.y_root); - /* If the user was snap moving then ignore the button release - * because they may have let go of shift before releasing the - * mouse button and they almost certainly do not want a - * non-snapped movement to occur from the button release. - */ - if (!window->display->grab_last_user_action_was_snap) - { - if (meta_grab_op_is_moving (window->display->grab_op)) - { - if (event->xbutton.root == window->screen->xroot) - update_move (window, event->xbutton.state & ShiftMask, - event->xbutton.x_root, event->xbutton.y_root); - } - else if (meta_grab_op_is_resizing (window->display->grab_op)) - { - if (event->xbutton.root == window->screen->xroot) - update_resize (window, - event->xbutton.state & ShiftMask, - event->xbutton.x_root, - event->xbutton.y_root, - TRUE); - if (window->display->compositor) - meta_compositor_set_updates (window->display->compositor, window, TRUE); - } - } - - meta_display_end_grab_op (window->display, event->xbutton.time); - break; - case MotionNotify: - meta_display_check_threshold_reached (window->display, - event->xmotion.x_root, - event->xmotion.y_root); - if (meta_grab_op_is_moving (window->display->grab_op)) - { - if (event->xmotion.root == window->screen->xroot) - { - if (check_use_this_motion_notify (window, - event)) - update_move (window, - event->xmotion.state & ShiftMask, - event->xmotion.x_root, - event->xmotion.y_root); - } - } - else if (meta_grab_op_is_resizing (window->display->grab_op)) - { - if (event->xmotion.root == window->screen->xroot) - { - if (check_use_this_motion_notify (window, - event)) - update_resize (window, - event->xmotion.state & ShiftMask, - event->xmotion.x_root, - event->xmotion.y_root, - FALSE); - } - } - break; - - default: - break; - } #endif } @@ -7817,25 +7787,26 @@ meta_window_same_application (MetaWindow *window, } void -meta_window_refresh_resize_popup (MetaWindow *window) +/* XXX change prototype? window == dev->grab_op->window! */ +meta_window_refresh_resize_popup (MetaWindow *window, MetaDevInfo *dev) { - if (window->display->grab_op == META_GRAB_OP_NONE) + if (dev->grab_op == NULL) return; - if (window->display->grab_window != window) + if (dev->grab_op->window != window) return; /* 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) + if (dev->grab_op->wireframe_active) { meta_topic (META_DEBUG_WINDOW_OPS, "refresh_resize_popup called when wireframe active\n"); return; } - switch (window->display->grab_op) + switch (dev->grab_op->op) { case META_GRAB_OP_RESIZING_SE: case META_GRAB_OP_RESIZING_S: @@ -7861,32 +7832,32 @@ meta_window_refresh_resize_popup (MetaWindow *window) return; } - if (window->display->grab_resize_popup == NULL) + if (dev->grab_op->resize_popup == NULL) { if (window->size_hints.width_inc > 1 || window->size_hints.height_inc > 1) - window->display->grab_resize_popup = + dev->grab_op->resize_popup = meta_ui_resize_popup_new (window->display->xdisplay, window->screen->number); } - if (window->display->grab_resize_popup != NULL) + if (dev->grab_op->resize_popup != NULL) { MetaRectangle rect; - if (window->display->grab_wireframe_active) - rect = window->display->grab_wireframe_rect; + if (dev->grab_op->wireframe_active) + rect = dev->grab_op->wireframe_rect; else meta_window_get_client_root_coords (window, &rect); - meta_ui_resize_popup_set (window->display->grab_resize_popup, + meta_ui_resize_popup_set (dev->grab_op->resize_popup, rect, window->size_hints.base_width, window->size_hints.base_height, window->size_hints.width_inc, window->size_hints.height_inc); - meta_ui_resize_popup_set_showing (window->display->grab_resize_popup, + meta_ui_resize_popup_set_showing (dev->grab_op->resize_popup, TRUE); } } @@ -8006,11 +7977,11 @@ meta_window_is_ancestor_of_transient (MetaWindow *window, */ static gboolean warp_grab_pointer (MetaWindow *window, + MetaDevInfo *dev, MetaGrabOp grab_op, int *x, int *y) { -/* XXX XXX XXX XXX XXX XXX */ MetaRectangle rect; MetaDisplay *display; @@ -8019,9 +7990,9 @@ warp_grab_pointer (MetaWindow *window, /* We may not have done begin_grab_op yet, i.e. may not be in a grab */ - if (window == display->grab_window && display->grab_wireframe_active) + if (window == dev->grab_op->window && dev->grab_op->wireframe_active) { - meta_window_get_xor_rect (window, &display->grab_wireframe_rect, &rect); + meta_window_get_xor_rect (window, &dev->grab_op->wireframe_rect, &rect); } else { @@ -8097,21 +8068,22 @@ warp_grab_pointer (MetaWindow *window, * events generated by the XWarpPointer() call below don't cause complete * funkiness. See bug 124582 and bug 122670. */ - display->grab_anchor_root_x = *x; - display->grab_anchor_root_y = *y; - display->grab_latest_motion_x = *x; - display->grab_latest_motion_y = *y; - if (display->grab_wireframe_active) - display->grab_anchor_window_pos = display->grab_wireframe_rect; + dev->grab_op->anchor_root_x = *x; + dev->grab_op->anchor_root_y = *y; + dev->grab_op->latest_motion_x = *x; + dev->grab_op->latest_motion_y = *y; + if (dev->grab_op->wireframe_active) + dev->grab_op->anchor_window_pos = dev->grab_op->wireframe_rect; else meta_window_get_client_root_coords (window, - &display->grab_anchor_window_pos); + &dev->grab_op->anchor_window_pos); - XWarpPointer (display->xdisplay, - None, - window->screen->xroot, - 0, 0, 0, 0, - *x, *y); + XWarpDevicePointer (display->xdisplay, + dev->xdev, + None, + window->screen->xroot, + 0, 0, 0, 0, + *x, *y); if (meta_error_trap_pop_with_return (display, FALSE) != Success) { @@ -8132,7 +8104,7 @@ meta_window_begin_grab_op (MetaWindow *window, { int x, y; - warp_grab_pointer (window, + warp_grab_pointer (window, dev, op, &x, &y); meta_display_begin_grab_op (window->display, @@ -8149,13 +8121,15 @@ meta_window_begin_grab_op (MetaWindow *window, } void -meta_window_update_keyboard_resize (MetaWindow *window, - gboolean update_cursor) +/* Change args order? */ +meta_window_update_keyboard_resize (MetaDevInfo *dev, + MetaWindow *window, + gboolean update_cursor) { int x, y; - warp_grab_pointer (window, - window->display->grab_op, + warp_grab_pointer (window, dev, + dev->grab_op->op, &x, &y); if (update_cursor) @@ -8167,20 +8141,20 @@ meta_window_update_keyboard_resize (MetaWindow *window, meta_display_set_grab_op_cursor (window->display, NULL, NULL, - window->display->grab_op, + dev->grab_op->op, TRUE, - window->display->grab_xwindow, + dev->grab_op->xwindow, timestamp); } } void -meta_window_update_keyboard_move (MetaWindow *window) +meta_window_update_keyboard_move (MetaDevInfo *dev, MetaWindow *window) { int x, y; - warp_grab_pointer (window, - window->display->grab_op, + warp_grab_pointer (window, dev, + dev->grab_op->op, &x, &y); } @@ -8376,7 +8350,7 @@ void meta_window_add_focused_device (MetaWindow *window, MetaDevInfo *kbdDev) { - meta_warning("Trying to add device named %s to window...\n", kbdDev->name); +// meta_warning("Trying to add device named %s to window...\n", kbdDev->name); int i; if (window->focused_devices_used == window->focused_devices_size) @@ -8395,8 +8369,8 @@ meta_window_add_focused_device (MetaWindow *window, MetaDevInfo *kbdDev) if ((!window->has_focus) && (window->focused_devices_used > 0)) meta_warning("(!window->has_focus()) && (window->focused_devices_used > 0"); - for (i = 0; i < window->focused_devices_used; i++) - meta_warning("Window focused by %s\n", window->focused_devices[i]->name); +// for (i = 0; i < window->focused_devices_used; i++) +// meta_warning("Window focused by %s\n", window->focused_devices[i]->name); } @@ -8414,9 +8388,9 @@ meta_window_add_focused_device (MetaWindow *window, MetaDevInfo *kbdDev) window->focused_devices[window->focused_devices_used] = kbdDev; window->focused_devices_used++; - meta_warning("window->focused_devices_used = %d\n", window->focused_devices_used); +// meta_warning("window->focused_devices_used = %d\n", window->focused_devices_used); - meta_warning("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n"); +// meta_warning("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n"); } void @@ -8424,7 +8398,7 @@ meta_window_remove_focused_device (MetaWindow *window, MetaDevInfo *kbdDev) { int i, j; - meta_warning("Trying to remove device named %s from window...\n", kbdDev->name); +// meta_warning("Trying to remove device named %s from window...\n", kbdDev->name); /* REMOVE THIS AFTER TESTING */ { @@ -8433,8 +8407,8 @@ meta_window_remove_focused_device (MetaWindow *window, MetaDevInfo *kbdDev) if ((!window->has_focus) && (window->focused_devices_used > 0)) meta_warning("(!window->has_focus()) && (window->focused_devices_used > 0"); - for (i = 0; i < window->focused_devices_used; i++) - meta_warning("Window focused by %s\n", window->focused_devices[i]->name); +// for (i = 0; i < window->focused_devices_used; i++) +// meta_warning("Window focused by %s\n", window->focused_devices[i]->name); } if (window->focused_devices_used == 0 || (!window->has_focus)) @@ -8466,9 +8440,9 @@ meta_window_remove_focused_device (MetaWindow *window, MetaDevInfo *kbdDev) if (window->focused_devices_used == 0) window->has_focus = FALSE; - meta_warning("window->focused_devices_used = %d\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n", window->focused_devices_used); +// meta_warning("window->focused_devices_used = %d\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n", window->focused_devices_used); - meta_warning("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"); +// meta_warning("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"); } gboolean |