2006-10-01 18:30:10 -04:00
|
|
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
|
|
|
Comprehensively rename to Mutter
Code:
All references in the code not related to themes, keybindings, or
GConf were changed from 'metacity' to 'mutter'. This includes, among other
things, strings, comments, the atoms used in the message protocol, and
the envvars used for debugging. The GConf schema file was reduced to
the 3 settings new to mutter.
The overall version was brought up to 2.27 to match current gnome.
Structure:
All files named '*metacity*' were renamed '*mutter*' with appropriate
changes in the automake system. Files removed are
doc/creating_themes, src/themes, doc/metacity-theme.dtd,
metacity.doap. These files will eventually end up in an external
gnome-wm-data module.
Installation location:
On the filesystem the mutter-plugindir was change from
$(libdir)/metacity/plugins/clutter to just $(libdir)/mutter/plugins.
The mutter-plugins.pc.in reflects these changes.
Note:
mutter.desktop.in and mutter-wm.desktop both continue to have
X-GNOME-WMSettingsModule=metacity set. This allows
gnome-control-center to continue using libmetacity.so for
configuration. This is fine since most the general keybindings and wm
settings are being read from /apps/metacity/* in gconf.
2009-06-10 06:29:20 -04:00
|
|
|
/* Mutter Keybindings */
|
2012-12-12 20:50:43 -05:00
|
|
|
/*
|
2004-02-22 20:48:29 -05:00
|
|
|
* Copyright (C) 2001 Havoc Pennington
|
|
|
|
* Copyright (C) 2002 Red Hat Inc.
|
|
|
|
* Copyright (C) 2003 Rob Adams
|
2006-01-10 14:43:21 -05:00
|
|
|
* Copyright (C) 2004-2006 Elijah Newren
|
2012-12-12 20:50:43 -05:00
|
|
|
*
|
2001-06-06 00:47:37 -04:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
2012-12-12 20:50:43 -05:00
|
|
|
*
|
2001-06-06 00:47:37 -04:00
|
|
|
* You should have received a copy of the GNU General Public License
|
2014-01-11 20:42:06 -05:00
|
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
2001-06-06 00:47:37 -04:00
|
|
|
*/
|
|
|
|
|
2013-02-18 08:19:28 -05:00
|
|
|
/**
|
|
|
|
* SECTION:keybindings
|
|
|
|
* @Title: MetaKeybinding
|
|
|
|
* @Short_Description: Key bindings
|
|
|
|
*/
|
|
|
|
|
2001-12-09 17:41:12 -05:00
|
|
|
#include <config.h>
|
2009-01-29 09:16:01 -05:00
|
|
|
#include "keybindings-private.h"
|
2008-09-18 11:09:11 -04:00
|
|
|
#include "workspace-private.h"
|
2012-08-09 20:27:18 -04:00
|
|
|
#include <meta/compositor.h>
|
2011-03-05 19:29:12 -05:00
|
|
|
#include <meta/errors.h>
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
#include "edge-resistance.h"
|
2011-03-05 19:29:12 -05:00
|
|
|
#include "frame.h"
|
2013-12-11 11:57:45 -05:00
|
|
|
#include "screen-private.h"
|
2011-03-05 19:29:12 -05:00
|
|
|
#include <meta/prefs.h>
|
2014-04-07 10:48:16 -04:00
|
|
|
#include "meta-accel-parse.h"
|
2001-06-06 00:47:37 -04:00
|
|
|
|
2014-09-22 09:06:22 -04:00
|
|
|
#ifdef __linux__
|
2014-04-07 14:24:53 -04:00
|
|
|
#include <linux/input.h>
|
2014-09-22 09:06:22 -04:00
|
|
|
#elif !defined KEY_GRAVE
|
|
|
|
#define KEY_GRAVE 0x29 /* assume the use of xf86-input-keyboard */
|
|
|
|
#endif
|
2014-04-07 14:24:53 -04:00
|
|
|
|
2017-05-05 11:51:06 -04:00
|
|
|
#include "backends/meta-monitor-manager-private.h"
|
2016-12-12 21:37:11 -05:00
|
|
|
#include "backends/meta-logical-monitor.h"
|
2014-04-23 16:23:26 -04:00
|
|
|
#include "backends/x11/meta-backend-x11.h"
|
2014-06-16 18:25:40 -04:00
|
|
|
#include "x11/window-x11.h"
|
2014-05-29 12:11:26 -04:00
|
|
|
|
|
|
|
#ifdef HAVE_NATIVE_BACKEND
|
2014-04-21 19:47:04 -04:00
|
|
|
#include "backends/native/meta-backend-native.h"
|
2014-05-29 12:11:26 -04:00
|
|
|
#endif
|
2014-03-18 22:01:31 -04:00
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
#define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings"
|
|
|
|
#define SCHEMA_MUTTER_KEYBINDINGS "org.gnome.mutter.keybindings"
|
2013-07-16 08:37:49 -04:00
|
|
|
#define SCHEMA_MUTTER_WAYLAND_KEYBINDINGS "org.gnome.mutter.wayland.keybindings"
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
static gboolean add_builtin_keybinding (MetaDisplay *display,
|
|
|
|
const char *name,
|
2012-03-27 10:42:42 -04:00
|
|
|
GSettings *settings,
|
2011-10-27 21:05:43 -04:00
|
|
|
MetaKeyBindingFlags flags,
|
|
|
|
MetaKeyBindingAction action,
|
|
|
|
MetaKeyHandlerFunc handler,
|
|
|
|
int handler_arg);
|
2008-10-05 20:24:07 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
static void
|
|
|
|
resolved_key_combo_reset (MetaResolvedKeyCombo *resolved_combo)
|
|
|
|
{
|
|
|
|
g_free (resolved_combo->keycodes);
|
|
|
|
resolved_combo->len = 0;
|
|
|
|
resolved_combo->keycodes = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
resolved_key_combo_copy (MetaResolvedKeyCombo *from,
|
|
|
|
MetaResolvedKeyCombo *to)
|
|
|
|
{
|
|
|
|
to->len = from->len;
|
|
|
|
to->keycodes = g_memdup (from->keycodes,
|
|
|
|
from->len * sizeof (xkb_keycode_t));
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
resolved_key_combo_has_keycode (MetaResolvedKeyCombo *resolved_combo,
|
|
|
|
int keycode)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < resolved_combo->len; i++)
|
|
|
|
if ((int) resolved_combo->keycodes[i] == keycode)
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
resolved_key_combo_intersect (MetaResolvedKeyCombo *a,
|
|
|
|
MetaResolvedKeyCombo *b)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < a->len; i++)
|
|
|
|
if (resolved_key_combo_has_keycode (b, a->keycodes[i]))
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2011-11-04 14:18:57 -04:00
|
|
|
static void
|
|
|
|
meta_key_binding_free (MetaKeyBinding *binding)
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_reset (&binding->resolved_combo);
|
2011-11-04 14:18:57 -04:00
|
|
|
g_slice_free (MetaKeyBinding, binding);
|
|
|
|
}
|
|
|
|
|
|
|
|
static MetaKeyBinding *
|
|
|
|
meta_key_binding_copy (MetaKeyBinding *binding)
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
MetaKeyBinding *clone = g_slice_dup (MetaKeyBinding, binding);
|
|
|
|
resolved_key_combo_copy (&binding->resolved_combo,
|
|
|
|
&clone->resolved_combo);
|
|
|
|
return clone;
|
2011-11-04 14:18:57 -04:00
|
|
|
}
|
|
|
|
|
2012-04-10 01:25:13 -04:00
|
|
|
G_DEFINE_BOXED_TYPE(MetaKeyBinding,
|
|
|
|
meta_key_binding,
|
|
|
|
meta_key_binding_copy,
|
|
|
|
meta_key_binding_free)
|
2011-11-04 14:18:57 -04:00
|
|
|
|
|
|
|
const char *
|
|
|
|
meta_key_binding_get_name (MetaKeyBinding *binding)
|
|
|
|
{
|
|
|
|
return binding->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
MetaVirtualModifier
|
|
|
|
meta_key_binding_get_modifiers (MetaKeyBinding *binding)
|
|
|
|
{
|
2015-01-06 21:31:33 -05:00
|
|
|
return binding->combo.modifiers;
|
2011-11-04 14:18:57 -04:00
|
|
|
}
|
|
|
|
|
2014-05-29 14:38:13 -04:00
|
|
|
gboolean
|
|
|
|
meta_key_binding_is_reversed (MetaKeyBinding *binding)
|
|
|
|
{
|
|
|
|
return (binding->handler->flags & META_KEY_BINDING_IS_REVERSED) != 0;
|
|
|
|
}
|
|
|
|
|
2011-11-04 14:18:57 -04:00
|
|
|
guint
|
|
|
|
meta_key_binding_get_mask (MetaKeyBinding *binding)
|
|
|
|
{
|
2015-01-07 17:48:32 -05:00
|
|
|
return binding->resolved_combo.mask;
|
2011-11-04 14:18:57 -04:00
|
|
|
}
|
|
|
|
|
2012-11-16 18:32:04 -05:00
|
|
|
gboolean
|
|
|
|
meta_key_binding_is_builtin (MetaKeyBinding *binding)
|
|
|
|
{
|
|
|
|
return binding->handler->flags & META_KEY_BINDING_BUILTIN;
|
|
|
|
}
|
|
|
|
|
2008-10-05 20:24:07 -04:00
|
|
|
/* These can't be bound to anything, but they are used to handle
|
|
|
|
* various other events. TODO: Possibly we should include them as event
|
|
|
|
* handler functions and have some kind of flag to say they're unbindable.
|
|
|
|
*/
|
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
static gboolean process_mouse_move_resize_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event);
|
|
|
|
|
|
|
|
static gboolean process_keyboard_move_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event);
|
|
|
|
|
|
|
|
static gboolean process_keyboard_resize_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event);
|
|
|
|
|
2013-03-31 13:06:40 -04:00
|
|
|
static void grab_key_bindings (MetaDisplay *display);
|
|
|
|
static void ungrab_key_bindings (MetaDisplay *display);
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
static GHashTable *key_handlers;
|
2012-08-28 09:28:11 -04:00
|
|
|
static GHashTable *external_grabs;
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
#define HANDLER(name) g_hash_table_lookup (key_handlers, (name))
|
|
|
|
|
|
|
|
static void
|
|
|
|
key_handler_free (MetaKeyHandler *handler)
|
|
|
|
{
|
|
|
|
g_free (handler->name);
|
|
|
|
if (handler->user_data_free_func && handler->user_data)
|
|
|
|
handler->user_data_free_func (handler->user_data);
|
|
|
|
g_free (handler);
|
|
|
|
}
|
2001-06-23 01:49:35 -04:00
|
|
|
|
2012-08-28 09:28:11 -04:00
|
|
|
typedef struct _MetaKeyGrab MetaKeyGrab;
|
|
|
|
struct _MetaKeyGrab {
|
|
|
|
char *name;
|
|
|
|
guint action;
|
2015-01-06 21:24:10 -05:00
|
|
|
MetaKeyCombo combo;
|
2012-08-28 09:28:11 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
|
|
meta_key_grab_free (MetaKeyGrab *grab)
|
|
|
|
{
|
|
|
|
g_free (grab->name);
|
|
|
|
g_free (grab);
|
|
|
|
}
|
|
|
|
|
2014-03-03 08:08:34 -05:00
|
|
|
static guint32
|
2017-04-25 07:17:02 -04:00
|
|
|
key_combo_key (MetaResolvedKeyCombo *resolved_combo,
|
|
|
|
int i)
|
2014-03-03 08:08:34 -05:00
|
|
|
{
|
|
|
|
/* On X, keycodes are only 8 bits while libxkbcommon supports 32 bit
|
|
|
|
keycodes, but since we're using the same XKB keymaps that X uses,
|
|
|
|
we won't find keycodes bigger than 8 bits in practice. The bits
|
|
|
|
that mutter cares about in the modifier mask are also all in the
|
|
|
|
lower 8 bits both on X and clutter key events. This means that we
|
|
|
|
can use a 32 bit integer to safely concatenate both keycode and
|
|
|
|
mask and thus making it easy to use them as an index in a
|
|
|
|
GHashTable. */
|
2017-04-25 07:17:02 -04:00
|
|
|
guint32 key = resolved_combo->keycodes[i] & 0xffff;
|
2015-01-07 17:48:32 -05:00
|
|
|
return (key << 16) | (resolved_combo->mask & 0xffff);
|
2014-03-03 08:08:34 -05:00
|
|
|
}
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
reload_modmap (MetaKeyBindingManager *keys)
|
2001-06-06 00:47:37 -04:00
|
|
|
{
|
2017-09-01 05:45:08 -04:00
|
|
|
struct xkb_keymap *keymap = meta_backend_get_keymap (keys->backend);
|
2014-08-18 15:52:22 -04:00
|
|
|
struct xkb_state *scratch_state;
|
2014-08-15 16:23:15 -04:00
|
|
|
xkb_mod_mask_t scroll_lock_mask;
|
2015-11-03 11:52:10 -05:00
|
|
|
xkb_mod_mask_t dummy_mask;
|
2014-08-15 16:23:15 -04:00
|
|
|
|
|
|
|
/* Modifiers to find. */
|
|
|
|
struct {
|
2015-09-23 19:13:59 -04:00
|
|
|
const char *name;
|
2014-08-15 16:23:15 -04:00
|
|
|
xkb_mod_mask_t *mask_p;
|
2015-11-03 11:52:10 -05:00
|
|
|
xkb_mod_mask_t *virtual_mask_p;
|
2014-08-15 16:23:15 -04:00
|
|
|
} mods[] = {
|
2015-11-03 11:52:10 -05:00
|
|
|
{ "ScrollLock", &scroll_lock_mask, &dummy_mask },
|
|
|
|
{ "Meta", &keys->meta_mask, &keys->virtual_meta_mask },
|
|
|
|
{ "Hyper", &keys->hyper_mask, &keys->virtual_hyper_mask },
|
|
|
|
{ "Super", &keys->super_mask, &keys->virtual_super_mask },
|
2014-08-15 16:23:15 -04:00
|
|
|
};
|
|
|
|
|
2014-08-18 15:52:22 -04:00
|
|
|
scratch_state = xkb_state_new (keymap);
|
|
|
|
|
2014-08-15 16:23:15 -04:00
|
|
|
gsize i;
|
|
|
|
for (i = 0; i < G_N_ELEMENTS (mods); i++)
|
2001-06-06 00:47:37 -04:00
|
|
|
{
|
2014-08-15 16:23:15 -04:00
|
|
|
xkb_mod_mask_t *mask_p = mods[i].mask_p;
|
2015-11-03 11:52:10 -05:00
|
|
|
xkb_mod_mask_t *virtual_mask_p = mods[i].virtual_mask_p;
|
2014-08-15 16:23:15 -04:00
|
|
|
xkb_mod_index_t idx = xkb_keymap_mod_get_index (keymap, mods[i].name);
|
|
|
|
|
|
|
|
if (idx != XKB_MOD_INVALID)
|
2014-08-18 15:52:22 -04:00
|
|
|
{
|
2014-08-19 14:57:48 -04:00
|
|
|
xkb_mod_mask_t vmodmask = (1 << idx);
|
|
|
|
xkb_state_update_mask (scratch_state, vmodmask, 0, 0, 0, 0, 0);
|
|
|
|
*mask_p = xkb_state_serialize_mods (scratch_state, XKB_STATE_MODS_DEPRESSED) & ~vmodmask;
|
2015-11-03 11:52:10 -05:00
|
|
|
*virtual_mask_p = vmodmask;
|
2014-08-18 15:52:22 -04:00
|
|
|
}
|
2014-08-15 16:23:15 -04:00
|
|
|
else
|
2015-11-03 11:52:10 -05:00
|
|
|
{
|
|
|
|
*mask_p = 0;
|
|
|
|
*virtual_mask_p = 0;
|
|
|
|
}
|
2001-06-06 00:47:37 -04:00
|
|
|
}
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2014-08-18 15:52:22 -04:00
|
|
|
xkb_state_unref (scratch_state);
|
|
|
|
|
2014-08-15 16:22:16 -04:00
|
|
|
keys->ignored_modifier_mask = (scroll_lock_mask | Mod2Mask | LockMask);
|
2002-04-28 00:52:26 -04:00
|
|
|
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
2014-08-15 16:22:16 -04:00
|
|
|
"Ignoring modmask 0x%x scroll lock 0x%x hyper 0x%x super 0x%x meta 0x%x\n",
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->ignored_modifier_mask,
|
2014-04-07 17:19:39 -04:00
|
|
|
scroll_lock_mask,
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->hyper_mask,
|
|
|
|
keys->super_mask,
|
|
|
|
keys->meta_mask);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2014-08-14 18:14:55 -04:00
|
|
|
static gboolean
|
|
|
|
is_keycode_for_keysym (struct xkb_keymap *keymap,
|
2014-09-23 11:48:31 -04:00
|
|
|
xkb_layout_index_t layout,
|
|
|
|
xkb_level_index_t level,
|
2014-08-14 18:14:55 -04:00
|
|
|
xkb_keycode_t keycode,
|
|
|
|
xkb_keysym_t keysym)
|
|
|
|
{
|
2014-09-23 11:48:31 -04:00
|
|
|
const xkb_keysym_t *syms;
|
|
|
|
int num_syms, k;
|
2014-08-14 18:14:55 -04:00
|
|
|
|
2014-09-23 11:48:31 -04:00
|
|
|
num_syms = xkb_keymap_key_get_syms_by_level (keymap, keycode, layout, level, &syms);
|
|
|
|
for (k = 0; k < num_syms; k++)
|
2014-08-14 18:14:55 -04:00
|
|
|
{
|
2014-09-23 11:48:31 -04:00
|
|
|
if (syms[k] == keysym)
|
|
|
|
return TRUE;
|
2014-08-14 18:14:55 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GArray *keycodes;
|
|
|
|
xkb_keysym_t keysym;
|
2014-09-23 11:48:31 -04:00
|
|
|
xkb_layout_index_t layout;
|
|
|
|
xkb_level_index_t level;
|
2014-08-14 18:14:55 -04:00
|
|
|
} FindKeysymData;
|
|
|
|
|
|
|
|
static void
|
|
|
|
get_keycodes_for_keysym_iter (struct xkb_keymap *keymap,
|
|
|
|
xkb_keycode_t keycode,
|
|
|
|
void *data)
|
|
|
|
{
|
|
|
|
FindKeysymData *search_data = data;
|
|
|
|
GArray *keycodes = search_data->keycodes;
|
|
|
|
xkb_keysym_t keysym = search_data->keysym;
|
2014-09-23 11:48:31 -04:00
|
|
|
xkb_layout_index_t layout = search_data->layout;
|
|
|
|
xkb_level_index_t level = search_data->level;
|
2014-08-14 18:14:55 -04:00
|
|
|
|
2014-09-23 11:48:31 -04:00
|
|
|
if (is_keycode_for_keysym (keymap, layout, level, keycode, keysym))
|
2017-04-25 07:17:02 -04:00
|
|
|
{
|
|
|
|
guint i;
|
|
|
|
gboolean missing = TRUE;
|
|
|
|
|
|
|
|
/* duplicate keycode detection */
|
|
|
|
for (i = 0; i < keycodes->len; i++)
|
|
|
|
if (g_array_index (keycodes, xkb_keysym_t, i) == keycode)
|
|
|
|
{
|
|
|
|
missing = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (missing)
|
|
|
|
g_array_append_val (keycodes, keycode);
|
|
|
|
}
|
2014-08-14 18:14:55 -04:00
|
|
|
}
|
|
|
|
|
2013-04-10 07:34:26 -04:00
|
|
|
/* Original code from gdk_x11_keymap_get_entries_for_keyval() in
|
|
|
|
* gdkkeys-x11.c */
|
2017-04-25 07:17:02 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
get_keycodes_for_keysym (MetaKeyBindingManager *keys,
|
2014-08-14 18:14:55 -04:00
|
|
|
int keysym,
|
2017-04-25 07:17:02 -04:00
|
|
|
MetaResolvedKeyCombo *resolved_combo)
|
2013-04-10 07:34:26 -04:00
|
|
|
{
|
2017-08-17 05:04:13 -04:00
|
|
|
struct xkb_keymap *keymap;
|
|
|
|
xkb_layout_index_t layout_index;
|
|
|
|
xkb_level_index_t layout_level;
|
|
|
|
GArray *keycodes;
|
2013-04-10 07:34:26 -04:00
|
|
|
int keycode;
|
|
|
|
|
2017-08-17 05:04:13 -04:00
|
|
|
keycodes = g_array_new (FALSE, FALSE, sizeof (xkb_keysym_t));
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2014-04-07 14:49:46 -04:00
|
|
|
/* Special-case: Fake mutter keysym */
|
|
|
|
if (keysym == META_KEY_ABOVE_TAB)
|
|
|
|
{
|
2014-04-07 14:24:53 -04:00
|
|
|
keycode = KEY_GRAVE + 8;
|
2017-08-17 05:04:13 -04:00
|
|
|
g_array_append_val (keycodes, keycode);
|
2014-04-07 14:49:46 -04:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2017-09-01 05:45:08 -04:00
|
|
|
keymap = meta_backend_get_keymap (keys->backend);
|
|
|
|
layout_index = meta_backend_get_keymap_layout_group (keys->backend);
|
2014-09-23 11:48:31 -04:00
|
|
|
|
2017-08-17 05:04:13 -04:00
|
|
|
for (layout_level = 0; layout_level < keys->keymap_num_levels; layout_level++)
|
|
|
|
{
|
|
|
|
FindKeysymData search_data = (FindKeysymData) {
|
|
|
|
.keycodes = keycodes,
|
|
|
|
.keysym = keysym,
|
|
|
|
.layout = layout_index,
|
|
|
|
.level = layout_level
|
|
|
|
};
|
|
|
|
xkb_keymap_key_for_each (keymap, get_keycodes_for_keysym_iter,
|
|
|
|
&search_data);
|
|
|
|
}
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2014-04-07 14:49:46 -04:00
|
|
|
out:
|
2017-08-17 05:04:13 -04:00
|
|
|
resolved_combo->len = keycodes->len;
|
|
|
|
resolved_combo->keycodes =
|
|
|
|
(xkb_keycode_t *) g_array_free (keycodes,
|
|
|
|
keycodes->len == 0 ? TRUE : FALSE);
|
2014-04-07 14:51:13 -04:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:48:31 -04:00
|
|
|
static void
|
|
|
|
determine_keymap_num_levels_iter (struct xkb_keymap *keymap,
|
|
|
|
xkb_keycode_t keycode,
|
|
|
|
void *data)
|
|
|
|
{
|
|
|
|
xkb_level_index_t *num_levels = data;
|
|
|
|
xkb_layout_index_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < xkb_keymap_num_layouts_for_key (keymap, keycode); i++)
|
|
|
|
{
|
|
|
|
xkb_level_index_t level = xkb_keymap_num_levels_for_key (keymap, keycode, i);
|
|
|
|
if (level > *num_levels)
|
|
|
|
*num_levels = level;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
determine_keymap_num_levels (MetaKeyBindingManager *keys)
|
|
|
|
{
|
2017-09-01 05:45:08 -04:00
|
|
|
struct xkb_keymap *keymap = meta_backend_get_keymap (keys->backend);
|
2014-09-23 11:48:31 -04:00
|
|
|
|
|
|
|
keys->keymap_num_levels = 0;
|
|
|
|
xkb_keymap_key_for_each (keymap, determine_keymap_num_levels_iter, &keys->keymap_num_levels);
|
|
|
|
}
|
|
|
|
|
2013-04-10 07:34:26 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
reload_iso_next_group_combos (MetaKeyBindingManager *keys)
|
2013-04-10 07:34:26 -04:00
|
|
|
{
|
|
|
|
const char *iso_next_group_option;
|
|
|
|
int i;
|
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
for (i = 0; i < keys->n_iso_next_group_combos; i++)
|
|
|
|
resolved_key_combo_reset (&keys->iso_next_group_combo[i]);
|
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->n_iso_next_group_combos = 0;
|
2013-04-10 07:34:26 -04:00
|
|
|
|
|
|
|
iso_next_group_option = meta_prefs_get_iso_next_group_option ();
|
|
|
|
if (iso_next_group_option == NULL)
|
|
|
|
return;
|
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
get_keycodes_for_keysym (keys, XKB_KEY_ISO_Next_Group, keys->iso_next_group_combo);
|
|
|
|
|
|
|
|
if (keys->iso_next_group_combo[0].len == 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
keys->n_iso_next_group_combos = 1;
|
2013-04-10 07:34:26 -04:00
|
|
|
|
|
|
|
if (g_str_equal (iso_next_group_option, "toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "lalt_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "lwin_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "rwin_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "lshift_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "rshift_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "lctrl_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "rctrl_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "sclk_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "menu_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "caps_toggle"))
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
keys->iso_next_group_combo[0].mask = 0;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
else if (g_str_equal (iso_next_group_option, "shift_caps_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "shifts_toggle"))
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
keys->iso_next_group_combo[0].mask = ShiftMask;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
else if (g_str_equal (iso_next_group_option, "alt_caps_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "alt_space_toggle"))
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
keys->iso_next_group_combo[0].mask = Mod1Mask;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
else if (g_str_equal (iso_next_group_option, "ctrl_shift_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "lctrl_lshift_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "rctrl_rshift_toggle"))
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_copy (&keys->iso_next_group_combo[0],
|
|
|
|
&keys->iso_next_group_combo[1]);
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
keys->iso_next_group_combo[0].mask = ShiftMask;
|
|
|
|
keys->iso_next_group_combo[1].mask = ControlMask;
|
|
|
|
keys->n_iso_next_group_combos = 2;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
else if (g_str_equal (iso_next_group_option, "ctrl_alt_toggle"))
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_copy (&keys->iso_next_group_combo[0],
|
|
|
|
&keys->iso_next_group_combo[1]);
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
keys->iso_next_group_combo[0].mask = Mod1Mask;
|
|
|
|
keys->iso_next_group_combo[1].mask = ControlMask;
|
|
|
|
keys->n_iso_next_group_combos = 2;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
else if (g_str_equal (iso_next_group_option, "alt_shift_toggle") ||
|
|
|
|
g_str_equal (iso_next_group_option, "lalt_lshift_toggle"))
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_copy (&keys->iso_next_group_combo[0],
|
|
|
|
&keys->iso_next_group_combo[1]);
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
keys->iso_next_group_combo[0].mask = Mod1Mask;
|
|
|
|
keys->iso_next_group_combo[1].mask = ShiftMask;
|
|
|
|
keys->n_iso_next_group_combos = 2;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_reset (keys->iso_next_group_combo);
|
|
|
|
keys->n_iso_next_group_combos = 0;
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-14 15:08:47 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
devirtualize_modifiers (MetaKeyBindingManager *keys,
|
|
|
|
MetaVirtualModifier modifiers,
|
|
|
|
unsigned int *mask)
|
2014-08-14 14:44:46 -04:00
|
|
|
{
|
|
|
|
*mask = 0;
|
|
|
|
|
|
|
|
if (modifiers & META_VIRTUAL_SHIFT_MASK)
|
|
|
|
*mask |= ShiftMask;
|
|
|
|
if (modifiers & META_VIRTUAL_CONTROL_MASK)
|
|
|
|
*mask |= ControlMask;
|
|
|
|
if (modifiers & META_VIRTUAL_ALT_MASK)
|
|
|
|
*mask |= Mod1Mask;
|
|
|
|
if (modifiers & META_VIRTUAL_META_MASK)
|
2014-08-14 15:33:45 -04:00
|
|
|
*mask |= keys->meta_mask;
|
2014-08-14 14:44:46 -04:00
|
|
|
if (modifiers & META_VIRTUAL_HYPER_MASK)
|
2014-08-14 15:33:45 -04:00
|
|
|
*mask |= keys->hyper_mask;
|
2014-08-14 14:44:46 -04:00
|
|
|
if (modifiers & META_VIRTUAL_SUPER_MASK)
|
2014-08-14 15:33:45 -04:00
|
|
|
*mask |= keys->super_mask;
|
2014-08-14 14:44:46 -04:00
|
|
|
if (modifiers & META_VIRTUAL_MOD2_MASK)
|
|
|
|
*mask |= Mod2Mask;
|
|
|
|
if (modifiers & META_VIRTUAL_MOD3_MASK)
|
|
|
|
*mask |= Mod3Mask;
|
|
|
|
if (modifiers & META_VIRTUAL_MOD4_MASK)
|
|
|
|
*mask |= Mod4Mask;
|
|
|
|
if (modifiers & META_VIRTUAL_MOD5_MASK)
|
|
|
|
*mask |= Mod5Mask;
|
|
|
|
}
|
|
|
|
|
2015-01-08 15:08:51 -05:00
|
|
|
static void
|
|
|
|
index_binding (MetaKeyBindingManager *keys,
|
|
|
|
MetaKeyBinding *binding)
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
int i;
|
2015-01-08 15:08:51 -05:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
for (i = 0; i < binding->resolved_combo.len; i++)
|
|
|
|
{
|
|
|
|
MetaKeyBinding *existing;
|
|
|
|
guint32 index_key;
|
|
|
|
|
|
|
|
index_key = key_combo_key (&binding->resolved_combo, i);
|
|
|
|
|
|
|
|
existing = g_hash_table_lookup (keys->key_bindings_index,
|
|
|
|
GINT_TO_POINTER (index_key));
|
|
|
|
if (existing != NULL)
|
|
|
|
{
|
|
|
|
/* Overwrite already indexed keycodes only for the first
|
|
|
|
* keycode, i.e. we give those primary keycodes precedence
|
|
|
|
* over non-first ones. */
|
|
|
|
if (i > 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
meta_warning ("Overwriting existing binding of keysym %x"
|
|
|
|
" with keysym %x (keycode %x).\n",
|
|
|
|
binding->combo.keysym,
|
|
|
|
existing->combo.keysym,
|
|
|
|
binding->resolved_combo.keycodes[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_hash_table_replace (keys->key_bindings_index,
|
|
|
|
GINT_TO_POINTER (index_key), binding);
|
|
|
|
}
|
2015-01-08 15:08:51 -05:00
|
|
|
}
|
|
|
|
|
2015-01-06 21:31:33 -05:00
|
|
|
static void
|
2015-01-07 17:48:32 -05:00
|
|
|
resolve_key_combo (MetaKeyBindingManager *keys,
|
|
|
|
MetaKeyCombo *combo,
|
|
|
|
MetaResolvedKeyCombo *resolved_combo)
|
2015-01-06 21:31:33 -05:00
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
|
|
|
|
resolved_key_combo_reset (resolved_combo);
|
|
|
|
|
2015-01-06 21:31:33 -05:00
|
|
|
if (combo->keysym != 0)
|
2017-04-25 07:17:02 -04:00
|
|
|
{
|
|
|
|
get_keycodes_for_keysym (keys, combo->keysym, resolved_combo);
|
|
|
|
}
|
|
|
|
else if (combo->keycode != 0)
|
|
|
|
{
|
|
|
|
resolved_combo->keycodes = g_new0 (xkb_keycode_t, 1);
|
|
|
|
resolved_combo->keycodes[0] = combo->keycode;
|
|
|
|
resolved_combo->len = 1;
|
|
|
|
}
|
2015-01-06 21:31:33 -05:00
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
devirtualize_modifiers (keys, combo->modifiers, &resolved_combo->mask);
|
2015-01-06 21:31:33 -05:00
|
|
|
}
|
|
|
|
|
2014-03-03 08:08:34 -05:00
|
|
|
static void
|
2015-01-06 21:29:00 -05:00
|
|
|
binding_reload_combos_foreach (gpointer key,
|
|
|
|
gpointer value,
|
|
|
|
gpointer data)
|
2014-03-03 08:08:34 -05:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = data;
|
2014-03-03 08:08:34 -05:00
|
|
|
MetaKeyBinding *binding = value;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
resolve_key_combo (keys, &binding->combo, &binding->resolved_combo);
|
2015-01-08 15:08:51 -05:00
|
|
|
index_binding (keys, binding);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2002-07-13 23:16:41 -04:00
|
|
|
static void
|
2015-01-06 21:29:00 -05:00
|
|
|
reload_combos (MetaKeyBindingManager *keys)
|
2002-07-13 23:16:41 -04:00
|
|
|
{
|
2015-01-08 15:08:51 -05:00
|
|
|
g_hash_table_remove_all (keys->key_bindings_index);
|
|
|
|
|
2015-01-06 21:29:00 -05:00
|
|
|
determine_keymap_num_levels (keys);
|
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
resolve_key_combo (keys,
|
|
|
|
&keys->overlay_key_combo,
|
|
|
|
&keys->overlay_resolved_key_combo);
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2015-01-06 21:29:00 -05:00
|
|
|
reload_iso_next_group_combos (keys);
|
|
|
|
|
|
|
|
g_hash_table_foreach (keys->key_bindings, binding_reload_combos_foreach, keys);
|
2002-07-13 23:16:41 -04:00
|
|
|
}
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
rebuild_binding_table (MetaKeyBindingManager *keys,
|
|
|
|
GList *prefs,
|
|
|
|
GList *grabs)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2014-03-03 08:08:34 -05:00
|
|
|
MetaKeyBinding *b;
|
2012-08-28 09:28:11 -04:00
|
|
|
GList *p, *g;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_remove_all (keys->key_bindings);
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
p = prefs;
|
|
|
|
while (p)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2011-10-27 21:05:43 -04:00
|
|
|
MetaKeyPref *pref = (MetaKeyPref*)p->data;
|
2014-02-25 13:49:16 -05:00
|
|
|
GSList *tmp = pref->combos;
|
Allow any keybinding pref to be specified either with <foo>, a string, or
2004-04-17 Thomas Thurman <thomas@thurman.org.uk>
* keybindings.c (count_bindings, rebuild_binding_table):
* prefs.c (change_notify, screen_bindings,
window_bindings, init_bindings, update_binding,
find_and_update_list_binding, update_list_binding,
meta_prefs_get_window_binding): Allow any keybinding pref
to be specified either with <foo>, a string, or <foo>_list,
a list of strings, or both. Fixes #164831.
2006-04-17 13:23:09 -04:00
|
|
|
|
|
|
|
while (tmp)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
Allow any keybinding pref to be specified either with <foo>, a string, or
2004-04-17 Thomas Thurman <thomas@thurman.org.uk>
* keybindings.c (count_bindings, rebuild_binding_table):
* prefs.c (change_notify, screen_bindings,
window_bindings, init_bindings, update_binding,
find_and_update_list_binding, update_list_binding,
meta_prefs_get_window_binding): Allow any keybinding pref
to be specified either with <foo>, a string, or <foo>_list,
a list of strings, or both. Fixes #164831.
2006-04-17 13:23:09 -04:00
|
|
|
MetaKeyCombo *combo = tmp->data;
|
2003-02-22 15:31:51 -05:00
|
|
|
|
Patch from Ed Catmur to fix keybindings with hex-values (coming from
2006-08-21 Elijah Newren <newren gmail com>
Patch from Ed Catmur to fix keybindings with hex-values (coming
from special extended keyboard keys). #140448.
* src/keybindings.c (struct _MetaKeyBinding): change keycode from
KeyCode to unsigned int (comment from Elijah: why???),
(reload_keycodes): only grab keysyms for keybindings that have
them, (count_bindings, rebuild_binding_table): bindings can be
valid either due to a valid keysym or a valid keycode,
(display_get_keybinding_action, meta_change_keygrab,
process_tab_grab, process_workspace_switch_grab): handle keycode
as well as keysym
* src/prefs.[ch] (struct MetaKeyCombo, update_binding,
update_list_binding): handle keycode as well as keysym
* src/ui.[ch] (meta_ui_accelerator_parse): new function special
cases strings of the form "0x[0-9a-fA-F]+" and otherwise calling
gtk_accelerator_parse(), (meta_ui_parse_accelerator,
meta_ui_parse_modifier): call meta_ui_accelerator_parse instead of
gtk_accelerator_parse.
2006-08-21 15:06:26 -04:00
|
|
|
if (combo && (combo->keysym != None || combo->keycode != 0))
|
2003-02-22 15:31:51 -05:00
|
|
|
{
|
2011-10-27 21:05:43 -04:00
|
|
|
MetaKeyHandler *handler = HANDLER (pref->name);
|
|
|
|
|
2015-01-08 21:42:37 -05:00
|
|
|
b = g_slice_new0 (MetaKeyBinding);
|
2014-03-03 08:08:34 -05:00
|
|
|
b->name = pref->name;
|
|
|
|
b->handler = handler;
|
|
|
|
b->flags = handler->flags;
|
2015-01-06 21:31:33 -05:00
|
|
|
b->combo = *combo;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_add (keys->key_bindings, b);
|
2003-02-22 15:31:51 -05:00
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
Allow any keybinding pref to be specified either with <foo>, a string, or
2004-04-17 Thomas Thurman <thomas@thurman.org.uk>
* keybindings.c (count_bindings, rebuild_binding_table):
* prefs.c (change_notify, screen_bindings,
window_bindings, init_bindings, update_binding,
find_and_update_list_binding, update_list_binding,
meta_prefs_get_window_binding): Allow any keybinding pref
to be specified either with <foo>, a string, or <foo>_list,
a list of strings, or both. Fixes #164831.
2006-04-17 13:23:09 -04:00
|
|
|
tmp = tmp->next;
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
p = p->next;
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2012-08-28 09:28:11 -04:00
|
|
|
g = grabs;
|
|
|
|
while (g)
|
|
|
|
{
|
|
|
|
MetaKeyGrab *grab = (MetaKeyGrab*)g->data;
|
2015-01-06 21:24:10 -05:00
|
|
|
if (grab->combo.keysym != None || grab->combo.keycode != 0)
|
2012-08-28 09:28:11 -04:00
|
|
|
{
|
|
|
|
MetaKeyHandler *handler = HANDLER ("external-grab");
|
|
|
|
|
2015-01-08 21:42:37 -05:00
|
|
|
b = g_slice_new0 (MetaKeyBinding);
|
2014-03-03 08:08:34 -05:00
|
|
|
b->name = grab->name;
|
|
|
|
b->handler = handler;
|
|
|
|
b->flags = handler->flags;
|
2015-01-06 21:31:33 -05:00
|
|
|
b->combo = grab->combo;
|
2014-03-03 08:08:34 -05:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_add (keys->key_bindings, b);
|
2012-08-28 09:28:11 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
g = g->next;
|
|
|
|
}
|
|
|
|
|
2003-02-22 15:31:51 -05:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
" %d bindings in table\n",
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_size (keys->key_bindings));
|
2003-02-22 15:31:51 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
rebuild_key_binding_table (MetaKeyBindingManager *keys)
|
2003-02-22 15:31:51 -05:00
|
|
|
{
|
2012-08-28 09:28:11 -04:00
|
|
|
GList *prefs, *grabs;
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2003-02-22 15:31:51 -05:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
2008-11-22 14:02:54 -05:00
|
|
|
"Rebuilding key binding table from preferences\n");
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
prefs = meta_prefs_get_keybindings ();
|
2012-08-28 09:28:11 -04:00
|
|
|
grabs = g_hash_table_get_values (external_grabs);
|
2014-08-14 15:33:45 -04:00
|
|
|
rebuild_binding_table (keys, prefs, grabs);
|
2011-10-27 21:05:43 -04:00
|
|
|
g_list_free (prefs);
|
2012-08-28 09:28:11 -04:00
|
|
|
g_list_free (grabs);
|
2003-02-22 15:31:51 -05:00
|
|
|
}
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2008-12-02 18:13:11 -05:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
rebuild_special_bindings (MetaKeyBindingManager *keys)
|
2008-12-02 18:13:11 -05:00
|
|
|
{
|
|
|
|
MetaKeyCombo combo;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-12-02 18:13:11 -05:00
|
|
|
meta_prefs_get_overlay_binding (&combo);
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->overlay_key_combo = combo;
|
2008-12-02 18:13:11 -05:00
|
|
|
}
|
|
|
|
|
2003-02-22 15:31:51 -05:00
|
|
|
static void
|
2013-03-31 13:06:40 -04:00
|
|
|
ungrab_key_bindings (MetaDisplay *display)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2014-08-14 14:52:15 -04:00
|
|
|
GSList *windows, *l;
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2013-10-03 18:31:09 -04:00
|
|
|
meta_screen_ungrab_keys (display->screen);
|
2002-11-06 11:00:56 -05:00
|
|
|
|
2009-06-15 15:32:23 -04:00
|
|
|
windows = meta_display_list_windows (display, META_LIST_DEFAULT);
|
2014-08-14 14:52:15 -04:00
|
|
|
for (l = windows; l; l = l->next)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2014-08-14 14:52:15 -04:00
|
|
|
MetaWindow *w = l->data;
|
2002-04-28 00:52:26 -04:00
|
|
|
meta_window_ungrab_keys (w);
|
2013-03-31 13:06:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
g_slist_free (windows);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
grab_key_bindings (MetaDisplay *display)
|
|
|
|
{
|
2014-08-14 14:52:15 -04:00
|
|
|
GSList *windows, *l;
|
2013-03-31 13:06:40 -04:00
|
|
|
|
2013-10-03 18:31:09 -04:00
|
|
|
meta_screen_grab_keys (display->screen);
|
2013-03-31 13:06:40 -04:00
|
|
|
|
|
|
|
windows = meta_display_list_windows (display, META_LIST_DEFAULT);
|
2014-08-14 14:52:15 -04:00
|
|
|
for (l = windows; l; l = l->next)
|
2013-03-31 13:06:40 -04:00
|
|
|
{
|
2014-08-14 14:52:15 -04:00
|
|
|
MetaWindow *w = l->data;
|
2002-04-28 00:52:26 -04:00
|
|
|
meta_window_grab_keys (w);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_slist_free (windows);
|
|
|
|
}
|
|
|
|
|
2009-08-25 16:54:54 -04:00
|
|
|
static MetaKeyBinding *
|
2014-08-14 15:33:45 -04:00
|
|
|
get_keybinding (MetaKeyBindingManager *keys,
|
2015-01-07 17:48:32 -05:00
|
|
|
MetaResolvedKeyCombo *resolved_combo)
|
2002-07-13 23:16:41 -04:00
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
MetaKeyBinding *binding = NULL;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < resolved_combo->len; i++)
|
|
|
|
{
|
|
|
|
guint32 key;
|
|
|
|
|
|
|
|
key = key_combo_key (resolved_combo, i);
|
|
|
|
binding = g_hash_table_lookup (keys->key_bindings_index,
|
|
|
|
GINT_TO_POINTER (key));
|
|
|
|
|
|
|
|
if (binding != NULL)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return binding;
|
2009-08-25 16:54:54 -04:00
|
|
|
}
|
|
|
|
|
2012-12-21 05:32:55 -05:00
|
|
|
static guint
|
2014-04-07 15:59:38 -04:00
|
|
|
next_dynamic_keybinding_action (void)
|
|
|
|
{
|
2012-12-21 05:32:55 -05:00
|
|
|
static guint num_dynamic_bindings = 0;
|
|
|
|
return META_KEYBINDING_ACTION_LAST + (++num_dynamic_bindings);
|
|
|
|
}
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
static gboolean
|
2011-11-04 14:18:57 -04:00
|
|
|
add_keybinding_internal (MetaDisplay *display,
|
|
|
|
const char *name,
|
2012-03-27 10:42:42 -04:00
|
|
|
GSettings *settings,
|
2011-11-04 14:18:57 -04:00
|
|
|
MetaKeyBindingFlags flags,
|
|
|
|
MetaKeyBindingAction action,
|
|
|
|
MetaKeyHandlerFunc func,
|
|
|
|
int data,
|
|
|
|
gpointer user_data,
|
|
|
|
GDestroyNotify free_data)
|
2011-10-27 21:05:43 -04:00
|
|
|
{
|
|
|
|
MetaKeyHandler *handler;
|
|
|
|
|
2012-03-27 10:42:42 -04:00
|
|
|
if (!meta_prefs_add_keybinding (name, settings, action, flags))
|
2011-10-27 21:05:43 -04:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
handler = g_new0 (MetaKeyHandler, 1);
|
|
|
|
handler->name = g_strdup (name);
|
|
|
|
handler->func = func;
|
|
|
|
handler->default_func = func;
|
|
|
|
handler->data = data;
|
|
|
|
handler->flags = flags;
|
2011-11-04 14:18:57 -04:00
|
|
|
handler->user_data = user_data;
|
|
|
|
handler->user_data_free_func = free_data;
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
g_hash_table_insert (key_handlers, g_strdup (name), handler);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2011-11-04 14:18:57 -04:00
|
|
|
static gboolean
|
|
|
|
add_builtin_keybinding (MetaDisplay *display,
|
|
|
|
const char *name,
|
2012-03-27 10:42:42 -04:00
|
|
|
GSettings *settings,
|
2011-11-04 14:18:57 -04:00
|
|
|
MetaKeyBindingFlags flags,
|
|
|
|
MetaKeyBindingAction action,
|
|
|
|
MetaKeyHandlerFunc handler,
|
|
|
|
int handler_arg)
|
|
|
|
{
|
2012-03-27 10:42:42 -04:00
|
|
|
return add_keybinding_internal (display, name, settings,
|
2011-11-04 14:18:57 -04:00
|
|
|
flags | META_KEY_BINDING_BUILTIN,
|
|
|
|
action, handler, handler_arg, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* meta_display_add_keybinding:
|
|
|
|
* @display: a #MetaDisplay
|
|
|
|
* @name: the binding's name
|
2012-03-27 10:42:42 -04:00
|
|
|
* @settings: the #GSettings object where @name is stored
|
2011-11-04 14:18:57 -04:00
|
|
|
* @flags: flags to specify binding details
|
|
|
|
* @handler: function to run when the keybinding is invoked
|
|
|
|
* @user_data: the data to pass to @handler
|
|
|
|
* @free_data: function to free @user_data
|
|
|
|
*
|
|
|
|
* Add a keybinding at runtime. The key @name in @schema needs to be of
|
|
|
|
* type %G_VARIANT_TYPE_STRING_ARRAY, with each string describing a
|
2013-02-13 09:44:06 -05:00
|
|
|
* keybinding in the form of "<Control>a" or "<Shift><Alt>F1". The parser
|
2011-11-04 14:18:57 -04:00
|
|
|
* is fairly liberal and allows lower or upper case, and also abbreviations
|
2013-02-13 09:44:06 -05:00
|
|
|
* such as "<Ctl>" and "<Ctrl>". If the key is set to the empty list or a
|
2011-11-04 14:18:57 -04:00
|
|
|
* list with a single element of either "" or "disabled", the keybinding is
|
|
|
|
* disabled.
|
|
|
|
*
|
|
|
|
* Use meta_display_remove_keybinding() to remove the binding.
|
|
|
|
*
|
2012-12-12 08:03:58 -05:00
|
|
|
* Returns: the corresponding keybinding action if the keybinding was
|
|
|
|
* added successfully, otherwise %META_KEYBINDING_ACTION_NONE
|
2011-11-04 14:18:57 -04:00
|
|
|
*/
|
2012-12-12 08:03:58 -05:00
|
|
|
guint
|
2011-11-04 14:18:57 -04:00
|
|
|
meta_display_add_keybinding (MetaDisplay *display,
|
|
|
|
const char *name,
|
2012-03-27 10:42:42 -04:00
|
|
|
GSettings *settings,
|
2011-11-04 14:18:57 -04:00
|
|
|
MetaKeyBindingFlags flags,
|
|
|
|
MetaKeyHandlerFunc handler,
|
|
|
|
gpointer user_data,
|
|
|
|
GDestroyNotify free_data)
|
|
|
|
{
|
2012-12-21 05:32:55 -05:00
|
|
|
guint new_action = next_dynamic_keybinding_action ();
|
2012-12-12 08:03:58 -05:00
|
|
|
|
|
|
|
if (!add_keybinding_internal (display, name, settings, flags, new_action,
|
|
|
|
handler, 0, user_data, free_data))
|
|
|
|
return META_KEYBINDING_ACTION_NONE;
|
|
|
|
|
|
|
|
return new_action;
|
2011-11-04 14:18:57 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* meta_display_remove_keybinding:
|
|
|
|
* @display: the #MetaDisplay
|
|
|
|
* @name: name of the keybinding to remove
|
|
|
|
*
|
|
|
|
* Remove keybinding @name; the function will fail if @name is not a known
|
|
|
|
* keybinding or has not been added with meta_display_add_keybinding().
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the binding has been removed sucessfully,
|
|
|
|
* otherwise %FALSE
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
meta_display_remove_keybinding (MetaDisplay *display,
|
|
|
|
const char *name)
|
|
|
|
{
|
|
|
|
if (!meta_prefs_remove_keybinding (name))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
g_hash_table_remove (key_handlers, name);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2015-01-06 22:11:23 -05:00
|
|
|
static guint
|
|
|
|
get_keybinding_action (MetaKeyBindingManager *keys,
|
2015-01-07 17:48:32 -05:00
|
|
|
MetaResolvedKeyCombo *resolved_combo)
|
2009-08-25 16:54:54 -04:00
|
|
|
{
|
|
|
|
MetaKeyBinding *binding;
|
|
|
|
|
2012-08-10 16:08:03 -04:00
|
|
|
/* This is much more vague than the MetaDisplay::overlay-key signal,
|
|
|
|
* which is only emitted if the overlay-key is the only key pressed;
|
|
|
|
* as this method is primarily intended for plugins to allow processing
|
|
|
|
* of mutter keybindings while holding a grab, the overlay-key-only-pressed
|
|
|
|
* tracking is left to the plugin here.
|
|
|
|
*/
|
2017-04-25 07:17:02 -04:00
|
|
|
if (resolved_key_combo_intersect (resolved_combo,
|
|
|
|
&keys->overlay_resolved_key_combo))
|
2012-08-10 16:08:03 -04:00
|
|
|
return META_KEYBINDING_ACTION_OVERLAY_KEY;
|
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
binding = get_keybinding (keys, resolved_combo);
|
2009-08-25 16:54:54 -04:00
|
|
|
if (binding)
|
2012-08-28 09:28:11 -04:00
|
|
|
{
|
|
|
|
MetaKeyGrab *grab = g_hash_table_lookup (external_grabs, binding->name);
|
|
|
|
if (grab)
|
|
|
|
return grab->action;
|
|
|
|
else
|
|
|
|
return (guint) meta_prefs_get_keybinding_action (binding->name);
|
|
|
|
}
|
2009-08-25 16:54:54 -04:00
|
|
|
else
|
2012-08-28 09:28:11 -04:00
|
|
|
{
|
|
|
|
return META_KEYBINDING_ACTION_NONE;
|
|
|
|
}
|
2002-07-13 23:16:41 -04:00
|
|
|
}
|
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
static xkb_mod_mask_t
|
|
|
|
mask_from_event_params (MetaKeyBindingManager *keys,
|
|
|
|
unsigned long mask)
|
2015-01-06 22:11:23 -05:00
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
return mask & 0xff & ~keys->ignored_modifier_mask;
|
2015-01-06 22:11:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* meta_display_get_keybinding_action:
|
|
|
|
* @display: A #MetaDisplay
|
|
|
|
* @keycode: Raw keycode
|
|
|
|
* @mask: Event mask
|
|
|
|
*
|
|
|
|
* Get the keybinding action bound to @keycode. Builtin keybindings
|
|
|
|
* have a fixed associated #MetaKeyBindingAction, for bindings added
|
|
|
|
* dynamically the function will return the keybinding action
|
|
|
|
* meta_display_add_keybinding() returns on registration.
|
|
|
|
*
|
|
|
|
* Returns: The action that should be taken for the given key, or
|
|
|
|
* %META_KEYBINDING_ACTION_NONE.
|
|
|
|
*/
|
|
|
|
guint
|
|
|
|
meta_display_get_keybinding_action (MetaDisplay *display,
|
|
|
|
unsigned int keycode,
|
|
|
|
unsigned long mask)
|
|
|
|
{
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2017-04-25 07:17:02 -04:00
|
|
|
xkb_keycode_t code = (xkb_keycode_t) keycode;
|
|
|
|
MetaResolvedKeyCombo resolved_combo = { &code, 1 };
|
|
|
|
|
|
|
|
resolved_combo.mask = mask_from_event_params (keys, mask);
|
2015-01-07 17:48:32 -05:00
|
|
|
return get_keybinding_action (keys, &resolved_combo);
|
2015-01-06 22:11:23 -05:00
|
|
|
}
|
|
|
|
|
2014-08-14 17:32:41 -04:00
|
|
|
static void
|
2017-08-17 05:04:13 -04:00
|
|
|
reload_keybindings (MetaDisplay *display)
|
2012-12-12 20:50:43 -05:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2014-08-14 14:25:43 -04:00
|
|
|
ungrab_key_bindings (display);
|
2010-05-02 11:35:33 -04:00
|
|
|
|
2014-08-14 14:25:43 -04:00
|
|
|
/* Deciphering the modmap depends on the loaded keysyms to find out
|
|
|
|
* what modifiers is Super and so forth, so we need to reload it
|
|
|
|
* even when only the keymap changes */
|
2014-08-14 15:33:45 -04:00
|
|
|
reload_modmap (keys);
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2015-01-06 21:29:00 -05:00
|
|
|
reload_combos (keys);
|
2010-05-02 11:35:33 -04:00
|
|
|
|
2014-08-14 14:25:43 -04:00
|
|
|
grab_key_bindings (display);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
static GArray *
|
|
|
|
calc_grab_modifiers (MetaKeyBindingManager *keys,
|
|
|
|
unsigned int modmask)
|
|
|
|
{
|
|
|
|
unsigned int ignored_mask;
|
|
|
|
XIGrabModifiers mods;
|
|
|
|
GArray *mods_array = g_array_new (FALSE, TRUE, sizeof (XIGrabModifiers));
|
|
|
|
|
2016-02-10 14:17:49 -05:00
|
|
|
/* The X server crashes if XIAnyModifier gets passed in with any
|
|
|
|
other bits. It doesn't make sense to ask for a grab of
|
|
|
|
XIAnyModifier plus other bits anyway so we avoid that. */
|
|
|
|
if (modmask & XIAnyModifier)
|
|
|
|
{
|
|
|
|
mods = (XIGrabModifiers) { XIAnyModifier, 0 };
|
|
|
|
g_array_append_val (mods_array, mods);
|
|
|
|
return mods_array;
|
|
|
|
}
|
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
mods = (XIGrabModifiers) { modmask, 0 };
|
|
|
|
g_array_append_val (mods_array, mods);
|
|
|
|
|
|
|
|
for (ignored_mask = 1;
|
|
|
|
ignored_mask <= keys->ignored_modifier_mask;
|
|
|
|
++ignored_mask)
|
|
|
|
{
|
|
|
|
if (ignored_mask & keys->ignored_modifier_mask)
|
|
|
|
{
|
|
|
|
mods = (XIGrabModifiers) { modmask | ignored_mask, 0 };
|
|
|
|
g_array_append_val (mods_array, mods);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return mods_array;
|
|
|
|
}
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
meta_change_button_grab (MetaKeyBindingManager *keys,
|
|
|
|
Window xwindow,
|
|
|
|
gboolean grab,
|
|
|
|
gboolean sync,
|
|
|
|
int button,
|
|
|
|
int modmask)
|
2014-08-14 15:04:00 -04:00
|
|
|
{
|
2016-04-18 09:29:42 -04:00
|
|
|
if (meta_is_wayland_compositor ())
|
|
|
|
return;
|
|
|
|
|
2017-09-01 05:45:08 -04:00
|
|
|
MetaBackendX11 *backend = META_BACKEND_X11 (keys->backend);
|
2014-08-14 15:04:00 -04:00
|
|
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
|
|
|
|
|
|
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
|
|
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
2016-02-10 09:36:07 -05:00
|
|
|
GArray *mods;
|
2014-08-14 15:04:00 -04:00
|
|
|
|
|
|
|
XISetMask (mask.mask, XI_ButtonPress);
|
|
|
|
XISetMask (mask.mask, XI_ButtonRelease);
|
|
|
|
XISetMask (mask.mask, XI_Motion);
|
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
mods = calc_grab_modifiers (keys, modmask);
|
2014-08-14 15:04:00 -04:00
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
/* GrabModeSync means freeze until XAllowEvents */
|
|
|
|
if (grab)
|
|
|
|
XIGrabButton (xdisplay,
|
|
|
|
META_VIRTUAL_CORE_POINTER_ID,
|
|
|
|
button, xwindow, None,
|
|
|
|
sync ? XIGrabModeSync : XIGrabModeAsync,
|
|
|
|
XIGrabModeAsync, False,
|
|
|
|
&mask, mods->len, (XIGrabModifiers *)mods->data);
|
|
|
|
else
|
|
|
|
XIUngrabButton (xdisplay,
|
|
|
|
META_VIRTUAL_CORE_POINTER_ID,
|
|
|
|
button, xwindow, mods->len, (XIGrabModifiers *)mods->data);
|
2014-08-14 15:04:00 -04:00
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
g_array_free (mods, TRUE);
|
2014-08-14 15:04:00 -04:00
|
|
|
}
|
|
|
|
|
2014-08-14 15:52:32 -04:00
|
|
|
ClutterModifierType
|
|
|
|
meta_display_get_window_grab_modifiers (MetaDisplay *display)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
return keys->window_grab_modifiers;
|
2014-08-14 15:52:32 -04:00
|
|
|
}
|
|
|
|
|
2014-08-14 16:02:19 -04:00
|
|
|
static void
|
|
|
|
meta_change_buttons_grab (MetaKeyBindingManager *keys,
|
|
|
|
Window xwindow,
|
|
|
|
gboolean grab,
|
|
|
|
gboolean sync,
|
|
|
|
int modmask)
|
|
|
|
{
|
|
|
|
#define MAX_BUTTON 3
|
|
|
|
|
|
|
|
int i;
|
|
|
|
for (i = 1; i <= MAX_BUTTON; i++)
|
|
|
|
meta_change_button_grab (keys, xwindow, grab, sync, i, modmask);
|
|
|
|
}
|
|
|
|
|
2014-08-14 15:04:00 -04:00
|
|
|
void
|
|
|
|
meta_display_grab_window_buttons (MetaDisplay *display,
|
|
|
|
Window xwindow)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2014-08-14 15:04:00 -04:00
|
|
|
/* Grab Alt + button1 for moving window.
|
|
|
|
* Grab Alt + button2 for resizing window.
|
|
|
|
* Grab Alt + button3 for popping up window menu.
|
|
|
|
* Grab Alt + Shift + button1 for snap-moving window.
|
|
|
|
*/
|
|
|
|
meta_verbose ("Grabbing window buttons for 0x%lx\n", xwindow);
|
|
|
|
|
|
|
|
/* FIXME If we ignored errors here instead of spewing, we could
|
|
|
|
* put one big error trap around the loop and avoid a bunch of
|
|
|
|
* XSync()
|
|
|
|
*/
|
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
if (keys->window_grab_modifiers != 0)
|
2014-08-14 15:04:00 -04:00
|
|
|
{
|
2014-08-14 16:02:19 -04:00
|
|
|
meta_change_buttons_grab (keys, xwindow, TRUE, FALSE,
|
|
|
|
keys->window_grab_modifiers);
|
2014-08-14 15:04:00 -04:00
|
|
|
|
|
|
|
/* In addition to grabbing Alt+Button1 for moving the window,
|
|
|
|
* grab Alt+Shift+Button1 for snap-moving the window. See bug
|
|
|
|
* 112478. Unfortunately, this doesn't work with
|
|
|
|
* Shift+Alt+Button1 for some reason; so at least part of the
|
|
|
|
* order still matters, which sucks (please FIXME).
|
|
|
|
*/
|
2014-08-14 15:33:45 -04:00
|
|
|
meta_change_button_grab (keys, xwindow,
|
2014-08-14 15:04:00 -04:00
|
|
|
TRUE,
|
|
|
|
FALSE,
|
2014-08-14 15:33:45 -04:00
|
|
|
1, keys->window_grab_modifiers | ShiftMask);
|
2014-08-14 15:04:00 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_display_ungrab_window_buttons (MetaDisplay *display,
|
|
|
|
Window xwindow)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2014-08-14 15:04:00 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
if (keys->window_grab_modifiers == 0)
|
2014-08-14 15:04:00 -04:00
|
|
|
return;
|
|
|
|
|
2014-08-14 16:02:19 -04:00
|
|
|
meta_change_buttons_grab (keys, xwindow, FALSE, FALSE,
|
|
|
|
keys->window_grab_modifiers);
|
2014-08-14 15:04:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
update_window_grab_modifiers (MetaKeyBindingManager *keys)
|
2014-08-14 15:04:00 -04:00
|
|
|
{
|
|
|
|
MetaVirtualModifier virtual_mods;
|
|
|
|
unsigned int mods;
|
|
|
|
|
|
|
|
virtual_mods = meta_prefs_get_mouse_button_mods ();
|
2014-08-14 15:33:45 -04:00
|
|
|
devirtualize_modifiers (keys, virtual_mods, &mods);
|
2014-08-14 15:04:00 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->window_grab_modifiers = mods;
|
2014-08-14 15:04:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_display_grab_focus_window_button (MetaDisplay *display,
|
|
|
|
MetaWindow *window)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2014-08-14 15:04:00 -04:00
|
|
|
/* Grab button 1 for activating unfocused windows */
|
|
|
|
meta_verbose ("Grabbing unfocused window buttons for %s\n", window->desc);
|
|
|
|
|
|
|
|
if (window->have_focus_click_grab)
|
|
|
|
{
|
|
|
|
meta_verbose (" (well, not grabbing since we already have the grab)\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME If we ignored errors here instead of spewing, we could
|
|
|
|
* put one big error trap around the loop and avoid a bunch of
|
|
|
|
* XSync()
|
|
|
|
*/
|
|
|
|
|
2016-02-10 14:17:49 -05:00
|
|
|
meta_change_buttons_grab (keys, window->xwindow, TRUE, TRUE, XIAnyModifier);
|
2014-08-14 16:02:19 -04:00
|
|
|
window->have_focus_click_grab = TRUE;
|
2014-08-14 15:04:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_display_ungrab_focus_window_button (MetaDisplay *display,
|
|
|
|
MetaWindow *window)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2014-08-14 15:04:00 -04:00
|
|
|
meta_verbose ("Ungrabbing unfocused window buttons for %s\n", window->desc);
|
|
|
|
|
|
|
|
if (!window->have_focus_click_grab)
|
|
|
|
return;
|
|
|
|
|
2016-02-10 14:17:49 -05:00
|
|
|
meta_change_buttons_grab (keys, window->xwindow, FALSE, FALSE, XIAnyModifier);
|
2014-08-14 16:02:19 -04:00
|
|
|
window->have_focus_click_grab = FALSE;
|
2014-08-14 15:04:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
prefs_changed_callback (MetaPreference pref,
|
|
|
|
void *data)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaDisplay *display = data;
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
switch (pref)
|
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
case META_PREF_KEYBINDINGS:
|
2013-03-31 13:06:40 -04:00
|
|
|
ungrab_key_bindings (display);
|
2014-08-14 15:33:45 -04:00
|
|
|
rebuild_key_binding_table (keys);
|
|
|
|
rebuild_special_bindings (keys);
|
2015-01-06 21:29:00 -05:00
|
|
|
reload_combos (keys);
|
2013-03-31 13:06:40 -04:00
|
|
|
grab_key_bindings (display);
|
2002-04-28 00:52:26 -04:00
|
|
|
break;
|
2014-08-14 15:04:00 -04:00
|
|
|
case META_PREF_MOUSE_BUTTON_MODS:
|
|
|
|
{
|
|
|
|
GSList *windows, *l;
|
|
|
|
windows = meta_display_list_windows (display, META_LIST_DEFAULT);
|
|
|
|
|
|
|
|
for (l = windows; l; l = l->next)
|
|
|
|
{
|
|
|
|
MetaWindow *w = l->data;
|
|
|
|
meta_display_ungrab_window_buttons (display, w->xwindow);
|
|
|
|
}
|
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
update_window_grab_modifiers (keys);
|
2014-08-14 15:04:00 -04:00
|
|
|
|
|
|
|
for (l = windows; l; l = l->next)
|
|
|
|
{
|
|
|
|
MetaWindow *w = l->data;
|
|
|
|
if (w->type != META_WINDOW_DOCK)
|
|
|
|
meta_display_grab_window_buttons (display, w->xwindow);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_slist_free (windows);
|
|
|
|
}
|
2002-04-28 00:52:26 -04:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-06-06 00:47:37 -04:00
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
void
|
|
|
|
meta_display_shutdown_keys (MetaDisplay *display)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2014-08-14 15:04:00 -04:00
|
|
|
meta_prefs_remove_listener (prefs_changed_callback, display);
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_destroy (keys->key_bindings_index);
|
|
|
|
g_hash_table_destroy (keys->key_bindings);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2001-10-04 22:58:48 -04:00
|
|
|
/* Grab/ungrab, ignoring all annoying modifiers like NumLock etc. */
|
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
meta_change_keygrab (MetaKeyBindingManager *keys,
|
2015-01-06 22:02:17 -05:00
|
|
|
Window xwindow,
|
|
|
|
gboolean grab,
|
2015-01-07 17:48:32 -05:00
|
|
|
MetaResolvedKeyCombo *resolved_combo)
|
2001-10-04 22:58:48 -04:00
|
|
|
{
|
2012-11-20 18:04:42 -05:00
|
|
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
|
|
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
|
|
|
|
|
|
|
XISetMask (mask.mask, XI_KeyPress);
|
|
|
|
XISetMask (mask.mask, XI_KeyRelease);
|
|
|
|
|
2016-04-18 09:29:42 -04:00
|
|
|
if (meta_is_wayland_compositor ())
|
|
|
|
return;
|
|
|
|
|
2014-04-23 16:23:26 -04:00
|
|
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
|
|
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
2016-02-10 09:36:07 -05:00
|
|
|
GArray *mods;
|
2017-04-25 07:17:02 -04:00
|
|
|
int i;
|
2014-04-23 16:23:26 -04:00
|
|
|
|
2001-10-04 22:58:48 -04:00
|
|
|
/* Grab keycode/modmask, together with
|
2002-04-28 00:52:26 -04:00
|
|
|
* all combinations of ignored modifiers.
|
2001-10-04 22:58:48 -04:00
|
|
|
* X provides no better way to do this.
|
|
|
|
*/
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
mods = calc_grab_modifiers (keys, resolved_combo->mask);
|
2012-11-20 18:04:42 -05:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
for (i = 0; i < resolved_combo->len; i++)
|
|
|
|
{
|
|
|
|
xkb_keycode_t keycode = resolved_combo->keycodes[i];
|
|
|
|
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"%s keybinding keycode %d mask 0x%x on 0x%lx\n",
|
|
|
|
grab ? "Grabbing" : "Ungrabbing",
|
|
|
|
keycode, resolved_combo->mask, xwindow);
|
|
|
|
|
|
|
|
if (grab)
|
|
|
|
XIGrabKeycode (xdisplay,
|
|
|
|
META_VIRTUAL_CORE_KEYBOARD_ID,
|
|
|
|
keycode, xwindow,
|
|
|
|
XIGrabModeSync, XIGrabModeAsync,
|
|
|
|
False, &mask, mods->len, (XIGrabModifiers *)mods->data);
|
|
|
|
else
|
|
|
|
XIUngrabKeycode (xdisplay,
|
|
|
|
META_VIRTUAL_CORE_KEYBOARD_ID,
|
|
|
|
keycode, xwindow,
|
|
|
|
mods->len, (XIGrabModifiers *)mods->data);
|
|
|
|
}
|
2002-10-21 17:44:35 -04:00
|
|
|
|
2016-02-10 09:36:07 -05:00
|
|
|
g_array_free (mods, TRUE);
|
2001-10-04 22:58:48 -04:00
|
|
|
}
|
|
|
|
|
2014-03-03 08:08:34 -05:00
|
|
|
typedef struct
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys;
|
2014-03-03 08:08:34 -05:00
|
|
|
Window xwindow;
|
2014-05-20 09:59:45 -04:00
|
|
|
gboolean only_per_window;
|
2014-03-03 08:08:34 -05:00
|
|
|
gboolean grab;
|
|
|
|
} ChangeKeygrabData;
|
|
|
|
|
|
|
|
static void
|
|
|
|
change_keygrab_foreach (gpointer key,
|
|
|
|
gpointer value,
|
|
|
|
gpointer user_data)
|
|
|
|
{
|
|
|
|
ChangeKeygrabData *data = user_data;
|
|
|
|
MetaKeyBinding *binding = value;
|
2014-05-20 09:59:45 -04:00
|
|
|
gboolean binding_is_per_window = (binding->flags & META_KEY_BINDING_PER_WINDOW) != 0;
|
2014-03-03 08:08:34 -05:00
|
|
|
|
2014-05-20 09:59:45 -04:00
|
|
|
if (data->only_per_window != binding_is_per_window)
|
|
|
|
return;
|
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
if (binding->resolved_combo.len == 0)
|
2014-05-20 09:59:45 -04:00
|
|
|
return;
|
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
meta_change_keygrab (data->keys, data->xwindow, data->grab, &binding->resolved_combo);
|
2014-03-03 08:08:34 -05:00
|
|
|
}
|
|
|
|
|
2001-10-04 22:58:48 -04:00
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
change_binding_keygrabs (MetaKeyBindingManager *keys,
|
|
|
|
Window xwindow,
|
|
|
|
gboolean only_per_window,
|
|
|
|
gboolean grab)
|
2001-06-06 00:47:37 -04:00
|
|
|
{
|
2014-03-03 08:08:34 -05:00
|
|
|
ChangeKeygrabData data;
|
2001-06-06 00:47:37 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
data.keys = keys;
|
2014-03-03 08:08:34 -05:00
|
|
|
data.xwindow = xwindow;
|
2014-05-20 09:59:45 -04:00
|
|
|
data.only_per_window = only_per_window;
|
2014-03-03 08:08:34 -05:00
|
|
|
data.grab = grab;
|
2002-11-06 11:00:56 -05:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_foreach (keys->key_bindings, change_keygrab_foreach, &data);
|
2001-06-06 00:47:37 -04:00
|
|
|
}
|
|
|
|
|
2001-06-23 01:49:35 -04:00
|
|
|
static void
|
2013-03-31 13:06:40 -04:00
|
|
|
meta_screen_change_keygrabs (MetaScreen *screen,
|
|
|
|
gboolean grab)
|
2001-06-06 00:47:37 -04:00
|
|
|
{
|
2013-03-31 13:06:40 -04:00
|
|
|
MetaDisplay *display = screen->display;
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2017-04-25 07:17:02 -04:00
|
|
|
int i;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
if (keys->overlay_resolved_key_combo.len != 0)
|
2015-01-07 17:48:32 -05:00
|
|
|
meta_change_keygrab (keys, screen->xroot, grab, &keys->overlay_resolved_key_combo);
|
2013-03-31 13:06:40 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
for (i = 0; i < keys->n_iso_next_group_combos; i++)
|
|
|
|
meta_change_keygrab (keys, screen->xroot, grab, &keys->iso_next_group_combo[i]);
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
change_binding_keygrabs (keys, screen->xroot, FALSE, grab);
|
2001-06-06 00:47:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2002-04-28 00:52:26 -04:00
|
|
|
meta_screen_grab_keys (MetaScreen *screen)
|
2001-06-23 01:49:35 -04:00
|
|
|
{
|
2002-04-28 00:52:26 -04:00
|
|
|
if (screen->keys_grabbed)
|
|
|
|
return;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2013-03-31 13:06:40 -04:00
|
|
|
meta_screen_change_keygrabs (screen, TRUE);
|
2002-04-28 00:52:26 -04:00
|
|
|
|
|
|
|
screen->keys_grabbed = TRUE;
|
2001-06-23 01:49:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_screen_ungrab_keys (MetaScreen *screen)
|
|
|
|
{
|
2013-03-31 13:06:40 -04:00
|
|
|
if (!screen->keys_grabbed)
|
|
|
|
return;
|
|
|
|
|
|
|
|
meta_screen_change_keygrabs (screen, FALSE);
|
|
|
|
|
|
|
|
screen->keys_grabbed = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
change_window_keygrabs (MetaKeyBindingManager *keys,
|
|
|
|
Window xwindow,
|
|
|
|
gboolean grab)
|
2013-03-31 13:06:40 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
change_binding_keygrabs (keys, xwindow, TRUE, grab);
|
2001-06-23 01:49:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_window_grab_keys (MetaWindow *window)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaDisplay *display = window->display;
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
if (window->all_keys_grabbed)
|
|
|
|
return;
|
2003-02-27 17:44:36 -05:00
|
|
|
|
2008-11-23 14:28:40 -05:00
|
|
|
if (window->type == META_WINDOW_DOCK
|
|
|
|
|| window->override_redirect)
|
2003-02-27 17:44:36 -05:00
|
|
|
{
|
|
|
|
if (window->keys_grabbed)
|
2014-08-14 15:33:45 -04:00
|
|
|
change_window_keygrabs (keys, window->xwindow, FALSE);
|
2003-02-27 17:44:36 -05:00
|
|
|
window->keys_grabbed = FALSE;
|
|
|
|
return;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2001-06-23 01:49:35 -04:00
|
|
|
if (window->keys_grabbed)
|
|
|
|
{
|
|
|
|
if (window->frame && !window->grab_on_frame)
|
2014-08-14 15:33:45 -04:00
|
|
|
change_window_keygrabs (keys, window->xwindow, FALSE);
|
2001-06-23 01:49:35 -04:00
|
|
|
else if (window->frame == NULL &&
|
|
|
|
window->grab_on_frame)
|
|
|
|
; /* continue to regrab on client window */
|
|
|
|
else
|
|
|
|
return; /* already all good */
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
change_window_keygrabs (keys,
|
|
|
|
meta_window_x11_get_toplevel_xwindow (window),
|
|
|
|
TRUE);
|
2001-06-23 01:49:35 -04:00
|
|
|
|
|
|
|
window->keys_grabbed = TRUE;
|
|
|
|
window->grab_on_frame = window->frame != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_window_ungrab_keys (MetaWindow *window)
|
|
|
|
{
|
|
|
|
if (window->keys_grabbed)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaDisplay *display = window->display;
|
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2001-06-23 01:49:35 -04:00
|
|
|
if (window->grab_on_frame &&
|
|
|
|
window->frame != NULL)
|
2014-08-14 15:33:45 -04:00
|
|
|
change_window_keygrabs (keys, window->frame->xwindow, FALSE);
|
2001-06-23 01:49:35 -04:00
|
|
|
else if (!window->grab_on_frame)
|
2014-08-14 15:33:45 -04:00
|
|
|
change_window_keygrabs (keys, window->xwindow, FALSE);
|
2002-06-08 20:09:01 -04:00
|
|
|
|
|
|
|
window->keys_grabbed = FALSE;
|
2001-06-23 01:49:35 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-28 09:28:11 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_external_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer user_data)
|
2012-08-28 09:28:11 -04:00
|
|
|
{
|
2015-01-06 22:11:23 -05:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2015-01-07 17:48:32 -05:00
|
|
|
guint action = get_keybinding_action (keys, &binding->resolved_combo);
|
2013-10-03 18:03:53 -04:00
|
|
|
meta_display_accelerator_activate (display, action, event);
|
2012-08-28 09:28:11 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
guint
|
|
|
|
meta_display_grab_accelerator (MetaDisplay *display,
|
|
|
|
const char *accelerator)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2014-03-03 08:08:34 -05:00
|
|
|
MetaKeyBinding *binding;
|
2012-08-28 09:28:11 -04:00
|
|
|
MetaKeyGrab *grab;
|
2016-05-11 12:07:49 -04:00
|
|
|
MetaKeyCombo combo = { 0 };
|
2017-04-25 07:17:02 -04:00
|
|
|
MetaResolvedKeyCombo resolved_combo = { NULL, 0 };
|
2012-08-28 09:28:11 -04:00
|
|
|
|
2015-01-06 21:59:53 -05:00
|
|
|
if (!meta_parse_accelerator (accelerator, &combo))
|
2012-08-28 09:28:11 -04:00
|
|
|
{
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Failed to parse accelerator\n");
|
2013-09-11 04:37:36 -04:00
|
|
|
meta_warning ("\"%s\" is not a valid accelerator\n", accelerator);
|
2012-08-28 09:28:11 -04:00
|
|
|
|
|
|
|
return META_KEYBINDING_ACTION_NONE;
|
|
|
|
}
|
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
resolve_key_combo (keys, &combo, &resolved_combo);
|
2012-08-28 09:28:11 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
if (resolved_combo.len == 0)
|
2012-08-28 09:28:11 -04:00
|
|
|
return META_KEYBINDING_ACTION_NONE;
|
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
if (get_keybinding (keys, &resolved_combo))
|
2017-04-25 07:17:02 -04:00
|
|
|
{
|
|
|
|
resolved_key_combo_reset (&resolved_combo);
|
|
|
|
return META_KEYBINDING_ACTION_NONE;
|
|
|
|
}
|
2012-08-28 09:28:11 -04:00
|
|
|
|
2016-04-18 09:29:42 -04:00
|
|
|
meta_change_keygrab (keys, display->screen->xroot, TRUE, &resolved_combo);
|
2012-08-28 09:28:11 -04:00
|
|
|
|
|
|
|
grab = g_new0 (MetaKeyGrab, 1);
|
|
|
|
grab->action = next_dynamic_keybinding_action ();
|
|
|
|
grab->name = meta_external_binding_name_for_action (grab->action);
|
2015-01-06 21:31:33 -05:00
|
|
|
grab->combo = combo;
|
2012-08-28 09:28:11 -04:00
|
|
|
|
|
|
|
g_hash_table_insert (external_grabs, grab->name, grab);
|
|
|
|
|
2015-01-08 21:42:37 -05:00
|
|
|
binding = g_slice_new0 (MetaKeyBinding);
|
2012-08-28 09:28:11 -04:00
|
|
|
binding->name = grab->name;
|
|
|
|
binding->handler = HANDLER ("external-grab");
|
2015-01-06 21:31:33 -05:00
|
|
|
binding->combo = combo;
|
2015-01-07 17:48:32 -05:00
|
|
|
binding->resolved_combo = resolved_combo;
|
2012-08-28 09:28:11 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_add (keys->key_bindings, binding);
|
|
|
|
index_binding (keys, binding);
|
2014-03-03 08:08:34 -05:00
|
|
|
|
2012-08-28 09:28:11 -04:00
|
|
|
return grab->action;
|
|
|
|
}
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
meta_display_ungrab_accelerator (MetaDisplay *display,
|
|
|
|
guint action)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2014-03-03 13:33:08 -05:00
|
|
|
MetaKeyBinding *binding;
|
2012-08-28 09:28:11 -04:00
|
|
|
MetaKeyGrab *grab;
|
|
|
|
char *key;
|
2017-04-25 07:17:02 -04:00
|
|
|
MetaResolvedKeyCombo resolved_combo = { NULL, 0 };
|
2012-08-28 09:28:11 -04:00
|
|
|
|
|
|
|
g_return_val_if_fail (action != META_KEYBINDING_ACTION_NONE, FALSE);
|
|
|
|
|
|
|
|
key = meta_external_binding_name_for_action (action);
|
|
|
|
grab = g_hash_table_lookup (external_grabs, key);
|
|
|
|
if (!grab)
|
|
|
|
return FALSE;
|
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
resolve_key_combo (keys, &grab->combo, &resolved_combo);
|
|
|
|
binding = get_keybinding (keys, &resolved_combo);
|
2014-03-03 13:33:08 -05:00
|
|
|
if (binding)
|
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
int i;
|
2014-03-03 08:08:34 -05:00
|
|
|
|
2016-04-18 09:29:42 -04:00
|
|
|
meta_change_keygrab (keys, display->screen->xroot, FALSE, &binding->resolved_combo);
|
2014-03-03 13:33:08 -05:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
for (i = 0; i < binding->resolved_combo.len; i++)
|
|
|
|
{
|
|
|
|
guint32 index_key = key_combo_key (&binding->resolved_combo, i);
|
|
|
|
g_hash_table_remove (keys->key_bindings_index, GINT_TO_POINTER (index_key));
|
|
|
|
}
|
2014-03-03 08:08:34 -05:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
g_hash_table_remove (keys->key_bindings, binding);
|
2014-03-03 13:33:08 -05:00
|
|
|
}
|
2012-08-28 09:28:11 -04:00
|
|
|
|
|
|
|
g_hash_table_remove (external_grabs, key);
|
|
|
|
g_free (key);
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_reset (&resolved_combo);
|
2012-08-28 09:28:11 -04:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2002-06-27 01:08:32 -04:00
|
|
|
static gboolean
|
2014-08-14 15:33:45 -04:00
|
|
|
grab_keyboard (Window xwindow,
|
|
|
|
guint32 timestamp,
|
|
|
|
int grab_mode)
|
2002-06-27 01:08:32 -04:00
|
|
|
{
|
2003-01-21 17:40:25 -05:00
|
|
|
int grab_status;
|
2012-11-20 17:11:13 -05:00
|
|
|
|
|
|
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
|
|
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
|
|
|
|
|
|
|
XISetMask (mask.mask, XI_KeyPress);
|
|
|
|
XISetMask (mask.mask, XI_KeyRelease);
|
|
|
|
|
2016-04-18 09:29:42 -04:00
|
|
|
if (meta_is_wayland_compositor ())
|
|
|
|
return TRUE;
|
|
|
|
|
2002-07-02 01:03:28 -04:00
|
|
|
/* Grab the keyboard, so we get key releases and all key
|
2002-06-27 01:08:32 -04:00
|
|
|
* presses
|
|
|
|
*/
|
2014-04-23 16:23:26 -04:00
|
|
|
|
|
|
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
|
|
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
2002-06-27 01:08:32 -04:00
|
|
|
|
2013-03-28 21:38:43 -04:00
|
|
|
/* Strictly, we only need to set grab_mode on the keyboard device
|
|
|
|
* while the pointer should always be XIGrabModeAsync. Unfortunately
|
|
|
|
* there is a bug in the X server, only fixed (link below) in 1.15,
|
|
|
|
* which swaps these arguments for keyboard devices. As such, we set
|
|
|
|
* both the device and the paired device mode which works around
|
|
|
|
* that bug and also works on fixed X servers.
|
|
|
|
*
|
|
|
|
* http://cgit.freedesktop.org/xorg/xserver/commit/?id=9003399708936481083424b4ff8f18a16b88b7b3
|
|
|
|
*/
|
2014-04-23 16:23:26 -04:00
|
|
|
grab_status = XIGrabDevice (xdisplay,
|
2012-11-20 17:11:13 -05:00
|
|
|
META_VIRTUAL_CORE_KEYBOARD_ID,
|
|
|
|
xwindow,
|
|
|
|
timestamp,
|
|
|
|
None,
|
2013-03-28 21:38:43 -04:00
|
|
|
grab_mode, grab_mode,
|
2013-05-29 14:51:43 -04:00
|
|
|
False, /* owner_events */
|
2012-11-20 17:11:13 -05:00
|
|
|
&mask);
|
|
|
|
|
2014-04-24 10:57:20 -04:00
|
|
|
return (grab_status == Success);
|
2002-06-27 01:08:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-08-14 15:33:45 -04:00
|
|
|
ungrab_keyboard (guint32 timestamp)
|
2002-06-27 01:08:32 -04:00
|
|
|
{
|
2016-04-18 09:29:42 -04:00
|
|
|
if (meta_is_wayland_compositor ())
|
|
|
|
return;
|
|
|
|
|
2014-04-23 16:23:26 -04:00
|
|
|
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
|
|
|
|
Display *xdisplay = meta_backend_x11_get_xdisplay (backend);
|
2002-06-27 01:08:32 -04:00
|
|
|
|
2014-04-23 16:23:26 -04:00
|
|
|
XIUngrabDevice (xdisplay, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
2002-06-27 01:08:32 -04:00
|
|
|
}
|
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
gboolean
|
2006-08-21 14:38:21 -04:00
|
|
|
meta_window_grab_all_keys (MetaWindow *window,
|
Fix issues on 64-bit machines with timestamps by using guint32 (like gtk+
2006-09-13 Elijah Newren <newren gmail com>
* src/common.h (MetaWindowMenuFunc):
* src/core.[ch] (meta_core_user_lower_and_unfocus,
meta_core_user_focus, meta_core_show_window_menu,
meta_core_begin_grab_op, meta_core_end_grab_op):
* src/delete.c (delete_ping_reply_func, delete_ping_timeout_func,
meta_window_delete):
* src/display.[ch] (struct MetaDisplay, struct MetaPingData,
sanity_check_timestamps, meta_display_open, event_callback,
meta_spew_event, meta_display_set_grab_op_cursor,
meta_display_begin_grab_op, meta_display_end_grab_op,
meta_display_ping_timeout, meta_display_ping_window,
process_pong_message, timestamp_too_old,
meta_display_set_input_focus_window):
* src/keybindings.[ch] (grab_keyboard, ungrab_keyboard,
meta_screen_grab_all_keys, meta_window_grab_all_keys,
meta_window_ungrab_all_keys, error_on_generic_command,
error_on_command, error_on_terminal_command):
* src/metacity-dialog.c (on_realize, warn_about_no_sm_support,
error_about_command, main):
* src/screen.[ch] (struct _MetaScreen, meta_screen_new,
meta_screen_show_desktop, meta_screen_apply_startup_properties):
* src/session.c (warn_about_lame_clients_and_finish_interact):
* src/window.[ch] (struct _MetaWindow,
intervening_user_event_occurred, window_activate,
meta_window_delete, meta_window_focus,
meta_window_send_icccm_message, meta_window_client_message,
menu_callback, meta_window_show_menu, struct EventScannerData,
check_use_this_motion_notify, meta_window_begin_grab_op,
meta_window_set_user_time):
* src/workspace.[ch] (focus_ancestor_or_mru_window,
meta_workspace_activate_with_focus, meta_workspace_activate,
meta_workspace_focus_default_window,
focus_ancestor_or_mru_window):
Fix issues on 64-bit machines with timestamps by using guint32
(like gtk+ does) instead of Time. #348305
2006-09-13 12:32:33 -04:00
|
|
|
guint32 timestamp)
|
2001-07-11 02:22:00 -04:00
|
|
|
{
|
|
|
|
Window grabwindow;
|
2002-06-27 01:08:32 -04:00
|
|
|
gboolean retval;
|
2013-11-14 21:34:20 -05:00
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
if (window->all_keys_grabbed)
|
|
|
|
return FALSE;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
if (window->keys_grabbed)
|
|
|
|
meta_window_ungrab_keys (window);
|
|
|
|
|
|
|
|
/* Make sure the window is focused, otherwise the grab
|
|
|
|
* won't do a lot of good.
|
|
|
|
*/
|
2002-01-03 18:28:19 -05:00
|
|
|
meta_topic (META_DEBUG_FOCUS,
|
|
|
|
"Focusing %s because we're grabbing all its keys\n",
|
|
|
|
window->desc);
|
2006-08-21 14:38:21 -04:00
|
|
|
meta_window_focus (window, timestamp);
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2014-06-16 18:25:40 -04:00
|
|
|
grabwindow = meta_window_x11_get_toplevel_xwindow (window);
|
2002-06-27 01:08:32 -04:00
|
|
|
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Grabbing all keys on window %s\n", window->desc);
|
2014-08-14 15:33:45 -04:00
|
|
|
retval = grab_keyboard (grabwindow, timestamp, XIGrabModeAsync);
|
2002-06-27 01:08:32 -04:00
|
|
|
if (retval)
|
2001-07-11 02:22:00 -04:00
|
|
|
{
|
2002-06-27 01:08:32 -04:00
|
|
|
window->keys_grabbed = FALSE;
|
|
|
|
window->all_keys_grabbed = TRUE;
|
|
|
|
window->grab_on_frame = window->frame != NULL;
|
2001-07-11 02:22:00 -04:00
|
|
|
}
|
2002-01-03 18:28:19 -05:00
|
|
|
|
2002-06-27 01:08:32 -04:00
|
|
|
return retval;
|
2001-07-11 02:22:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
Fix issues on 64-bit machines with timestamps by using guint32 (like gtk+
2006-09-13 Elijah Newren <newren gmail com>
* src/common.h (MetaWindowMenuFunc):
* src/core.[ch] (meta_core_user_lower_and_unfocus,
meta_core_user_focus, meta_core_show_window_menu,
meta_core_begin_grab_op, meta_core_end_grab_op):
* src/delete.c (delete_ping_reply_func, delete_ping_timeout_func,
meta_window_delete):
* src/display.[ch] (struct MetaDisplay, struct MetaPingData,
sanity_check_timestamps, meta_display_open, event_callback,
meta_spew_event, meta_display_set_grab_op_cursor,
meta_display_begin_grab_op, meta_display_end_grab_op,
meta_display_ping_timeout, meta_display_ping_window,
process_pong_message, timestamp_too_old,
meta_display_set_input_focus_window):
* src/keybindings.[ch] (grab_keyboard, ungrab_keyboard,
meta_screen_grab_all_keys, meta_window_grab_all_keys,
meta_window_ungrab_all_keys, error_on_generic_command,
error_on_command, error_on_terminal_command):
* src/metacity-dialog.c (on_realize, warn_about_no_sm_support,
error_about_command, main):
* src/screen.[ch] (struct _MetaScreen, meta_screen_new,
meta_screen_show_desktop, meta_screen_apply_startup_properties):
* src/session.c (warn_about_lame_clients_and_finish_interact):
* src/window.[ch] (struct _MetaWindow,
intervening_user_event_occurred, window_activate,
meta_window_delete, meta_window_focus,
meta_window_send_icccm_message, meta_window_client_message,
menu_callback, meta_window_show_menu, struct EventScannerData,
check_use_this_motion_notify, meta_window_begin_grab_op,
meta_window_set_user_time):
* src/workspace.[ch] (focus_ancestor_or_mru_window,
meta_workspace_activate_with_focus, meta_workspace_activate,
meta_workspace_focus_default_window,
focus_ancestor_or_mru_window):
Fix issues on 64-bit machines with timestamps by using guint32
(like gtk+ does) instead of Time. #348305
2006-09-13 12:32:33 -04:00
|
|
|
meta_window_ungrab_all_keys (MetaWindow *window, guint32 timestamp)
|
2001-07-11 02:22:00 -04:00
|
|
|
{
|
|
|
|
if (window->all_keys_grabbed)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
ungrab_keyboard (timestamp);
|
2002-01-03 18:28:19 -05:00
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
window->grab_on_frame = FALSE;
|
|
|
|
window->all_keys_grabbed = FALSE;
|
|
|
|
window->keys_grabbed = FALSE;
|
|
|
|
|
|
|
|
/* Re-establish our standard bindings */
|
|
|
|
meta_window_grab_keys (window);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-28 21:38:43 -04:00
|
|
|
void
|
2014-10-13 00:52:30 -04:00
|
|
|
meta_display_freeze_keyboard (MetaDisplay *display, guint32 timestamp)
|
2013-03-28 21:38:43 -04:00
|
|
|
{
|
2014-09-10 12:30:14 -04:00
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
|
|
|
|
if (!META_IS_BACKEND_X11 (backend))
|
|
|
|
return;
|
|
|
|
|
2014-10-13 00:52:30 -04:00
|
|
|
Window window = meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend));
|
2014-08-14 15:33:45 -04:00
|
|
|
grab_keyboard (window, timestamp, XIGrabModeSync);
|
2013-03-28 21:38:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_display_ungrab_keyboard (MetaDisplay *display, guint32 timestamp)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
ungrab_keyboard (timestamp);
|
2013-03-28 21:38:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_display_unfreeze_keyboard (MetaDisplay *display, guint32 timestamp)
|
|
|
|
{
|
2014-04-23 16:23:26 -04:00
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
|
|
|
|
if (!META_IS_BACKEND_X11 (backend))
|
|
|
|
return;
|
|
|
|
|
|
|
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
|
|
|
|
|
|
XIAllowEvents (xdisplay, META_VIRTUAL_CORE_KEYBOARD_ID,
|
2013-03-28 21:38:43 -04:00
|
|
|
XIAsyncDevice, timestamp);
|
|
|
|
/* We shouldn't need to unfreeze the pointer device here, however we
|
|
|
|
* have to, due to the workaround we do in grab_keyboard().
|
|
|
|
*/
|
2014-04-23 16:23:26 -04:00
|
|
|
XIAllowEvents (xdisplay, META_VIRTUAL_CORE_POINTER_ID,
|
2013-03-28 21:38:43 -04:00
|
|
|
XIAsyncDevice, timestamp);
|
|
|
|
}
|
|
|
|
|
2012-12-12 20:50:43 -05:00
|
|
|
static gboolean
|
2014-04-07 15:41:37 -04:00
|
|
|
is_modifier (xkb_keysym_t keysym)
|
|
|
|
{
|
|
|
|
switch (keysym)
|
|
|
|
{
|
|
|
|
case XKB_KEY_Shift_L:
|
|
|
|
case XKB_KEY_Shift_R:
|
|
|
|
case XKB_KEY_Control_L:
|
|
|
|
case XKB_KEY_Control_R:
|
|
|
|
case XKB_KEY_Caps_Lock:
|
|
|
|
case XKB_KEY_Shift_Lock:
|
|
|
|
case XKB_KEY_Meta_L:
|
|
|
|
case XKB_KEY_Meta_R:
|
|
|
|
case XKB_KEY_Alt_L:
|
|
|
|
case XKB_KEY_Alt_R:
|
|
|
|
case XKB_KEY_Super_L:
|
|
|
|
case XKB_KEY_Super_R:
|
|
|
|
case XKB_KEY_Hyper_L:
|
|
|
|
case XKB_KEY_Hyper_R:
|
|
|
|
return TRUE;
|
|
|
|
default:
|
|
|
|
return FALSE;
|
2001-08-19 14:09:10 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-25 16:54:54 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
invoke_handler (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaKeyHandler *handler,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding)
|
2009-08-25 16:54:54 -04:00
|
|
|
{
|
|
|
|
if (handler->func)
|
|
|
|
(* handler->func) (display, screen,
|
2011-10-27 21:05:43 -04:00
|
|
|
handler->flags & META_KEY_BINDING_PER_WINDOW ?
|
2012-12-12 20:50:43 -05:00
|
|
|
window : NULL,
|
2009-08-25 16:54:54 -04:00
|
|
|
event,
|
|
|
|
binding,
|
|
|
|
handler->user_data);
|
|
|
|
else
|
|
|
|
(* handler->default_func) (display, screen,
|
2011-10-27 21:05:43 -04:00
|
|
|
handler->flags & META_KEY_BINDING_PER_WINDOW ?
|
2012-12-12 20:50:43 -05:00
|
|
|
window: NULL,
|
2009-08-25 16:54:54 -04:00
|
|
|
event,
|
|
|
|
binding,
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
2008-03-10 23:37:54 -04:00
|
|
|
static gboolean
|
2014-03-03 08:08:34 -05:00
|
|
|
process_event (MetaDisplay *display,
|
2002-10-16 16:12:24 -04:00
|
|
|
MetaScreen *screen,
|
2002-04-28 00:52:26 -04:00
|
|
|
MetaWindow *window,
|
2014-02-26 12:56:17 -05:00
|
|
|
ClutterKeyEvent *event)
|
2001-06-06 00:47:37 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2017-04-25 07:17:02 -04:00
|
|
|
xkb_keycode_t keycode = (xkb_keycode_t) event->hardware_keycode;
|
|
|
|
MetaResolvedKeyCombo resolved_combo = { &keycode, 1 };
|
2014-03-03 13:33:08 -05:00
|
|
|
MetaKeyBinding *binding;
|
2001-06-06 00:47:37 -04:00
|
|
|
|
2002-06-15 23:03:08 -04:00
|
|
|
/* we used to have release-based bindings but no longer. */
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->type == CLUTTER_KEY_RELEASE)
|
2008-03-10 23:37:54 -04:00
|
|
|
return FALSE;
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_combo.mask = mask_from_event_params (keys, event->modifier_state);
|
2015-01-06 22:11:23 -05:00
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
binding = get_keybinding (keys, &resolved_combo);
|
2015-01-06 22:11:23 -05:00
|
|
|
|
2014-03-03 13:33:08 -05:00
|
|
|
if (!binding ||
|
2014-03-20 10:24:43 -04:00
|
|
|
(!window && binding->flags & META_KEY_BINDING_PER_WINDOW))
|
|
|
|
goto not_found;
|
|
|
|
|
2017-03-17 08:34:52 -04:00
|
|
|
if (display->focus_window &&
|
|
|
|
!(binding->handler->flags & META_KEY_BINDING_NON_MASKABLE))
|
|
|
|
{
|
|
|
|
ClutterInputDevice *source;
|
|
|
|
|
|
|
|
source = clutter_event_get_source_device ((ClutterEvent *) event);
|
|
|
|
if (meta_window_shortcuts_inhibited (display->focus_window, source))
|
|
|
|
goto not_found;
|
|
|
|
}
|
|
|
|
|
2014-03-20 10:24:43 -04:00
|
|
|
/* If the compositor filtered out the keybindings, that
|
|
|
|
* means they don't want the binding to trigger, so we do
|
|
|
|
* the same thing as if the binding didn't exist. */
|
2014-03-18 17:31:22 -04:00
|
|
|
if (meta_compositor_filter_keybinding (display->compositor, binding))
|
2014-03-03 13:33:08 -05:00
|
|
|
goto not_found;
|
|
|
|
|
|
|
|
if (binding->handler == NULL)
|
|
|
|
meta_bug ("Binding %s has no handler\n", binding->name);
|
|
|
|
else
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Running handler for %s\n",
|
|
|
|
binding->name);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2014-03-03 13:33:08 -05:00
|
|
|
/* Global keybindings count as a let-the-terminal-lose-focus
|
|
|
|
* due to new window mapping until the user starts
|
|
|
|
* interacting with the terminal again.
|
|
|
|
*/
|
|
|
|
display->allow_terminal_deactivation = TRUE;
|
2006-01-15 12:03:57 -05:00
|
|
|
|
2014-03-03 13:33:08 -05:00
|
|
|
invoke_handler (display, screen, binding->handler, window, event, binding);
|
2009-02-03 08:20:51 -05:00
|
|
|
|
2014-03-03 13:33:08 -05:00
|
|
|
return TRUE;
|
2002-06-15 23:03:08 -04:00
|
|
|
|
2014-03-03 13:33:08 -05:00
|
|
|
not_found:
|
2002-06-15 23:03:08 -04:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"No handler found for this event in this binding table\n");
|
2008-03-10 23:37:54 -04:00
|
|
|
return FALSE;
|
2001-06-06 00:47:37 -04:00
|
|
|
}
|
2002-06-27 01:08:32 -04:00
|
|
|
|
2011-07-08 20:48:01 -04:00
|
|
|
static gboolean
|
|
|
|
process_overlay_key (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
2014-02-26 12:56:17 -05:00
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaWindow *window)
|
2011-07-08 20:48:01 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2017-09-01 05:45:08 -04:00
|
|
|
MetaBackend *backend = keys->backend;
|
2014-05-07 09:27:42 -04:00
|
|
|
Display *xdisplay;
|
2014-04-23 16:23:26 -04:00
|
|
|
|
2014-05-07 09:27:42 -04:00
|
|
|
if (META_IS_BACKEND_X11 (backend))
|
|
|
|
xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
|
|
else
|
|
|
|
xdisplay = NULL;
|
2014-04-23 16:23:26 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
if (keys->overlay_key_only_pressed)
|
2011-07-08 20:48:01 -04:00
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
if (! resolved_key_combo_has_keycode (&keys->overlay_resolved_key_combo,
|
|
|
|
event->hardware_keycode))
|
2011-07-08 20:48:01 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->overlay_key_only_pressed = FALSE;
|
2011-07-08 20:48:01 -04:00
|
|
|
|
|
|
|
/* OK, the user hit modifier+key rather than pressing and
|
|
|
|
* releasing the ovelay key. We want to handle the key
|
|
|
|
* sequence "normally". Unfortunately, using
|
|
|
|
* XAllowEvents(..., ReplayKeyboard, ...) doesn't quite
|
|
|
|
* work, since global keybindings won't be activated ("this
|
|
|
|
* time, however, the function ignores any passive grabs at
|
|
|
|
* above (toward the root of) the grab_window of the grab
|
|
|
|
* just released.") So, we first explicitly check for one of
|
|
|
|
* our global keybindings, and if not found, we then replay
|
|
|
|
* the event. Other clients with global grabs will be out of
|
|
|
|
* luck.
|
|
|
|
*/
|
2014-03-03 08:08:34 -05:00
|
|
|
if (process_event (display, screen, window, event))
|
2011-07-08 20:48:01 -04:00
|
|
|
{
|
|
|
|
/* As normally, after we've handled a global key
|
|
|
|
* binding, we unfreeze the keyboard but keep the grab
|
|
|
|
* (this is important for something like cycling
|
|
|
|
* windows */
|
2014-05-07 09:27:42 -04:00
|
|
|
|
|
|
|
if (xdisplay)
|
|
|
|
XIAllowEvents (xdisplay,
|
|
|
|
clutter_input_device_get_device_id (event->device),
|
|
|
|
XIAsyncDevice, event->time);
|
2011-07-08 20:48:01 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Replay the event so it gets delivered to our
|
|
|
|
* per-window key bindings or to the application */
|
2014-05-07 09:27:42 -04:00
|
|
|
if (xdisplay)
|
|
|
|
XIAllowEvents (xdisplay,
|
|
|
|
clutter_input_device_get_device_id (event->device),
|
|
|
|
XIReplayDevice, event->time);
|
2014-05-07 09:27:59 -04:00
|
|
|
|
|
|
|
return FALSE;
|
2011-07-08 20:48:01 -04:00
|
|
|
}
|
|
|
|
}
|
2013-10-03 18:03:53 -04:00
|
|
|
else if (event->type == CLUTTER_KEY_RELEASE)
|
2011-07-08 20:48:01 -04:00
|
|
|
{
|
2013-03-04 11:23:46 -05:00
|
|
|
MetaKeyBinding *binding;
|
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->overlay_key_only_pressed = FALSE;
|
2013-10-03 18:03:53 -04:00
|
|
|
|
2011-07-08 20:48:01 -04:00
|
|
|
/* We want to unfreeze events, but keep the grab so that if the user
|
|
|
|
* starts typing into the overlay we get all the keys */
|
2014-05-07 09:27:42 -04:00
|
|
|
if (xdisplay)
|
|
|
|
XIAllowEvents (xdisplay,
|
|
|
|
clutter_input_device_get_device_id (event->device),
|
|
|
|
XIAsyncDevice, event->time);
|
2012-08-29 17:07:34 -04:00
|
|
|
|
2015-01-07 17:48:32 -05:00
|
|
|
binding = get_keybinding (keys, &keys->overlay_resolved_key_combo);
|
2013-03-04 11:23:46 -05:00
|
|
|
if (binding &&
|
2014-03-18 17:31:22 -04:00
|
|
|
meta_compositor_filter_keybinding (display->compositor, binding))
|
2013-03-04 11:23:46 -05:00
|
|
|
return TRUE;
|
2011-07-08 20:48:01 -04:00
|
|
|
meta_display_overlay_key_activate (display);
|
|
|
|
}
|
2013-08-05 11:00:32 -04:00
|
|
|
else
|
|
|
|
{
|
|
|
|
/* In some rare race condition, mutter might not receive the Super_L
|
|
|
|
* KeyRelease event because:
|
|
|
|
* - the compositor might end the modal mode and call XIUngrabDevice
|
|
|
|
* while the key is still down
|
|
|
|
* - passive grabs are only activated on KeyPress and not KeyRelease.
|
|
|
|
*
|
2014-08-14 15:33:45 -04:00
|
|
|
* In this case, keys->overlay_key_only_pressed might be wrong.
|
2013-08-05 11:00:32 -04:00
|
|
|
* Mutter still ought to acknowledge events, otherwise the X server
|
|
|
|
* will not send the next events.
|
|
|
|
*
|
|
|
|
* https://bugzilla.gnome.org/show_bug.cgi?id=666101
|
|
|
|
*/
|
2014-05-07 09:27:42 -04:00
|
|
|
if (xdisplay)
|
|
|
|
XIAllowEvents (xdisplay,
|
|
|
|
clutter_input_device_get_device_id (event->device),
|
|
|
|
XIAsyncDevice, event->time);
|
2013-08-05 11:00:32 -04:00
|
|
|
}
|
2011-07-08 20:48:01 -04:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
2013-10-03 18:03:53 -04:00
|
|
|
else if (event->type == CLUTTER_KEY_PRESS &&
|
2017-04-25 07:17:02 -04:00
|
|
|
resolved_key_combo_has_keycode (&keys->overlay_resolved_key_combo,
|
|
|
|
event->hardware_keycode))
|
2011-07-08 20:48:01 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->overlay_key_only_pressed = TRUE;
|
2011-07-08 20:48:01 -04:00
|
|
|
/* We keep the keyboard frozen - this allows us to use ReplayKeyboard
|
|
|
|
* on the next event if it's not the release of the overlay key */
|
2014-05-07 09:27:42 -04:00
|
|
|
if (xdisplay)
|
|
|
|
XIAllowEvents (xdisplay,
|
|
|
|
clutter_input_device_get_device_id (event->device),
|
|
|
|
XISyncDevice, event->time);
|
2011-07-08 20:48:01 -04:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2013-04-10 07:34:26 -04:00
|
|
|
static gboolean
|
|
|
|
process_iso_next_group (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
2013-10-03 18:03:53 -04:00
|
|
|
ClutterKeyEvent *event)
|
2013-04-10 07:34:26 -04:00
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2013-04-10 07:34:26 -04:00
|
|
|
gboolean activate;
|
2017-04-25 07:17:02 -04:00
|
|
|
xkb_keycode_t keycode = (xkb_keycode_t) event->hardware_keycode;
|
|
|
|
xkb_mod_mask_t mask;
|
|
|
|
int i, j;
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2013-11-25 08:06:10 -05:00
|
|
|
if (event->type == CLUTTER_KEY_RELEASE)
|
2013-04-10 07:34:26 -04:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
activate = FALSE;
|
2017-04-25 07:17:02 -04:00
|
|
|
mask = mask_from_event_params (keys, event->modifier_state);
|
2014-09-02 12:11:31 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
for (i = 0; i < keys->n_iso_next_group_combos; ++i)
|
2013-04-10 07:34:26 -04:00
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
for (j = 0; j < keys->iso_next_group_combo[i].len; ++j)
|
2013-04-10 07:34:26 -04:00
|
|
|
{
|
2017-04-25 07:17:02 -04:00
|
|
|
if (keycode == keys->iso_next_group_combo[i].keycodes[j] &&
|
|
|
|
mask == keys->iso_next_group_combo[i].mask)
|
|
|
|
{
|
|
|
|
/* If the signal handler returns TRUE the keyboard will
|
|
|
|
remain frozen. It's the signal handler's responsibility
|
|
|
|
to unfreeze it. */
|
|
|
|
if (!meta_display_modifiers_accelerator_activate (display))
|
|
|
|
meta_display_unfreeze_keyboard (display, event->time);
|
|
|
|
activate = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
2013-04-10 07:34:26 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return activate;
|
|
|
|
}
|
|
|
|
|
2014-05-08 14:53:50 -04:00
|
|
|
static gboolean
|
|
|
|
process_key_event (MetaDisplay *display,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event)
|
2001-06-23 01:49:35 -04:00
|
|
|
{
|
2008-03-10 23:37:54 -04:00
|
|
|
gboolean keep_grab;
|
2002-06-27 01:08:32 -04:00
|
|
|
gboolean all_keys_grabbed;
|
2008-12-02 18:13:11 -05:00
|
|
|
gboolean handled;
|
2002-06-27 01:08:32 -04:00
|
|
|
MetaScreen *screen;
|
2008-11-22 14:02:54 -05:00
|
|
|
|
2002-08-10 11:55:18 -04:00
|
|
|
/* window may be NULL */
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2013-10-03 18:31:09 -04:00
|
|
|
screen = display->screen;
|
2001-07-11 02:22:00 -04:00
|
|
|
|
2014-04-28 17:28:15 -04:00
|
|
|
all_keys_grabbed = window ? window->all_keys_grabbed : FALSE;
|
2011-07-08 20:48:01 -04:00
|
|
|
if (!all_keys_grabbed)
|
|
|
|
{
|
2014-02-26 12:56:17 -05:00
|
|
|
handled = process_overlay_key (display, screen, event, window);
|
2011-07-08 20:48:01 -04:00
|
|
|
if (handled)
|
|
|
|
return TRUE;
|
2013-04-10 07:34:26 -04:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
handled = process_iso_next_group (display, screen, event);
|
2013-04-10 07:34:26 -04:00
|
|
|
if (handled)
|
|
|
|
return TRUE;
|
2011-07-08 20:48:01 -04:00
|
|
|
}
|
|
|
|
|
2014-04-30 09:30:35 -04:00
|
|
|
{
|
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
if (META_IS_BACKEND_X11 (backend))
|
|
|
|
{
|
|
|
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
|
|
XIAllowEvents (xdisplay,
|
|
|
|
clutter_input_device_get_device_id (event->device),
|
|
|
|
XIAsyncDevice, event->time);
|
|
|
|
}
|
|
|
|
}
|
2011-07-08 20:48:01 -04:00
|
|
|
|
|
|
|
keep_grab = TRUE;
|
2008-03-10 23:37:54 -04:00
|
|
|
if (all_keys_grabbed)
|
2001-07-11 02:22:00 -04:00
|
|
|
{
|
2008-03-10 23:37:54 -04:00
|
|
|
if (display->grab_op == META_GRAB_OP_NONE)
|
2009-08-11 19:41:50 -04:00
|
|
|
return TRUE;
|
2014-08-15 14:05:04 -04:00
|
|
|
|
2008-03-10 23:37:54 -04:00
|
|
|
/* If we get here we have a global grab, because
|
2012-12-12 20:50:43 -05:00
|
|
|
* we're in some special keyboard mode such as window move
|
|
|
|
* mode.
|
|
|
|
*/
|
2014-08-15 14:05:04 -04:00
|
|
|
if (window == display->grab_window)
|
2008-03-10 23:37:54 -04:00
|
|
|
{
|
2014-08-15 14:05:04 -04:00
|
|
|
if (display->grab_op & META_GRAB_OP_WINDOW_FLAG_KEYBOARD)
|
|
|
|
{
|
|
|
|
if (display->grab_op == META_GRAB_OP_KEYBOARD_MOVING)
|
|
|
|
{
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Processing event for keyboard move\n");
|
|
|
|
keep_grab = process_keyboard_move_grab (display, screen, window, event);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Processing event for keyboard resize\n");
|
|
|
|
keep_grab = process_keyboard_resize_grab (display, screen, window, event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2008-03-10 23:37:54 -04:00
|
|
|
{
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Processing event for mouse-only move/resize\n");
|
2013-10-03 18:03:53 -04:00
|
|
|
keep_grab = process_mouse_move_resize_grab (display, screen, window, event);
|
2008-03-10 23:37:54 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!keep_grab)
|
2013-10-03 18:03:53 -04:00
|
|
|
meta_display_end_grab_op (display, event->time);
|
2009-08-11 19:41:50 -04:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-03-10 23:37:54 -04:00
|
|
|
/* Do the normal keybindings */
|
2014-03-03 08:08:34 -05:00
|
|
|
return process_event (display, screen, window, event);
|
2001-08-19 14:09:10 -04:00
|
|
|
}
|
|
|
|
|
2014-05-08 14:53:50 -04:00
|
|
|
/* Handle a key event. May be called recursively: some key events cause
|
|
|
|
* grabs to be ended and then need to be processed again in their own
|
|
|
|
* right. This cannot cause infinite recursion because we never call
|
|
|
|
* ourselves when there wasn't a grab, and we always clear the grab
|
|
|
|
* first; the invariant is enforced using an assertion. See #112560.
|
|
|
|
*
|
|
|
|
* The return value is whether we handled the key event.
|
|
|
|
*
|
|
|
|
* FIXME: We need to prove there are no race conditions here.
|
|
|
|
* FIXME: Does it correctly handle alt-Tab being followed by another
|
|
|
|
* grabbing keypress without letting go of alt?
|
|
|
|
* FIXME: An iterative solution would probably be simpler to understand
|
|
|
|
* (and help us solve the other fixmes).
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
meta_keybindings_process_event (MetaDisplay *display,
|
|
|
|
MetaWindow *window,
|
|
|
|
const ClutterEvent *event)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
|
|
|
|
2014-05-08 14:53:50 -04:00
|
|
|
switch (event->type)
|
|
|
|
{
|
2014-05-08 14:58:40 -04:00
|
|
|
case CLUTTER_BUTTON_PRESS:
|
|
|
|
case CLUTTER_BUTTON_RELEASE:
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->overlay_key_only_pressed = FALSE;
|
2014-05-08 14:58:40 -04:00
|
|
|
return FALSE;
|
|
|
|
|
2014-05-08 14:53:50 -04:00
|
|
|
case CLUTTER_KEY_PRESS:
|
|
|
|
case CLUTTER_KEY_RELEASE:
|
|
|
|
return process_key_event (display, window, (ClutterKeyEvent *) event);
|
|
|
|
|
|
|
|
default:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-08-21 14:38:21 -04:00
|
|
|
static gboolean
|
2013-10-03 18:03:53 -04:00
|
|
|
process_mouse_move_resize_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event)
|
2006-08-21 14:38:21 -04:00
|
|
|
{
|
|
|
|
/* don't care about releases, but eat them, don't end grab */
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->type == CLUTTER_KEY_RELEASE)
|
2006-08-21 14:38:21 -04:00
|
|
|
return TRUE;
|
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->keyval == CLUTTER_KEY_Escape)
|
2006-08-21 14:38:21 -04:00
|
|
|
{
|
2016-01-10 09:16:09 -05:00
|
|
|
/* Hide the tiling preview if necessary */
|
|
|
|
if (window->tile_mode != META_TILE_NONE)
|
|
|
|
meta_screen_hide_tile_preview (screen);
|
|
|
|
|
|
|
|
/* Restore the original tile mode */
|
|
|
|
window->tile_mode = display->grab_tile_mode;
|
|
|
|
window->tile_monitor_number = display->grab_tile_monitor_number;
|
|
|
|
|
2006-08-21 14:38:21 -04:00
|
|
|
/* End move or resize and restore to original state. If the
|
|
|
|
* window was a maximized window that had been "shaken loose" we
|
|
|
|
* need to remaximize it. In normal cases, we need to do a
|
2009-05-07 13:53:47 -04:00
|
|
|
* moveresize now to get the position back to the original.
|
2006-08-21 14:38:21 -04:00
|
|
|
*/
|
2016-01-10 09:16:09 -05:00
|
|
|
if (window->shaken_loose || window->tile_mode == META_TILE_MAXIMIZED)
|
2014-03-13 18:32:20 -04:00
|
|
|
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
2016-01-10 09:16:09 -05:00
|
|
|
else if (window->tile_mode != META_TILE_NONE)
|
|
|
|
meta_window_tile (window);
|
2009-05-07 13:53:47 -04:00
|
|
|
else
|
2014-05-20 17:47:10 -04:00
|
|
|
meta_window_move_resize_frame (display->grab_window,
|
|
|
|
TRUE,
|
|
|
|
display->grab_initial_window_pos.x,
|
|
|
|
display->grab_initial_window_pos.y,
|
|
|
|
display->grab_initial_window_pos.width,
|
|
|
|
display->grab_initial_window_pos.height);
|
2006-08-21 14:38:21 -04:00
|
|
|
|
2008-03-10 23:37:54 -04:00
|
|
|
/* End grab */
|
2006-08-21 14:38:21 -04:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
static gboolean
|
2013-10-03 18:03:53 -04:00
|
|
|
process_keyboard_move_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event)
|
2001-08-19 14:09:10 -04:00
|
|
|
{
|
|
|
|
gboolean handled;
|
2014-05-21 08:46:18 -04:00
|
|
|
MetaRectangle frame_rect;
|
2001-08-19 14:09:10 -04:00
|
|
|
int x, y;
|
|
|
|
int incr;
|
|
|
|
gboolean smart_snap;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
handled = FALSE;
|
2001-07-11 02:22:00 -04:00
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
/* don't care about releases, but eat them, don't end grab */
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->type == CLUTTER_KEY_RELEASE)
|
2001-08-19 14:09:10 -04:00
|
|
|
return TRUE;
|
2001-07-11 02:22:00 -04:00
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
/* don't end grab on modifier key presses */
|
2014-04-07 15:41:37 -04:00
|
|
|
if (is_modifier (event->keyval))
|
2001-08-19 14:09:10 -04:00
|
|
|
return TRUE;
|
|
|
|
|
2014-05-21 08:46:18 -04:00
|
|
|
meta_window_get_frame_rect (window, &frame_rect);
|
|
|
|
x = frame_rect.x;
|
|
|
|
y = frame_rect.y;
|
2001-08-19 14:09:10 -04:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
smart_snap = (event->modifier_state & CLUTTER_SHIFT_MASK) != 0;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
#define SMALL_INCREMENT 1
|
|
|
|
#define NORMAL_INCREMENT 10
|
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
if (smart_snap)
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
incr = 1;
|
2013-10-03 18:03:53 -04:00
|
|
|
else if (event->modifier_state & CLUTTER_CONTROL_MASK)
|
2001-08-19 14:09:10 -04:00
|
|
|
incr = SMALL_INCREMENT;
|
|
|
|
else
|
|
|
|
incr = NORMAL_INCREMENT;
|
2001-07-12 01:53:56 -04:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->keyval == CLUTTER_KEY_Escape)
|
2003-04-24 23:32:41 -04:00
|
|
|
{
|
2006-08-21 14:38:21 -04:00
|
|
|
/* End move and restore to original state. If the window was a
|
|
|
|
* maximized window that had been "shaken loose" we need to
|
|
|
|
* remaximize it. In normal cases, we need to do a moveresize
|
2009-05-07 13:53:47 -04:00
|
|
|
* now to get the position back to the original.
|
2003-10-12 02:25:38 -04:00
|
|
|
*/
|
2006-08-21 14:38:21 -04:00
|
|
|
if (window->shaken_loose)
|
2014-03-13 18:32:20 -04:00
|
|
|
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
2009-05-07 13:53:47 -04:00
|
|
|
else
|
2014-05-20 17:47:10 -04:00
|
|
|
meta_window_move_resize_frame (display->grab_window,
|
|
|
|
TRUE,
|
|
|
|
display->grab_initial_window_pos.x,
|
|
|
|
display->grab_initial_window_pos.y,
|
|
|
|
display->grab_initial_window_pos.width,
|
|
|
|
display->grab_initial_window_pos.height);
|
2003-04-24 23:32:41 -04:00
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
/* When moving by increments, we still snap to edges if the move
|
|
|
|
* to the edge is smaller than the increment. This is because
|
|
|
|
* Shift + arrow to snap is sort of a hidden feature. This way
|
|
|
|
* people using just arrows shouldn't get too frustrated.
|
|
|
|
*/
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2001-08-19 14:09:10 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_KP_Home:
|
|
|
|
case CLUTTER_KEY_KP_Prior:
|
|
|
|
case CLUTTER_KEY_Up:
|
|
|
|
case CLUTTER_KEY_KP_Up:
|
2001-08-19 14:09:10 -04:00
|
|
|
y -= incr;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_KP_End:
|
|
|
|
case CLUTTER_KEY_KP_Next:
|
|
|
|
case CLUTTER_KEY_Down:
|
|
|
|
case CLUTTER_KEY_KP_Down:
|
2001-08-19 14:09:10 -04:00
|
|
|
y += incr;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2003-04-24 23:32:41 -04:00
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2003-04-24 23:32:41 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_KP_Home:
|
|
|
|
case CLUTTER_KEY_KP_End:
|
|
|
|
case CLUTTER_KEY_Left:
|
|
|
|
case CLUTTER_KEY_KP_Left:
|
2001-08-19 14:09:10 -04:00
|
|
|
x -= incr;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_KP_Prior:
|
|
|
|
case CLUTTER_KEY_KP_Next:
|
|
|
|
case CLUTTER_KEY_Right:
|
|
|
|
case CLUTTER_KEY_KP_Right:
|
2001-08-19 14:09:10 -04:00
|
|
|
x += incr;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
2001-07-12 01:53:56 -04:00
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
if (handled)
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
{
|
2003-10-12 02:25:38 -04:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
|
|
|
"Computed new window location %d,%d due to keypress\n",
|
|
|
|
x, y);
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
|
2012-12-12 20:50:43 -05:00
|
|
|
meta_window_edge_resistance_for_move (window,
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
&x,
|
|
|
|
&y,
|
|
|
|
NULL,
|
|
|
|
smart_snap,
|
|
|
|
TRUE);
|
|
|
|
|
2014-05-21 08:46:18 -04:00
|
|
|
meta_window_move_frame (window, TRUE, x, y);
|
2003-10-12 02:25:38 -04:00
|
|
|
meta_window_update_keyboard_move (window);
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
}
|
2001-07-11 02:22:00 -04:00
|
|
|
|
2001-08-19 14:09:10 -04:00
|
|
|
return handled;
|
|
|
|
}
|
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
static gboolean
|
2013-10-03 18:03:53 -04:00
|
|
|
process_keyboard_resize_grab_op_change (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
|
|
|
gboolean handled;
|
|
|
|
|
2005-08-02 22:22:00 -04:00
|
|
|
handled = FALSE;
|
2002-06-19 00:12:49 -04:00
|
|
|
switch (display->grab_op)
|
|
|
|
{
|
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN:
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Up:
|
|
|
|
case CLUTTER_KEY_KP_Up:
|
2012-12-12 20:50:43 -05:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_N;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Down:
|
|
|
|
case CLUTTER_KEY_KP_Down:
|
2002-06-19 00:12:49 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_S;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Left:
|
|
|
|
case CLUTTER_KEY_KP_Left:
|
2002-06-19 00:12:49 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_W;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Right:
|
|
|
|
case CLUTTER_KEY_KP_Right:
|
2002-06-19 00:12:49 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_E;
|
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_S:
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Left:
|
|
|
|
case CLUTTER_KEY_KP_Left:
|
2005-08-02 22:22:00 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_W;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Right:
|
|
|
|
case CLUTTER_KEY_KP_Right:
|
2005-08-02 22:22:00 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_E;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_N:
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Left:
|
|
|
|
case CLUTTER_KEY_KP_Left:
|
2005-08-02 22:22:00 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_W;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Right:
|
|
|
|
case CLUTTER_KEY_KP_Right:
|
2005-08-02 22:22:00 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_E;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_W:
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Up:
|
|
|
|
case CLUTTER_KEY_KP_Up:
|
2012-12-12 20:50:43 -05:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_N;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Down:
|
|
|
|
case CLUTTER_KEY_KP_Down:
|
2005-08-02 22:22:00 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_S;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_E:
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Up:
|
|
|
|
case CLUTTER_KEY_KP_Up:
|
2012-12-12 20:50:43 -05:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_N;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Down:
|
|
|
|
case CLUTTER_KEY_KP_Down:
|
2005-08-02 22:22:00 -04:00
|
|
|
display->grab_op = META_GRAB_OP_KEYBOARD_RESIZING_S;
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_SE:
|
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_NE:
|
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_SW:
|
|
|
|
case META_GRAB_OP_KEYBOARD_RESIZING_NW:
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (handled)
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
{
|
2003-10-12 02:25:38 -04:00
|
|
|
meta_window_update_keyboard_resize (window, TRUE);
|
2012-12-12 20:50:43 -05:00
|
|
|
return TRUE;
|
2003-10-12 02:25:38 -04:00
|
|
|
}
|
2002-06-19 00:12:49 -04:00
|
|
|
|
2005-08-02 22:22:00 -04:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2013-10-03 18:03:53 -04:00
|
|
|
process_keyboard_resize_grab (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event)
|
2005-08-02 22:22:00 -04:00
|
|
|
{
|
2014-05-20 18:28:56 -04:00
|
|
|
MetaRectangle frame_rect;
|
2005-08-02 22:22:00 -04:00
|
|
|
gboolean handled;
|
|
|
|
int height_inc;
|
|
|
|
int width_inc;
|
|
|
|
int width, height;
|
|
|
|
gboolean smart_snap;
|
|
|
|
int gravity;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2005-08-02 22:22:00 -04:00
|
|
|
handled = FALSE;
|
|
|
|
|
|
|
|
/* don't care about releases, but eat them, don't end grab */
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->type == CLUTTER_KEY_RELEASE)
|
2005-08-02 22:22:00 -04:00
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
/* don't end grab on modifier key presses */
|
2014-04-07 15:41:37 -04:00
|
|
|
if (is_modifier (event->keyval))
|
2005-08-02 22:22:00 -04:00
|
|
|
return TRUE;
|
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
if (event->keyval == CLUTTER_KEY_Escape)
|
2005-08-02 22:22:00 -04:00
|
|
|
{
|
2009-05-07 13:53:47 -04:00
|
|
|
/* End resize and restore to original state. */
|
2014-05-20 17:47:10 -04:00
|
|
|
meta_window_move_resize_frame (display->grab_window,
|
|
|
|
TRUE,
|
|
|
|
display->grab_initial_window_pos.x,
|
|
|
|
display->grab_initial_window_pos.y,
|
|
|
|
display->grab_initial_window_pos.width,
|
|
|
|
display->grab_initial_window_pos.height);
|
2005-08-02 22:22:00 -04:00
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
if (process_keyboard_resize_grab_op_change (display, screen, window, event))
|
2005-08-02 22:22:00 -04:00
|
|
|
return TRUE;
|
|
|
|
|
2009-05-07 13:53:47 -04:00
|
|
|
width = window->rect.width;
|
|
|
|
height = window->rect.height;
|
2002-06-19 00:12:49 -04:00
|
|
|
|
2014-05-20 18:28:56 -04:00
|
|
|
meta_window_get_frame_rect (window, &frame_rect);
|
|
|
|
width = frame_rect.width;
|
|
|
|
height = frame_rect.height;
|
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
gravity = meta_resize_gravity_from_grab_op (display->grab_op);
|
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
smart_snap = (event->modifier_state & CLUTTER_SHIFT_MASK) != 0;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
#define SMALL_INCREMENT 1
|
|
|
|
#define NORMAL_INCREMENT 10
|
|
|
|
|
|
|
|
if (smart_snap)
|
|
|
|
{
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
height_inc = 1;
|
|
|
|
width_inc = 1;
|
2002-06-19 00:12:49 -04:00
|
|
|
}
|
2013-10-03 18:03:53 -04:00
|
|
|
else if (event->modifier_state & CLUTTER_CONTROL_MASK)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
width_inc = SMALL_INCREMENT;
|
|
|
|
height_inc = SMALL_INCREMENT;
|
2012-12-12 20:50:43 -05:00
|
|
|
}
|
2002-06-19 00:12:49 -04:00
|
|
|
else
|
|
|
|
{
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
width_inc = NORMAL_INCREMENT;
|
|
|
|
height_inc = NORMAL_INCREMENT;
|
2002-06-19 00:12:49 -04:00
|
|
|
}
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
|
|
|
|
/* If this is a resize increment window, make the amount we resize
|
|
|
|
* the window by match that amount (well, unless snap resizing...)
|
2002-06-19 00:12:49 -04:00
|
|
|
*/
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
if (window->size_hints.width_inc > 1)
|
|
|
|
width_inc = window->size_hints.width_inc;
|
|
|
|
if (window->size_hints.height_inc > 1)
|
|
|
|
height_inc = window->size_hints.height_inc;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
switch (event->keyval)
|
2002-06-19 00:12:49 -04:00
|
|
|
{
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Up:
|
|
|
|
case CLUTTER_KEY_KP_Up:
|
2002-06-19 00:12:49 -04:00
|
|
|
switch (gravity)
|
|
|
|
{
|
|
|
|
case NorthGravity:
|
|
|
|
case NorthWestGravity:
|
|
|
|
case NorthEastGravity:
|
|
|
|
/* Move bottom edge up */
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
height -= height_inc;
|
2002-06-19 00:12:49 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SouthGravity:
|
|
|
|
case SouthWestGravity:
|
|
|
|
case SouthEastGravity:
|
|
|
|
/* Move top edge up */
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
height += height_inc;
|
2002-06-19 00:12:49 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case EastGravity:
|
|
|
|
case WestGravity:
|
|
|
|
case CenterGravity:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Down:
|
|
|
|
case CLUTTER_KEY_KP_Down:
|
2002-06-19 00:12:49 -04:00
|
|
|
switch (gravity)
|
|
|
|
{
|
|
|
|
case NorthGravity:
|
|
|
|
case NorthWestGravity:
|
|
|
|
case NorthEastGravity:
|
|
|
|
/* Move bottom edge down */
|
|
|
|
height += height_inc;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SouthGravity:
|
|
|
|
case SouthWestGravity:
|
|
|
|
case SouthEastGravity:
|
|
|
|
/* Move top edge down */
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
height -= height_inc;
|
2002-06-19 00:12:49 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case EastGravity:
|
|
|
|
case WestGravity:
|
|
|
|
case CenterGravity:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
handled = TRUE;
|
|
|
|
break;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Left:
|
|
|
|
case CLUTTER_KEY_KP_Left:
|
2002-07-02 22:32:40 -04:00
|
|
|
switch (gravity)
|
|
|
|
{
|
|
|
|
case EastGravity:
|
|
|
|
case SouthEastGravity:
|
|
|
|
case NorthEastGravity:
|
2005-08-02 22:22:00 -04:00
|
|
|
/* Move left edge left */
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
width += width_inc;
|
2002-07-02 22:32:40 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case WestGravity:
|
|
|
|
case SouthWestGravity:
|
|
|
|
case NorthWestGravity:
|
|
|
|
/* Move right edge left */
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
width -= width_inc;
|
2002-07-02 22:32:40 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case NorthGravity:
|
|
|
|
case SouthGravity:
|
|
|
|
case CenterGravity:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-07-02 22:32:40 -04:00
|
|
|
handled = TRUE;
|
2002-06-19 00:12:49 -04:00
|
|
|
break;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2013-10-03 18:03:53 -04:00
|
|
|
case CLUTTER_KEY_Right:
|
|
|
|
case CLUTTER_KEY_KP_Right:
|
2002-07-02 22:32:40 -04:00
|
|
|
switch (gravity)
|
|
|
|
{
|
|
|
|
case EastGravity:
|
|
|
|
case SouthEastGravity:
|
|
|
|
case NorthEastGravity:
|
|
|
|
/* Move left edge right */
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
width -= width_inc;
|
2002-07-02 22:32:40 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case WestGravity:
|
|
|
|
case SouthWestGravity:
|
|
|
|
case NorthWestGravity:
|
|
|
|
/* Move right edge right */
|
|
|
|
width += width_inc;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NorthGravity:
|
|
|
|
case SouthGravity:
|
|
|
|
case CenterGravity:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-07-02 22:32:40 -04:00
|
|
|
handled = TRUE;
|
2002-06-19 00:12:49 -04:00
|
|
|
break;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* fixup hack (just paranoia, not sure it's required) */
|
|
|
|
if (height < 1)
|
|
|
|
height = 1;
|
|
|
|
if (width < 1)
|
|
|
|
width = 1;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-06-19 00:12:49 -04:00
|
|
|
if (handled)
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
{
|
2003-10-12 02:25:38 -04:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
"Computed new window size due to keypress: "
|
|
|
|
"%dx%d, gravity %s\n",
|
|
|
|
width, height, meta_gravity_to_string (gravity));
|
2012-12-12 20:50:43 -05:00
|
|
|
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
/* Do any edge resistance/snapping */
|
|
|
|
meta_window_edge_resistance_for_resize (window,
|
|
|
|
&width,
|
|
|
|
&height,
|
|
|
|
gravity,
|
|
|
|
NULL,
|
|
|
|
smart_snap,
|
|
|
|
TRUE);
|
|
|
|
|
2014-05-20 18:28:56 -04:00
|
|
|
meta_window_resize_frame_with_gravity (window,
|
|
|
|
TRUE,
|
|
|
|
width,
|
|
|
|
height,
|
|
|
|
gravity);
|
2009-05-07 13:53:47 -04:00
|
|
|
|
2003-10-12 02:25:38 -04:00
|
|
|
meta_window_update_keyboard_resize (window, FALSE);
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
}
|
2002-06-19 00:12:49 -04:00
|
|
|
|
|
|
|
return handled;
|
|
|
|
}
|
|
|
|
|
2013-05-17 08:08:57 -04:00
|
|
|
static void
|
|
|
|
handle_switch_to_last_workspace (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *event_window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
|
|
|
{
|
|
|
|
gint target = meta_screen_get_n_workspaces(screen) - 1;
|
|
|
|
MetaWorkspace *workspace = meta_screen_get_workspace_by_index (screen, target);
|
|
|
|
meta_workspace_activate (workspace, event->time);
|
|
|
|
}
|
|
|
|
|
2001-06-06 00:47:37 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_switch_to_workspace (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *event_window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2001-06-06 00:47:37 -04:00
|
|
|
{
|
2008-10-05 20:24:07 -04:00
|
|
|
gint which = binding->handler->data;
|
2001-06-06 00:47:37 -04:00
|
|
|
MetaWorkspace *workspace;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2014-04-17 10:54:37 -04:00
|
|
|
if (which < 0)
|
|
|
|
{
|
|
|
|
/* Negative workspace numbers are directions with respect to the
|
|
|
|
* current workspace.
|
|
|
|
*/
|
|
|
|
|
|
|
|
workspace = meta_workspace_get_neighbor (screen->active_workspace,
|
|
|
|
which);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
workspace = meta_screen_get_workspace_by_index (screen, which);
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2001-08-03 09:56:39 -04:00
|
|
|
if (workspace)
|
|
|
|
{
|
2012-11-15 16:35:42 -05:00
|
|
|
meta_workspace_activate (workspace, event->time);
|
2001-06-06 00:47:37 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* We could offer to create it I suppose */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-08 16:09:05 -05:00
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_maximize_vertically (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-12-08 16:09:05 -05:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_resize_func)
|
2002-12-08 16:09:05 -05:00
|
|
|
{
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
if (window->maximized_vertically)
|
|
|
|
meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL);
|
|
|
|
else
|
|
|
|
meta_window_maximize (window, META_MAXIMIZE_VERTICAL);
|
2002-12-08 16:09:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_maximize_horizontally (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-12-08 16:09:05 -05:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_resize_func)
|
2002-12-08 16:09:05 -05:00
|
|
|
{
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
if (window->maximized_horizontally)
|
|
|
|
meta_window_unmaximize (window, META_MAXIMIZE_HORIZONTAL);
|
|
|
|
else
|
|
|
|
meta_window_maximize (window, META_MAXIMIZE_HORIZONTAL);
|
2002-12-08 16:09:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-24 14:55:23 -04:00
|
|
|
static void
|
2013-11-19 14:02:42 -05:00
|
|
|
handle_always_on_top (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2013-07-24 14:55:23 -04:00
|
|
|
{
|
|
|
|
if (window->wm_state_above == FALSE)
|
|
|
|
meta_window_make_above (window);
|
|
|
|
else
|
|
|
|
meta_window_unmake_above (window);
|
|
|
|
}
|
|
|
|
|
2006-11-05 17:23:44 -05:00
|
|
|
static void
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
int gravity)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
|
|
|
MetaRectangle work_area;
|
2013-11-19 12:24:45 -05:00
|
|
|
MetaRectangle frame_rect;
|
2006-11-05 17:23:44 -05:00
|
|
|
int new_x, new_y;
|
|
|
|
|
2009-08-31 09:52:16 -04:00
|
|
|
meta_window_get_work_area_all_monitors (window, &work_area);
|
2013-11-19 12:24:45 -05:00
|
|
|
meta_window_get_frame_rect (window, &frame_rect);
|
2006-11-05 17:23:44 -05:00
|
|
|
|
2014-05-22 16:09:14 -04:00
|
|
|
switch (gravity)
|
2014-05-22 15:44:34 -04:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
case NorthWestGravity:
|
|
|
|
case WestGravity:
|
|
|
|
case SouthWestGravity:
|
|
|
|
new_x = work_area.x;
|
|
|
|
break;
|
|
|
|
case NorthGravity:
|
|
|
|
case SouthGravity:
|
2014-05-22 15:44:50 -04:00
|
|
|
new_x = frame_rect.x;
|
2014-05-22 16:09:14 -04:00
|
|
|
break;
|
|
|
|
case NorthEastGravity:
|
|
|
|
case EastGravity:
|
|
|
|
case SouthEastGravity:
|
|
|
|
new_x = work_area.x + work_area.width - frame_rect.width;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
2014-05-22 15:44:34 -04:00
|
|
|
}
|
2006-11-05 17:23:44 -05:00
|
|
|
|
2014-05-22 16:09:14 -04:00
|
|
|
switch (gravity)
|
2014-05-22 15:44:34 -04:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
case NorthWestGravity:
|
|
|
|
case NorthGravity:
|
|
|
|
case NorthEastGravity:
|
|
|
|
new_y = work_area.y;
|
|
|
|
break;
|
|
|
|
case WestGravity:
|
|
|
|
case EastGravity:
|
2014-05-22 15:44:50 -04:00
|
|
|
new_y = frame_rect.y;
|
2014-05-22 16:09:14 -04:00
|
|
|
break;
|
|
|
|
case SouthWestGravity:
|
|
|
|
case SouthGravity:
|
|
|
|
case SouthEastGravity:
|
|
|
|
new_y = work_area.y + work_area.height - frame_rect.height;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
2014-05-22 15:44:34 -04:00
|
|
|
}
|
2006-11-05 17:23:44 -05:00
|
|
|
|
2012-03-12 15:40:12 -04:00
|
|
|
meta_window_move_frame (window,
|
|
|
|
TRUE,
|
|
|
|
new_x,
|
|
|
|
new_y);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_corner_nw (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, NorthWestGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_corner_ne (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, NorthEastGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_corner_sw (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, SouthWestGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_corner_se (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, SouthEastGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_side_n (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, NorthGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_side_s (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, SouthGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_side_e (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, EastGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_side_w (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2006-11-05 17:23:44 -05:00
|
|
|
{
|
2014-05-22 16:09:14 -04:00
|
|
|
handle_move_to_corner_backend (display, screen, window, WestGravity);
|
2006-11-05 17:23:44 -05:00
|
|
|
}
|
|
|
|
|
2008-08-31 21:32:39 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_center (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2008-08-31 21:32:39 -04:00
|
|
|
{
|
|
|
|
MetaRectangle work_area;
|
2013-11-19 12:24:45 -05:00
|
|
|
MetaRectangle frame_rect;
|
2008-08-31 21:32:39 -04:00
|
|
|
|
2009-08-31 09:52:16 -04:00
|
|
|
meta_window_get_work_area_all_monitors (window, &work_area);
|
2013-11-19 12:24:45 -05:00
|
|
|
meta_window_get_frame_rect (window, &frame_rect);
|
2008-08-31 21:32:39 -04:00
|
|
|
|
2014-05-21 08:51:24 -04:00
|
|
|
meta_window_move_frame (window,
|
|
|
|
TRUE,
|
|
|
|
work_area.x + (work_area.width - frame_rect.width ) / 2,
|
|
|
|
work_area.y + (work_area.height - frame_rect.height) / 2);
|
2008-08-31 21:32:39 -04:00
|
|
|
}
|
|
|
|
|
2001-10-14 23:39:41 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_show_desktop (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2001-10-14 23:39:41 -04:00
|
|
|
{
|
Make the "showing desktop" mode be per-workspace instead of per-screen.
2004-10-16 Elijah Newren <newren@math.utah.edu>
Make the "showing desktop" mode be per-workspace instead of
per-screen. (fixes #142198)
* src/keybindings.c (handle_toggle_desktop): access
showing_desktop through the active workspace
* src/screen.c (meta_screen_new): remove initialization of
screen->showing_desktop,
(meta_screen_update_showing_desktop_hint): rename and make not
static and access showing_desktop through the active workspace,
(queue_windows_showing): replace meta_display_list_windows() with
screen->active_workspace->windows,
(meta_screen_minimize_all_on_active_workspace_except): renamed
from meta_screen_minimize_all_except since it now only works on
the active workspace, (meta_screen_show_desktop,
meta_screen_unshow_desktop): access showing_desktop through the
active workspace
* src/screen.h (struct _MetaScreen): remove showing_desktop field,
(meta_screen_minimize_all_on_active_workspace_except): rename from
meta_screen_minimize_all_except,
(meta_screen_update)_showing_desktop_hint): export this function too
* src/window.c (maybe_leave_show_desktop_mode): access
showing_desktop through the active workspace and use new name for
meta_screen_minimize_all_on_active_workspace_except,
(window_should_be_showing): access showing_desktop through the
active workspace
* src/workspace.c (meta_workspace_new): initialize
workspace->showing_desktop, (meta_workspace_activate_with_focus):
add note that old can be NULL, update showing_desktop_hint if
different on this workspace than the previous one
* src/workspace.h (struct _MetaWorkspace): add showing_desktop
field
2004-10-17 00:28:29 -04:00
|
|
|
if (screen->active_workspace->showing_desktop)
|
2003-05-16 17:59:08 -04:00
|
|
|
{
|
|
|
|
meta_screen_unshow_desktop (screen);
|
2012-12-12 20:50:43 -05:00
|
|
|
meta_workspace_focus_default_window (screen->active_workspace,
|
Fix a variety of focus race conditions in all focus modes, or at least
2004-10-04 Elijah Newren <newren@math.utah.edu>
Fix a variety of focus race conditions in all focus modes, or at
least make them harder to trigger (fixes #152000)
* src/core.[ch] (meta_core_user_lower_and_unfocus): add a
timestamp parameter; pass it along to
meta_workspace_focus_default_window
* src/display.[ch] (meta_display_get_current_time_roundtrip): new
function
* src/display.c (event_callback): pass a timestamp to the
meta_workspace_activate and meta_workspace_focus_default_window
function calls
* src/frames.c (meta_frames_button_press_event): pass a timestamp
to meta_core_user_lower_and_unfocus
* src/keybindings.c (handle_activate_workspace): pass a timestamp
to meta_workspace_activate, (process_workspace_switch_grab): pass
a timestamp to meta_workspace_focus_default_window and
meta_workspace_activate, (handle_toggle_desktop): pass a timestamp
to meta_workspace_focus_default_window,
(do_handle_move_to_workspace): pass a timestamp to
meta_workspace_activate_with_focus, (handle_workspace_switch):
meta_workspace_activate
* src/screen.c (meta_screen_new): pass a timestamp to
meta_workspace_activate
* src/window.c (meta_window_free): pass a timestamp to
meta_workspace_focus_default_window, (idle_calc_showing): don't
increment the focus sentinel here, (meta_window_minimize): pass a
timestamp to meta_workspace_focus_default_window,
(meta_window_client_message), pass a timestamp to
meta_workspace_focus_default_window
* src/workspace.h (meta_workspace_activate): add timestamp
parameter, (meta_workspace_activate_with_focus): add timestamp
parameter, (meta_workspace_focus_default_window): add timestamp
parameter
* src/workspace.c (meta_workspace_focus_mru_window): make this
function take a timestamp and use it for meta_window_focus or
XSetInputFocus, (meta_workspace_activate_with_focus): make this
function take a timestamp and pass it along to meta_window_focus
and meta_workspace_focus_default_window,
(meta_workspace_activate): make this function take a timestamp and
pass it to meta_workspace_activate_with_focus),
(meta_workspace_focus_default_window): make this function take a
timestamp, warn if its 0 but try to handle that case sanely, and
pass the timestamp on to meta_window_focus or
meta_workspace_focus_mru_window or XSetInputFocus
2004-10-04 16:32:59 -04:00
|
|
|
NULL,
|
2012-11-15 16:35:42 -05:00
|
|
|
event->time);
|
2003-05-16 17:59:08 -04:00
|
|
|
}
|
2001-10-14 23:39:41 -04:00
|
|
|
else
|
2012-11-15 16:35:42 -05:00
|
|
|
meta_screen_show_desktop (screen, event->time);
|
2001-10-14 23:39:41 -04:00
|
|
|
}
|
|
|
|
|
2003-02-23 21:16:09 -05:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_panel (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2003-02-23 21:16:09 -05:00
|
|
|
{
|
2008-10-05 20:24:07 -04:00
|
|
|
MetaKeyBindingAction action = binding->handler->data;
|
2003-02-23 21:16:09 -05:00
|
|
|
Atom action_atom;
|
|
|
|
XClientMessageEvent ev;
|
|
|
|
|
|
|
|
action_atom = None;
|
|
|
|
switch (action)
|
|
|
|
{
|
2012-12-12 20:50:43 -05:00
|
|
|
/* FIXME: The numbers are wrong */
|
2003-02-23 21:16:09 -05:00
|
|
|
case META_KEYBINDING_ACTION_PANEL_MAIN_MENU:
|
2008-05-02 14:49:01 -04:00
|
|
|
action_atom = display->atom__GNOME_PANEL_ACTION_MAIN_MENU;
|
2003-02-23 21:16:09 -05:00
|
|
|
break;
|
|
|
|
case META_KEYBINDING_ACTION_PANEL_RUN_DIALOG:
|
2008-05-02 14:49:01 -04:00
|
|
|
action_atom = display->atom__GNOME_PANEL_ACTION_RUN_DIALOG;
|
2003-02-23 21:16:09 -05:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2003-02-23 21:16:09 -05:00
|
|
|
ev.type = ClientMessage;
|
|
|
|
ev.window = screen->xroot;
|
2008-05-02 14:49:01 -04:00
|
|
|
ev.message_type = display->atom__GNOME_PANEL_ACTION;
|
2003-02-23 21:16:09 -05:00
|
|
|
ev.format = 32;
|
|
|
|
ev.data.l[0] = action_atom;
|
2012-11-15 16:35:42 -05:00
|
|
|
ev.data.l[1] = event->time;
|
2003-02-23 21:16:09 -05:00
|
|
|
|
2003-02-25 20:55:25 -05:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
2013-10-03 18:03:53 -04:00
|
|
|
"Sending panel message with timestamp %u, and turning mouse_mode "
|
2012-11-15 16:35:42 -05:00
|
|
|
"off due to keybinding press\n", event->time);
|
2007-04-03 16:19:12 -04:00
|
|
|
display->mouse_mode = FALSE;
|
2003-02-25 20:55:25 -05:00
|
|
|
|
2003-02-23 21:16:09 -05:00
|
|
|
meta_error_trap_push (display);
|
2003-02-25 20:55:25 -05:00
|
|
|
|
|
|
|
/* Release the grab for the panel before sending the event */
|
2012-11-15 16:35:42 -05:00
|
|
|
XUngrabKeyboard (display->xdisplay, event->time);
|
2003-02-25 20:55:25 -05:00
|
|
|
|
2003-02-23 21:16:09 -05:00
|
|
|
XSendEvent (display->xdisplay,
|
|
|
|
screen->xroot,
|
|
|
|
False,
|
|
|
|
StructureNotifyMask,
|
|
|
|
(XEvent*) &ev);
|
2003-02-25 20:55:25 -05:00
|
|
|
|
2010-10-25 14:44:30 -04:00
|
|
|
meta_error_trap_pop (display);
|
2003-02-23 21:16:09 -05:00
|
|
|
}
|
|
|
|
|
2001-06-23 01:49:35 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_activate_window_menu (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *event_window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2001-06-23 01:49:35 -04:00
|
|
|
{
|
|
|
|
if (display->focus_window)
|
2014-05-22 08:35:11 -04:00
|
|
|
{
|
|
|
|
int x, y;
|
2014-05-22 10:32:31 -04:00
|
|
|
MetaRectangle frame_rect;
|
|
|
|
cairo_rectangle_int_t child_rect;
|
2014-05-22 08:35:11 -04:00
|
|
|
|
2014-05-22 10:32:31 -04:00
|
|
|
meta_window_get_frame_rect (display->focus_window, &frame_rect);
|
|
|
|
meta_window_get_client_area_rect (display->focus_window, &child_rect);
|
2014-05-22 08:35:11 -04:00
|
|
|
|
2014-05-22 10:32:31 -04:00
|
|
|
x = frame_rect.x + child_rect.x;
|
2014-08-17 22:57:51 -04:00
|
|
|
if (meta_get_locale_direction () == META_LOCALE_DIRECTION_RTL)
|
2014-05-22 10:32:31 -04:00
|
|
|
x += child_rect.width;
|
2014-05-22 08:35:11 -04:00
|
|
|
|
2014-05-22 10:32:31 -04:00
|
|
|
y = frame_rect.y + child_rect.y;
|
2014-05-23 17:14:51 -04:00
|
|
|
meta_window_show_menu (display->focus_window, META_WINDOW_MENU_WM, x, y);
|
2014-05-22 08:35:11 -04:00
|
|
|
}
|
2001-06-23 01:49:35 -04:00
|
|
|
}
|
2001-06-23 22:22:10 -04:00
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
do_choose_window (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *event_window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
2013-04-23 12:52:25 -04:00
|
|
|
gboolean backward)
|
2001-06-23 22:22:10 -04:00
|
|
|
{
|
2008-10-05 20:24:07 -04:00
|
|
|
MetaTabList type = binding->handler->data;
|
2014-05-15 15:02:22 -04:00
|
|
|
MetaWindow *window;
|
2008-10-05 20:24:07 -04:00
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
2013-04-23 12:52:25 -04:00
|
|
|
"Tab list = %u\n", type);
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2014-05-15 15:02:22 -04:00
|
|
|
window = meta_display_get_tab_next (display,
|
|
|
|
type,
|
|
|
|
screen->active_workspace,
|
|
|
|
NULL,
|
|
|
|
backward);
|
2002-07-06 12:50:48 -04:00
|
|
|
|
2014-05-15 15:02:46 -04:00
|
|
|
if (window)
|
|
|
|
meta_window_activate (window, event->time);
|
2001-06-23 22:22:10 -04:00
|
|
|
}
|
2001-06-23 23:18:10 -04:00
|
|
|
|
2002-07-06 12:50:48 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_switch (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *event_window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2001-06-23 23:18:10 -04:00
|
|
|
{
|
2014-05-29 14:38:13 -04:00
|
|
|
gboolean backwards = meta_key_binding_is_reversed (binding);
|
2013-04-23 12:52:25 -04:00
|
|
|
do_choose_window (display, screen, event_window, event, binding, backwards);
|
2002-06-08 23:44:16 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_cycle (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *event_window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-06-08 23:44:16 -04:00
|
|
|
{
|
2014-05-29 14:38:13 -04:00
|
|
|
gboolean backwards = meta_key_binding_is_reversed (binding);
|
2013-04-23 12:52:25 -04:00
|
|
|
do_choose_window (display, screen, event_window, event, binding, backwards);
|
2009-08-25 16:54:54 -04:00
|
|
|
}
|
2008-10-05 20:24:07 -04:00
|
|
|
|
2002-04-05 10:52:49 -05:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_toggle_fullscreen (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-05 10:52:49 -05:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->fullscreen)
|
|
|
|
meta_window_unmake_fullscreen (window);
|
|
|
|
else if (window->has_fullscreen_func)
|
|
|
|
meta_window_make_fullscreen (window);
|
2002-04-05 10:52:49 -05:00
|
|
|
}
|
2002-01-10 22:31:14 -05:00
|
|
|
|
2003-06-27 10:49:56 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_toggle_above (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2003-06-27 10:49:56 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->wm_state_above)
|
|
|
|
meta_window_unmake_above (window);
|
|
|
|
else
|
|
|
|
meta_window_make_above (window);
|
2003-06-27 10:49:56 -04:00
|
|
|
}
|
|
|
|
|
2011-11-15 11:29:56 -05:00
|
|
|
static void
|
2016-01-10 09:16:09 -05:00
|
|
|
handle_toggle_tiled (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2011-11-15 11:29:56 -05:00
|
|
|
{
|
2016-01-10 09:16:09 -05:00
|
|
|
MetaTileMode mode = binding->handler->data;
|
2011-11-15 11:29:56 -05:00
|
|
|
|
2016-01-10 09:16:09 -05:00
|
|
|
if ((META_WINDOW_TILED_LEFT (window) && mode == META_TILE_LEFT) ||
|
|
|
|
(META_WINDOW_TILED_RIGHT (window) && mode == META_TILE_RIGHT))
|
|
|
|
{
|
|
|
|
window->tile_monitor_number = window->saved_maximize ? window->monitor->number
|
|
|
|
: -1;
|
|
|
|
window->tile_mode = window->saved_maximize ? META_TILE_MAXIMIZED
|
|
|
|
: META_TILE_NONE;
|
|
|
|
|
|
|
|
if (window->saved_maximize)
|
|
|
|
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
|
|
|
else
|
|
|
|
meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
|
|
|
|
}
|
|
|
|
else if (meta_window_can_tile_side_by_side (window))
|
|
|
|
{
|
|
|
|
window->tile_monitor_number = window->monitor->number;
|
|
|
|
window->tile_mode = mode;
|
|
|
|
/* Maximization constraints beat tiling constraints, so if the window
|
|
|
|
* is maximized, tiling won't have any effect unless we unmaximize it
|
|
|
|
* horizontally first; rather than calling meta_window_unmaximize(),
|
|
|
|
* we just set the flag and rely on meta_window_tile() syncing it to
|
|
|
|
* save an additional roundtrip.
|
|
|
|
*/
|
|
|
|
window->maximized_horizontally = FALSE;
|
|
|
|
meta_window_tile (window);
|
|
|
|
}
|
2011-11-15 11:29:56 -05:00
|
|
|
}
|
|
|
|
|
2002-01-10 22:31:14 -05:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_toggle_maximized (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (META_WINDOW_MAXIMIZED (window))
|
2014-03-13 18:32:20 -04:00
|
|
|
meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
|
2008-11-22 14:02:54 -05:00
|
|
|
else if (window->has_maximize_func)
|
2014-03-13 18:32:20 -04:00
|
|
|
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2002-08-21 02:47:16 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_maximize (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-08-21 02:47:16 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_maximize_func)
|
2014-03-13 18:32:20 -04:00
|
|
|
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
2002-08-21 02:47:16 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_unmaximize (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-08-21 02:47:16 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->maximized_vertically || window->maximized_horizontally)
|
2014-03-13 18:32:20 -04:00
|
|
|
meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
|
2002-08-21 02:47:16 -04:00
|
|
|
}
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_toggle_shaded (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->shaded)
|
2012-11-15 16:35:42 -05:00
|
|
|
meta_window_unshade (window, event->time);
|
2008-11-22 14:02:54 -05:00
|
|
|
else if (window->has_shade_func)
|
2012-11-15 16:35:42 -05:00
|
|
|
meta_window_shade (window, event->time);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_close (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_close_func)
|
2012-11-15 16:35:42 -05:00
|
|
|
meta_window_delete (window, event->time);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2002-05-24 22:30:00 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_minimize (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-05-24 22:30:00 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_minimize_func)
|
|
|
|
meta_window_minimize (window);
|
2002-05-24 22:30:00 -04:00
|
|
|
}
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_begin_move (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_move_func)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
meta_window_begin_grab_op (window,
|
|
|
|
META_GRAB_OP_KEYBOARD_MOVING,
|
2006-10-12 20:28:34 -04:00
|
|
|
FALSE,
|
2012-11-15 16:35:42 -05:00
|
|
|
event->time);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_begin_resize (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->has_resize_func)
|
2002-07-09 23:51:01 -04:00
|
|
|
{
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
meta_window_begin_grab_op (window,
|
|
|
|
META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN,
|
2006-10-12 20:28:34 -04:00
|
|
|
FALSE,
|
2012-11-15 16:35:42 -05:00
|
|
|
event->time);
|
2002-07-09 23:51:01 -04:00
|
|
|
}
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_toggle_on_all_workspaces (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2011-02-28 05:41:23 -05:00
|
|
|
if (window->on_all_workspaces_requested)
|
2008-11-22 14:02:54 -05:00
|
|
|
meta_window_unstick (window);
|
|
|
|
else
|
|
|
|
meta_window_stick (window);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2013-05-17 08:08:57 -04:00
|
|
|
static void
|
|
|
|
handle_move_to_workspace_last (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
|
|
|
{
|
|
|
|
gint which;
|
|
|
|
MetaWorkspace *workspace;
|
|
|
|
|
|
|
|
if (window->always_sticky)
|
|
|
|
return;
|
|
|
|
|
|
|
|
which = meta_screen_get_n_workspaces (screen) - 1;
|
|
|
|
workspace = meta_screen_get_workspace_by_index (screen, which);
|
|
|
|
meta_window_change_workspace (window, workspace);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_move_to_workspace (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-04-28 00:52:26 -04:00
|
|
|
{
|
2008-10-05 20:24:07 -04:00
|
|
|
gint which = binding->handler->data;
|
|
|
|
gboolean flip = (which < 0);
|
2002-04-28 00:52:26 -04:00
|
|
|
MetaWorkspace *workspace;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-09-06 18:01:56 -04:00
|
|
|
/* If which is zero or positive, it's a workspace number, and the window
|
|
|
|
* should move to the workspace with that number.
|
|
|
|
*
|
|
|
|
* However, if it's negative, it's a direction with respect to the current
|
|
|
|
* position; it's expressed as a member of the MetaMotionDirection enum,
|
|
|
|
* all of whose members are negative. Such a change is called a flip.
|
|
|
|
*/
|
2002-04-28 00:52:26 -04:00
|
|
|
|
2008-11-22 14:02:54 -05:00
|
|
|
if (window->always_sticky)
|
2002-05-26 11:54:38 -04:00
|
|
|
return;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
workspace = NULL;
|
2008-09-06 18:01:56 -04:00
|
|
|
if (flip)
|
2012-12-12 20:50:43 -05:00
|
|
|
{
|
2002-04-28 00:52:26 -04:00
|
|
|
workspace = meta_workspace_get_neighbor (screen->active_workspace,
|
|
|
|
which);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-10-16 16:12:24 -04:00
|
|
|
workspace = meta_screen_get_workspace_by_index (screen, which);
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
if (workspace)
|
|
|
|
{
|
2002-05-24 22:33:55 -04:00
|
|
|
/* Activate second, so the window is never unmapped */
|
2002-04-28 00:52:26 -04:00
|
|
|
meta_window_change_workspace (window, workspace);
|
2003-05-16 20:00:55 -04:00
|
|
|
if (flip)
|
2005-02-21 21:11:25 -05:00
|
|
|
{
|
|
|
|
meta_topic (META_DEBUG_FOCUS,
|
|
|
|
"Resetting mouse_mode to FALSE due to "
|
2008-09-06 18:01:56 -04:00
|
|
|
"handle_move_to_workspace() call with flip set.\n");
|
2012-04-14 09:12:48 -04:00
|
|
|
meta_display_clear_mouse_mode (workspace->screen->display);
|
2005-02-21 21:11:25 -05:00
|
|
|
meta_workspace_activate_with_focus (workspace,
|
|
|
|
window,
|
2012-11-15 16:35:42 -05:00
|
|
|
event->time);
|
2005-02-21 21:11:25 -05:00
|
|
|
}
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* We could offer to create it I suppose */
|
2012-12-12 20:50:43 -05:00
|
|
|
}
|
2002-04-28 00:52:26 -04:00
|
|
|
}
|
|
|
|
|
2013-12-11 11:57:45 -05:00
|
|
|
static void
|
|
|
|
handle_move_to_monitor (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
|
|
|
{
|
2016-12-01 02:15:52 -05:00
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
MetaMonitorManager *monitor_manager =
|
|
|
|
meta_backend_get_monitor_manager (backend);
|
2013-12-11 11:57:45 -05:00
|
|
|
gint which = binding->handler->data;
|
2016-12-01 02:15:52 -05:00
|
|
|
MetaLogicalMonitor *current, *new;
|
2013-12-11 11:57:45 -05:00
|
|
|
|
2015-04-09 00:20:24 -04:00
|
|
|
current = window->monitor;
|
2016-12-01 02:15:52 -05:00
|
|
|
new = meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager,
|
|
|
|
current, which);
|
2013-12-11 11:57:45 -05:00
|
|
|
|
|
|
|
if (new == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
meta_window_move_to_monitor (window, new->number);
|
|
|
|
}
|
|
|
|
|
2012-12-12 20:50:43 -05:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_raise_or_lower (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-05-28 23:11:24 -04:00
|
|
|
{
|
|
|
|
/* Get window at pointer */
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-11-22 14:02:54 -05:00
|
|
|
MetaWindow *above = NULL;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-11-22 14:02:54 -05:00
|
|
|
/* Check if top */
|
|
|
|
if (meta_stack_get_top (window->screen->stack) == window)
|
|
|
|
{
|
|
|
|
meta_window_lower (window);
|
|
|
|
return;
|
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-11-22 14:02:54 -05:00
|
|
|
/* else check if windows in same layer are intersecting it */
|
2012-12-12 20:50:43 -05:00
|
|
|
|
|
|
|
above = meta_stack_get_above (window->screen->stack, window, TRUE);
|
2002-05-28 23:11:24 -04:00
|
|
|
|
2008-11-22 14:02:54 -05:00
|
|
|
while (above)
|
|
|
|
{
|
|
|
|
MetaRectangle tmp, win_rect, above_rect;
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2017-02-06 11:17:02 -05:00
|
|
|
if (above->mapped && meta_window_should_be_showing (above))
|
2008-11-22 14:02:54 -05:00
|
|
|
{
|
2013-11-19 12:24:45 -05:00
|
|
|
meta_window_get_frame_rect (window, &win_rect);
|
|
|
|
meta_window_get_frame_rect (above, &above_rect);
|
2012-12-12 20:50:43 -05:00
|
|
|
|
2008-11-22 14:02:54 -05:00
|
|
|
/* Check if obscured */
|
|
|
|
if (meta_rectangle_intersect (&win_rect, &above_rect, &tmp))
|
2002-10-20 11:22:40 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
meta_window_raise (window);
|
|
|
|
return;
|
2002-10-20 11:22:40 -04:00
|
|
|
}
|
2008-11-22 14:02:54 -05:00
|
|
|
}
|
2012-12-12 20:50:43 -05:00
|
|
|
|
|
|
|
above = meta_stack_get_above (window->screen->stack, above, TRUE);
|
2002-05-28 23:11:24 -04:00
|
|
|
}
|
2008-11-22 14:02:54 -05:00
|
|
|
|
|
|
|
/* window is not obscured */
|
|
|
|
meta_window_lower (window);
|
2002-05-28 23:11:24 -04:00
|
|
|
}
|
|
|
|
|
2002-08-15 01:14:49 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_raise (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-08-15 01:14:49 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
meta_window_raise (window);
|
2002-08-15 01:14:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_lower (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-08-15 01:14:49 -04:00
|
|
|
{
|
2008-11-22 14:02:54 -05:00
|
|
|
meta_window_lower (window);
|
2002-08-15 01:14:49 -04:00
|
|
|
}
|
|
|
|
|
2002-04-28 00:52:26 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_set_spew_mark (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2002-01-10 22:31:14 -05:00
|
|
|
{
|
|
|
|
meta_verbose ("-- MARK MARK MARK MARK --\n");
|
|
|
|
}
|
|
|
|
|
2014-05-29 12:11:26 -04:00
|
|
|
#ifdef HAVE_NATIVE_BACKEND
|
2013-07-16 08:37:49 -04:00
|
|
|
static void
|
2013-10-03 18:03:53 -04:00
|
|
|
handle_switch_vt (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
2013-07-16 08:37:49 -04:00
|
|
|
{
|
2014-02-01 19:22:56 -05:00
|
|
|
gint vt = binding->handler->data;
|
2014-02-01 19:34:24 -05:00
|
|
|
GError *error = NULL;
|
2014-01-16 13:40:41 -05:00
|
|
|
|
2014-03-31 23:19:13 -04:00
|
|
|
if (!meta_activate_vt (vt, &error))
|
2014-02-01 19:22:56 -05:00
|
|
|
{
|
2014-02-01 19:34:24 -05:00
|
|
|
g_warning ("Failed to switch VT: %s", error->message);
|
|
|
|
g_error_free (error);
|
2014-02-01 19:22:56 -05:00
|
|
|
}
|
2013-07-16 08:37:49 -04:00
|
|
|
}
|
2014-05-29 12:11:26 -04:00
|
|
|
#endif /* HAVE_NATIVE_BACKEND */
|
2013-07-16 08:37:49 -04:00
|
|
|
|
2017-06-07 13:07:26 -04:00
|
|
|
static void
|
|
|
|
handle_switch_monitor (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
|
|
|
{
|
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
MetaMonitorManager *monitor_manager =
|
|
|
|
meta_backend_get_monitor_manager (backend);
|
|
|
|
MetaMonitorSwitchConfigType config_type =
|
|
|
|
meta_monitor_manager_get_switch_config (monitor_manager);
|
|
|
|
|
|
|
|
if (!meta_monitor_manager_can_switch_config (monitor_manager))
|
|
|
|
return;
|
|
|
|
|
|
|
|
config_type = (config_type + 1) % (META_MONITOR_SWITCH_CONFIG_UNKNOWN);
|
|
|
|
meta_monitor_manager_switch_config (monitor_manager, config_type);
|
|
|
|
}
|
|
|
|
|
2017-05-05 11:51:06 -04:00
|
|
|
static void
|
|
|
|
handle_rotate_monitor (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
|
|
|
{
|
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
MetaMonitorManager *monitor_manager =
|
|
|
|
meta_backend_get_monitor_manager (backend);
|
|
|
|
|
|
|
|
meta_monitor_manager_rotate_monitor (monitor_manager);
|
|
|
|
}
|
|
|
|
|
2017-03-17 08:34:52 -04:00
|
|
|
static void
|
|
|
|
handle_restore_shortcuts (MetaDisplay *display,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWindow *window,
|
|
|
|
ClutterKeyEvent *event,
|
|
|
|
MetaKeyBinding *binding,
|
|
|
|
gpointer dummy)
|
|
|
|
{
|
|
|
|
ClutterInputDevice *source;
|
|
|
|
|
|
|
|
source = clutter_event_get_source_device ((ClutterEvent *) event);
|
|
|
|
|
|
|
|
meta_topic (META_DEBUG_KEYBINDINGS, "Restoring normal keyboard shortcuts\n");
|
|
|
|
|
|
|
|
meta_window_force_restore_shortcuts (display->focus_window, source);
|
|
|
|
}
|
|
|
|
|
2012-09-01 16:09:39 -04:00
|
|
|
/**
|
|
|
|
* meta_keybindings_set_custom_handler:
|
|
|
|
* @name: The name of the keybinding to set
|
2014-05-28 15:44:23 -04:00
|
|
|
* @handler: (nullable): The new handler function
|
2012-09-01 16:09:39 -04:00
|
|
|
* @user_data: User data to pass to the callback
|
|
|
|
* @free_data: Will be called when this handler is overridden.
|
|
|
|
*
|
|
|
|
* Allows users to register a custom handler for a
|
|
|
|
* builtin key binding.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the binding known as @name was found,
|
|
|
|
* %FALSE otherwise.
|
|
|
|
*/
|
2009-01-29 10:07:57 -05:00
|
|
|
gboolean
|
|
|
|
meta_keybindings_set_custom_handler (const gchar *name,
|
|
|
|
MetaKeyHandlerFunc handler,
|
|
|
|
gpointer user_data,
|
2009-03-25 10:50:40 -04:00
|
|
|
GDestroyNotify free_data)
|
2009-01-29 10:07:57 -05:00
|
|
|
{
|
2011-10-27 21:05:43 -04:00
|
|
|
MetaKeyHandler *key_handler = HANDLER (name);
|
2009-01-29 10:07:57 -05:00
|
|
|
|
|
|
|
if (!key_handler)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
if (key_handler->user_data_free_func && key_handler->user_data)
|
2009-01-29 10:29:43 -05:00
|
|
|
key_handler->user_data_free_func (key_handler->user_data);
|
2009-01-29 10:07:57 -05:00
|
|
|
|
|
|
|
key_handler->func = handler;
|
|
|
|
key_handler->user_data = user_data;
|
|
|
|
key_handler->user_data_free_func = free_data;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
static void
|
|
|
|
init_builtin_key_bindings (MetaDisplay *display)
|
|
|
|
{
|
2012-03-27 10:42:42 -04:00
|
|
|
GSettings *common_keybindings = g_settings_new (SCHEMA_COMMON_KEYBINDINGS);
|
|
|
|
GSettings *mutter_keybindings = g_settings_new (SCHEMA_MUTTER_KEYBINDINGS);
|
2013-07-16 08:37:49 -04:00
|
|
|
GSettings *mutter_wayland_keybindings = g_settings_new (SCHEMA_MUTTER_WAYLAND_KEYBINDINGS);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-1",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_1,
|
|
|
|
handle_switch_to_workspace, 0);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-2",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_2,
|
|
|
|
handle_switch_to_workspace, 1);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-3",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_3,
|
|
|
|
handle_switch_to_workspace, 2);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-4",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_4,
|
|
|
|
handle_switch_to_workspace, 3);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-5",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_5,
|
|
|
|
handle_switch_to_workspace, 4);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-6",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_6,
|
|
|
|
handle_switch_to_workspace, 5);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-7",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_7,
|
|
|
|
handle_switch_to_workspace, 6);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-8",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_8,
|
|
|
|
handle_switch_to_workspace, 7);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-9",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_9,
|
|
|
|
handle_switch_to_workspace, 8);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-10",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_10,
|
|
|
|
handle_switch_to_workspace, 9);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-11",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_11,
|
|
|
|
handle_switch_to_workspace, 10);
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-12",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_12,
|
|
|
|
handle_switch_to_workspace, 11);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-left",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_LEFT,
|
2014-04-17 10:54:37 -04:00
|
|
|
handle_switch_to_workspace, META_MOTION_LEFT);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-right",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_RIGHT,
|
2014-04-17 10:54:37 -04:00
|
|
|
handle_switch_to_workspace, META_MOTION_RIGHT);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-up",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_UP,
|
2014-04-17 10:54:37 -04:00
|
|
|
handle_switch_to_workspace, META_MOTION_UP);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-down",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_DOWN,
|
2014-04-17 10:54:37 -04:00
|
|
|
handle_switch_to_workspace, META_MOTION_DOWN);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2013-05-17 08:08:57 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-workspace-last",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_WORKSPACE_LAST,
|
|
|
|
handle_switch_to_last_workspace, 0);
|
|
|
|
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
/* The ones which have inverses. These can't be bound to any keystroke
|
|
|
|
* containing Shift because Shift will invert their "backward" state.
|
|
|
|
*
|
|
|
|
* TODO: "NORMAL" and "DOCKS" should be renamed to the same name as their
|
|
|
|
* action, for obviousness.
|
|
|
|
*
|
|
|
|
* TODO: handle_switch and handle_cycle should probably really be the
|
|
|
|
* same function checking a bit in the parameter for difference.
|
|
|
|
*/
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-group",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_GROUP,
|
|
|
|
handle_switch, META_TAB_LIST_GROUP);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-group-backward",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_GROUP_BACKWARD,
|
|
|
|
handle_switch, META_TAB_LIST_GROUP);
|
|
|
|
|
2012-11-22 21:48:14 -05:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-applications",
|
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2012-11-22 21:48:14 -05:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_APPLICATIONS,
|
|
|
|
handle_switch, META_TAB_LIST_NORMAL);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-applications-backward",
|
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2012-11-22 21:48:14 -05:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_APPLICATIONS_BACKWARD,
|
|
|
|
handle_switch, META_TAB_LIST_NORMAL);
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-windows",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_WINDOWS,
|
|
|
|
handle_switch, META_TAB_LIST_NORMAL);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-windows-backward",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_WINDOWS_BACKWARD,
|
|
|
|
handle_switch, META_TAB_LIST_NORMAL);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-panels",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_PANELS,
|
|
|
|
handle_switch, META_TAB_LIST_DOCKS);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-panels-backward",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_SWITCH_PANELS_BACKWARD,
|
|
|
|
handle_switch, META_TAB_LIST_DOCKS);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"cycle-group",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_CYCLE_GROUP,
|
|
|
|
handle_cycle, META_TAB_LIST_GROUP);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"cycle-group-backward",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_CYCLE_GROUP_BACKWARD,
|
|
|
|
handle_cycle, META_TAB_LIST_GROUP);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"cycle-windows",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_CYCLE_WINDOWS,
|
|
|
|
handle_cycle, META_TAB_LIST_NORMAL);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"cycle-windows-backward",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_CYCLE_WINDOWS_BACKWARD,
|
|
|
|
handle_cycle, META_TAB_LIST_NORMAL);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"cycle-panels",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_CYCLE_PANELS,
|
|
|
|
handle_cycle, META_TAB_LIST_DOCKS);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"cycle-panels-backward",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2014-06-27 10:07:44 -04:00
|
|
|
META_KEY_BINDING_IS_REVERSED,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEYBINDING_ACTION_CYCLE_PANELS_BACKWARD,
|
|
|
|
handle_cycle, META_TAB_LIST_DOCKS);
|
|
|
|
|
2012-12-12 20:50:43 -05:00
|
|
|
/***********************************/
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"show-desktop",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_SHOW_DESKTOP,
|
|
|
|
handle_show_desktop, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"panel-main-menu",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_PANEL_MAIN_MENU,
|
|
|
|
handle_panel, META_KEYBINDING_ACTION_PANEL_MAIN_MENU);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"panel-run-dialog",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_PANEL_RUN_DIALOG,
|
|
|
|
handle_panel, META_KEYBINDING_ACTION_PANEL_RUN_DIALOG);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"set-spew-mark",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_SET_SPEW_MARK,
|
|
|
|
handle_set_spew_mark, 0);
|
|
|
|
|
2017-06-07 13:07:26 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-monitor",
|
|
|
|
mutter_keybindings,
|
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_SWITCH_MONITOR,
|
|
|
|
handle_switch_monitor, 0);
|
|
|
|
|
2017-05-05 11:51:06 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"rotate-monitor",
|
|
|
|
mutter_keybindings,
|
|
|
|
META_KEY_BINDING_NONE,
|
|
|
|
META_KEYBINDING_ACTION_ROTATE_MONITOR,
|
|
|
|
handle_rotate_monitor, 0);
|
|
|
|
|
2014-05-29 12:11:26 -04:00
|
|
|
#ifdef HAVE_NATIVE_BACKEND
|
2014-05-29 12:09:10 -04:00
|
|
|
MetaBackend *backend = meta_get_backend ();
|
|
|
|
if (META_IS_BACKEND_NATIVE (backend))
|
2013-07-16 08:37:49 -04:00
|
|
|
{
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-1",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 1);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-2",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 2);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-3",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 3);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-4",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 4);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-5",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 5);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-6",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 6);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-7",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2013-07-16 08:37:49 -04:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 7);
|
2015-02-19 16:07:49 -05:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-8",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2015-02-19 16:07:49 -05:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 8);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-9",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2015-02-19 16:07:49 -05:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 9);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-10",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2015-02-19 16:07:49 -05:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 10);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-11",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2015-02-19 16:07:49 -05:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 11);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"switch-to-session-12",
|
|
|
|
mutter_wayland_keybindings,
|
2017-03-17 08:34:52 -04:00
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
2015-02-19 16:07:49 -05:00
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_switch_vt, 12);
|
2013-07-16 08:37:49 -04:00
|
|
|
}
|
2014-05-29 12:11:26 -04:00
|
|
|
#endif /* HAVE_NATIVE_BACKEND */
|
2013-07-16 08:37:49 -04:00
|
|
|
|
2017-03-17 08:34:52 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"restore-shortcuts",
|
|
|
|
mutter_wayland_keybindings,
|
|
|
|
META_KEY_BINDING_NON_MASKABLE,
|
|
|
|
META_KEYBINDING_ACTION_NONE,
|
|
|
|
handle_restore_shortcuts, 0);
|
|
|
|
|
2012-12-12 20:50:43 -05:00
|
|
|
/************************ PER WINDOW BINDINGS ************************/
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2012-12-12 20:50:43 -05:00
|
|
|
/* These take a window as an extra parameter; they have no effect
|
|
|
|
* if no window is active.
|
|
|
|
*/
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"activate-window-menu",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU,
|
|
|
|
handle_activate_window_menu, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-fullscreen",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN,
|
|
|
|
handle_toggle_fullscreen, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-maximized",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED,
|
|
|
|
handle_toggle_maximized, 0);
|
|
|
|
|
2011-11-15 11:29:56 -05:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-tiled-left",
|
2012-03-27 10:42:42 -04:00
|
|
|
mutter_keybindings,
|
2011-11-15 11:29:56 -05:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT,
|
2016-01-10 09:16:09 -05:00
|
|
|
handle_toggle_tiled, META_TILE_LEFT);
|
2011-11-15 11:29:56 -05:00
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-tiled-right",
|
2012-03-27 10:42:42 -04:00
|
|
|
mutter_keybindings,
|
2011-11-15 11:29:56 -05:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT,
|
2016-01-10 09:16:09 -05:00
|
|
|
handle_toggle_tiled, META_TILE_RIGHT);
|
2011-11-15 11:29:56 -05:00
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-above",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_ABOVE,
|
|
|
|
handle_toggle_above, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"maximize",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MAXIMIZE,
|
|
|
|
handle_maximize, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"unmaximize",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_UNMAXIMIZE,
|
|
|
|
handle_unmaximize, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-shaded",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_SHADED,
|
|
|
|
handle_toggle_shaded, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"minimize",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MINIMIZE,
|
|
|
|
handle_minimize, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"close",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_CLOSE,
|
|
|
|
handle_close, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"begin-move",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_BEGIN_MOVE,
|
|
|
|
handle_begin_move, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"begin-resize",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_BEGIN_RESIZE,
|
|
|
|
handle_begin_resize, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"toggle-on-all-workspaces",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_TOGGLE_ON_ALL_WORKSPACES,
|
|
|
|
handle_toggle_on_all_workspaces, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-1",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_1,
|
|
|
|
handle_move_to_workspace, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-2",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_2,
|
|
|
|
handle_move_to_workspace, 1);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-3",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_3,
|
|
|
|
handle_move_to_workspace, 2);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-4",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_4,
|
|
|
|
handle_move_to_workspace, 3);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-5",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_5,
|
|
|
|
handle_move_to_workspace, 4);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-6",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_6,
|
|
|
|
handle_move_to_workspace, 5);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-7",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_7,
|
|
|
|
handle_move_to_workspace, 6);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-8",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_8,
|
|
|
|
handle_move_to_workspace, 7);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-9",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_9,
|
|
|
|
handle_move_to_workspace, 8);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-10",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_10,
|
|
|
|
handle_move_to_workspace, 9);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-11",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_11,
|
|
|
|
handle_move_to_workspace, 10);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-12",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_12,
|
|
|
|
handle_move_to_workspace, 11);
|
|
|
|
|
2013-05-17 08:08:57 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-last",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_LAST,
|
|
|
|
handle_move_to_workspace_last, 0);
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-left",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_LEFT,
|
|
|
|
handle_move_to_workspace, META_MOTION_LEFT);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-right",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT,
|
|
|
|
handle_move_to_workspace, META_MOTION_RIGHT);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-up",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP,
|
|
|
|
handle_move_to_workspace, META_MOTION_UP);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-workspace-down",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN,
|
|
|
|
handle_move_to_workspace, META_MOTION_DOWN);
|
|
|
|
|
2013-12-11 11:57:45 -05:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-monitor-left",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_LEFT,
|
|
|
|
handle_move_to_monitor, META_SCREEN_LEFT);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-monitor-right",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_RIGHT,
|
|
|
|
handle_move_to_monitor, META_SCREEN_RIGHT);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-monitor-down",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_DOWN,
|
|
|
|
handle_move_to_monitor, META_SCREEN_DOWN);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-monitor-up",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_UP,
|
|
|
|
handle_move_to_monitor, META_SCREEN_UP);
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"raise-or-lower",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_RAISE_OR_LOWER,
|
|
|
|
handle_raise_or_lower, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"raise",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_RAISE,
|
|
|
|
handle_raise, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"lower",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_LOWER,
|
|
|
|
handle_lower, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"maximize-vertically",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MAXIMIZE_VERTICALLY,
|
|
|
|
handle_maximize_vertically, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"maximize-horizontally",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MAXIMIZE_HORIZONTALLY,
|
|
|
|
handle_maximize_horizontally, 0);
|
|
|
|
|
2013-07-24 14:55:23 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"always-on-top",
|
|
|
|
common_keybindings,
|
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_ALWAYS_ON_TOP,
|
|
|
|
handle_always_on_top, 0);
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-corner-nw",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_CORNER_NW,
|
|
|
|
handle_move_to_corner_nw, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-corner-ne",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_CORNER_NE,
|
|
|
|
handle_move_to_corner_ne, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-corner-sw",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_CORNER_SW,
|
|
|
|
handle_move_to_corner_sw, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-corner-se",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_CORNER_SE,
|
|
|
|
handle_move_to_corner_se, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-side-n",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_SIDE_N,
|
|
|
|
handle_move_to_side_n, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-side-s",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_SIDE_S,
|
|
|
|
handle_move_to_side_s, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-side-e",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_SIDE_E,
|
|
|
|
handle_move_to_side_e, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-side-w",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_SIDE_W,
|
|
|
|
handle_move_to_side_w, 0);
|
|
|
|
|
|
|
|
add_builtin_keybinding (display,
|
|
|
|
"move-to-center",
|
2012-03-27 10:42:42 -04:00
|
|
|
common_keybindings,
|
2011-10-27 21:05:43 -04:00
|
|
|
META_KEY_BINDING_PER_WINDOW,
|
|
|
|
META_KEYBINDING_ACTION_MOVE_TO_CENTER,
|
|
|
|
handle_move_to_center, 0);
|
2012-03-27 10:42:42 -04:00
|
|
|
|
|
|
|
g_object_unref (common_keybindings);
|
|
|
|
g_object_unref (mutter_keybindings);
|
2014-02-25 11:09:06 -05:00
|
|
|
g_object_unref (mutter_wayland_keybindings);
|
2011-10-27 21:05:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
meta_display_init_keys (MetaDisplay *display)
|
|
|
|
{
|
2014-08-14 15:33:45 -04:00
|
|
|
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
2017-08-17 05:04:13 -04:00
|
|
|
MetaBackend *backend = meta_get_backend ();
|
2012-08-29 17:07:34 -04:00
|
|
|
MetaKeyHandler *handler;
|
|
|
|
|
2017-09-01 05:45:08 -04:00
|
|
|
keys->backend = backend;
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
/* Keybindings */
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->ignored_modifier_mask = 0;
|
|
|
|
keys->hyper_mask = 0;
|
|
|
|
keys->super_mask = 0;
|
|
|
|
keys->meta_mask = 0;
|
|
|
|
|
2015-01-08 21:42:37 -05:00
|
|
|
keys->key_bindings = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) meta_key_binding_free);
|
2014-08-14 15:33:45 -04:00
|
|
|
keys->key_bindings_index = g_hash_table_new (NULL, NULL);
|
|
|
|
|
|
|
|
reload_modmap (keys);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
|
|
|
key_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
|
|
|
|
(GDestroyNotify) key_handler_free);
|
2012-08-29 17:07:34 -04:00
|
|
|
|
|
|
|
handler = g_new0 (MetaKeyHandler, 1);
|
|
|
|
handler->name = g_strdup ("overlay-key");
|
|
|
|
handler->flags = META_KEY_BINDING_BUILTIN;
|
|
|
|
|
|
|
|
g_hash_table_insert (key_handlers, g_strdup ("overlay-key"), handler);
|
|
|
|
|
2013-04-10 07:34:26 -04:00
|
|
|
handler = g_new0 (MetaKeyHandler, 1);
|
|
|
|
handler->name = g_strdup ("iso-next-group");
|
|
|
|
handler->flags = META_KEY_BINDING_BUILTIN;
|
|
|
|
|
|
|
|
g_hash_table_insert (key_handlers, g_strdup ("iso-next-group"), handler);
|
|
|
|
|
2012-08-28 09:28:11 -04:00
|
|
|
handler = g_new0 (MetaKeyHandler, 1);
|
|
|
|
handler->name = g_strdup ("external-grab");
|
|
|
|
handler->func = handle_external_grab;
|
|
|
|
handler->default_func = handle_external_grab;
|
|
|
|
|
|
|
|
g_hash_table_insert (key_handlers, g_strdup ("external-grab"), handler);
|
|
|
|
|
|
|
|
external_grabs = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
|
|
NULL,
|
|
|
|
(GDestroyNotify)meta_key_grab_free);
|
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
init_builtin_key_bindings (display);
|
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
rebuild_key_binding_table (keys);
|
|
|
|
rebuild_special_bindings (keys);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2015-01-06 21:29:00 -05:00
|
|
|
reload_combos (keys);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2014-08-14 15:33:45 -04:00
|
|
|
update_window_grab_modifiers (keys);
|
2014-08-14 15:04:00 -04:00
|
|
|
|
2011-10-27 21:05:43 -04:00
|
|
|
/* Keys are actually grabbed in meta_screen_grab_keys() */
|
|
|
|
|
2014-08-14 15:04:00 -04:00
|
|
|
meta_prefs_add_listener (prefs_changed_callback, display);
|
2011-10-27 21:05:43 -04:00
|
|
|
|
2017-08-17 05:04:13 -04:00
|
|
|
g_signal_connect_swapped (backend, "keymap-changed",
|
|
|
|
G_CALLBACK (reload_keybindings), display);
|
|
|
|
g_signal_connect_swapped (backend, "keymap-layout-group-changed",
|
|
|
|
G_CALLBACK (reload_keybindings), display);
|
2011-10-27 21:05:43 -04:00
|
|
|
}
|