diff options
Diffstat (limited to 'src/display.c')
-rw-r--r-- | src/display.c | 684 |
1 files changed, 379 insertions, 305 deletions
diff --git a/src/display.c b/src/display.c index ef7b5d7d..da9d60f4 100644 --- a/src/display.c +++ b/src/display.c @@ -376,14 +376,14 @@ meta_display_open (void) display->autoraise_window = NULL; display->focus_window = NULL; display->expected_focus_window = NULL; - display->grab_old_window_stacking = NULL; +// display->grab_old_window_stacking = NULL; display->mouse_mode = TRUE; /* Only relevant for mouse or sloppy focus */ display->allow_terminal_deactivation = TRUE; /* Only relevant for when a terminal has the focus */ #ifdef HAVE_XSYNC - display->grab_sync_request_alarm = None; +// display->grab_sync_request_alarm = None; #endif /* FIXME copy the checks from GDK probably */ @@ -629,20 +629,20 @@ meta_display_open (void) display->current_time = CurrentTime; display->sentinel_counter = 0; - display->grab_resize_timeout_id = 0; - display->grab_have_keyboard = FALSE; +// display->grab_resize_timeout_id = 0; +// display->grab_have_keyboard = FALSE; #ifdef HAVE_XKB display->last_bell_time = 0; #endif - display->grab_op = META_GRAB_OP_NONE; - display->grab_wireframe_active = FALSE; - display->grab_window = NULL; - display->grab_screen = NULL; - display->grab_resize_popup = NULL; +// display->grab_op = META_GRAB_OP_NONE; +// display->grab_wireframe_active = FALSE; +// display->grab_window = NULL; +// display->grab_screen = NULL; +// display->grab_resize_popup = NULL; - display->grab_edge_resistance_data = NULL; +// display->grab_edge_resistance_data = NULL; #ifdef HAVE_XSYNC { @@ -995,6 +995,7 @@ void meta_display_close (MetaDisplay *display, guint32 timestamp) { + int idev; GSList *tmp; if (display->error_traps > 0) @@ -1006,8 +1007,17 @@ meta_display_close (MetaDisplay *display, meta_display_remove_autoraise_callback (display); - if (display->grab_old_window_stacking) - g_list_free (display->grab_old_window_stacking); + + for (idev = 0; idev < display->devices->miceUsed; idev++) + { + if (display->devices->mice[idev].grab_op) + { + if (display->devices->mice[idev].grab_op->old_window_stacking) + g_list_free + (display->devices->mice[idev].grab_op->old_window_stacking); + g_free (display->devices->mice[idev].grab_op); + } + } /* Stop caring about events */ meta_ui_remove_event_func (display->xdisplay, @@ -1558,13 +1568,12 @@ event_callback (XEvent *event, { XDeviceButtonPressedEvent *xdbe; xdbe = (XDeviceButtonPressedEvent *)event; - meta_warning("event_callback: XDeviceButtonPress received... XID = %d\n", - (int)xdbe->deviceid); +// meta_warning("event_callback: XDeviceButtonPress received... XID = %d\n", +// (int)xdbe->deviceid); // return 0; } /* XXX */ -#ifdef MPX if (event->type == display->dev_btn_press_type) { xdbe = (XDeviceButtonPressedEvent *) event; @@ -1573,15 +1582,6 @@ event_callback (XEvent *event, xdbe->button == 5) return FALSE; } -#else - if (event->type == ButtonPress) - { - /* filter out scrollwheel */ - if (event->xbutton.button == 4 || - event->xbutton.button == 5) - return FALSE; - } -#endif else if (event->type == UnmapNotify) { if (meta_ui_window_should_not_cause_focus (display->xdisplay, @@ -1593,16 +1593,29 @@ event_callback (XEvent *event, event->xany.serial); } } +#ifdef MPX + else if (event->type == display->dev_leave_notify_type && + ((XDeviceCrossingEvent*)event)->mode == NotifyUngrab && + modified == display->ungrab_should_not_cause_focus_window) + { + add_ignored_serial (display, ((XDeviceCrossingEvent*)event)->serial); + meta_topic (META_DEBUG_FOCUS, + "Adding LeaveNotify serial %lu to ignored focus serials\n", + ((XDeviceCrossingEvent*)event)->serial); + } + +#else else if (event->type == LeaveNotify && event->xcrossing.mode == NotifyUngrab && modified == display->ungrab_should_not_cause_focus_window) { + /* XXX! Use MPX! */ add_ignored_serial (display, event->xany.serial); meta_topic (META_DEBUG_FOCUS, "Adding LeaveNotify serial %lu to ignored focus serials\n", event->xany.serial); } - +#endif if (modified != None) window = meta_display_lookup_x_window (display, modified); else @@ -1636,15 +1649,20 @@ event_callback (XEvent *event, #ifdef HAVE_XSYNC if (META_DISPLAY_HAS_XSYNC (display) && - event->type == (display->xsync_event_base + XSyncAlarmNotify) && - ((XSyncAlarmNotifyEvent*)event)->alarm == display->grab_sync_request_alarm) + event->type == (display->xsync_event_base + XSyncAlarmNotify)) { - filter_out_event = TRUE; /* GTK doesn't want to see this really */ - - if (display->grab_op != META_GRAB_OP_NONE && - display->grab_window != NULL && - grab_op_is_mouse (display->grab_op)) - meta_window_handle_mouse_grab_op_event (display->grab_window, event); + int idev; + + for (idev = 0; idev < display->devices->miceUsed; idev++) + if (display->devices->mice[idev].grab_op) + if (((XSyncAlarmNotifyEvent*)event)->alarm == + display->devices->mice[idev].grab_op->sync_request_alarm) + { + filter_out_event = TRUE; /* GTK doesn't want to see this really */ + if (display->devices->mice[idev].grab_op->window != NULL && + grab_op_is_mouse(display->devices->mice[idev].grab_op->op)) + meta_window_handle_mouse_grab_op_event (display->devices->mice[idev].grab_op->window, event); + } } #endif /* HAVE_XSYNC */ @@ -1849,6 +1867,7 @@ event_callback (XEvent *event, case DestroyNotify: if (window) { + int idev; /* FIXME: It sucks that DestroyNotify events don't come with * a timestamp; could we do something better here? Maybe X * will change one day? @@ -1856,9 +1875,12 @@ event_callback (XEvent *event, guint32 timestamp; timestamp = meta_display_get_current_time_roundtrip (display); - if (display->grab_op != META_GRAB_OP_NONE && - display->grab_window == window) - meta_display_end_grab_op (display, NULL, timestamp); + for (idev = 0; idev < display->devices->miceUsed; idev++) + if (display->devices->mice[idev].grab_op) + if (display->devices->mice[idev].grab_op->window == window) + meta_display_end_grab_op (display, + &display->devices->mice[idev], + timestamp); if (frame_was_receiver) { @@ -1879,6 +1901,8 @@ event_callback (XEvent *event, case UnmapNotify: if (window) { + int idev; + /* FIXME: It sucks that UnmapNotify events don't come with * a timestamp; could we do something better here? Maybe X * will change one day? @@ -1886,11 +1910,14 @@ event_callback (XEvent *event, guint32 timestamp; timestamp = meta_display_get_current_time_roundtrip (display); - if (display->grab_op != META_GRAB_OP_NONE && - display->grab_window == window && - ((window->frame == NULL) || !window->frame->mapped)) - meta_display_end_grab_op (display, NULL, timestamp); /* XXX ? */ - + for (idev = 0; idev < display->devices->miceUsed; idev++) + if (display->devices->mice[idev].grab_op) + if (display->devices->mice[idev].grab_op->window == window && + ((window->frame == NULL) || !window->frame->mapped)) + meta_display_end_grab_op (display, + &display->devices->mice[idev], + timestamp); + if (!frame_was_receiver) { if (window->unmaps_pending == 0) @@ -2137,7 +2164,9 @@ event_callback (XEvent *event, } if (workspace) - meta_workspace_activate (workspace, time); + meta_workspace_activate (workspace, + /* XXX */ &display->devices->keyboards[0], + time); else meta_verbose ("Don't know about workspace %d\n", space); } @@ -2273,34 +2302,39 @@ event_callback (XEvent *event, xdbe = (XDeviceButtonEvent *) event; dev = meta_devices_find_mouse_by_id (display, xdbe->deviceid); - if ((window && - grab_op_is_mouse (display->grab_op) && - display->grab_button != (int) xdbe->button && - display->grab_window == window) || - grab_op_is_keyboard (display->grab_op)) + if (dev->grab_op) { - meta_topic (META_DEBUG_WINDOW_OPS, - "Ending grab op %u on window %s due to button press\n", - display->grab_op, - (display->grab_window ? - display->grab_window->desc : - "none")); - if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op)) + if ((window && + grab_op_is_mouse (dev->grab_op->op) && + dev->grab_op->button != (int) xdbe->button && + dev->grab_op->window == window) || + grab_op_is_keyboard (dev->grab_op->op)) { - MetaScreen *screen; - meta_topic (META_DEBUG_WINDOW_OPS, - "Syncing to old stack positions.\n"); - screen = - meta_display_screen_for_root (display, xdbe->window); - meta_stack_set_positions (screen->stack, - display->grab_old_window_stacking); - } + meta_topic (META_DEBUG_WINDOW_OPS, + "Ending grab op %u on device %s window %s due to" + " button press\n", + dev->grab_op->op, + dev->name, + (dev->grab_op->window ? + dev->grab_op->window->desc : + "none")); + if (GRAB_OP_IS_WINDOW_SWITCH (dev->grab_op->op)) + { + MetaScreen *screen; + meta_topic (META_DEBUG_WINDOW_OPS, + "Syncing to old stack positions.\n"); + screen = + meta_display_screen_for_root (display, xdbe->window); + meta_stack_set_positions (screen->stack, + dev->grab_op->old_window_stacking); + } - meta_display_end_grab_op (display, - dev, - xdbe->time); + meta_display_end_grab_op (display, + dev, + xdbe->time); + } } - else if (window && display->grab_op == META_GRAB_OP_NONE) + else if (window && dev->grab_op == NULL) { gboolean begin_move = FALSE; unsigned int grab_mask; @@ -2469,20 +2503,33 @@ event_callback (XEvent *event, } else if (event->type == display->dev_btn_release_type) { - meta_warning("recived XDeviceButtonRelease (where is the button press?)\n"); - if (display->grab_window == window && - grab_op_is_mouse (display->grab_op)) - meta_window_handle_mouse_grab_op_event (window, event); +// meta_warning("recived XDeviceButtonRelease (where is the button press?)\n"); + + MetaDevInfo *ptr_dev; + + ptr_dev = meta_devices_find_mouse_by_id (display, + ((XDeviceButtonReleasedEvent*)event)->deviceid); + if (ptr_dev->grab_op) + if (ptr_dev->grab_op->window == window && + grab_op_is_mouse (ptr_dev->grab_op->op)) + meta_window_handle_mouse_grab_op_event (window, event); } else if (event->type == display->dev_motion_notify_type) { // meta_warning("recived XDeviceMotionNotify! display->grab_op = %d, display->grab_window = 0x%x, window = 0x%x\n", display->grab_op, (int)display->grab_window, (int)window); - if (display->grab_window == window && - grab_op_is_mouse (display->grab_op)) - { -// meta_warning("chamando meta_window_handle_mouse_grab_op_event\n"); - meta_window_handle_mouse_grab_op_event (window, event); - } + + MetaDevInfo *ptr_dev; + + ptr_dev = meta_devices_find_mouse_by_id (display, + ((XDeviceMotionEvent*)event)->deviceid); + + if (ptr_dev->grab_op) + if (ptr_dev->grab_op->window == window && + grab_op_is_mouse (ptr_dev->grab_op->op)) + { +// meta_warning("calling meta_window_handle_mouse_grab_op_event\n"); + meta_window_handle_mouse_grab_op_event (window, event); + } } else if (event->type == display->dev_focus_in_type || event->type == display->dev_focus_out_type) @@ -2550,28 +2597,20 @@ event_callback (XEvent *event, else if (event->type == display->dev_enter_notify_type) { XDeviceCrossingEvent *xdce; - - xdce = (XDeviceCrossingEvent *)event; -#if 0 - int idev; MetaDevInfo *dev; - /* XXX make a meta_devices_get_pointer_by_id */ - for (idev = 0; idev < display->devices->miceUsed; idev++) - if (xdce->deviceid == display->devices->mice[idev].xdev->device_id) - dev = &display->devices->mice[idev]; -#endif - MetaDevInfo *dev; - dev = meta_devices_find_mouse_by_id (display, xdce->deviceid); + xdce = (XDeviceCrossingEvent *)event; + dev = meta_devices_find_mouse_by_id (display, xdce->deviceid); -// meta_warning("got a DeviceEnterNotify event!!! woohoo!!!\n"); - if (display->grab_window == window && - grab_op_is_mouse (display->grab_op)) - { - /* Wtf???? This does nothing! */ - meta_window_handle_mouse_grab_op_event (window, event); - break; - } + //meta_warning("got a DeviceEnterNotify event!!! woohoo!!!\n"); + if (dev->grab_op) + if (dev->grab_op->window == window && + grab_op_is_mouse (dev->grab_op->op)) + { + /* XXX Wtf???? This does nothing! FIXME */ + meta_window_handle_mouse_grab_op_event (window, event); + break; + } /* If the mouse switches screens, active the default window on the new * screen; this will make keybindings and workspace-launched items @@ -2663,23 +2702,20 @@ event_callback (XEvent *event, else if (event->type == display->dev_leave_notify_type) { XDeviceCrossingEvent *xdce; + MetaDevInfo *ptr_dev; xdce = (XDeviceCrossingEvent *)event; -// int idev; -// MetaDevInfo *dev; - - /* XXX make a meta_devices_get_pointer_by_id */ -// for (idev = 0; idev < display->devices->miceUsed; idev++) -// if (xdce->deviceid == display->devices->mice[idev].xdev->device_id) -// dev = &display->devices->mice[idev]; - // meta_warning("got a DeviceLeaveNotify event!!! woohoo!!!\n"); + ptr_dev = meta_devices_find_mouse_by_id (display, xdce->deviceid); - if (display->grab_window == window && - grab_op_is_mouse (display->grab_op)) - meta_window_handle_mouse_grab_op_event (window, event); + if (ptr_dev->grab_op) + { + if (ptr_dev->grab_op->window == window && + grab_op_is_mouse (ptr_dev->grab_op->op)) + meta_window_handle_mouse_grab_op_event (window, event); + } else if (window != NULL) { if (window->type == META_WINDOW_DOCK && @@ -2805,9 +2841,9 @@ event_get_modified_window (MetaDisplay *display, if (event->type == display->dev_key_press_type) return ((XDeviceKeyPressedEvent *)event)->window; - if (event->type == display->dev_key_release_type) + else if (event->type == display->dev_key_release_type) return ((XDeviceKeyReleasedEvent *)event)->window; - if (event->type == display->dev_btn_press_type) + else if (event->type == display->dev_btn_press_type) return ((XDeviceButtonPressedEvent *)event)->window; else if (event->type == display->dev_btn_release_type) return ((XDeviceButtonReleasedEvent *)event)->window; @@ -2889,6 +2925,30 @@ event_get_time (MetaDisplay *display, case CirculateRequest: case MappingNotify: default: + if (event->type == display->dev_key_press_type) + return ((XDeviceKeyPressedEvent *)event)->time; + else if (event->type == display->dev_key_release_type) + return ((XDeviceKeyReleasedEvent *)event)->time; + else if (event->type == display->dev_btn_press_type) + return ((XDeviceButtonPressedEvent *)event)->time; + else if (event->type == display->dev_btn_release_type) + return ((XDeviceButtonReleasedEvent *)event)->time; + else if (event->type == display->dev_motion_notify_type) + return ((XDeviceMotionEvent *)event)->time; + else if (event->type == display->dev_ptr_motion_hint_type) + { + meta_warning("received dev_ptr_motion_hint_type event!" + " returning NULL for its time!\n"); + return None; + } + else if (event->type == display->dev_enter_notify_type) + return ((XDeviceEnterWindowEvent *)event)->time; + else if (event->type == display->dev_leave_notify_type) + return ((XDeviceLeaveWindowEvent *)event)->time; + else if (event->type == display->dev_focus_in_type) + return ((XDeviceFocusInEvent *)event)->time; + else if (event->type == display->dev_focus_out_type) + return ((XDeviceFocusOutEvent *)event)->time; return CurrentTime; } } @@ -3552,8 +3612,8 @@ meta_display_set_grab_op_cursor (MetaDisplay *display, { meta_topic (META_DEBUG_WINDOW_OPS, "Error trapped from XChangeActivePointerGrab()\n"); - if (display->grab_have_pointer) - display->grab_have_pointer = FALSE; + if (dev->grab_op->have_pointer) + dev->grab_op->have_pointer = FALSE; } } else @@ -3561,7 +3621,6 @@ meta_display_set_grab_op_cursor (MetaDisplay *display, g_assert (screen != NULL); meta_error_trap_push (display); -#ifdef MPX /* XXX: EnterWindowMask, LeaveWindowMask */ XEventClass evclasses[5]; @@ -3583,31 +3642,26 @@ meta_display_set_grab_op_cursor (MetaDisplay *display, // meta_warning("going to XExtendedGrabDevice now for device named %s\n", // dev->name); - if (XExtendedGrabDevice (display->xdisplay, /* dpy */ - dev->xdev, /* dev */ - grab_xwindow, /* grab_win */ - GrabModeAsync, /* device_mode */ - False, /* ownerEvents */ - screen->xroot, /* confineTo */ - cursor, /* cursor */ - 5, /* event_count */ - evclasses, /* event_list */ - 0, /* generic_event_count */ - NULL) == GrabSuccess ) /* generic_events */ -#endif + if (XExtendedGrabDevice (display->xdisplay, /* dpy */ + dev->xdev, /* dev */ + grab_xwindow, /* grab_win */ + GrabModeAsync, /* device_mode */ + False, /* ownerEvents */ + screen->xroot, /* confineTo */ + cursor, /* cursor */ + 5, /* event_count */ + evclasses, /* event_list */ + 0, /* generic_event_count */ + NULL) == GrabSuccess ) /* generic_events */ { - display->grab_have_pointer = TRUE; -#ifdef MPX + dev->grab_op->have_pointer = TRUE; meta_topic (META_DEBUG_WINDOW_OPS, "XExtendedGrabDevice() returned GrabSuccess\n"); -#endif } else { -#ifdef MPX meta_topic (META_DEBUG_WINDOW_OPS, "XExtendedGrabDevice() failed!\n"); -#endif } meta_error_trap_pop (display, TRUE); } @@ -3635,10 +3689,11 @@ meta_display_begin_grab_op (MetaDisplay *display, int root_y) { - meta_warning("meta_display_begin_grab_op called for device named %s\n", - dev->name); +// meta_warning("meta_display_begin_grab_op called for device named %s\n", +// dev->name); { + /* XXX Debug-only code!!! Don't release this! */ int i; for (i = 0; i < display->devices->keybsUsed; i++) if (dev->xdev->device_id == display->devices->keyboards[i].xdev->device_id) @@ -3663,30 +3718,35 @@ meta_display_begin_grab_op (MetaDisplay *display, } /* meta_topic (META_DEBUG_WINDOW_OPS, */ - meta_warning( - "Doing grab op %u on window %s button %d pointer already grabbed: %d pointer pos %d,%d\n", - op, window ? window->desc : "none", button, pointer_already_grabbed, - root_x, root_y); + meta_warning("Doing grab op %u on device %s window %s button %d pointer" + " already grabbed: %d pointer pos %d,%d\n", + op, dev->name, window ? window->desc : "none", + button, pointer_already_grabbed, + root_x, root_y); - if (display->grab_op != META_GRAB_OP_NONE) + if (dev->grab_op != NULL) { - meta_warning ("Attempt to perform window operation %u on window %s when operation %u on %s already in effect\n", - op, window ? window->desc : "none", display->grab_op, - display->grab_window ? display->grab_window->desc : "none"); + meta_warning ("Attempt to perform window operation %u on device %s" + " window %s when operation %u on %s already in effect\n", + op, dev->name, window ? window->desc : "none", + dev->grab_op->op, + dev->grab_op->window ? dev->grab_op->window->desc : "none"); return FALSE; } + dev->grab_op = g_new0 (MetaGrabOpInfo, 1); + if (window && (meta_grab_op_is_moving (op) || meta_grab_op_is_resizing (op))) { - meta_warning("moving or resizing!\n"); +// meta_warning("moving or resizing!\n"); if (meta_prefs_get_raise_on_click ()) meta_window_raise (window); else { - display->grab_initial_x = root_x; - display->grab_initial_y = root_y; - display->grab_threshold_movement_reached = FALSE; + dev->grab_op->initial_x = root_x; + dev->grab_op->initial_y = root_y; + dev->grab_op->threshold_movement_reached = FALSE; } } @@ -3701,17 +3761,15 @@ meta_display_begin_grab_op (MetaDisplay *display, else grab_xwindow = screen->xroot; - display->grab_have_pointer = FALSE; - if (pointer_already_grabbed) - display->grab_have_pointer = TRUE; + dev->grab_op->have_pointer = TRUE; + else + dev->grab_op->have_pointer = FALSE; -#ifdef MPX meta_display_set_grab_op_cursor (display, screen, dev, op, FALSE, grab_xwindow, timestamp); -#endif - if (!display->grab_have_pointer) + if (!dev->grab_op->have_pointer) { meta_topic (META_DEBUG_WINDOW_OPS, "XExtendedGrabDevice() failed\n"); @@ -3721,84 +3779,83 @@ meta_display_begin_grab_op (MetaDisplay *display, /* Grab keys for keyboard ops and mouse move/resizes; see #126497 */ if (grab_op_is_keyboard (op) || grab_op_is_mouse_only (op)) { -#ifdef MPX - MetaDevInfo *keybDev; + MetaDevInfo *paired_kbd; - keybDev = meta_devices_find_paired_keyboard (display, - dev->xdev->device_id); -#endif + paired_kbd = meta_devices_find_paired_keyboard (display, + dev->xdev->device_id); if (window) - display->grab_have_keyboard = -#ifdef MPX - meta_window_grab_all_keys (window, keybDev, timestamp); -#endif - + dev->grab_op->have_keyboard = meta_window_grab_all_keys (window, + paired_kbd, + timestamp); else - display->grab_have_keyboard = -#ifdef MPX - meta_screen_grab_all_keys (screen, dev, timestamp); -#endif - - if (!display->grab_have_keyboard) + dev->grab_op->have_keyboard = meta_screen_grab_all_keys (screen, + paired_kbd, + timestamp); + /* XXX: make paired_kbd = dev->grab_op here??? */ + if (!dev->grab_op->have_keyboard) { - meta_warning( -/* meta_topic (META_DEBUG_WINDOW_OPS, */ - "grabbing all keys failed, ungrabbing pointer\n"); - XUngrabDevice (display->xdisplay, dev->xdev, timestamp); - display->grab_have_pointer = FALSE; - return FALSE; + meta_warning ( +/* meta_topic (META_DEBUG_WINDOW_OPS, */ + "grabbing all keys failed, ungrabbing pointer\n"); + XExtendedUngrabDevice (display->xdisplay, dev->xdev); + dev->grab_op->have_pointer = FALSE; + g_free(dev->grab_op); + dev->grab_op = NULL; + return FALSE; } + else + paired_kbd->grab_op = dev->grab_op; } - display->grab_op = op; - display->grab_window = window; - display->grab_screen = screen; - display->grab_xwindow = grab_xwindow; - display->grab_button = button; - display->grab_mask = modmask; - display->grab_anchor_root_x = root_x; - display->grab_anchor_root_y = root_y; - display->grab_latest_motion_x = root_x; - display->grab_latest_motion_y = root_y; - display->grab_last_moveresize_time.tv_sec = 0; - display->grab_last_moveresize_time.tv_usec = 0; - display->grab_motion_notify_time = 0; - display->grab_old_window_stacking = NULL; + dev->grab_op->op = op; + dev->grab_op->window = window; + dev->grab_op->screen = screen; + dev->grab_op->xwindow = grab_xwindow; + dev->grab_op->button = button; + dev->grab_op->mask = modmask; + dev->grab_op->anchor_root_x = root_x; + dev->grab_op->anchor_root_y = root_y; + dev->grab_op->latest_motion_x = root_x; + dev->grab_op->latest_motion_y = root_y; + dev->grab_op->last_moveresize_time.tv_sec = 0; + dev->grab_op->last_moveresize_time.tv_usec = 0; + dev->grab_op->motion_notify_time = 0; + dev->grab_op->old_window_stacking = NULL; #ifdef HAVE_XSYNC - display->grab_sync_request_alarm = None; - display->grab_last_user_action_was_snap = FALSE; + dev->grab_op->sync_request_alarm = None; + dev->grab_op->last_user_action_was_snap = FALSE; #endif - display->grab_was_cancelled = FALSE; - display->grab_frame_action = frame_action; + dev->grab_op->was_cancelled = FALSE; + dev->grab_op->frame_action = frame_action; - if (display->grab_resize_timeout_id) + if (dev->grab_op->resize_timeout_id) { - g_source_remove (display->grab_resize_timeout_id); - display->grab_resize_timeout_id = 0; + g_source_remove (dev->grab_op->resize_timeout_id); + dev->grab_op->resize_timeout_id = 0; } - if (display->grab_window) + if (dev->grab_op->window) { - meta_window_get_client_root_coords (display->grab_window, - &display->grab_initial_window_pos); - display->grab_anchor_window_pos = display->grab_initial_window_pos; + meta_window_get_client_root_coords (dev->grab_op->window, + &dev->grab_op->initial_window_pos); + dev->grab_op->anchor_window_pos = dev->grab_op->initial_window_pos; - display->grab_wireframe_active = + dev->grab_op->wireframe_active = (meta_prefs_get_reduced_resources () && !meta_prefs_get_gnome_accessibility ()) && - (meta_grab_op_is_resizing (display->grab_op) || - meta_grab_op_is_moving (display->grab_op)); + (meta_grab_op_is_resizing (dev->grab_op->op) || + meta_grab_op_is_moving (dev->grab_op->op)); - if (display->grab_wireframe_active) + if (dev->grab_op->wireframe_active) { - meta_window_calc_showing (display->grab_window); - meta_window_begin_wireframe (window); + meta_window_calc_showing (dev->grab_op->window); + meta_window_begin_wireframe (window, dev); } #ifdef HAVE_XSYNC - if (!display->grab_wireframe_active && - meta_grab_op_is_resizing (display->grab_op) && - display->grab_window->sync_request_counter != None) + if (!dev->grab_op->wireframe_active && + meta_grab_op_is_resizing (dev->grab_op->op) && + dev->grab_op->window->sync_request_counter != None) { XSyncAlarmAttributes values; XSyncValue init; @@ -3812,17 +3869,17 @@ meta_display_begin_grab_op (MetaDisplay *display, XSyncIntToValue (&init, 0); XSyncSetCounter (display->xdisplay, - display->grab_window->sync_request_counter, init); + dev->grab_op->window->sync_request_counter, init); - display->grab_window->sync_request_serial = 0; - display->grab_window->sync_request_time.tv_sec = 0; - display->grab_window->sync_request_time.tv_usec = 0; + dev->grab_op->window->sync_request_serial = 0; + dev->grab_op->window->sync_request_time.tv_sec = 0; + dev->grab_op->window->sync_request_time.tv_usec = 0; - values.trigger.counter = display->grab_window->sync_request_counter; + values.trigger.counter = dev->grab_op->window->sync_request_counter; values.trigger.value_type = XSyncAbsolute; values.trigger.test_type = XSyncPositiveTransition; XSyncIntToValue (&values.trigger.wait_value, - display->grab_window->sync_request_serial + 1); + dev->grab_op->window->sync_request_serial + 1); /* After triggering, increment test_value by this. * (NOT wait_value above) @@ -3832,21 +3889,21 @@ meta_display_begin_grab_op (MetaDisplay *display, /* we want events (on by default anyway) */ values.events = True; - display->grab_sync_request_alarm = XSyncCreateAlarm (display->xdisplay, - XSyncCACounter | - XSyncCAValueType | - XSyncCAValue | - XSyncCATestType | - XSyncCADelta | - XSyncCAEvents, - &values); + dev->grab_op->sync_request_alarm = XSyncCreateAlarm(display->xdisplay, + XSyncCACounter | + XSyncCAValueType | + XSyncCAValue | + XSyncCATestType | + XSyncCADelta | + XSyncCAEvents, + &values); if (meta_error_trap_pop_with_return (display, FALSE) != Success) - display->grab_sync_request_alarm = None; + dev->grab_op->sync_request_alarm = None; meta_topic (META_DEBUG_RESIZING, "Created update alarm 0x%lx\n", - display->grab_sync_request_alarm); + dev->grab_op->sync_request_alarm); } #endif } @@ -3854,30 +3911,33 @@ meta_display_begin_grab_op (MetaDisplay *display, meta_warning( /* meta_topic (META_DEBUG_WINDOW_OPS, */ "Grab op %u on window %s successful\n", - display->grab_op, window ? window->desc : "(null)"); + dev->grab_op->op, window ? window->desc : "(null)"); - g_assert (display->grab_window != NULL || display->grab_screen != NULL); - g_assert (display->grab_op != META_GRAB_OP_NONE); + g_assert (dev->grab_op->window != NULL || dev->grab_op->screen != NULL); +/* g_assert (display->grab_op != META_GRAB_OP_NONE); XXX */ +/* g_assert (display->grab_op != META_GRAB_OP_UNUSED); XXX */ + /* XXX No need to assert dev->grab_op, because we would have already + * segfaulted if it didn't exist... */ /* If this is a move or resize, cache the window edges for * resistance/snapping */ - if (meta_grab_op_is_resizing (display->grab_op) || - meta_grab_op_is_moving (display->grab_op)) + if (meta_grab_op_is_resizing (dev->grab_op->op) || + meta_grab_op_is_moving (dev->grab_op->op)) { meta_topic (META_DEBUG_WINDOW_OPS, "Computing edges to resist-movement or snap-to for %s.\n", window->desc); - meta_display_compute_resistance_and_snapping_edges (display); + meta_display_compute_resistance_and_snapping_edges (dev); } /* Save the old stacking */ - if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op)) + if (GRAB_OP_IS_WINDOW_SWITCH (dev->grab_op->op)) { meta_topic (META_DEBUG_WINDOW_OPS, "Saving old stack positions; old pointer was %p.\n", - display->grab_old_window_stacking); - display->grab_old_window_stacking = + dev->grab_op->old_window_stacking); + dev->grab_op->old_window_stacking = meta_stack_get_positions (screen->stack); } @@ -3923,9 +3983,9 @@ meta_warning( break; } - if (display->grab_window) + if (dev->grab_op->window) { - meta_window_refresh_resize_popup (display->grab_window); + meta_window_refresh_resize_popup (dev->grab_op->window, dev); } return TRUE; @@ -3937,24 +3997,34 @@ meta_display_end_grab_op (MetaDisplay *display, guint32 timestamp) { -// meta_warning("meta_display_end_grab_op called for device named %s\n", -// dev->name); + meta_warning("meta_display_end_grab_op called for device named %s\n", + dev->name); MetaDevInfo *pairedKbd; meta_topic (META_DEBUG_WINDOW_OPS, - "Ending grab op %u at time %u\n", display->grab_op, timestamp); + "Ending grab op %u device %s at time %u\n", + dev->grab_op->op, dev->name, timestamp); - if (display->grab_op == META_GRAB_OP_NONE) + if (dev->grab_op == NULL) return; - if (display->grab_window != NULL) - display->grab_window->shaken_loose = FALSE; + { + /* debugging only!!!!!! */ + if (dev->grab_op->op == META_GRAB_OP_NONE) + { + meta_warning("found META_GRAB_OP_NONE!!!!!!!\n"); + sleep (60); + } + } + + if (dev->grab_op->window != NULL) + dev->grab_op->window->shaken_loose = FALSE; - if (display->grab_window != NULL && + if (dev->grab_op->window != NULL && !meta_prefs_get_raise_on_click () && - (meta_grab_op_is_moving (display->grab_op) || - meta_grab_op_is_resizing (display->grab_op))) + (meta_grab_op_is_moving (dev->grab_op->op) || + meta_grab_op_is_resizing (dev->grab_op->op))) { /* Only raise the window in orthogonal raise * ('do-not-raise-on-click') mode if the user didn't try to move @@ -3962,142 +4032,146 @@ meta_display_end_grab_op (MetaDisplay *display, * For raise on click mode, the window was raised at the * beginning of the grab_op. */ - if (!display->grab_threshold_movement_reached) - meta_window_raise (display->grab_window); + if (!dev->grab_op->threshold_movement_reached) + meta_window_raise (dev->grab_op->window); } - if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op) || - display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING) + if (GRAB_OP_IS_WINDOW_SWITCH (dev->grab_op->op) || + dev->grab_op->op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING) { - meta_ui_tab_popup_free (display->grab_screen->tab_popup); - display->grab_screen->tab_popup = NULL; + meta_ui_tab_popup_free (dev->grab_op->screen->tab_popup); + dev->grab_op->screen->tab_popup = NULL; /* If the ungrab here causes an EnterNotify, ignore it for * sloppy focus */ - display->ungrab_should_not_cause_focus_window = display->grab_xwindow; + display->ungrab_should_not_cause_focus_window = dev->grab_op->xwindow; } /* If this was a move or resize clear out the edge cache */ - if (meta_grab_op_is_resizing (display->grab_op) || - meta_grab_op_is_moving (display->grab_op)) + if (meta_grab_op_is_resizing (dev->grab_op->op) || + meta_grab_op_is_moving (dev->grab_op->op)) { meta_topic (META_DEBUG_WINDOW_OPS, "Clearing out the edges for resistance/snapping"); - meta_display_cleanup_edges (display); + meta_display_cleanup_edges (dev); } - if (display->grab_old_window_stacking != NULL) + if (dev->grab_op->old_window_stacking != NULL) { meta_topic (META_DEBUG_WINDOW_OPS, "Clearing out the old stack position, which was %p.\n", - display->grab_old_window_stacking); - g_list_free (display->grab_old_window_stacking); - display->grab_old_window_stacking = NULL; + dev->grab_op->old_window_stacking); + g_list_free (dev->grab_op->old_window_stacking); + dev->grab_op->old_window_stacking = NULL; } - if (display->grab_wireframe_active) + if (dev->grab_op->wireframe_active) { - display->grab_wireframe_active = FALSE; - meta_window_end_wireframe (display->grab_window); + dev->grab_op->wireframe_active = FALSE; + meta_window_end_wireframe (dev->grab_op->window, dev); - if (!display->grab_was_cancelled) + if (!dev->grab_op->was_cancelled) { - if (meta_grab_op_is_moving (display->grab_op)) - meta_window_move (display->grab_window, + if (meta_grab_op_is_moving (dev->grab_op->op)) + meta_window_move (dev->grab_op->window, dev, TRUE, - display->grab_wireframe_rect.x, - display->grab_wireframe_rect.y); - if (meta_grab_op_is_resizing (display->grab_op)) - meta_window_resize_with_gravity (display->grab_window, + dev->grab_op->wireframe_rect.x, + dev->grab_op->wireframe_rect.y); + if (meta_grab_op_is_resizing (dev->grab_op->op)) + meta_window_resize_with_gravity (dev->grab_op->window, dev, TRUE, - display->grab_wireframe_rect.width, - display->grab_wireframe_rect.height, - meta_resize_gravity_from_grab_op (display->grab_op)); + dev->grab_op->wireframe_rect.width, + dev->grab_op->wireframe_rect.height, + meta_resize_gravity_from_grab_op (dev->grab_op->op)); } - meta_window_calc_showing (display->grab_window); + meta_window_calc_showing (dev->grab_op->window); } if (display->compositor && - display->grab_window && - grab_op_is_mouse (display->grab_op) && - meta_grab_op_is_moving (display->grab_op)) + dev->grab_op->window && + grab_op_is_mouse (dev->grab_op->op) && + meta_grab_op_is_moving (dev->grab_op->op)) { meta_compositor_end_move (display->compositor, - display->grab_window); + dev->grab_op->window); } - if (display->grab_have_pointer) + if (dev->grab_op->have_pointer) { meta_topic (META_DEBUG_WINDOW_OPS, - "Ungrabbing pointer with timestamp %u\n", timestamp); + "Ungrabbing pointer %s with timestamp %u\n", + dev->name, timestamp); XExtendedUngrabDevice (display->xdisplay, dev->xdev); } - if (display->grab_have_keyboard) + if (dev->grab_op->have_keyboard) { -#if 0 - int idev; - for (idev = 0; idev < display->devices->keybsUsed; idev++) - if (&display->devices->pairedPointers[idev] == dev) - pairedKbd = &display->devices->keyboards[idev]; - if (pairedKbd == NULL) - meta_warning("we have a pointer with no associated keyboard!!\n"); /* XXX */ -#endif + /* XXX: there can be more than one keyboard paired with the same mouse! */ pairedKbd = meta_devices_find_paired_keyboard (display, dev->xdev->device_id); meta_topic (META_DEBUG_WINDOW_OPS, "Ungrabbing all keys timestamp %u\n", timestamp); - if (display->grab_window) - meta_window_ungrab_all_keys (display->grab_window, + if (dev->grab_op->window) + meta_window_ungrab_all_keys (dev->grab_op->window, pairedKbd, timestamp); else - meta_screen_ungrab_all_keys (display->grab_screen, + meta_screen_ungrab_all_keys (dev->grab_op->screen, pairedKbd, timestamp); + + pairedKbd->grab_op = NULL; } #ifdef HAVE_XSYNC - if (display->grab_sync_request_alarm != None) + if (dev->grab_op->sync_request_alarm != None) { XSyncDestroyAlarm (display->xdisplay, - display->grab_sync_request_alarm); - display->grab_sync_request_alarm = None; + dev->grab_op->sync_request_alarm); + dev->grab_op->sync_request_alarm = None; } #endif /* HAVE_XSYNC */ - display->grab_window = NULL; - display->grab_screen = NULL; - display->grab_xwindow = None; - display->grab_op = META_GRAB_OP_NONE; + dev->grab_op->window = NULL; + dev->grab_op->screen = NULL; + dev->grab_op->xwindow = None; +/* dev->grab_op->op = META_GRAB_OP_NONE; */ - if (display->grab_resize_popup) + if (dev->grab_op->resize_popup) { - meta_ui_resize_popup_free (display->grab_resize_popup); - display->grab_resize_popup = NULL; + meta_ui_resize_popup_free (dev->grab_op->resize_popup); + dev->grab_op->resize_popup = NULL; } - if (display->grab_resize_timeout_id) + if (dev->grab_op->resize_timeout_id) { - g_source_remove (display->grab_resize_timeout_id); - display->grab_resize_timeout_id = 0; + g_source_remove (dev->grab_op->resize_timeout_id); + dev->grab_op->resize_timeout_id = 0; } + + g_free (dev->grab_op); + dev->grab_op = NULL; } void meta_display_check_threshold_reached (MetaDisplay *display, + MetaDevInfo *ptr_dev, int x, int y) { /* Don't bother doing the check again if we've already reached the threshold */ - if (meta_prefs_get_raise_on_click () || - display->grab_threshold_movement_reached) - return; - if (ABS (display->grab_initial_x - x) >= 8 || - ABS (display->grab_initial_y - y) >= 8) - display->grab_threshold_movement_reached = TRUE; + if (ptr_dev->grab_op) + { + if (meta_prefs_get_raise_on_click () || + ptr_dev->grab_op->threshold_movement_reached) + return; + + if (ABS (ptr_dev->grab_op->initial_x - x) >= 8 || + ABS (ptr_dev->grab_op->initial_y - y) >= 8) + ptr_dev->grab_op->threshold_movement_reached = TRUE; + } } static void |