@@ -2032,16 +2032,48 @@ strip_self_mod (guint keyval,
2032
2032
* stripped_mod = event_state & ~mod ;
2033
2033
}
2034
2034
2035
+ static gboolean
2036
+ is_workspace_action (gint action )
2037
+ {
2038
+ if (action == META_MOTION_LEFT || action == META_MOTION_RIGHT )
2039
+ {
2040
+ return TRUE;
2041
+ }
2042
+
2043
+ switch (action )
2044
+ {
2045
+ case META_MOTION_LEFT :
2046
+ case META_MOTION_RIGHT :
2047
+ case META_KEYBINDING_ACTION_WORKSPACE_1 :
2048
+ case META_KEYBINDING_ACTION_WORKSPACE_2 :
2049
+ case META_KEYBINDING_ACTION_WORKSPACE_3 :
2050
+ case META_KEYBINDING_ACTION_WORKSPACE_4 :
2051
+ case META_KEYBINDING_ACTION_WORKSPACE_5 :
2052
+ case META_KEYBINDING_ACTION_WORKSPACE_6 :
2053
+ case META_KEYBINDING_ACTION_WORKSPACE_7 :
2054
+ case META_KEYBINDING_ACTION_WORKSPACE_8 :
2055
+ case META_KEYBINDING_ACTION_WORKSPACE_9 :
2056
+ case META_KEYBINDING_ACTION_WORKSPACE_10 :
2057
+ case META_KEYBINDING_ACTION_WORKSPACE_11 :
2058
+ case META_KEYBINDING_ACTION_WORKSPACE_12 :
2059
+ return TRUE;
2060
+ }
2061
+
2062
+ return FALSE;
2063
+ }
2064
+
2035
2065
static gboolean
2036
2066
process_event (MetaDisplay * display ,
2037
2067
MetaWindow * window ,
2038
2068
ClutterKeyEvent * event ,
2039
- gboolean allow_release )
2069
+ gboolean allow_release ,
2070
+ gboolean mouse_grab_move )
2040
2071
{
2041
2072
MetaKeyBindingManager * keys = & display -> key_binding_manager ;
2042
2073
xkb_keycode_t keycode = (xkb_keycode_t ) event -> hardware_keycode ;
2043
2074
MetaResolvedKeyCombo resolved_combo = { & keycode , 1 };
2044
2075
MetaKeyBinding * binding ;
2076
+ MetaKeyBindingAction action ;
2045
2077
2046
2078
/* we used to have release-based bindings but no longer. */
2047
2079
if (event -> type == CLUTTER_KEY_RELEASE && !allow_release )
@@ -2059,6 +2091,11 @@ process_event (MetaDisplay *display,
2059
2091
(!window && binding -> flags & META_KEY_BINDING_PER_WINDOW ))
2060
2092
goto not_found ;
2061
2093
2094
+ action = binding -> handler -> data ;
2095
+
2096
+ if (mouse_grab_move && !is_workspace_action (action ))
2097
+ goto not_found ;
2098
+
2062
2099
if (binding -> handler == NULL )
2063
2100
meta_bug ("Binding %s has no handler\n" , binding -> name );
2064
2101
@@ -2107,7 +2144,7 @@ process_event (MetaDisplay *display,
2107
2144
not_found :
2108
2145
meta_topic (META_DEBUG_KEYBINDINGS ,
2109
2146
"No handler found for this event in this binding table\n" );
2110
- return FALSE ;
2147
+ return mouse_grab_move ;
2111
2148
}
2112
2149
2113
2150
static gboolean
@@ -2172,7 +2209,7 @@ process_special_modifier_key (MetaDisplay *display,
2172
2209
{
2173
2210
modifier_key_only_pressed = FALSE;
2174
2211
2175
- if (process_event (display , window , event , FALSE))
2212
+ if (process_event (display , window , event , FALSE, FALSE ))
2176
2213
{
2177
2214
/* As normally, after we've handled a global key
2178
2215
* binding, we unfreeze the keyboard but keep the grab
@@ -2288,7 +2325,7 @@ process_key_event (MetaDisplay *display,
2288
2325
MetaWindow * window ,
2289
2326
ClutterKeyEvent * event )
2290
2327
{
2291
- gboolean keep_grab ;
2328
+ gboolean keep_grab , mouse_grab_move ;
2292
2329
gboolean all_keys_grabbed ;
2293
2330
gboolean allow_key_up = FALSE;
2294
2331
@@ -2314,6 +2351,8 @@ process_key_event (MetaDisplay *display,
2314
2351
}
2315
2352
2316
2353
keep_grab = TRUE;
2354
+ mouse_grab_move = FALSE;
2355
+
2317
2356
if (all_keys_grabbed )
2318
2357
{
2319
2358
if (display -> grab_op == META_GRAB_OP_NONE )
@@ -2345,16 +2384,20 @@ process_key_event (MetaDisplay *display,
2345
2384
meta_topic (META_DEBUG_KEYBINDINGS ,
2346
2385
"Processing event for mouse-only move/resize\n" );
2347
2386
keep_grab = process_mouse_move_resize_grab (display , window , event );
2387
+ mouse_grab_move = display -> grab_op == META_GRAB_OP_MOVING ;
2348
2388
}
2349
2389
}
2350
2390
if (!keep_grab )
2351
2391
meta_display_end_grab_op (display , event -> time );
2352
2392
2353
- return TRUE;
2393
+ if (!mouse_grab_move )
2394
+ {
2395
+ return TRUE;
2396
+ }
2354
2397
}
2355
2398
2356
2399
/* Do the normal keybindings */
2357
- return process_event (display , window , event , allow_key_up );
2400
+ return process_event (display , window , event , allow_key_up , mouse_grab_move );
2358
2401
}
2359
2402
2360
2403
/* Handle a key event. May be called recursively: some key events cause
@@ -2396,6 +2439,40 @@ meta_keybindings_process_event (MetaDisplay *display,
2396
2439
}
2397
2440
}
2398
2441
2442
+ static void
2443
+ handle_workspace_shift (MetaWindow * window ,
2444
+ ClutterKeyEvent * event ,
2445
+ guint keyval )
2446
+ {
2447
+ MetaWorkspace * target_workspace ;
2448
+ guint motion = META_MOTION_LEFT ;
2449
+ gboolean should_handle = FALSE;
2450
+
2451
+ if (keyval == CLUTTER_KEY_Left || keyval == CLUTTER_KEY_KP_Left )
2452
+ {
2453
+ motion = meta_prefs_get_invert_flip_direction () ? META_MOTION_RIGHT : META_MOTION_LEFT ;
2454
+ should_handle = TRUE;
2455
+ }
2456
+ else
2457
+ if (keyval == CLUTTER_KEY_Right || keyval == CLUTTER_KEY_KP_Right )
2458
+ {
2459
+ motion = meta_prefs_get_invert_flip_direction () ? META_MOTION_LEFT : META_MOTION_RIGHT ;
2460
+ should_handle = TRUE;
2461
+ }
2462
+
2463
+ if (!should_handle )
2464
+ {
2465
+ return ;
2466
+ }
2467
+
2468
+ target_workspace = meta_workspace_get_neighbor (meta_workspace_manager_get_active_workspace (window -> display -> workspace_manager ), motion );
2469
+
2470
+ if (target_workspace )
2471
+ {
2472
+ meta_workspace_activate (target_workspace , event -> time );
2473
+ }
2474
+ }
2475
+
2399
2476
static gboolean
2400
2477
process_mouse_move_resize_grab (MetaDisplay * display ,
2401
2478
MetaWindow * window ,
@@ -2441,6 +2518,90 @@ process_mouse_move_resize_grab (MetaDisplay *display,
2441
2518
return FALSE;
2442
2519
}
2443
2520
2521
+ MetaWorkspace * target_workspace ;
2522
+ gulong mask ;
2523
+
2524
+ /* Only proceed if no mod or only numlock */
2525
+ mask = event -> modifier_state & ~(CLUTTER_BUTTON2_MASK | CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK | CLUTTER_BUTTON5_MASK );
2526
+
2527
+ if (mask != CLUTTER_BUTTON1_MASK )
2528
+ return TRUE;
2529
+
2530
+ gint index = -1 ;
2531
+
2532
+ switch (event -> keyval )
2533
+ {
2534
+ case CLUTTER_KEY_Left :
2535
+ case CLUTTER_KEY_KP_Left :
2536
+ case CLUTTER_KEY_Right :
2537
+ case CLUTTER_KEY_KP_Right :
2538
+ handle_workspace_shift (window , event , event -> keyval );
2539
+ return TRUE;
2540
+
2541
+ case CLUTTER_KEY_KP_1 :
2542
+ case CLUTTER_KEY_1 :
2543
+ index = 0 ;
2544
+ break ;
2545
+
2546
+ case CLUTTER_KEY_KP_2 :
2547
+ case CLUTTER_KEY_2 :
2548
+ index = 1 ;
2549
+ break ;
2550
+
2551
+ case CLUTTER_KEY_KP_3 :
2552
+ case CLUTTER_KEY_3 :
2553
+ index = 2 ;
2554
+ break ;
2555
+
2556
+ case CLUTTER_KEY_KP_4 :
2557
+ case CLUTTER_KEY_4 :
2558
+ index = 3 ;
2559
+ break ;
2560
+
2561
+ case CLUTTER_KEY_KP_5 :
2562
+ case CLUTTER_KEY_5 :
2563
+ index = 4 ;
2564
+ break ;
2565
+
2566
+ case CLUTTER_KEY_KP_6 :
2567
+ case CLUTTER_KEY_6 :
2568
+ index = 5 ;
2569
+ break ;
2570
+
2571
+ case CLUTTER_KEY_KP_7 :
2572
+ case CLUTTER_KEY_7 :
2573
+ index = 6 ;
2574
+ break ;
2575
+
2576
+ case CLUTTER_KEY_KP_8 :
2577
+ case CLUTTER_KEY_8 :
2578
+ index = 7 ;
2579
+ break ;
2580
+
2581
+ case CLUTTER_KEY_KP_9 :
2582
+ case CLUTTER_KEY_9 :
2583
+ index = 8 ;
2584
+ break ;
2585
+
2586
+ case CLUTTER_KEY_KP_0 :
2587
+ case CLUTTER_KEY_0 :
2588
+ index = 9 ;
2589
+ break ;
2590
+
2591
+ default :
2592
+ break ;
2593
+ }
2594
+
2595
+ if (index >= 0 )
2596
+ {
2597
+ target_workspace = meta_workspace_manager_get_workspace_by_index (window -> display -> workspace_manager , index );
2598
+
2599
+ if (target_workspace )
2600
+ {
2601
+ meta_workspace_activate (target_workspace , event -> time );
2602
+ }
2603
+ }
2604
+
2444
2605
return TRUE;
2445
2606
}
2446
2607
0 commit comments