Compare commits
75 Commits
wip/carlos
...
3.22.3
Author | SHA1 | Date | |
---|---|---|---|
afb4165262 | |||
6161aacde7 | |||
4d300db0e2 | |||
b465546a52 | |||
443250a9f7 | |||
1d24f612cc | |||
6e2722298e | |||
917aef5090 | |||
58669e7598 | |||
998aa532d0 | |||
050e4acdae | |||
8ccbd36315 | |||
790b386c5f | |||
d4d3dbd088 | |||
23c315ea71 | |||
18a4b9fb2c | |||
2166a496fe | |||
f8fd02d6ee | |||
2ae42f0db2 | |||
06f5b6b3e3 | |||
d9fc81e702 | |||
497a94fac7 | |||
a943c0fc12 | |||
76f890a26f | |||
5c46094d67 | |||
a601639dd3 | |||
462d504ca0 | |||
374bba2d4e | |||
1b4b361a92 | |||
6054b1cdbd | |||
f3a9465fbd | |||
ac5ea45319 | |||
c52808b30d | |||
5919a4a779 | |||
e8fc09064a | |||
d911c5aac4 | |||
84134aa78e | |||
f9d1bb4e6c | |||
1da239c83c | |||
d22db60a2b | |||
ab21c3cad7 | |||
20efdfcb41 | |||
1d8bb58990 | |||
32877118c3 | |||
6567e235a4 | |||
0289925101 | |||
ffea28e05d | |||
43a1ac3b5f | |||
a15d61ba9b | |||
2eaa9de9da | |||
c042c835a5 | |||
803148ed1f | |||
006c83f99d | |||
9f071fdc87 | |||
5216137146 | |||
35be843f52 | |||
6c2e43f76c | |||
b171668ae0 | |||
8916e47d56 | |||
94623f475c | |||
5c4c946f64 | |||
2783375f8f | |||
35b8f8c072 | |||
89d22addbd | |||
15a4ad4c38 | |||
1c28f85173 | |||
d8a0275418 | |||
aeeffbe1f7 | |||
ac9a113478 | |||
5ec5e29422 | |||
95e5786833 | |||
325e9d374b | |||
31043dd58a | |||
e1685f6ac2 | |||
3071c9efbc |
45
NEWS
45
NEWS
@ -1,3 +1,48 @@
|
||||
3.22.3
|
||||
======
|
||||
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
|
||||
* Fix frequent freezes in multihead setups on wayland [Rui; #774557]
|
||||
* Preserve root window mask on XSelectionRequest [Olivier; #776128]
|
||||
* Fix window menu placement with HiDPI [Jonas; #776055]
|
||||
* Fix HiDPI detection on vertical monitor layouts [Carlos; #777687]
|
||||
* Fix erroneous key event repeats [Rui; #774989]
|
||||
* Fix "ghost" cursors in multi-monitor setups [Jonas; #771056]
|
||||
* Use eglGetPlatformDisplay [Adam; #772422]
|
||||
* Fix erratic raise_or_lower behavior [Jose; #705200]
|
||||
* Extend tablet device checks [Carlos; #773779]
|
||||
* Set right scale for tablet tool cursors on HiDPI [Carlos; #778474]
|
||||
* Allow edge-scrolling without 2fg-scroll capable devices [Rui; #778554]
|
||||
* Misc. bug fixes [Jonas, Rui, Carlos, Peter; #771297, #774135, #775986,
|
||||
#777691, #777470, #778262, #776919]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Peter Hutterer, Adam Jackson,
|
||||
Jose Marino, Rui Matos
|
||||
|
||||
Translations:
|
||||
Mandy Wang [zh_CN]
|
||||
|
||||
3.22.2
|
||||
======
|
||||
* Really fix framebuffer capture origin offset [Rui; #771502]
|
||||
* Fix session going into idle mode immediately on startup [Rui; #772839]
|
||||
* Fix mirror mode with stage views [Rui; #773115]
|
||||
* Improve pointer constraints support [Jonas; #771859]
|
||||
* Stack docks below other windows on fullscreen monitors [Rui; #772937]
|
||||
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
|
||||
* Fix popup grabs blocking screen lock on wayland [Rui; #771235]
|
||||
* Fix various crashes on wayland [Jonas; #771646, #771858]
|
||||
* Fix various placement issues on wayland [Jonas, Sjoerd, Olivier; #768039,
|
||||
#771841, #773141, #772729]
|
||||
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Olivier Fourdan, Rui Matos, Sjoerd Simons
|
||||
|
||||
Translations:
|
||||
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], liushuyu [zh_CN],
|
||||
YunQiang Su [zh_CN]
|
||||
|
||||
3.22.1
|
||||
======
|
||||
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
|
||||
|
@ -4712,8 +4712,8 @@ capture_view (ClutterStage *stage,
|
||||
clutter_stage_view_get_layout (view, &view_layout);
|
||||
|
||||
cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
|
||||
view_layout.x + rect->x,
|
||||
view_layout.y + rect->y,
|
||||
rect->x - view_layout.x,
|
||||
rect->y - view_layout.y,
|
||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||
bitmap);
|
||||
|
||||
|
@ -2261,6 +2261,12 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
|
||||
return next_id;
|
||||
}
|
||||
|
||||
void
|
||||
_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
|
||||
{
|
||||
dispatch_libinput (manager_evdev);
|
||||
}
|
||||
|
||||
static int
|
||||
compare_ids (gconstpointer a,
|
||||
gconstpointer b)
|
||||
|
@ -76,6 +76,8 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
|
||||
float *new_x,
|
||||
float *new_y);
|
||||
|
||||
void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
|
||||
|
||||
static inline guint64
|
||||
us (guint64 us)
|
||||
{
|
||||
|
@ -185,15 +185,19 @@ keyboard_repeat (gpointer data)
|
||||
{
|
||||
ClutterSeatEvdev *seat = data;
|
||||
GSource *source;
|
||||
guint32 time_ms;
|
||||
|
||||
/* There might be events queued in libinput that could cancel the
|
||||
repeat timer. */
|
||||
_clutter_device_manager_evdev_dispatch (seat->manager_evdev);
|
||||
if (!seat->repeat_timer)
|
||||
return G_SOURCE_REMOVE;
|
||||
|
||||
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
|
||||
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
|
||||
time_ms = g_source_get_time (source) / 1000;
|
||||
|
||||
clutter_seat_evdev_notify_key (seat,
|
||||
seat->repeat_device,
|
||||
ms2us (time_ms),
|
||||
g_source_get_time (source),
|
||||
seat->repeat_key,
|
||||
AUTOREPEAT_VALUE,
|
||||
FALSE);
|
||||
|
@ -261,6 +261,39 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
|
||||
g_slice_free (CoglRendererEGL, egl_renderer);
|
||||
}
|
||||
|
||||
static EGLDisplay
|
||||
_cogl_winsys_egl_get_display (void *native)
|
||||
{
|
||||
EGLDisplay dpy = NULL;
|
||||
const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplay");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
return eglGetDisplay ((EGLNativeDisplayType) native);
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
||||
CoglError **error)
|
||||
@ -277,8 +310,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
||||
if (!_cogl_xlib_renderer_connect (renderer, error))
|
||||
goto error;
|
||||
|
||||
egl_renderer->edpy =
|
||||
eglGetDisplay ((EGLNativeDisplayType) xlib_renderer->xdpy);
|
||||
egl_renderer->edpy = _cogl_winsys_egl_get_display (xlib_renderer->xdpy);
|
||||
|
||||
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
|
||||
goto error;
|
||||
|
@ -2,7 +2,7 @@ AC_PREREQ(2.62)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [22])
|
||||
m4_define([mutter_micro_version], [1])
|
||||
m4_define([mutter_micro_version], [3])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
|
850
po/nb.po
850
po/nb.po
@ -1,13 +1,13 @@
|
||||
# Norwegian bokmål translation of mutter.
|
||||
# Copyright © 2002-2004 Free Software Foundation, Inc.
|
||||
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2015.
|
||||
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2016.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter 3.15.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-03-19 21:23+0100\n"
|
||||
"PO-Revision-Date: 2015-03-19 21:24+0100\n"
|
||||
"Project-Id-Version: mutter 3.23.x\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-10-15 17:12+0200\n"
|
||||
"PO-Revision-Date: 2016-10-15 17:12+0200\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
|
||||
"Language: nb\n"
|
||||
@ -15,469 +15,47 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
msgid "Navigation"
|
||||
msgstr "Navigering"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Flytt vindu til arbeidsområde 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Flytt vindu til arbeidsområde 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Flytt vindu til arbeidsområde 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Flytt vindu til arbeidsområde 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "Flytt vindu til siste arbeidsområde"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Flytt vindu ett arbeidsområde til venstre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Flytt vindu ett arbeidsområde til høyre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Flytt vindu ett arbeidsområde opp"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Flytt vindu ett arbeidsområde ned"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Flytt vindu en skjerm til venstre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Flytt vindu en skjerm til høyre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Flytt vindu en skjerm opp"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Flytt vindu en skjerm ned"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
msgid "Switch applications"
|
||||
msgstr "Bytt programmer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Bytt til forrige program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
msgid "Switch windows"
|
||||
msgstr "Bytt vinduer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Bytt forrige vindu"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Bytt mellom et programs vinduer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Bytt til forrige vindu i et program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
msgid "Switch system controls"
|
||||
msgstr "Bytt systemkontroller"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Bytt til forrige systemkontroll"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Bytt vinduer direkte"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Bytt direkte til forrige vindu"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Bytt mellom et programs vinduer direkte"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Bytt direkte til forrive vindu i et program"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Bytt systemkontroller direkte"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Bytt direkte til forrige systemkontroll"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Skjul alle normale vinduer"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Bytt til arbeidsområde 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Bytt til arbeidsområde 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Bytt til arbeidsområde 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Bytt til arbeidsområde 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Bytt til siste arbeidsområde"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Flytt til arbeidsområdet til venstre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Flytt til arbeidsområdet til høyre"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Flytt til arbeidsområdet over"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Flytt til arbeidsområdet under"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Vis kommandolinje"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:3
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Vis oversikt over aktiviteter"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Aktiver vindumenyen"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Slå av/på fullskjermmodus"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Endre tilstand for maksimering"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
msgid "Maximize window"
|
||||
msgstr "Maksimer vindu"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
msgid "Restore window"
|
||||
msgstr "Gjenopprett vindu"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Endre tilstand for skyggelegging"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
msgid "Close window"
|
||||
msgstr "Lukk vindu"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
msgid "Hide window"
|
||||
msgstr "Skjul vindu"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
msgid "Move window"
|
||||
msgstr "Flytt vindu"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
msgid "Resize window"
|
||||
msgstr "Endre størrelse på vindu"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Slå av/på om vinduet skal vises på alle arbeidsområder eller bare ett"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:13
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Hev vindu hvis skjult av et annet vindu, senk det ellers"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Hev vinduet over andre vinduer"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Senk vinduet under andre vinduer"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maksimer vinduet vertikalt"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maksimer vinduet horisontalt"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
msgid "View split on left"
|
||||
msgstr "Visning delt til venstre"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
msgid "View split on right"
|
||||
msgstr "Visning delt til høyre"
|
||||
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Endringstast som skal brukes for utvidede vindushåndteringsoperasjoner"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"This key will initiate the \"overlay\", which is a combination window "
|
||||
"overview and application launching system. The default is intended to be the "
|
||||
"\"Windows key\" on PC hardware. It's expected that this binding either the "
|
||||
"default or set to the empty string."
|
||||
msgstr ""
|
||||
"Denne tasten vil initiere «overlay», som er en kombinasjon av vindusoversikt "
|
||||
"og et system for å starte programmer. Forvalget er ment å være «Windows-"
|
||||
"tasten» på PC-maskinvare. Det forventes at denne bindingen er satt til "
|
||||
"forvalg eller en tom streng."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Fest modale dialoger"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
"the parent window."
|
||||
msgstr ""
|
||||
"Hvis denne er satt til sann vil modale dialoger vises festet til "
|
||||
"tittellinjen på opphavsvinduet og flyttes sammen med dette i stedet for å ha "
|
||||
"individuelle tittellinjer."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
|
||||
"dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
|
||||
"skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres de "
|
||||
"fullstendig."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbeidsområder håndteres dynamisk"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Bestemmer om arbeidsområder skal håndteres dynamisk eller om det er et fast "
|
||||
"antall arbeidsområder (bestemt av num-workspaces nøkkelen i org.gnome."
|
||||
"desktop.wm.preferences)."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Arbeidsområder kun på primær skjerm"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
|
||||
"skjermer eller kun på primær skjerm."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Ingen tabulatordialog"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
|
||||
"mellom vinduer."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Utsett fokusendringer til pekeren slutter å bevege seg"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
"after the pointer stops moving."
|
||||
msgstr ""
|
||||
"Hvis denne settes til «true» og fokusmodus er enten «sloppy» eller «mouse» "
|
||||
"så vil fokus ikke endres med en gang markøren kommer inn i et vindu, men i "
|
||||
"stedet når markørens bevegelse stopper."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Draggable border width"
|
||||
msgstr "Bredde på drakant"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil usynlige "
|
||||
"kanter legges til for å imøtekomme denne verdien."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr "Maksimer vinduer automatisk hvis de er nesten like store som skjermen"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
"Nye vinduer som i utgangspunktet er samme størrelse som skjermen vil "
|
||||
"automatisk bli maksimert hvis denne slås på."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
|
||||
msgid "Place new windows in the center"
|
||||
msgstr "Plasser nye vinduer i senter"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"When true, the new windows will always be put in the center of the active "
|
||||
"screen of the monitor."
|
||||
msgstr ""
|
||||
"Når denne er «true» vil mye vinduer alltid plasseres midt på aktivt område "
|
||||
"på skjermen."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Fjern vindu fra tabulatordialog"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Avbryt tabulatordialog"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Bytt til VT 1"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "Bytt til VT 2"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "Bytt til VT 3"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "Bytt til VT 4"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "Bytt til VT 5"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "Bytt til VT 6"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "Bytt til VT 7"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "Bytt til VT 8"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "Bytt til VT 9"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "Bytt til VT 10"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "Bytt til VT 11"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Bytt til VT 12"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:364
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: ../src/backends/meta-input-settings.c:1847
|
||||
msgid "Switch monitor"
|
||||
msgstr "Bytt skjerm"
|
||||
|
||||
#: ../src/backends/meta-input-settings.c:1849
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Vis hjelp på skjermen"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:514
|
||||
msgid "Built-in display"
|
||||
msgstr "Innebygget skjerm"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:391
|
||||
#: ../src/backends/meta-monitor-manager.c:537
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:393
|
||||
#: ../src/backends/meta-monitor-manager.c:539
|
||||
msgid "Unknown Display"
|
||||
msgstr "Ukjent skjerm"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: ../src/backends/meta-monitor-manager.c:401
|
||||
#: ../src/backends/meta-monitor-manager.c:547
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:456
|
||||
#: ../src/compositor/compositor.c:463
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "En annen compositing manager kjører skjerm %i på display «%s»."
|
||||
|
||||
#: ../src/core/bell.c:185
|
||||
#: ../src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Klokkehendelse"
|
||||
|
||||
@ -498,48 +76,52 @@ msgstr ""
|
||||
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
|
||||
"programmet til å avslutte helt."
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Vent"
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Tvungen nedstenging"
|
||||
|
||||
#: ../src/core/display.c:562
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Vent"
|
||||
|
||||
#: ../src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Feil under åpning av X Window System skjerm «%s»\n"
|
||||
|
||||
#: ../src/core/main.c:176
|
||||
#: ../src/core/main.c:182
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Deaktiver tilkobling til sesjonshåndtereren"
|
||||
|
||||
#: ../src/core/main.c:182
|
||||
#: ../src/core/main.c:188
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Erstatt kjørende vindushåndterer"
|
||||
|
||||
#: ../src/core/main.c:188
|
||||
#: ../src/core/main.c:194
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Oppgi sesjonshåndterings-ID"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#: ../src/core/main.c:199
|
||||
msgid "X Display to use"
|
||||
msgstr "X-skjerm som skal brukes"
|
||||
|
||||
#: ../src/core/main.c:199
|
||||
#: ../src/core/main.c:205
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Initier sesjonen fra en lagret fil"
|
||||
|
||||
#: ../src/core/main.c:205
|
||||
#: ../src/core/main.c:211
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Gjør X-kall synkrone"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:218
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Kjør som en wayland-kompositør"
|
||||
|
||||
#: ../src/core/main.c:220
|
||||
#: ../src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Kjør som en nøstet kompositør"
|
||||
|
||||
#: ../src/core/main.c:232
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Kjør som en full skjermtjener, heller enn nøstet"
|
||||
|
||||
@ -565,27 +147,34 @@ msgstr "Skriv versjonsnummer"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Mutter-tillegg som skal brukes"
|
||||
|
||||
#: ../src/core/prefs.c:2004
|
||||
#: ../src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeidsområde %d"
|
||||
|
||||
#: ../src/core/screen.c:525
|
||||
#: ../src/core/screen.c:521
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
"to replace the current window manager."
|
||||
msgstr "Skjerm «%s» har allerede en vindushåndterer; prøv å bruke flagget --replace for å erstatte aktiv vindushåndterer."
|
||||
msgstr ""
|
||||
"Skjerm «%s» har allerede en vindushåndterer; prøv å bruke flagget --replace "
|
||||
"for å erstatte aktiv vindushåndterer."
|
||||
|
||||
#: ../src/core/screen.c:607
|
||||
#: ../src/core/screen.c:606
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Skjerm %d på display «%s» er ugyldig\n"
|
||||
|
||||
#: ../src/core/util.c:118
|
||||
#: ../src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter er kompilert uten støtte for «verbose» modus\n"
|
||||
|
||||
#: ../src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Modusbytte: Modus %d"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
@ -594,11 +183,346 @@ msgstr ""
|
||||
"Disse vinduene støtter ikke "lagre aktiv konfigurasjon"og vil "
|
||||
"måtte startes på nytt manuelt neste gang du logger inn."
|
||||
|
||||
#: ../src/x11/window-props.c:549
|
||||
#: ../src/x11/window-props.c:548
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (på %s)"
|
||||
|
||||
#~ msgid "Move window to workspace 1"
|
||||
#~ msgstr "Flytt vindu til arbeidsområde 1"
|
||||
|
||||
#~ msgid "Move window to workspace 2"
|
||||
#~ msgstr "Flytt vindu til arbeidsområde 2"
|
||||
|
||||
#~ msgid "Move window to workspace 3"
|
||||
#~ msgstr "Flytt vindu til arbeidsområde 3"
|
||||
|
||||
#~ msgid "Move window to workspace 4"
|
||||
#~ msgstr "Flytt vindu til arbeidsområde 4"
|
||||
|
||||
#~ msgid "Move window to last workspace"
|
||||
#~ msgstr "Flytt vindu til siste arbeidsområde"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "Flytt vindu ett arbeidsområde til venstre"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "Flytt vindu ett arbeidsområde til høyre"
|
||||
|
||||
#~ msgid "Move window one workspace up"
|
||||
#~ msgstr "Flytt vindu ett arbeidsområde opp"
|
||||
|
||||
#~ msgid "Move window one workspace down"
|
||||
#~ msgstr "Flytt vindu ett arbeidsområde ned"
|
||||
|
||||
#~ msgid "Move window one monitor to the left"
|
||||
#~ msgstr "Flytt vindu en skjerm til venstre"
|
||||
|
||||
#~ msgid "Move window one monitor to the right"
|
||||
#~ msgstr "Flytt vindu en skjerm til høyre"
|
||||
|
||||
#~ msgid "Move window one monitor up"
|
||||
#~ msgstr "Flytt vindu en skjerm opp"
|
||||
|
||||
#~ msgid "Move window one monitor down"
|
||||
#~ msgstr "Flytt vindu en skjerm ned"
|
||||
|
||||
#~ msgid "Switch applications"
|
||||
#~ msgstr "Bytt programmer"
|
||||
|
||||
#~ msgid "Switch to previous application"
|
||||
#~ msgstr "Bytt til forrige program"
|
||||
|
||||
#~ msgid "Switch windows"
|
||||
#~ msgstr "Bytt vinduer"
|
||||
|
||||
#~ msgid "Switch to previous window"
|
||||
#~ msgstr "Bytt forrige vindu"
|
||||
|
||||
#~ msgid "Switch windows of an application"
|
||||
#~ msgstr "Bytt mellom et programs vinduer"
|
||||
|
||||
#~ msgid "Switch to previous window of an application"
|
||||
#~ msgstr "Bytt til forrige vindu i et program"
|
||||
|
||||
#~ msgid "Switch to previous system control"
|
||||
#~ msgstr "Bytt til forrige systemkontroll"
|
||||
|
||||
#~ msgid "Switch windows directly"
|
||||
#~ msgstr "Bytt vinduer direkte"
|
||||
|
||||
#~ msgid "Switch directly to previous window"
|
||||
#~ msgstr "Bytt direkte til forrige vindu"
|
||||
|
||||
#~ msgid "Switch windows of an app directly"
|
||||
#~ msgstr "Bytt mellom et programs vinduer direkte"
|
||||
|
||||
#~ msgid "Switch directly to previous window of an app"
|
||||
#~ msgstr "Bytt direkte til forrive vindu i et program"
|
||||
|
||||
#~ msgid "Switch system controls directly"
|
||||
#~ msgstr "Bytt systemkontroller direkte"
|
||||
|
||||
#~ msgid "Switch directly to previous system control"
|
||||
#~ msgstr "Bytt direkte til forrige systemkontroll"
|
||||
|
||||
#~ msgid "Hide all normal windows"
|
||||
#~ msgstr "Skjul alle normale vinduer"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "Bytt til arbeidsområde 1"
|
||||
|
||||
#~ msgid "Switch to workspace 2"
|
||||
#~ msgstr "Bytt til arbeidsområde 2"
|
||||
|
||||
#~ msgid "Switch to workspace 3"
|
||||
#~ msgstr "Bytt til arbeidsområde 3"
|
||||
|
||||
#~ msgid "Switch to workspace 4"
|
||||
#~ msgstr "Bytt til arbeidsområde 4"
|
||||
|
||||
#~ msgid "Switch to last workspace"
|
||||
#~ msgstr "Bytt til siste arbeidsområde"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "Flytt til arbeidsområdet til venstre"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "Flytt til arbeidsområdet til høyre"
|
||||
|
||||
#~ msgid "Move to workspace above"
|
||||
#~ msgstr "Flytt til arbeidsområdet over"
|
||||
|
||||
#~ msgid "Move to workspace below"
|
||||
#~ msgstr "Flytt til arbeidsområdet under"
|
||||
|
||||
#~ msgid "System"
|
||||
#~ msgstr "System"
|
||||
|
||||
#~ msgid "Show the run command prompt"
|
||||
#~ msgstr "Vis kommandolinje"
|
||||
|
||||
#~ msgid "Show the activities overview"
|
||||
#~ msgstr "Vis oversikt over aktiviteter"
|
||||
|
||||
#~ msgid "Windows"
|
||||
#~ msgstr "Vinduer"
|
||||
|
||||
#~ msgid "Activate the window menu"
|
||||
#~ msgstr "Aktiver vindumenyen"
|
||||
|
||||
#~ msgid "Toggle fullscreen mode"
|
||||
#~ msgstr "Slå av/på fullskjermmodus"
|
||||
|
||||
#~ msgid "Toggle maximization state"
|
||||
#~ msgstr "Endre tilstand for maksimering"
|
||||
|
||||
#~ msgid "Maximize window"
|
||||
#~ msgstr "Maksimer vindu"
|
||||
|
||||
#~ msgid "Restore window"
|
||||
#~ msgstr "Gjenopprett vindu"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "Endre tilstand for skyggelegging"
|
||||
|
||||
#~ msgid "Close window"
|
||||
#~ msgstr "Lukk vindu"
|
||||
|
||||
#~ msgid "Hide window"
|
||||
#~ msgstr "Skjul vindu"
|
||||
|
||||
#~ msgid "Move window"
|
||||
#~ msgstr "Flytt vindu"
|
||||
|
||||
#~ msgid "Resize window"
|
||||
#~ msgstr "Endre størrelse på vindu"
|
||||
|
||||
#~ msgid "Toggle window on all workspaces or one"
|
||||
#~ msgstr ""
|
||||
#~ "Slå av/på om vinduet skal vises på alle arbeidsområder eller bare ett"
|
||||
|
||||
#~ msgid "Raise window if covered, otherwise lower it"
|
||||
#~ msgstr "Hev vindu hvis skjult av et annet vindu, senk det ellers"
|
||||
|
||||
#~ msgid "Raise window above other windows"
|
||||
#~ msgstr "Hev vinduet over andre vinduer"
|
||||
|
||||
#~ msgid "Lower window below other windows"
|
||||
#~ msgstr "Senk vinduet under andre vinduer"
|
||||
|
||||
#~ msgid "Maximize window vertically"
|
||||
#~ msgstr "Maksimer vinduet vertikalt"
|
||||
|
||||
#~ msgid "Maximize window horizontally"
|
||||
#~ msgstr "Maksimer vinduet horisontalt"
|
||||
|
||||
#~ msgid "View split on left"
|
||||
#~ msgstr "Visning delt til venstre"
|
||||
|
||||
#~ msgid "View split on right"
|
||||
#~ msgstr "Visning delt til høyre"
|
||||
|
||||
#~ msgid "Mutter"
|
||||
#~ msgstr "Mutter"
|
||||
|
||||
#~ msgid "Modifier to use for extended window management operations"
|
||||
#~ msgstr ""
|
||||
#~ "Endringstast som skal brukes for utvidede vindushåndteringsoperasjoner"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This key will initiate the \"overlay\", which is a combination window "
|
||||
#~ "overview and application launching system. The default is intended to be "
|
||||
#~ "the \"Windows key\" on PC hardware. It's expected that this binding "
|
||||
#~ "either the default or set to the empty string."
|
||||
#~ msgstr ""
|
||||
#~ "Denne tasten vil initiere «overlay», som er en kombinasjon av "
|
||||
#~ "vindusoversikt og et system for å starte programmer. Forvalget er ment å "
|
||||
#~ "være «Windows-tasten» på PC-maskinvare. Det forventes at denne bindingen "
|
||||
#~ "er satt til forvalg eller en tom streng."
|
||||
|
||||
#~ msgid "Attach modal dialogs"
|
||||
#~ msgstr "Fest modale dialoger"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When true, instead of having independent titlebars, modal dialogs appear "
|
||||
#~ "attached to the titlebar of the parent window and are moved together with "
|
||||
#~ "the parent window."
|
||||
#~ msgstr ""
|
||||
#~ "Hvis denne er satt til sann vil modale dialoger vises festet til "
|
||||
#~ "tittellinjen på opphavsvinduet og flyttes sammen med dette i stedet for å "
|
||||
#~ "ha individuelle tittellinjer."
|
||||
|
||||
#~ msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
#~ msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
#~ "vertically and resizes them horizontally to cover half of the available "
|
||||
#~ "area. Dropping windows on the top screen edge maximizes them completely."
|
||||
#~ msgstr ""
|
||||
#~ "Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
|
||||
#~ "dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
|
||||
#~ "skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres "
|
||||
#~ "de fullstendig."
|
||||
|
||||
#~ msgid "Workspaces are managed dynamically"
|
||||
#~ msgstr "Arbeidsområder håndteres dynamisk"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether workspaces are managed dynamically or whether there's "
|
||||
#~ "a static number of workspaces (determined by the num-workspaces key in "
|
||||
#~ "org.gnome.desktop.wm.preferences)."
|
||||
#~ msgstr ""
|
||||
#~ "Bestemmer om arbeidsområder skal håndteres dynamisk eller om det er et "
|
||||
#~ "fast antall arbeidsområder (bestemt av num-workspaces nøkkelen i org."
|
||||
#~ "gnome.desktop.wm.preferences)."
|
||||
|
||||
#~ msgid "Workspaces only on primary"
|
||||
#~ msgstr "Arbeidsområder kun på primær skjerm"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether workspace switching should happen for windows on all "
|
||||
#~ "monitors or only for windows on the primary monitor."
|
||||
#~ msgstr ""
|
||||
#~ "Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
|
||||
#~ "skjermer eller kun på primær skjerm."
|
||||
|
||||
#~ msgid "No tab popup"
|
||||
#~ msgstr "Ingen tabulatordialog"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether the use of popup and highlight frame should be "
|
||||
#~ "disabled for window cycling."
|
||||
#~ msgstr ""
|
||||
#~ "Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
|
||||
#~ "mellom vinduer."
|
||||
|
||||
#~ msgid "Delay focus changes until the pointer stops moving"
|
||||
#~ msgstr "Utsett fokusendringer til pekeren slutter å bevege seg"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
#~ "the focus will not be changed immediately when entering a window, but "
|
||||
#~ "only after the pointer stops moving."
|
||||
#~ msgstr ""
|
||||
#~ "Hvis denne settes til «true» og fokusmodus er enten «sloppy» eller "
|
||||
#~ "«mouse» så vil fokus ikke endres med en gang markøren kommer inn i et "
|
||||
#~ "vindu, men i stedet når markørens bevegelse stopper."
|
||||
|
||||
#~ msgid "Draggable border width"
|
||||
#~ msgstr "Bredde på drakant"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The amount of total draggable borders. If the theme's visible borders are "
|
||||
#~ "not enough, invisible borders will be added to meet this value."
|
||||
#~ msgstr ""
|
||||
#~ "Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil "
|
||||
#~ "usynlige kanter legges til for å imøtekomme denne verdien."
|
||||
|
||||
#~ msgid "Auto maximize nearly monitor sized windows"
|
||||
#~ msgstr ""
|
||||
#~ "Maksimer vinduer automatisk hvis de er nesten like store som skjermen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "If enabled, new windows that are initially the size of the monitor "
|
||||
#~ "automatically get maximized."
|
||||
#~ msgstr ""
|
||||
#~ "Nye vinduer som i utgangspunktet er samme størrelse som skjermen vil "
|
||||
#~ "automatisk bli maksimert hvis denne slås på."
|
||||
|
||||
#~ msgid "Place new windows in the center"
|
||||
#~ msgstr "Plasser nye vinduer i senter"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When true, the new windows will always be put in the center of the active "
|
||||
#~ "screen of the monitor."
|
||||
#~ msgstr ""
|
||||
#~ "Når denne er «true» vil mye vinduer alltid plasseres midt på aktivt "
|
||||
#~ "område på skjermen."
|
||||
|
||||
#~ msgid "Select window from tab popup"
|
||||
#~ msgstr "Fjern vindu fra tabulatordialog"
|
||||
|
||||
#~ msgid "Cancel tab popup"
|
||||
#~ msgstr "Avbryt tabulatordialog"
|
||||
|
||||
#~ msgid "Switch to VT 1"
|
||||
#~ msgstr "Bytt til VT 1"
|
||||
|
||||
#~ msgid "Switch to VT 2"
|
||||
#~ msgstr "Bytt til VT 2"
|
||||
|
||||
#~ msgid "Switch to VT 3"
|
||||
#~ msgstr "Bytt til VT 3"
|
||||
|
||||
#~ msgid "Switch to VT 4"
|
||||
#~ msgstr "Bytt til VT 4"
|
||||
|
||||
#~ msgid "Switch to VT 5"
|
||||
#~ msgstr "Bytt til VT 5"
|
||||
|
||||
#~ msgid "Switch to VT 6"
|
||||
#~ msgstr "Bytt til VT 6"
|
||||
|
||||
#~ msgid "Switch to VT 7"
|
||||
#~ msgstr "Bytt til VT 7"
|
||||
|
||||
#~ msgid "Switch to VT 8"
|
||||
#~ msgstr "Bytt til VT 8"
|
||||
|
||||
#~ msgid "Switch to VT 9"
|
||||
#~ msgstr "Bytt til VT 9"
|
||||
|
||||
#~ msgid "Switch to VT 10"
|
||||
#~ msgstr "Bytt til VT 10"
|
||||
|
||||
#~ msgid "Switch to VT 11"
|
||||
#~ msgstr "Bytt til VT 11"
|
||||
|
||||
#~ msgid "Switch to VT 12"
|
||||
#~ msgstr "Bytt til VT 12"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit "
|
||||
#~ "the format"
|
||||
|
10
po/th.po
10
po/th.po
@ -1,11 +1,11 @@
|
||||
# Thai translation for mutter.
|
||||
# Copyright (C) 2003-2015 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2003-2016 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
#
|
||||
# Phakhinee Thangnithirat <sc442535@angsila.compsci.buu.ac.th>, 2003
|
||||
# Chanchai Junlouchai <taz@opentle.org>, 2003
|
||||
# Paisa Seeluangsawat <paisa@users.sf.net>, 2004.
|
||||
# Theppitak Karoonboonyanan <theppitak@gmail.com>, 2004-2012.
|
||||
# Theppitak Karoonboonyanan <theppitak@gmail.com>, 2004-2012, 2016.
|
||||
# Akom Chotiphantawanon <knight2000@gmail.com>, 2015.
|
||||
#
|
||||
msgid ""
|
||||
@ -14,8 +14,8 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2015-07-18 22:50+0000\n"
|
||||
"PO-Revision-Date: 2015-08-01 17:29+0700\n"
|
||||
"Last-Translator: Akom Chotiphantawanon <knight2000@gmail.com>\n"
|
||||
"PO-Revision-Date: 2016-10-13 11:22+0700\n"
|
||||
"Last-Translator: Theppitak Karoonboonyanan <theppitak@gmail.com>\n"
|
||||
"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
|
||||
"Language: th\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -170,7 +170,7 @@ msgstr "ย้ายไปพื้นที่ทำงานขวา"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
msgid "Move to workspace above"
|
||||
msgstr "ย้ายไปพื้นที่ทำงานซ้าย"
|
||||
msgstr "ย้ายไปพื้นที่ทำงานบน"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
msgid "Move to workspace below"
|
||||
|
1403
po/zh_CN.po
1403
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
@ -107,6 +107,9 @@ struct _MetaInputSettingsClass
|
||||
void (* set_trackball_accel_profile) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
GDesktopPointerAccelProfile profile);
|
||||
|
||||
gboolean (* has_two_finger_scroll) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device);
|
||||
};
|
||||
|
||||
GType meta_input_settings_get_type (void) G_GNUC_CONST;
|
||||
|
@ -83,6 +83,8 @@ struct _MetaInputSettingsPrivate
|
||||
#ifdef HAVE_LIBWACOM
|
||||
WacomDeviceDatabase *wacom_db;
|
||||
#endif
|
||||
|
||||
GHashTable *two_finger_devices;
|
||||
};
|
||||
|
||||
typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
|
||||
@ -148,6 +150,8 @@ meta_input_settings_dispose (GObject *object)
|
||||
libwacom_database_destroy (priv->wacom_db);
|
||||
#endif
|
||||
|
||||
g_clear_pointer (&priv->two_finger_devices, g_hash_table_destroy);
|
||||
|
||||
G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
@ -483,6 +487,8 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
||||
{
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
gboolean edge_scroll_enabled;
|
||||
gboolean two_finger_scroll_enabled;
|
||||
gboolean two_finger_scroll_available;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
|
||||
if (device &&
|
||||
@ -492,6 +498,12 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "edge-scrolling-enabled");
|
||||
two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled");
|
||||
two_finger_scroll_available = g_hash_table_size (priv->two_finger_devices) > 0;
|
||||
|
||||
/* If both are enabled we prefer two finger. */
|
||||
if (edge_scroll_enabled && two_finger_scroll_enabled && two_finger_scroll_available)
|
||||
edge_scroll_enabled = FALSE;
|
||||
|
||||
if (device)
|
||||
{
|
||||
@ -523,6 +535,10 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled");
|
||||
|
||||
/* Disable edge since they can't both be set. */
|
||||
if (two_finger_scroll_enabled)
|
||||
update_touchpad_edge_scroll (input_settings, device);
|
||||
|
||||
if (device)
|
||||
{
|
||||
settings_device_set_bool_setting (input_settings, device,
|
||||
@ -535,6 +551,10 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
|
||||
(ConfigBoolFunc) input_settings_class->set_two_finger_scroll,
|
||||
two_finger_scroll_enabled);
|
||||
}
|
||||
|
||||
/* Edge might have been disabled because two finger was on. */
|
||||
if (!two_finger_scroll_enabled)
|
||||
update_touchpad_edge_scroll (input_settings, device);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -665,6 +685,9 @@ update_keyboard_repeat (MetaInputSettings *input_settings)
|
||||
delay = g_settings_get_uint (priv->keyboard_settings, "delay");
|
||||
interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
|
||||
|
||||
delay = MAX (1, delay);
|
||||
interval = MAX (1, interval);
|
||||
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
input_settings_class->set_keyboard_repeat (input_settings,
|
||||
repeat, delay, interval);
|
||||
@ -730,7 +753,9 @@ update_tablet_keep_aspect (MetaInputSettings *input_settings,
|
||||
MetaOutput *output = NULL;
|
||||
gboolean keep_aspect;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@ -778,6 +803,8 @@ update_device_display (MetaInputSettings *input_settings,
|
||||
MetaOutput *output;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHSCREEN_DEVICE)
|
||||
return;
|
||||
|
||||
@ -811,7 +838,9 @@ update_tablet_mapping (MetaInputSettings *input_settings,
|
||||
GDesktopTabletMapping mapping;
|
||||
DeviceMappingInfo *info;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@ -852,7 +881,9 @@ update_tablet_area (MetaInputSettings *input_settings,
|
||||
const guint32 *area;
|
||||
gsize n_elems;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@ -891,7 +922,10 @@ update_tablet_left_handed (MetaInputSettings *input_settings,
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
gboolean enabled;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PAD_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@ -1384,6 +1418,23 @@ apply_device_settings (MetaInputSettings *input_settings,
|
||||
device);
|
||||
}
|
||||
|
||||
static void
|
||||
evaluate_two_finger_scrolling (MetaInputSettings *input_settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
MetaInputSettingsClass *klass;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||
return;
|
||||
|
||||
klass = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
|
||||
if (klass->has_two_finger_scroll (input_settings, device))
|
||||
g_hash_table_add (priv->two_finger_devices, device);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDevice *device,
|
||||
@ -1392,6 +1443,8 @@ meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
||||
return;
|
||||
|
||||
evaluate_two_finger_scrolling (input_settings, device);
|
||||
|
||||
apply_device_settings (input_settings, device);
|
||||
check_add_mappable_device (input_settings, device);
|
||||
}
|
||||
@ -1405,6 +1458,10 @@ meta_input_settings_device_removed (ClutterDeviceManager *device_manager,
|
||||
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
g_hash_table_remove (priv->mappable_devices, device);
|
||||
|
||||
if (g_hash_table_remove (priv->two_finger_devices, device) &&
|
||||
g_hash_table_size (priv->two_finger_devices) == 0)
|
||||
apply_device_settings (input_settings, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1431,6 +1488,13 @@ static void
|
||||
meta_input_settings_constructed (GObject *object)
|
||||
{
|
||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
|
||||
GSList *devices, *d;
|
||||
|
||||
devices = meta_input_settings_get_devices (input_settings, CLUTTER_TOUCHPAD_DEVICE);
|
||||
for (d = devices; d; d = d->next)
|
||||
evaluate_two_finger_scrolling (input_settings, d->data);
|
||||
|
||||
g_slist_free (devices);
|
||||
|
||||
apply_device_settings (input_settings, NULL);
|
||||
update_keyboard_repeat (input_settings);
|
||||
@ -1492,6 +1556,8 @@ meta_input_settings_init (MetaInputSettings *settings)
|
||||
"expect tablets to misbehave");
|
||||
}
|
||||
#endif
|
||||
|
||||
priv->two_finger_devices = g_hash_table_new (NULL, NULL);
|
||||
}
|
||||
|
||||
MetaInputSettings *
|
||||
|
@ -454,7 +454,7 @@ handle_end_element (GMarkupParseContext *context,
|
||||
{
|
||||
if (strcmp (element_name, "configuration") == 0 && parser->unknown_count == 0)
|
||||
{
|
||||
MetaConfiguration *config = g_slice_new (MetaConfiguration);
|
||||
MetaConfiguration *config = config_new ();
|
||||
|
||||
g_assert (parser->key_array->len == parser->output_array->len);
|
||||
|
||||
|
@ -135,6 +135,7 @@ construct_tile_monitor (MetaMonitorManager *manager,
|
||||
info.width_mm = output->width_mm;
|
||||
info.height_mm = output->height_mm;
|
||||
info.winsys_id = output->winsys_id;
|
||||
info.scale = output->scale;
|
||||
}
|
||||
|
||||
/* hack */
|
||||
|
@ -63,6 +63,7 @@ static GQuark quark_cursor_sprite = 0;
|
||||
|
||||
struct _MetaCursorRendererNativePrivate
|
||||
{
|
||||
gboolean hw_state_invalidated;
|
||||
gboolean has_hw_cursor;
|
||||
|
||||
MetaCursorSprite *last_cursor;
|
||||
@ -159,8 +160,7 @@ set_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite,
|
||||
static void
|
||||
set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
MetaCRTC *crtc,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
gboolean force)
|
||||
MetaCursorSprite *cursor_sprite)
|
||||
{
|
||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||
|
||||
@ -177,7 +177,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
else
|
||||
bo = get_active_cursor_sprite_gbm_bo (cursor_sprite);
|
||||
|
||||
if (!force && bo == crtc->cursor_renderer_private)
|
||||
if (!priv->hw_state_invalidated && bo == crtc->cursor_renderer_private)
|
||||
return;
|
||||
|
||||
crtc->cursor_renderer_private = bo;
|
||||
@ -197,7 +197,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
}
|
||||
else
|
||||
{
|
||||
if (force || crtc->cursor_renderer_private != NULL)
|
||||
if (priv->hw_state_invalidated || crtc->cursor_renderer_private != NULL)
|
||||
{
|
||||
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
||||
crtc->cursor_renderer_private = NULL;
|
||||
@ -207,8 +207,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
|
||||
static void
|
||||
update_hw_cursor (MetaCursorRendererNative *native,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
gboolean force)
|
||||
MetaCursorSprite *cursor_sprite)
|
||||
{
|
||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||
@ -241,7 +240,7 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
||||
else
|
||||
crtc_cursor = NULL;
|
||||
|
||||
set_crtc_cursor (native, &crtcs[i], crtc_cursor, force);
|
||||
set_crtc_cursor (native, &crtcs[i], crtc_cursor);
|
||||
|
||||
if (crtc_cursor)
|
||||
{
|
||||
@ -252,6 +251,8 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
||||
}
|
||||
}
|
||||
|
||||
priv->hw_state_invalidated = FALSE;
|
||||
|
||||
if (painted)
|
||||
meta_cursor_renderer_emit_painted (renderer, cursor_sprite);
|
||||
}
|
||||
@ -394,7 +395,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer,
|
||||
meta_cursor_renderer_native_trigger_frame (native, cursor_sprite);
|
||||
|
||||
priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite);
|
||||
update_hw_cursor (native, cursor_sprite, FALSE);
|
||||
update_hw_cursor (native, cursor_sprite);
|
||||
return priv->has_hw_cursor;
|
||||
}
|
||||
|
||||
@ -648,8 +649,11 @@ static void
|
||||
force_update_hw_cursor (MetaCursorRendererNative *native)
|
||||
{
|
||||
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||
MetaCursorRendererNativePrivate *priv =
|
||||
meta_cursor_renderer_native_get_instance_private (native);
|
||||
|
||||
update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE);
|
||||
priv->hw_state_invalidated = TRUE;
|
||||
update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -670,6 +674,8 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
|
||||
g_signal_connect_object (monitors, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed), native, 0);
|
||||
|
||||
priv->hw_state_invalidated = TRUE;
|
||||
|
||||
#if defined(CLUTTER_WINDOWING_EGL)
|
||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
||||
{
|
||||
|
@ -162,6 +162,7 @@ meta_idle_monitor_native_init (MetaIdleMonitorNative *monitor_native)
|
||||
MetaIdleMonitor *monitor = META_IDLE_MONITOR (monitor_native);
|
||||
|
||||
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
|
||||
monitor_native->last_event_time = g_get_monotonic_time ();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -141,28 +141,18 @@ static gboolean
|
||||
device_set_scroll_method (struct libinput_device *libinput_device,
|
||||
enum libinput_config_scroll_method method)
|
||||
{
|
||||
enum libinput_config_scroll_method supported;
|
||||
|
||||
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
||||
|
||||
if (method & supported)
|
||||
enum libinput_config_status status =
|
||||
libinput_device_config_scroll_set_method (libinput_device, method);
|
||||
|
||||
return (method & supported) != 0;
|
||||
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
device_set_click_method (struct libinput_device *libinput_device,
|
||||
enum libinput_config_click_method method)
|
||||
{
|
||||
enum libinput_config_click_method supported;
|
||||
|
||||
supported = libinput_device_config_click_get_methods (libinput_device);
|
||||
|
||||
if (method & supported)
|
||||
enum libinput_config_status status =
|
||||
libinput_device_config_click_set_method (libinput_device, method);
|
||||
|
||||
return (method & supported) != 0;
|
||||
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -170,32 +160,16 @@ meta_input_settings_native_set_edge_scroll (MetaInputSettings *settin
|
||||
ClutterInputDevice *device,
|
||||
gboolean edge_scrolling_enabled)
|
||||
{
|
||||
enum libinput_config_scroll_method scroll_method = 0;
|
||||
struct libinput_device *libinput_device;
|
||||
enum libinput_config_scroll_method supported;
|
||||
enum libinput_config_scroll_method current;
|
||||
enum libinput_config_scroll_method current, method;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
if (!libinput_device)
|
||||
return;
|
||||
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
||||
|
||||
method = edge_scrolling_enabled ? LIBINPUT_CONFIG_SCROLL_EDGE : LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
current = libinput_device_config_scroll_get_method (libinput_device);
|
||||
current &= ~LIBINPUT_CONFIG_SCROLL_EDGE;
|
||||
|
||||
/* Don't set edge scrolling if two-finger scrolling is enabled and available */
|
||||
if (current == LIBINPUT_CONFIG_SCROLL_2FG)
|
||||
return;
|
||||
|
||||
if (supported & LIBINPUT_CONFIG_SCROLL_EDGE &&
|
||||
edge_scrolling_enabled)
|
||||
{
|
||||
scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
}
|
||||
|
||||
device_set_scroll_method (libinput_device, scroll_method);
|
||||
device_set_scroll_method (libinput_device, current | method);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -203,31 +177,29 @@ meta_input_settings_native_set_two_finger_scroll (MetaInputSettings *
|
||||
ClutterInputDevice *device,
|
||||
gboolean two_finger_scroll_enabled)
|
||||
{
|
||||
enum libinput_config_scroll_method scroll_method = 0;
|
||||
struct libinput_device *libinput_device;
|
||||
enum libinput_config_scroll_method supported;
|
||||
enum libinput_config_scroll_method current;
|
||||
enum libinput_config_scroll_method current, method;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
||||
|
||||
method = two_finger_scroll_enabled ? LIBINPUT_CONFIG_SCROLL_2FG : LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
current = libinput_device_config_scroll_get_method (libinput_device);
|
||||
current &= ~LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
|
||||
if (two_finger_scroll_enabled &&
|
||||
!(supported & LIBINPUT_CONFIG_SCROLL_2FG))
|
||||
return;
|
||||
device_set_scroll_method (libinput_device, current | method);
|
||||
}
|
||||
|
||||
if (two_finger_scroll_enabled)
|
||||
{
|
||||
scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
}
|
||||
else if (current != LIBINPUT_CONFIG_SCROLL_EDGE)
|
||||
{
|
||||
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
}
|
||||
else
|
||||
return;
|
||||
static gboolean
|
||||
meta_input_settings_native_has_two_finger_scroll (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
struct libinput_device *libinput_device;
|
||||
|
||||
device_set_scroll_method (libinput_device, scroll_method);
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
if (!libinput_device)
|
||||
return FALSE;
|
||||
|
||||
return libinput_device_config_scroll_get_methods (libinput_device) & LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -459,6 +431,8 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
|
||||
|
||||
input_settings_class->set_mouse_accel_profile = meta_input_settings_native_set_mouse_accel_profile;
|
||||
input_settings_class->set_trackball_accel_profile = meta_input_settings_native_set_trackball_accel_profile;
|
||||
|
||||
input_settings_class->has_two_finger_scroll = meta_input_settings_native_has_two_finger_scroll;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -475,18 +475,31 @@ find_output_by_id (MetaOutput *outputs,
|
||||
static int
|
||||
compute_scale (MetaOutput *output)
|
||||
{
|
||||
int scale = 1;
|
||||
int scale = 1, width, height;
|
||||
|
||||
if (!output->crtc)
|
||||
goto out;
|
||||
|
||||
width = output->crtc->rect.width;
|
||||
height = output->crtc->rect.height;
|
||||
|
||||
/* Swap values on rotated transforms, so pixel and mm sizes
|
||||
* from the same axes is compared.
|
||||
*/
|
||||
if (meta_monitor_transform_is_rotated (output->crtc->transform))
|
||||
{
|
||||
int tmp = width;
|
||||
width = height;
|
||||
height = tmp;
|
||||
}
|
||||
|
||||
/* Scaling makes no sense */
|
||||
if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
|
||||
if (height < HIDPI_MIN_HEIGHT)
|
||||
goto out;
|
||||
|
||||
/* 4K TV */
|
||||
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
||||
output->crtc->rect.width >= SMALLEST_4K_WIDTH)
|
||||
width >= SMALLEST_4K_WIDTH)
|
||||
goto out;
|
||||
|
||||
/* Somebody encoded the aspect ratio (16/9 or 16/10)
|
||||
@ -500,8 +513,9 @@ compute_scale (MetaOutput *output)
|
||||
if (output->width_mm > 0 && output->height_mm > 0)
|
||||
{
|
||||
double dpi_x, dpi_y;
|
||||
dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
|
||||
dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
|
||||
|
||||
dpi_x = (double)width / (output->width_mm / 25.4);
|
||||
dpi_y = (double)height / (output->height_mm / 25.4);
|
||||
/* We don't completely trust these values so both
|
||||
must be high, and never pick higher ratio than
|
||||
2 automatically */
|
||||
@ -1531,31 +1545,19 @@ get_crtc_connectors (MetaMonitorManager *manager,
|
||||
uint32_t **connectors,
|
||||
unsigned int *n_connectors)
|
||||
{
|
||||
GArray *connectors_array = NULL;
|
||||
unsigned int i;
|
||||
GArray *connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
|
||||
|
||||
for (i = 0; i < manager->n_outputs; i++)
|
||||
{
|
||||
MetaOutput *output = &manager->outputs[i];
|
||||
|
||||
if (output->crtc == crtc)
|
||||
{
|
||||
if (!connectors_array)
|
||||
connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
|
||||
g_array_append_val (connectors_array, output->winsys_id);
|
||||
}
|
||||
g_array_append_val (connectors_array, output->winsys_id);
|
||||
}
|
||||
|
||||
if (connectors_array)
|
||||
{
|
||||
*connectors = (uint32_t *) connectors_array->data;
|
||||
*n_connectors = connectors_array->len;
|
||||
}
|
||||
else
|
||||
{
|
||||
*connectors = NULL;
|
||||
*n_connectors = 0;
|
||||
}
|
||||
*n_connectors = connectors_array->len;
|
||||
*connectors = (uint32_t *) g_array_free (connectors_array, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -73,6 +73,9 @@ typedef struct _MetaOnscreenNative
|
||||
|
||||
gboolean pending_set_crtc;
|
||||
|
||||
int64_t pending_queue_swap_notify_frame_count;
|
||||
int64_t pending_swap_notify_frame_count;
|
||||
|
||||
MetaRendererView *view;
|
||||
int pending_flips;
|
||||
} MetaOnscreenNative;
|
||||
@ -124,16 +127,19 @@ flush_pending_swap_notify (CoglFramebuffer *framebuffer)
|
||||
|
||||
if (onscreen_native->pending_swap_notify)
|
||||
{
|
||||
CoglFrameInfo *info =
|
||||
g_queue_pop_head (&onscreen->pending_frame_infos);
|
||||
CoglFrameInfo *info;
|
||||
|
||||
_cogl_onscreen_notify_frame_sync (onscreen, info);
|
||||
_cogl_onscreen_notify_complete (onscreen, info);
|
||||
while ((info = g_queue_peek_head (&onscreen->pending_frame_infos)) &&
|
||||
info->global_frame_counter <= onscreen_native->pending_swap_notify_frame_count)
|
||||
{
|
||||
_cogl_onscreen_notify_frame_sync (onscreen, info);
|
||||
_cogl_onscreen_notify_complete (onscreen, info);
|
||||
cogl_object_unref (info);
|
||||
g_queue_pop_head (&onscreen->pending_frame_infos);
|
||||
}
|
||||
|
||||
onscreen_native->pending_swap_notify = FALSE;
|
||||
cogl_object_unref (onscreen);
|
||||
|
||||
cogl_object_unref (info);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -200,6 +206,9 @@ meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen)
|
||||
CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
|
||||
MetaRendererNative *renderer_native = egl_renderer->platform;
|
||||
|
||||
onscreen_native->pending_swap_notify_frame_count =
|
||||
onscreen_native->pending_queue_swap_notify_frame_count;
|
||||
|
||||
/* We only want to notify that the swap is complete when the
|
||||
* application calls cogl_context_dispatch so instead of
|
||||
* immediately notifying we queue an idle callback */
|
||||
@ -222,6 +231,39 @@ meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen)
|
||||
onscreen_native->pending_swap_notify = TRUE;
|
||||
}
|
||||
|
||||
static EGLDisplay
|
||||
meta_egl_get_display (void *native)
|
||||
{
|
||||
EGLDisplay dpy = NULL;
|
||||
const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplay");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
return eglGetDisplay ((EGLNativeDisplayType) native);
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
||||
CoglError **error)
|
||||
@ -246,8 +288,7 @@ meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
egl_renderer->edpy =
|
||||
eglGetDisplay ((EGLNativeDisplayType) renderer_native->gbm);
|
||||
egl_renderer->edpy = meta_egl_get_display (renderer_native->gbm);
|
||||
if (egl_renderer->edpy == EGL_NO_DISPLAY)
|
||||
{
|
||||
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||
@ -466,16 +507,19 @@ meta_onscreen_native_set_crtc_modes (MetaOnscreenNative *onscreen_native)
|
||||
monitor_info = meta_renderer_view_get_monitor_info (view);
|
||||
if (monitor_info)
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < monitor_info->n_outputs; i++)
|
||||
for (i = 0; i < monitor_manager->n_crtcs; i++)
|
||||
{
|
||||
MetaOutput *output = monitor_info->outputs[i];
|
||||
int x = output->crtc->rect.x - monitor_info->rect.x;
|
||||
int y = output->crtc->rect.y - monitor_info->rect.y;
|
||||
MetaCRTC *crtc = &monitor_manager->crtcs[i];
|
||||
int x = crtc->rect.x - monitor_info->rect.x;
|
||||
int y = crtc->rect.y - monitor_info->rect.y;
|
||||
|
||||
if (crtc->logical_monitor != monitor_info)
|
||||
continue;
|
||||
|
||||
meta_monitor_manager_kms_apply_crtc_mode (monitor_manager_kms,
|
||||
output->crtc,
|
||||
crtc,
|
||||
x, y,
|
||||
next_fb_id);
|
||||
}
|
||||
@ -530,16 +574,19 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
|
||||
monitor_info = meta_renderer_view_get_monitor_info (view);
|
||||
if (monitor_info)
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < monitor_info->n_outputs; i++)
|
||||
for (i = 0; i < monitor_manager->n_crtcs; i++)
|
||||
{
|
||||
MetaOutput *output = monitor_info->outputs[i];
|
||||
int x = output->crtc->rect.x - monitor_info->rect.x;
|
||||
int y = output->crtc->rect.y - monitor_info->rect.y;
|
||||
MetaCRTC *crtc = &monitor_manager->crtcs[i];
|
||||
int x = crtc->rect.x - monitor_info->rect.x;
|
||||
int y = crtc->rect.y - monitor_info->rect.y;
|
||||
|
||||
if (crtc->logical_monitor != monitor_info)
|
||||
continue;
|
||||
|
||||
meta_onscreen_native_flip_crtc (onscreen_native, flip_closure,
|
||||
output->crtc, x, y,
|
||||
crtc, x, y,
|
||||
&fb_in_use);
|
||||
}
|
||||
}
|
||||
@ -634,6 +681,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
onscreen_native->pending_set_crtc = FALSE;
|
||||
}
|
||||
|
||||
onscreen_native->pending_queue_swap_notify_frame_count = renderer_native->frame_counter;
|
||||
meta_onscreen_native_flip_crtcs (onscreen);
|
||||
}
|
||||
|
||||
@ -1235,7 +1283,6 @@ meta_renderer_native_initable_init (GInitable *initable,
|
||||
GError **error)
|
||||
{
|
||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (initable);
|
||||
drmModeRes *resources;
|
||||
|
||||
renderer_native->gbm = gbm_create_device (renderer_native->kms_fd);
|
||||
if (!renderer_native->gbm)
|
||||
@ -1243,25 +1290,10 @@ meta_renderer_native_initable_init (GInitable *initable,
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"Failed to create gbm device");
|
||||
goto err;
|
||||
}
|
||||
|
||||
resources = drmModeGetResources (renderer_native->kms_fd);
|
||||
if (!resources)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"drmModeGetResources failed");
|
||||
goto err_resources;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
err_resources:
|
||||
g_clear_pointer (&renderer_native->gbm, gbm_device_destroy);
|
||||
|
||||
err:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -222,32 +222,27 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
|
||||
gboolean edge_scroll_enabled)
|
||||
{
|
||||
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||
guchar *defaults;
|
||||
guchar *available;
|
||||
guchar *current = NULL;
|
||||
guchar *available = NULL;
|
||||
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
defaults = get_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!available || !defaults)
|
||||
if (!available || !available[SCROLL_METHOD_FIELD_EDGE])
|
||||
goto out;
|
||||
|
||||
memcpy (values, defaults, SCROLL_METHOD_NUM_FIELDS);
|
||||
current = get_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!current)
|
||||
goto out;
|
||||
|
||||
/* Don't set edge scrolling if two-finger scrolling is enabled and available */
|
||||
if (available[SCROLL_METHOD_FIELD_EDGE] &&
|
||||
!(available[SCROLL_METHOD_FIELD_2FG] && values[SCROLL_METHOD_FIELD_2FG]))
|
||||
{
|
||||
values[1] = !!edge_scroll_enabled;
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
}
|
||||
memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
|
||||
|
||||
out:
|
||||
if (available)
|
||||
meta_XFree (available);
|
||||
if (defaults)
|
||||
meta_XFree (defaults);
|
||||
values[SCROLL_METHOD_FIELD_EDGE] = !!edge_scroll_enabled;
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
out:
|
||||
meta_XFree (current);
|
||||
meta_XFree (available);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -256,44 +251,43 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *set
|
||||
gboolean two_finger_scroll_enabled)
|
||||
{
|
||||
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||
guchar *defaults;
|
||||
guchar *available;
|
||||
gboolean changed;
|
||||
guchar *current = NULL;
|
||||
guchar *available = NULL;
|
||||
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
defaults = get_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!available || !defaults)
|
||||
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
||||
goto out;
|
||||
|
||||
memcpy (values, defaults, SCROLL_METHOD_NUM_FIELDS);
|
||||
changed = FALSE;
|
||||
current = get_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!current)
|
||||
goto out;
|
||||
|
||||
if (available[SCROLL_METHOD_FIELD_2FG])
|
||||
{
|
||||
values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled;
|
||||
changed = TRUE;
|
||||
}
|
||||
memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
|
||||
|
||||
/* Disable edge scrolling when two-finger scrolling is enabled */
|
||||
if (values[SCROLL_METHOD_FIELD_2FG] && values[SCROLL_METHOD_FIELD_EDGE])
|
||||
{
|
||||
values[SCROLL_METHOD_FIELD_EDGE] = 0;
|
||||
changed = TRUE;
|
||||
}
|
||||
values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled;
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
out:
|
||||
meta_XFree (current);
|
||||
meta_XFree (available);
|
||||
}
|
||||
|
||||
if (changed)
|
||||
{
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
}
|
||||
static gboolean
|
||||
meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
guchar *available = NULL;
|
||||
gboolean has_two_finger = TRUE;
|
||||
|
||||
out:
|
||||
if (available)
|
||||
meta_XFree (available);
|
||||
if (defaults)
|
||||
meta_XFree (defaults);
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
||||
has_two_finger = FALSE;
|
||||
|
||||
meta_XFree (available);
|
||||
return has_two_finger;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -565,6 +559,8 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
||||
|
||||
input_settings_class->set_mouse_accel_profile = meta_input_settings_x11_set_mouse_accel_profile;
|
||||
input_settings_class->set_trackball_accel_profile = meta_input_settings_x11_set_trackball_accel_profile;
|
||||
|
||||
input_settings_class->has_two_finger_scroll = meta_input_settings_x11_has_two_finger_scroll;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -352,6 +352,14 @@ meta_begin_modal_for_plugin (MetaCompositor *compositor,
|
||||
*/
|
||||
MetaDisplay *display = compositor->display;
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
if (display->grab_op == META_GRAB_OP_WAYLAND_POPUP)
|
||||
{
|
||||
MetaWaylandSeat *seat = meta_wayland_compositor_get_default ()->seat;
|
||||
meta_wayland_pointer_end_popup_grab (seat->pointer);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (is_modal (display) || display->grab_op != META_GRAB_OP_NONE)
|
||||
return FALSE;
|
||||
|
||||
|
@ -1129,6 +1129,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
MetaPluginEffect event)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
gboolean inconsistent = FALSE;
|
||||
|
||||
/* NB: Keep in mind that when effects get completed it possible
|
||||
* that the corresponding MetaWindow may have be been destroyed.
|
||||
@ -1145,6 +1146,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in minimize accounting.");
|
||||
priv->minimize_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -1155,6 +1157,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in unminimize accounting.");
|
||||
priv->unminimize_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -1169,6 +1172,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in map accounting.");
|
||||
priv->map_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_DESTROY:
|
||||
@ -1178,6 +1182,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in destroy accounting.");
|
||||
priv->destroy_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_SIZE_CHANGE:
|
||||
@ -1186,6 +1191,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in size change accounting.");
|
||||
priv->size_change_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_SWITCH_WORKSPACE:
|
||||
@ -1193,7 +1199,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_freeze_thaw_effect (event))
|
||||
if (is_freeze_thaw_effect (event) && !inconsistent)
|
||||
meta_window_actor_thaw (self);
|
||||
|
||||
if (!meta_window_actor_effect_in_progress (self))
|
||||
|
@ -465,7 +465,12 @@ place_window_if_needed(MetaWindow *window,
|
||||
MetaWorkspace *cur_workspace;
|
||||
const MetaMonitorInfo *monitor_info;
|
||||
|
||||
meta_window_get_frame_rect (window, &placed_rect);
|
||||
placed_rect = (MetaRectangle) {
|
||||
.x = window->rect.x,
|
||||
.y = window->rect.y,
|
||||
.width = info->current.width,
|
||||
.height = info->current.height
|
||||
};
|
||||
|
||||
orig_rect = info->orig;
|
||||
|
||||
@ -779,10 +784,6 @@ constrain_custom_rule (MetaWindow *window,
|
||||
if (!placement_rule)
|
||||
return TRUE;
|
||||
|
||||
if (!meta_rectangle_could_fit_rect (&info->work_area_monitor,
|
||||
&info->current))
|
||||
return TRUE;
|
||||
|
||||
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
|
||||
&intersection);
|
||||
|
||||
|
@ -3205,7 +3205,7 @@ handle_raise_or_lower (MetaDisplay *display,
|
||||
{
|
||||
MetaRectangle tmp, win_rect, above_rect;
|
||||
|
||||
if (above->mapped)
|
||||
if (above->mapped && meta_window_should_be_showing (above))
|
||||
{
|
||||
meta_window_get_frame_rect (window, &win_rect);
|
||||
meta_window_get_frame_rect (above, &above_rect);
|
||||
|
@ -2888,7 +2888,15 @@ check_fullscreen_func (gpointer data)
|
||||
g_slist_free (fullscreen_monitors);
|
||||
|
||||
if (in_fullscreen_changed)
|
||||
g_signal_emit (screen, screen_signals[IN_FULLSCREEN_CHANGED], 0, NULL);
|
||||
{
|
||||
/* DOCK window stacking depends on the monitor's fullscreen
|
||||
status so we need to trigger a re-layering. */
|
||||
MetaWindow *window = meta_stack_get_top (screen->stack);
|
||||
if (window)
|
||||
meta_stack_update_layer (screen->stack, window);
|
||||
|
||||
g_signal_emit (screen, screen_signals[IN_FULLSCREEN_CHANGED], 0, NULL);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -286,8 +286,8 @@ get_standalone_layer (MetaWindow *window)
|
||||
break;
|
||||
|
||||
case META_WINDOW_DOCK:
|
||||
/* still experimenting here */
|
||||
if (window->wm_state_below)
|
||||
if (window->wm_state_below ||
|
||||
(window->monitor && window->monitor->in_fullscreen))
|
||||
layer = META_LAYER_BOTTOM;
|
||||
else
|
||||
layer = META_LAYER_DOCK;
|
||||
|
@ -2267,27 +2267,7 @@ meta_window_show (MetaWindow *window)
|
||||
( (!place_on_top_on_map && !takes_focus_on_map) ||
|
||||
window_would_be_covered (window) )
|
||||
) {
|
||||
if (meta_window_is_ancestor_of_transient (focus_window, window))
|
||||
{
|
||||
guint32 timestamp;
|
||||
|
||||
timestamp = meta_display_get_current_time_roundtrip (window->display);
|
||||
|
||||
/* This happens for error dialogs or alerts; these need to remain on
|
||||
* top, but it would be confusing to have its ancestor remain
|
||||
* focused.
|
||||
*/
|
||||
meta_topic (META_DEBUG_STARTUP,
|
||||
"The focus window %s is an ancestor of the newly mapped "
|
||||
"window %s which isn't being focused. Unfocusing the "
|
||||
"ancestor.\n",
|
||||
focus_window->desc, window->desc);
|
||||
|
||||
meta_display_focus_the_no_focus_window (window->display,
|
||||
window->screen,
|
||||
timestamp);
|
||||
}
|
||||
else
|
||||
if (!meta_window_is_ancestor_of_transient (focus_window, window))
|
||||
{
|
||||
needs_stacking_adjustment = TRUE;
|
||||
if (!window->placed)
|
||||
|
@ -89,7 +89,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaWaylandDataSource, meta_wayland_data_source,
|
||||
G_DEFINE_TYPE (MetaWaylandDataSourceWayland, meta_wayland_data_source_wayland,
|
||||
META_TYPE_WAYLAND_DATA_SOURCE);
|
||||
G_DEFINE_TYPE (MetaWaylandDataSourcePrimary, meta_wayland_data_source_primary,
|
||||
META_TYPE_WAYLAND_DATA_SOURCE);
|
||||
META_TYPE_WAYLAND_DATA_SOURCE_WAYLAND);
|
||||
|
||||
static MetaWaylandDataSource *
|
||||
meta_wayland_data_source_wayland_new (struct wl_resource *resource);
|
||||
@ -1195,9 +1195,12 @@ data_device_start_drag (struct wl_client *client,
|
||||
&drag_grab_interface,
|
||||
surface, drag_source, icon_surface);
|
||||
|
||||
meta_wayland_keyboard_set_focus (seat->keyboard, NULL);
|
||||
meta_wayland_keyboard_start_grab (seat->keyboard,
|
||||
&seat->data_device.current_grab->keyboard_grab);
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
{
|
||||
meta_wayland_keyboard_set_focus (seat->keyboard, NULL);
|
||||
meta_wayland_keyboard_start_grab (seat->keyboard,
|
||||
&seat->data_device.current_grab->keyboard_grab);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -26,6 +26,10 @@
|
||||
|
||||
#include "wayland/meta-wayland-input-device.h"
|
||||
|
||||
#include <wayland-server.h>
|
||||
|
||||
#include "wayland/meta-wayland-seat.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
@ -51,6 +55,14 @@ meta_wayland_input_device_get_seat (MetaWaylandInputDevice *input_device)
|
||||
return priv->seat;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
meta_wayland_input_device_next_serial (MetaWaylandInputDevice *input_device)
|
||||
{
|
||||
MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device);
|
||||
|
||||
return wl_display_next_serial (seat->wl_display);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_input_device_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
|
@ -26,6 +26,7 @@
|
||||
#define META_WAYLAND_INPUT_DEVICE_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "wayland/meta-wayland-types.h"
|
||||
|
||||
@ -42,4 +43,6 @@ struct _MetaWaylandInputDeviceClass
|
||||
|
||||
MetaWaylandSeat * meta_wayland_input_device_get_seat (MetaWaylandInputDevice *input_device);
|
||||
|
||||
uint32_t meta_wayland_input_device_next_serial (MetaWaylandInputDevice *input_device);
|
||||
|
||||
#endif /* META_WAYLAND_INPUT_DEVICE_H */
|
||||
|
@ -252,7 +252,8 @@ on_keymap_layout_group_changed (MetaBackend *backend,
|
||||
static void
|
||||
keyboard_handle_focus_surface_destroy (struct wl_listener *listener, void *data)
|
||||
{
|
||||
MetaWaylandKeyboard *keyboard = wl_container_of (listener, keyboard, focus_surface_listener);
|
||||
MetaWaylandKeyboard *keyboard = wl_container_of (listener, keyboard,
|
||||
focus_surface_listener);
|
||||
|
||||
meta_wayland_keyboard_set_focus (keyboard, NULL);
|
||||
}
|
||||
@ -264,17 +265,16 @@ meta_wayland_keyboard_broadcast_key (MetaWaylandKeyboard *keyboard,
|
||||
uint32_t state)
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
struct wl_list *l;
|
||||
|
||||
l = &keyboard->focus_resource_list;
|
||||
if (!wl_list_empty (l))
|
||||
if (!wl_list_empty (&keyboard->focus_resource_list))
|
||||
{
|
||||
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
MetaWaylandInputDevice *input_device =
|
||||
META_WAYLAND_INPUT_DEVICE (keyboard);
|
||||
|
||||
keyboard->key_serial = wl_display_next_serial (display);
|
||||
keyboard->key_serial =
|
||||
meta_wayland_input_device_next_serial (input_device);
|
||||
|
||||
wl_resource_for_each (resource, l)
|
||||
wl_resource_for_each (resource, &keyboard->focus_resource_list)
|
||||
{
|
||||
wl_keyboard_send_key (resource, keyboard->key_serial, time, key, state);
|
||||
}
|
||||
@ -349,19 +349,16 @@ static void
|
||||
meta_wayland_keyboard_broadcast_modifiers (MetaWaylandKeyboard *keyboard)
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
struct wl_list *l;
|
||||
|
||||
l = &keyboard->focus_resource_list;
|
||||
if (!wl_list_empty (l))
|
||||
if (!wl_list_empty (&keyboard->focus_resource_list))
|
||||
{
|
||||
MetaWaylandInputDevice *input_device =
|
||||
META_WAYLAND_INPUT_DEVICE (keyboard);
|
||||
MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device);
|
||||
uint32_t serial;
|
||||
|
||||
serial = wl_display_next_serial (seat->wl_display);
|
||||
serial = meta_wayland_input_device_next_serial (input_device);
|
||||
|
||||
wl_resource_for_each (resource, l)
|
||||
wl_resource_for_each (resource, &keyboard->focus_resource_list)
|
||||
keyboard_send_modifiers (keyboard, resource, serial);
|
||||
}
|
||||
}
|
||||
@ -517,7 +514,11 @@ notify_key_repeat_for_resource (MetaWaylandKeyboard *keyboard,
|
||||
interval = g_settings_get_uint (keyboard->settings, "repeat-interval");
|
||||
/* Our setting is in the milliseconds between keys. "rate" is the number
|
||||
* of keys per second. */
|
||||
rate = (1000 / interval);
|
||||
if (interval > 0)
|
||||
rate = (1000 / interval);
|
||||
else
|
||||
rate = 0;
|
||||
|
||||
delay = g_settings_get_uint (keyboard->settings, "delay");
|
||||
}
|
||||
else
|
||||
@ -611,17 +612,6 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
GSettingsSchema *schema;
|
||||
|
||||
wl_list_init (&keyboard->resource_list);
|
||||
wl_list_init (&keyboard->focus_resource_list);
|
||||
|
||||
keyboard->focus_surface_listener.notify = keyboard_handle_focus_surface_destroy;
|
||||
|
||||
keyboard->xkb_info.keymap_fd = -1;
|
||||
|
||||
keyboard->default_grab.interface = &default_keyboard_grab_interface;
|
||||
keyboard->default_grab.keyboard = keyboard;
|
||||
keyboard->grab = &keyboard->default_grab;
|
||||
|
||||
keyboard->settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard");
|
||||
g_signal_connect (keyboard->settings, "changed",
|
||||
G_CALLBACK (settings_changed), keyboard);
|
||||
@ -647,6 +637,12 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
|
||||
maybe_restore_numlock_state (keyboard);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_xkb_info_init (MetaWaylandXkbInfo *xkb_info)
|
||||
{
|
||||
xkb_info->keymap_fd = -1;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
|
||||
{
|
||||
@ -659,7 +655,10 @@ meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
|
||||
xkb_info->keymap_area = NULL;
|
||||
}
|
||||
if (xkb_info->keymap_fd >= 0)
|
||||
close (xkb_info->keymap_fd);
|
||||
{
|
||||
close (xkb_info->keymap_fd);
|
||||
xkb_info->keymap_fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -670,10 +669,14 @@ meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard)
|
||||
g_signal_handlers_disconnect_by_func (backend, on_keymap_changed, keyboard);
|
||||
g_signal_handlers_disconnect_by_func (backend, on_keymap_layout_group_changed, keyboard);
|
||||
|
||||
meta_wayland_keyboard_end_grab (keyboard);
|
||||
meta_wayland_keyboard_set_focus (keyboard, NULL);
|
||||
meta_wayland_xkb_info_destroy (&keyboard->xkb_info);
|
||||
|
||||
/* XXX: What about keyboard->resource_list? */
|
||||
wl_list_remove (&keyboard->resource_list);
|
||||
wl_list_init (&keyboard->resource_list);
|
||||
wl_list_remove (&keyboard->focus_resource_list);
|
||||
wl_list_init (&keyboard->focus_resource_list);
|
||||
|
||||
g_clear_object (&keyboard->settings);
|
||||
if (keyboard->gsd_settings)
|
||||
@ -826,32 +829,27 @@ meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (keyboard);
|
||||
MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device);
|
||||
|
||||
if (!meta_wayland_seat_has_keyboard (seat))
|
||||
return;
|
||||
|
||||
if (keyboard->focus_surface == surface)
|
||||
return;
|
||||
|
||||
if (keyboard->focus_surface != NULL)
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
struct wl_list *l;
|
||||
|
||||
l = &keyboard->focus_resource_list;
|
||||
if (!wl_list_empty (l))
|
||||
if (!wl_list_empty (&keyboard->focus_resource_list))
|
||||
{
|
||||
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
uint32_t serial = wl_display_next_serial (display);
|
||||
struct wl_resource *resource;
|
||||
uint32_t serial;
|
||||
|
||||
wl_resource_for_each (resource, l)
|
||||
serial = meta_wayland_input_device_next_serial (input_device);
|
||||
|
||||
wl_resource_for_each (resource, &keyboard->focus_resource_list)
|
||||
{
|
||||
wl_keyboard_send_leave (resource, serial, keyboard->focus_surface->resource);
|
||||
wl_keyboard_send_leave (resource, serial,
|
||||
keyboard->focus_surface->resource);
|
||||
}
|
||||
|
||||
move_resources (&keyboard->resource_list, &keyboard->focus_resource_list);
|
||||
move_resources (&keyboard->resource_list,
|
||||
&keyboard->focus_resource_list);
|
||||
}
|
||||
|
||||
wl_list_remove (&keyboard->focus_surface_listener.link);
|
||||
@ -860,24 +858,25 @@ meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
|
||||
|
||||
if (surface != NULL)
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
struct wl_list *l;
|
||||
struct wl_resource *focus_surface_resource;
|
||||
|
||||
keyboard->focus_surface = surface;
|
||||
wl_resource_add_destroy_listener (keyboard->focus_surface->resource, &keyboard->focus_surface_listener);
|
||||
focus_surface_resource = keyboard->focus_surface->resource;
|
||||
wl_resource_add_destroy_listener (focus_surface_resource,
|
||||
&keyboard->focus_surface_listener);
|
||||
|
||||
move_resources_for_client (&keyboard->focus_resource_list,
|
||||
&keyboard->resource_list,
|
||||
wl_resource_get_client (keyboard->focus_surface->resource));
|
||||
wl_resource_get_client (focus_surface_resource));
|
||||
|
||||
l = &keyboard->focus_resource_list;
|
||||
if (!wl_list_empty (l))
|
||||
if (!wl_list_empty (&keyboard->focus_resource_list))
|
||||
{
|
||||
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
keyboard->focus_serial = wl_display_next_serial (display);
|
||||
struct wl_resource *resource;
|
||||
|
||||
wl_resource_for_each (resource, l)
|
||||
keyboard->focus_serial =
|
||||
meta_wayland_input_device_next_serial (input_device);
|
||||
|
||||
wl_resource_for_each (resource, &keyboard->focus_resource_list)
|
||||
{
|
||||
broadcast_focus (keyboard, resource);
|
||||
}
|
||||
@ -911,26 +910,31 @@ meta_wayland_keyboard_create_new_resource (MetaWaylandKeyboard *keyboard,
|
||||
struct wl_resource *seat_resource,
|
||||
uint32_t id)
|
||||
{
|
||||
struct wl_resource *cr;
|
||||
struct wl_resource *resource;
|
||||
|
||||
cr = wl_resource_create (client, &wl_keyboard_interface, wl_resource_get_version (seat_resource), id);
|
||||
wl_resource_set_implementation (cr, &keyboard_interface, keyboard, unbind_resource);
|
||||
resource = wl_resource_create (client, &wl_keyboard_interface,
|
||||
wl_resource_get_version (seat_resource), id);
|
||||
wl_resource_set_implementation (resource, &keyboard_interface,
|
||||
keyboard, unbind_resource);
|
||||
|
||||
wl_keyboard_send_keymap (cr,
|
||||
wl_keyboard_send_keymap (resource,
|
||||
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
|
||||
keyboard->xkb_info.keymap_fd,
|
||||
keyboard->xkb_info.keymap_size);
|
||||
|
||||
notify_key_repeat_for_resource (keyboard, cr);
|
||||
notify_key_repeat_for_resource (keyboard, resource);
|
||||
|
||||
if (keyboard->focus_surface && wl_resource_get_client (keyboard->focus_surface->resource) == client)
|
||||
if (keyboard->focus_surface &&
|
||||
wl_resource_get_client (keyboard->focus_surface->resource) == client)
|
||||
{
|
||||
wl_list_insert (&keyboard->focus_resource_list, wl_resource_get_link (cr));
|
||||
broadcast_focus (keyboard, cr);
|
||||
wl_list_insert (&keyboard->focus_resource_list,
|
||||
wl_resource_get_link (resource));
|
||||
broadcast_focus (keyboard, resource);
|
||||
}
|
||||
else
|
||||
{
|
||||
wl_list_insert (&keyboard->resource_list, wl_resource_get_link (cr));
|
||||
wl_list_insert (&keyboard->resource_list,
|
||||
wl_resource_get_link (resource));
|
||||
}
|
||||
}
|
||||
|
||||
@ -959,6 +963,17 @@ meta_wayland_keyboard_end_grab (MetaWaylandKeyboard *keyboard)
|
||||
static void
|
||||
meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard)
|
||||
{
|
||||
wl_list_init (&keyboard->resource_list);
|
||||
wl_list_init (&keyboard->focus_resource_list);
|
||||
|
||||
meta_wayland_xkb_info_init (&keyboard->xkb_info);
|
||||
|
||||
keyboard->default_grab.interface = &default_keyboard_grab_interface;
|
||||
keyboard->default_grab.keyboard = keyboard;
|
||||
keyboard->grab = &keyboard->default_grab;
|
||||
|
||||
keyboard->focus_surface_listener.notify =
|
||||
keyboard_handle_focus_surface_destroy;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/native/meta-backend-native.h"
|
||||
#include "backends/meta-pointer-constraint.h"
|
||||
#include "core/frame.h"
|
||||
|
||||
#include "pointer-constraints-unstable-v1-server-protocol.h"
|
||||
|
||||
@ -447,17 +448,10 @@ is_within_constraint_region (MetaWaylandPointerConstraint *constraint,
|
||||
return is_within;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *constraint)
|
||||
static gboolean
|
||||
should_constraint_be_enabled (MetaWaylandPointerConstraint *constraint)
|
||||
{
|
||||
MetaWindow *window;
|
||||
wl_fixed_t sx, sy;
|
||||
|
||||
if (constraint->is_enabled)
|
||||
return;
|
||||
|
||||
if (constraint->seat->pointer->focus_surface != constraint->surface)
|
||||
return;
|
||||
|
||||
window = constraint->surface->window;
|
||||
if (!window)
|
||||
@ -467,11 +461,14 @@ meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *cons
|
||||
* associate the X11 Window with the wl_surface.
|
||||
*/
|
||||
g_warn_if_fail (meta_xwayland_is_xwayland_surface (constraint->surface));
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (window->unmanaging)
|
||||
return;
|
||||
return FALSE;
|
||||
|
||||
if (constraint->seat->pointer->focus_surface != constraint->surface)
|
||||
return FALSE;
|
||||
|
||||
if (meta_xwayland_is_xwayland_surface (constraint->surface))
|
||||
{
|
||||
@ -493,14 +490,30 @@ meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *cons
|
||||
|
||||
if (display->focus_window &&
|
||||
display->focus_window->client_type != META_WINDOW_CLIENT_TYPE_X11)
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaWindow *window = constraint->surface->window;
|
||||
|
||||
if (!meta_window_appears_focused (window))
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *constraint)
|
||||
{
|
||||
wl_fixed_t sx, sy;
|
||||
|
||||
if (constraint->is_enabled)
|
||||
return;
|
||||
|
||||
if (!should_constraint_be_enabled (constraint))
|
||||
return;
|
||||
|
||||
meta_wayland_pointer_get_relative_coordinates (constraint->seat->pointer,
|
||||
constraint->surface,
|
||||
&sx, &sy);
|
||||
@ -519,26 +532,9 @@ meta_wayland_pointer_constraint_remove (MetaWaylandPointerConstraint *constraint
|
||||
meta_wayland_pointer_constraint_destroy (constraint);
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
|
||||
MetaWindow *window)
|
||||
static void
|
||||
meta_wayland_pointer_constraint_deactivate (MetaWaylandPointerConstraint *constraint)
|
||||
{
|
||||
MetaWaylandPointer *pointer = seat->pointer;
|
||||
MetaWaylandPointerConstraint *constraint;
|
||||
|
||||
if ((pointer->grab->interface != &confined_pointer_grab_interface &&
|
||||
pointer->grab->interface != &locked_pointer_grab_interface))
|
||||
return;
|
||||
|
||||
constraint = wl_container_of (pointer->grab, constraint, grab);
|
||||
|
||||
if (constraint->surface != window->surface)
|
||||
return;
|
||||
|
||||
if (meta_window_appears_focused (window) &&
|
||||
pointer->focus_surface == window->surface)
|
||||
return;
|
||||
|
||||
switch (constraint->lifetime)
|
||||
{
|
||||
case ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT:
|
||||
@ -554,6 +550,25 @@ meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
|
||||
MetaWindow *window)
|
||||
{
|
||||
MetaWaylandPointer *pointer = seat->pointer;
|
||||
MetaWaylandPointerConstraint *constraint;
|
||||
|
||||
if ((pointer->grab->interface != &confined_pointer_grab_interface &&
|
||||
pointer->grab->interface != &locked_pointer_grab_interface))
|
||||
return;
|
||||
|
||||
constraint = wl_container_of (pointer->grab, constraint, grab);
|
||||
|
||||
if (should_constraint_be_enabled (constraint))
|
||||
return;
|
||||
|
||||
meta_wayland_pointer_constraint_deactivate (constraint);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_constraint_maybe_enable_for_window (MetaWindow *window)
|
||||
{
|
||||
@ -589,11 +604,32 @@ cairo_region_t *
|
||||
meta_wayland_pointer_constraint_calculate_effective_region (MetaWaylandPointerConstraint *constraint)
|
||||
{
|
||||
cairo_region_t *region;
|
||||
MetaWindow *window;
|
||||
|
||||
region = meta_wayland_surface_calculate_input_region (constraint->surface);
|
||||
if (constraint->region)
|
||||
cairo_region_intersect (region, constraint->region);
|
||||
|
||||
window = constraint->surface->window;
|
||||
if (window && window->frame)
|
||||
{
|
||||
MetaFrame *frame = window->frame;
|
||||
int actual_width, actual_height;
|
||||
|
||||
g_assert (meta_xwayland_is_xwayland_surface (constraint->surface));
|
||||
|
||||
actual_width = window->buffer_rect.width - (frame->child_x +
|
||||
frame->right_width);
|
||||
actual_height = window->buffer_rect.height - (frame->child_y +
|
||||
frame->bottom_height);
|
||||
cairo_region_intersect_rectangle (region, &(cairo_rectangle_int_t) {
|
||||
.x = frame->child_x,
|
||||
.y = frame->child_y,
|
||||
.width = actual_width,
|
||||
.height = actual_height
|
||||
});
|
||||
}
|
||||
|
||||
return region;
|
||||
}
|
||||
|
||||
@ -938,10 +974,20 @@ locked_pointer_grab_pointer_button (MetaWaylandPointerGrab *grab,
|
||||
meta_wayland_pointer_send_button (grab->pointer, event);
|
||||
}
|
||||
|
||||
static void
|
||||
locked_pointer_grab_pointer_cancel (MetaWaylandPointerGrab *grab)
|
||||
{
|
||||
MetaWaylandPointerConstraint *constraint =
|
||||
wl_container_of (grab, constraint, grab);
|
||||
|
||||
meta_wayland_pointer_constraint_deactivate (constraint);
|
||||
}
|
||||
|
||||
static const MetaWaylandPointerGrabInterface locked_pointer_grab_interface = {
|
||||
locked_pointer_grab_pointer_focus,
|
||||
locked_pointer_grab_pointer_motion,
|
||||
locked_pointer_grab_pointer_button,
|
||||
locked_pointer_grab_pointer_cancel,
|
||||
};
|
||||
|
||||
static void
|
||||
@ -999,10 +1045,20 @@ confined_pointer_grab_pointer_button (MetaWaylandPointerGrab *grab,
|
||||
meta_wayland_pointer_send_button (grab->pointer, event);
|
||||
}
|
||||
|
||||
static void
|
||||
confined_pointer_grab_pointer_cancel (MetaWaylandPointerGrab *grab)
|
||||
{
|
||||
MetaWaylandPointerConstraint *constraint =
|
||||
wl_container_of (grab, constraint, grab);
|
||||
|
||||
meta_wayland_pointer_constraint_deactivate (constraint);
|
||||
}
|
||||
|
||||
static const MetaWaylandPointerGrabInterface confined_pointer_grab_interface = {
|
||||
confined_pointer_grab_pointer_focus,
|
||||
confined_pointer_grab_pointer_motion,
|
||||
confined_pointer_grab_pointer_button,
|
||||
confined_pointer_grab_pointer_cancel,
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -86,6 +86,12 @@ static guint signals[LAST_SIGNAL];
|
||||
G_DEFINE_TYPE (MetaWaylandPointer, meta_wayland_pointer,
|
||||
META_TYPE_WAYLAND_INPUT_DEVICE)
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_reset_grab (MetaWaylandPointer *pointer);
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_cancel_grab (MetaWaylandPointer *pointer);
|
||||
|
||||
static MetaWaylandPointerClient *
|
||||
meta_wayland_pointer_client_new (void)
|
||||
{
|
||||
@ -358,8 +364,8 @@ meta_wayland_pointer_send_button (MetaWaylandPointer *pointer,
|
||||
if (pointer->focus_client &&
|
||||
!wl_list_empty (&pointer->focus_client->pointer_resources))
|
||||
{
|
||||
struct wl_client *client = wl_resource_get_client (pointer->focus_surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
MetaWaylandInputDevice *input_device =
|
||||
META_WAYLAND_INPUT_DEVICE (pointer);
|
||||
uint32_t time;
|
||||
uint32_t button;
|
||||
uint32_t serial;
|
||||
@ -395,7 +401,7 @@ meta_wayland_pointer_send_button (MetaWaylandPointer *pointer,
|
||||
}
|
||||
|
||||
time = clutter_event_get_time (event);
|
||||
serial = wl_display_next_serial (display);
|
||||
serial = meta_wayland_input_device_next_serial (input_device);
|
||||
|
||||
wl_resource_for_each (resource, &pointer->focus_client->pointer_resources)
|
||||
{
|
||||
@ -416,11 +422,27 @@ default_grab_focus (MetaWaylandPointerGrab *grab,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
MetaWaylandPointer *pointer = grab->pointer;
|
||||
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (pointer);
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
|
||||
if (pointer->button_count > 0)
|
||||
return;
|
||||
|
||||
meta_wayland_pointer_set_focus (pointer, surface);
|
||||
switch (display->event_route)
|
||||
{
|
||||
case META_EVENT_ROUTE_WINDOW_OP:
|
||||
case META_EVENT_ROUTE_COMPOSITOR_GRAB:
|
||||
case META_EVENT_ROUTE_FRAME_BUTTON:
|
||||
return;
|
||||
break;
|
||||
|
||||
case META_EVENT_ROUTE_NORMAL:
|
||||
case META_EVENT_ROUTE_WAYLAND_POPUP:
|
||||
break;
|
||||
}
|
||||
|
||||
if (meta_wayland_seat_has_pointer (seat))
|
||||
meta_wayland_pointer_set_focus (pointer, surface);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -493,7 +515,8 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
|
||||
pointer->cursor_surface_destroy_id);
|
||||
}
|
||||
|
||||
meta_wayland_pointer_end_grab (pointer);
|
||||
meta_wayland_pointer_cancel_grab (pointer);
|
||||
meta_wayland_pointer_reset_grab (pointer);
|
||||
meta_wayland_pointer_set_focus (pointer, NULL);
|
||||
|
||||
g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
|
||||
@ -534,7 +557,8 @@ repick_for_event (MetaWaylandPointer *pointer,
|
||||
actor = clutter_input_device_get_pointer_actor (pointer->device);
|
||||
|
||||
if (META_IS_SURFACE_ACTOR_WAYLAND (actor))
|
||||
pointer->current = meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
|
||||
pointer->current =
|
||||
meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
|
||||
else
|
||||
pointer->current = NULL;
|
||||
|
||||
@ -793,22 +817,16 @@ void
|
||||
meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (pointer);
|
||||
|
||||
if (!meta_wayland_seat_has_pointer (seat))
|
||||
return;
|
||||
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (pointer);
|
||||
|
||||
if (pointer->focus_surface == surface)
|
||||
return;
|
||||
|
||||
if (pointer->focus_surface != NULL)
|
||||
{
|
||||
struct wl_client *client =
|
||||
wl_resource_get_client (pointer->focus_surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
uint32_t serial;
|
||||
|
||||
serial = wl_display_next_serial (display);
|
||||
serial = meta_wayland_input_device_next_serial (input_device);
|
||||
|
||||
if (pointer->focus_client)
|
||||
{
|
||||
@ -825,11 +843,11 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
|
||||
if (surface != NULL)
|
||||
{
|
||||
struct wl_client *client = wl_resource_get_client (surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
ClutterPoint pos;
|
||||
|
||||
pointer->focus_surface = surface;
|
||||
wl_resource_add_destroy_listener (pointer->focus_surface->resource, &pointer->focus_surface_listener);
|
||||
wl_resource_add_destroy_listener (pointer->focus_surface->resource,
|
||||
&pointer->focus_surface_listener);
|
||||
|
||||
clutter_input_device_get_coords (pointer->device, NULL, &pos);
|
||||
|
||||
@ -843,7 +861,8 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
|
||||
meta_wayland_pointer_get_pointer_client (pointer, client);
|
||||
if (pointer->focus_client)
|
||||
{
|
||||
pointer->focus_serial = wl_display_next_serial (display);
|
||||
pointer->focus_serial =
|
||||
meta_wayland_input_device_next_serial (input_device);
|
||||
meta_wayland_pointer_broadcast_enter (pointer,
|
||||
pointer->focus_serial,
|
||||
pointer->focus_surface);
|
||||
@ -861,6 +880,8 @@ meta_wayland_pointer_start_grab (MetaWaylandPointer *pointer,
|
||||
{
|
||||
const MetaWaylandPointerGrabInterface *interface;
|
||||
|
||||
meta_wayland_pointer_cancel_grab (pointer);
|
||||
|
||||
pointer->grab = grab;
|
||||
interface = pointer->grab->interface;
|
||||
grab->pointer = pointer;
|
||||
@ -868,6 +889,12 @@ meta_wayland_pointer_start_grab (MetaWaylandPointer *pointer,
|
||||
interface->focus (pointer->grab, pointer->current);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_reset_grab (MetaWaylandPointer *pointer)
|
||||
{
|
||||
pointer->grab = &pointer->default_grab;
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer)
|
||||
{
|
||||
@ -880,6 +907,13 @@ meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer)
|
||||
meta_wayland_pointer_update_cursor_surface (pointer);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_cancel_grab (MetaWaylandPointer *pointer)
|
||||
{
|
||||
if (pointer->grab->interface->cancel)
|
||||
pointer->grab->interface->cancel (pointer->grab);
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer)
|
||||
{
|
||||
@ -1059,24 +1093,25 @@ meta_wayland_pointer_create_new_resource (MetaWaylandPointer *pointer,
|
||||
struct wl_resource *seat_resource,
|
||||
uint32_t id)
|
||||
{
|
||||
struct wl_resource *cr;
|
||||
struct wl_resource *resource;
|
||||
MetaWaylandPointerClient *pointer_client;
|
||||
|
||||
cr = wl_resource_create (client, &wl_pointer_interface, wl_resource_get_version (seat_resource), id);
|
||||
wl_resource_set_implementation (cr, &pointer_interface, pointer,
|
||||
resource = wl_resource_create (client, &wl_pointer_interface,
|
||||
wl_resource_get_version (seat_resource), id);
|
||||
wl_resource_set_implementation (resource, &pointer_interface, pointer,
|
||||
meta_wayland_pointer_unbind_pointer_client_resource);
|
||||
|
||||
pointer_client = meta_wayland_pointer_ensure_pointer_client (pointer, client);
|
||||
|
||||
wl_list_insert (&pointer_client->pointer_resources,
|
||||
wl_resource_get_link (cr));
|
||||
wl_resource_get_link (resource));
|
||||
|
||||
if (pointer->focus_client == pointer_client)
|
||||
{
|
||||
meta_wayland_pointer_send_enter (pointer, cr,
|
||||
meta_wayland_pointer_send_enter (pointer, resource,
|
||||
pointer->focus_serial,
|
||||
pointer->focus_surface);
|
||||
meta_wayland_pointer_send_frame (pointer, cr);
|
||||
meta_wayland_pointer_send_frame (pointer, resource);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1127,30 +1162,31 @@ relative_pointer_manager_destroy (struct wl_client *client,
|
||||
|
||||
static void
|
||||
relative_pointer_manager_get_relative_pointer (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
struct wl_resource *manager_resource,
|
||||
uint32_t id,
|
||||
struct wl_resource *pointer_resource)
|
||||
{
|
||||
MetaWaylandPointer *pointer = wl_resource_get_user_data (pointer_resource);
|
||||
struct wl_resource *cr;
|
||||
struct wl_resource *resource;
|
||||
MetaWaylandPointerClient *pointer_client;
|
||||
|
||||
cr = wl_resource_create (client, &zwp_relative_pointer_v1_interface,
|
||||
wl_resource_get_version (resource), id);
|
||||
if (cr == NULL)
|
||||
resource = wl_resource_create (client, &zwp_relative_pointer_v1_interface,
|
||||
wl_resource_get_version (manager_resource),
|
||||
id);
|
||||
if (!resource)
|
||||
{
|
||||
wl_client_post_no_memory (client);
|
||||
return;
|
||||
}
|
||||
|
||||
wl_resource_set_implementation (cr, &relative_pointer_interface,
|
||||
wl_resource_set_implementation (resource, &relative_pointer_interface,
|
||||
pointer,
|
||||
meta_wayland_pointer_unbind_pointer_client_resource);
|
||||
|
||||
pointer_client = meta_wayland_pointer_ensure_pointer_client (pointer, client);
|
||||
|
||||
wl_list_insert (&pointer_client->relative_pointer_resources,
|
||||
wl_resource_get_link (cr));
|
||||
wl_resource_get_link (resource));
|
||||
}
|
||||
|
||||
static const struct zwp_relative_pointer_manager_v1_interface relative_pointer_manager = {
|
||||
|
@ -46,6 +46,7 @@ struct _MetaWaylandPointerGrabInterface
|
||||
const ClutterEvent *event);
|
||||
void (*button) (MetaWaylandPointerGrab *grab,
|
||||
const ClutterEvent *event);
|
||||
void (*cancel) (MetaWaylandPointerGrab *grab);
|
||||
};
|
||||
|
||||
struct _MetaWaylandPointerGrab
|
||||
|
@ -101,6 +101,16 @@ popup_grab_focus (MetaWaylandPointerGrab *grab,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
MetaWaylandPopupGrab *popup_grab = (MetaWaylandPopupGrab*)grab;
|
||||
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (grab->pointer);
|
||||
|
||||
/*
|
||||
* We rely on having a pointer grab even when the seat doesn't have
|
||||
* the pointer capability. In this case, we shouldn't update any pointer focus
|
||||
* since there is no such thing when the seat doesn't have the pointer
|
||||
* capability.
|
||||
*/
|
||||
if (!meta_wayland_seat_has_pointer (seat))
|
||||
return;
|
||||
|
||||
/* Popup grabs are in owner-events mode (ie, events for the same client
|
||||
are reported as normal) */
|
||||
@ -131,10 +141,17 @@ popup_grab_button (MetaWaylandPointerGrab *grab,
|
||||
meta_wayland_pointer_end_popup_grab (grab->pointer);
|
||||
}
|
||||
|
||||
static void
|
||||
popup_grab_cancel (MetaWaylandPointerGrab *grab)
|
||||
{
|
||||
meta_wayland_pointer_end_popup_grab (grab->pointer);
|
||||
}
|
||||
|
||||
static MetaWaylandPointerGrabInterface popup_grab_interface = {
|
||||
popup_grab_focus,
|
||||
popup_grab_motion,
|
||||
popup_grab_button
|
||||
popup_grab_button,
|
||||
popup_grab_cancel
|
||||
};
|
||||
|
||||
MetaWaylandPopupGrab *
|
||||
@ -249,12 +266,12 @@ meta_wayland_popup_dismiss (MetaWaylandPopup *popup)
|
||||
{
|
||||
MetaWaylandSurface *top_popup_surface;
|
||||
MetaWaylandSeat *seat;
|
||||
MetaWaylandKeyboard *keyboard;
|
||||
|
||||
top_popup_surface = meta_wayland_popup_grab_get_top_popup (popup_grab);
|
||||
seat = meta_wayland_pointer_get_seat (popup_grab->generic.pointer);
|
||||
keyboard = seat->keyboard;
|
||||
meta_wayland_keyboard_set_focus (keyboard, top_popup_surface);
|
||||
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
meta_wayland_keyboard_set_focus (seat->keyboard, top_popup_surface);
|
||||
}
|
||||
}
|
||||
|
||||
@ -272,7 +289,6 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
|
||||
meta_wayland_popup_surface_get_surface (popup_surface);
|
||||
MetaWaylandPopup *popup;
|
||||
MetaWaylandSeat *seat;
|
||||
MetaWaylandKeyboard *keyboard;
|
||||
|
||||
/* Don't allow creating popups if the grab has a different client. */
|
||||
if (grab->grab_client != wl_resource_get_client (surface->resource))
|
||||
@ -285,8 +301,8 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
|
||||
wl_list_insert (&grab->all_popups, &popup->link);
|
||||
|
||||
seat = meta_wayland_pointer_get_seat (grab->generic.pointer);
|
||||
keyboard = seat->keyboard;
|
||||
meta_wayland_keyboard_set_focus (keyboard, surface);
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
meta_wayland_keyboard_set_focus (seat->keyboard, surface);
|
||||
|
||||
return popup;
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ seat_get_pointer (struct wl_client *client,
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
|
||||
MetaWaylandPointer *pointer = seat->pointer;
|
||||
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0)
|
||||
if (meta_wayland_seat_has_pointer (seat))
|
||||
meta_wayland_pointer_create_new_resource (pointer, client, resource, id);
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@ seat_get_keyboard (struct wl_client *client,
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
|
||||
MetaWaylandKeyboard *keyboard = seat->keyboard;
|
||||
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
meta_wayland_keyboard_create_new_resource (keyboard, client, resource, id);
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ seat_get_touch (struct wl_client *client,
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
|
||||
MetaWaylandTouch *touch = seat->touch;
|
||||
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
|
||||
if (meta_wayland_seat_has_touch (seat))
|
||||
meta_wayland_touch_create_new_resource (touch, client, resource, id);
|
||||
}
|
||||
|
||||
@ -319,20 +319,20 @@ meta_wayland_seat_update (MetaWaylandSeat *seat,
|
||||
case CLUTTER_BUTTON_PRESS:
|
||||
case CLUTTER_BUTTON_RELEASE:
|
||||
case CLUTTER_SCROLL:
|
||||
if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
|
||||
if (meta_wayland_seat_has_pointer (seat))
|
||||
meta_wayland_pointer_update (seat->pointer, event);
|
||||
break;
|
||||
|
||||
case CLUTTER_KEY_PRESS:
|
||||
case CLUTTER_KEY_RELEASE:
|
||||
if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
meta_wayland_keyboard_update (seat->keyboard, (const ClutterKeyEvent *) event);
|
||||
break;
|
||||
|
||||
case CLUTTER_TOUCH_BEGIN:
|
||||
case CLUTTER_TOUCH_UPDATE:
|
||||
case CLUTTER_TOUCH_END:
|
||||
if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
|
||||
if (meta_wayland_seat_has_touch (seat))
|
||||
meta_wayland_touch_update (seat->touch, event);
|
||||
break;
|
||||
|
||||
@ -356,18 +356,18 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
|
||||
case CLUTTER_SCROLL:
|
||||
case CLUTTER_TOUCHPAD_SWIPE:
|
||||
case CLUTTER_TOUCHPAD_PINCH:
|
||||
if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
|
||||
if (meta_wayland_seat_has_pointer (seat))
|
||||
return meta_wayland_pointer_handle_event (seat->pointer, event);
|
||||
|
||||
case CLUTTER_KEY_PRESS:
|
||||
case CLUTTER_KEY_RELEASE:
|
||||
if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
return meta_wayland_keyboard_handle_event (seat->keyboard,
|
||||
(const ClutterKeyEvent *) event);
|
||||
case CLUTTER_TOUCH_BEGIN:
|
||||
case CLUTTER_TOUCH_UPDATE:
|
||||
case CLUTTER_TOUCH_END:
|
||||
if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
|
||||
if (meta_wayland_seat_has_touch (seat))
|
||||
return meta_wayland_touch_handle_event (seat->touch, event);
|
||||
|
||||
default:
|
||||
@ -380,7 +380,7 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
|
||||
void
|
||||
meta_wayland_seat_repick (MetaWaylandSeat *seat)
|
||||
{
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) == 0)
|
||||
if (!meta_wayland_seat_has_pointer (seat))
|
||||
return;
|
||||
|
||||
meta_wayland_pointer_repick (seat->pointer);
|
||||
@ -393,7 +393,7 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat,
|
||||
MetaWaylandTabletSeat *tablet_seat;
|
||||
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
|
||||
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
{
|
||||
meta_wayland_keyboard_set_focus (seat->keyboard, surface);
|
||||
meta_wayland_data_device_set_keyboard_focus (&seat->data_device);
|
||||
@ -414,7 +414,7 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
|
||||
ClutterEventSequence *sequence = NULL;
|
||||
gboolean can_grab_surface = FALSE;
|
||||
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
|
||||
if (meta_wayland_seat_has_touch (seat))
|
||||
sequence = meta_wayland_touch_find_grab_sequence (seat->touch,
|
||||
surface,
|
||||
serial);
|
||||
@ -425,7 +425,7 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0 &&
|
||||
if (meta_wayland_seat_has_pointer (seat) &&
|
||||
(!require_pressed || seat->pointer->button_count > 0))
|
||||
can_grab_surface = meta_wayland_pointer_can_grab_surface (seat->pointer,
|
||||
surface,
|
||||
|
@ -62,7 +62,6 @@ meta_wayland_tablet_pad_ring_free (MetaWaylandTabletPadRing *ring)
|
||||
|
||||
wl_resource_for_each_safe (resource, next, &ring->resource_list)
|
||||
{
|
||||
zwp_tablet_tool_v2_send_removed (resource);
|
||||
wl_list_remove (wl_resource_get_link (resource));
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
}
|
||||
|
@ -62,7 +62,6 @@ meta_wayland_tablet_pad_strip_free (MetaWaylandTabletPadStrip *strip)
|
||||
|
||||
wl_resource_for_each_safe (resource, next, &strip->resource_list)
|
||||
{
|
||||
zwp_tablet_tool_v2_send_removed (resource);
|
||||
wl_list_remove (wl_resource_get_link (resource));
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ meta_wayland_tablet_tool_update_cursor_surface (MetaWaylandTabletTool *tool)
|
||||
cursor = NULL;
|
||||
}
|
||||
else if (tool->current_tablet)
|
||||
cursor = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
|
||||
cursor = tool->default_sprite;
|
||||
else
|
||||
cursor = NULL;
|
||||
|
||||
@ -380,6 +380,22 @@ tablet_tool_handle_cursor_surface_destroy (struct wl_listener *listener,
|
||||
meta_wayland_tablet_tool_set_cursor_surface (tool, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
tool_cursor_prepare_at (MetaCursorSprite *cursor_sprite,
|
||||
int x,
|
||||
int y,
|
||||
MetaWaylandTabletTool *tool)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
const MetaMonitorInfo *monitor;
|
||||
|
||||
monitor = meta_screen_get_monitor_for_point (display->screen, x, y);
|
||||
|
||||
/* Reload the cursor texture if the scale has changed. */
|
||||
if (monitor)
|
||||
meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale);
|
||||
}
|
||||
|
||||
MetaWaylandTabletTool *
|
||||
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||
ClutterInputDevice *device,
|
||||
@ -397,6 +413,11 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||
tool->focus_surface_destroy_listener.notify = tablet_tool_handle_focus_surface_destroy;
|
||||
tool->cursor_surface_destroy_listener.notify = tablet_tool_handle_cursor_surface_destroy;
|
||||
|
||||
tool->default_sprite = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
|
||||
tool->prepare_at_signal_id =
|
||||
g_signal_connect (tool->default_sprite, "prepare-at",
|
||||
G_CALLBACK (tool_cursor_prepare_at), tool);
|
||||
|
||||
return tool;
|
||||
}
|
||||
|
||||
@ -416,6 +437,9 @@ meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool)
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
}
|
||||
|
||||
g_signal_handler_disconnect (tool->default_sprite, tool->prepare_at_signal_id);
|
||||
g_object_unref (tool->default_sprite);
|
||||
|
||||
g_slice_free (MetaWaylandTabletTool, tool);
|
||||
}
|
||||
|
||||
|
@ -43,6 +43,8 @@ struct _MetaWaylandTabletTool
|
||||
MetaWaylandSurface *cursor_surface;
|
||||
struct wl_listener cursor_surface_destroy_listener;
|
||||
MetaCursorRenderer *cursor_renderer;
|
||||
MetaCursorSprite *default_sprite;
|
||||
guint prepare_at_signal_id;
|
||||
|
||||
MetaWaylandSurface *current;
|
||||
guint32 pressed_buttons;
|
||||
|
@ -202,18 +202,11 @@ touch_get_relative_coordinates (MetaWaylandTouch *touch,
|
||||
|
||||
clutter_event_get_coords (event, &event_x, &event_y);
|
||||
|
||||
if (surface->surface_actor)
|
||||
{
|
||||
clutter_actor_transform_stage_point (CLUTTER_ACTOR (surface->surface_actor),
|
||||
event_x, event_y,
|
||||
&event_x, &event_y);
|
||||
}
|
||||
|
||||
*x = event_x / surface->scale;
|
||||
*y = event_y / surface->scale;
|
||||
return meta_wayland_surface_get_relative_coordinates (surface,
|
||||
event_x, event_y,
|
||||
x, y);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
meta_wayland_touch_update (MetaWaylandTouch *touch,
|
||||
const ClutterEvent *event)
|
||||
@ -249,11 +242,10 @@ meta_wayland_touch_update (MetaWaylandTouch *touch,
|
||||
if (event->type == CLUTTER_TOUCH_BEGIN ||
|
||||
event->type == CLUTTER_TOUCH_END)
|
||||
{
|
||||
MetaWaylandSurface *surface = touch_info->touch_surface->surface;
|
||||
struct wl_client *client = wl_resource_get_client (surface->resource);
|
||||
struct wl_display *display = wl_client_get_display (client);
|
||||
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (touch);
|
||||
|
||||
touch_info->slot_serial = wl_display_get_serial (display);
|
||||
touch_info->slot_serial =
|
||||
meta_wayland_input_device_next_serial (input_device);
|
||||
}
|
||||
|
||||
touch_get_relative_coordinates (touch, touch_info->touch_surface->surface,
|
||||
|
@ -109,6 +109,11 @@ struct _MetaWaylandXdgPopup
|
||||
|
||||
struct {
|
||||
MetaWaylandSurface *parent_surface;
|
||||
|
||||
/*
|
||||
* The coordinates/dimensions in the placement rule are in logical pixel
|
||||
* coordinate space, i.e. not scaled given what monitor the popup is on.
|
||||
*/
|
||||
MetaPlacementRule placement_rule;
|
||||
|
||||
MetaWaylandSeat *grab_seat;
|
||||
@ -222,13 +227,15 @@ xdg_toplevel_show_window_menu (struct wl_client *client,
|
||||
{
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||
MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
|
||||
int monitor_scale;
|
||||
|
||||
if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
|
||||
return;
|
||||
|
||||
monitor_scale = surface->window->monitor->scale;
|
||||
meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
|
||||
surface->window->buffer_rect.x + x,
|
||||
surface->window->buffer_rect.y + y);
|
||||
surface->window->buffer_rect.x + (x * monitor_scale),
|
||||
surface->window->buffer_rect.y + (y * monitor_scale));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -617,6 +624,12 @@ xdg_toplevel_role_commit (MetaWaylandSurfaceRole *surface_role,
|
||||
return;
|
||||
}
|
||||
|
||||
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
|
||||
meta_window_wayland_move_resize (window,
|
||||
&xdg_surface_priv->acked_configure_serial,
|
||||
window_geometry,
|
||||
pending->dx, pending->dy);
|
||||
|
||||
/* When we get to this point, we ought to have valid size hints */
|
||||
if (pending->has_new_min_size || pending->has_new_max_size)
|
||||
{
|
||||
@ -639,11 +652,6 @@ xdg_toplevel_role_commit (MetaWaylandSurfaceRole *surface_role,
|
||||
}
|
||||
}
|
||||
|
||||
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
|
||||
meta_window_wayland_move_resize (window,
|
||||
&xdg_surface_priv->acked_configure_serial,
|
||||
window_geometry,
|
||||
pending->dx, pending->dy);
|
||||
xdg_surface_priv->acked_configure_serial.set = FALSE;
|
||||
}
|
||||
|
||||
@ -757,6 +765,22 @@ meta_wayland_xdg_toplevel_class_init (MetaWaylandXdgToplevelClass *klass)
|
||||
xdg_toplevel_role_shell_client_destroyed;
|
||||
}
|
||||
|
||||
static void
|
||||
scale_placement_rule (MetaPlacementRule *placement_rule,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
int monitor_scale = surface->window->monitor->scale;
|
||||
|
||||
placement_rule->anchor_rect.x *= monitor_scale;
|
||||
placement_rule->anchor_rect.y *= monitor_scale;
|
||||
placement_rule->anchor_rect.width *= monitor_scale;
|
||||
placement_rule->anchor_rect.height *= monitor_scale;
|
||||
placement_rule->offset_x *= monitor_scale;
|
||||
placement_rule->offset_y *= monitor_scale;
|
||||
placement_rule->width *= monitor_scale;
|
||||
placement_rule->height *= monitor_scale;
|
||||
}
|
||||
|
||||
static void
|
||||
finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
{
|
||||
@ -764,14 +788,13 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
MetaWaylandSurface *surface =
|
||||
meta_wayland_surface_role_get_surface (surface_role);
|
||||
MetaWaylandSurface *parent_surface;
|
||||
MetaPlacementRule placement_rule;
|
||||
MetaPlacementRule scaled_placement_rule;
|
||||
MetaWaylandSeat *seat;
|
||||
uint32_t serial;
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaWindow *window;
|
||||
|
||||
parent_surface = xdg_popup->setup.parent_surface;
|
||||
placement_rule = xdg_popup->setup.placement_rule;
|
||||
seat = xdg_popup->setup.grab_seat;
|
||||
serial = xdg_popup->setup.grab_serial;
|
||||
|
||||
@ -793,8 +816,12 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
&xdg_popup->parent_destroy_listener);
|
||||
|
||||
window = meta_window_wayland_new (display, surface);
|
||||
meta_window_place_with_placement_rule (window, &placement_rule);
|
||||
meta_wayland_surface_set_window (surface, window);
|
||||
meta_window_update_monitor (window, FALSE);
|
||||
|
||||
scaled_placement_rule = xdg_popup->setup.placement_rule;
|
||||
scale_placement_rule (&scaled_placement_rule, surface);
|
||||
meta_window_place_with_placement_rule (window, &scaled_placement_rule);
|
||||
|
||||
if (seat)
|
||||
{
|
||||
@ -814,6 +841,17 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
|
||||
xdg_popup->popup = popup;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
|
||||
* is pretty undefined. Same applies for subsurfaces, but in practice,
|
||||
* subsurfaces never receive keyboard focus, so it makes sense to
|
||||
* do the same for non-grabbing popups.
|
||||
*
|
||||
* See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
|
||||
*/
|
||||
window->input = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -873,6 +911,7 @@ xdg_popup_role_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role
|
||||
MetaWaylandXdgPopup *xdg_popup = META_WAYLAND_XDG_POPUP (shell_surface_role);
|
||||
MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_popup);
|
||||
MetaWindow *parent_window = xdg_popup->parent_surface->window;
|
||||
int monitor_scale;
|
||||
int x, y;
|
||||
|
||||
/* If the parent surface was destroyed, its window will be destroyed
|
||||
@ -886,8 +925,9 @@ xdg_popup_role_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role
|
||||
if (!parent_window)
|
||||
return;
|
||||
|
||||
x = new_x - parent_window->rect.x;
|
||||
y = new_y - parent_window->rect.y;
|
||||
monitor_scale = meta_window_wayland_get_main_monitor_scale (parent_window);
|
||||
x = (new_x - parent_window->rect.x) / monitor_scale;
|
||||
y = (new_y - parent_window->rect.y) / monitor_scale;
|
||||
zxdg_popup_v6_send_configure (xdg_popup->resource,
|
||||
x, y, new_width, new_height);
|
||||
meta_wayland_xdg_surface_send_configure (xdg_surface);
|
||||
@ -1463,6 +1503,7 @@ xdg_surface_constructor_get_toplevel (struct wl_client *client,
|
||||
|
||||
window = meta_window_wayland_new (meta_get_display (), surface);
|
||||
meta_wayland_surface_set_window (surface, window);
|
||||
meta_window_update_monitor (window, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -117,10 +117,11 @@ static void
|
||||
meta_window_wayland_focus (MetaWindow *window,
|
||||
guint32 timestamp)
|
||||
{
|
||||
meta_display_set_input_focus_window (window->display,
|
||||
window,
|
||||
FALSE,
|
||||
timestamp);
|
||||
if (window->input)
|
||||
meta_display_set_input_focus_window (window->display,
|
||||
window,
|
||||
FALSE,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -334,18 +335,29 @@ scale_rect_size (MetaRectangle *rect,
|
||||
static void
|
||||
meta_window_wayland_update_main_monitor (MetaWindow *window)
|
||||
{
|
||||
MetaWindow *toplevel_window;
|
||||
const MetaMonitorInfo *from;
|
||||
const MetaMonitorInfo *to;
|
||||
const MetaMonitorInfo *scaled_new;
|
||||
float scale;
|
||||
MetaRectangle rect;
|
||||
|
||||
from = window->monitor;
|
||||
|
||||
/* If the window is not a toplevel window (i.e. it's a popup window) just use
|
||||
* the monitor of the toplevel. */
|
||||
toplevel_window = meta_wayland_surface_get_toplevel_window (window->surface);
|
||||
if (toplevel_window != window)
|
||||
{
|
||||
window->monitor = toplevel_window->monitor;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Require both the current and the new monitor would be the new main monitor,
|
||||
* even given the resulting scale the window would end up having. This is
|
||||
* needed to avoid jumping back and forth between the new and the old, since
|
||||
* changing main monitor may cause the window to be resized so that it no
|
||||
* longer have that same new main monitor. */
|
||||
from = window->monitor;
|
||||
to = meta_screen_calculate_monitor_for_window (window->screen, window);
|
||||
|
||||
if (from == to)
|
||||
|
@ -546,6 +546,8 @@ static WaylandSelectionData *
|
||||
wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
||||
MetaWaylandCompositor *compositor)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaScreen *screen = display->screen;
|
||||
MetaWaylandDataDevice *data_device;
|
||||
MetaWaylandDataSource *wayland_source;
|
||||
MetaSelectionBridge *selection;
|
||||
@ -595,7 +597,8 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
||||
data->window = meta_display_lookup_x_window (meta_get_display (),
|
||||
data->request_event.requestor);
|
||||
|
||||
if (!data->window)
|
||||
/* Do *not* change the event mask on the root window, bugger! */
|
||||
if (!data->window && data->request_event.requestor != screen->xroot)
|
||||
{
|
||||
/* Not a managed window, set the PropertyChangeMask
|
||||
* for INCR deletion notifications.
|
||||
@ -629,10 +632,12 @@ reply_selection_request (XSelectionRequestEvent *request_event,
|
||||
static void
|
||||
wayland_selection_data_free (WaylandSelectionData *data)
|
||||
{
|
||||
if (!data->window)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaScreen *screen = display->screen;
|
||||
|
||||
/* Do *not* change the event mask on the root window, bugger! */
|
||||
if (!data->window && data->request_event.requestor != screen->xroot)
|
||||
{
|
||||
meta_error_trap_push (display);
|
||||
XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
data->request_event.requestor, NoEventMask);
|
||||
|
Reference in New Issue
Block a user