Compare commits
50 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2012eab842 | ||
![]() |
9ecb488437 | ||
![]() |
4295fdb892 | ||
![]() |
998d921d41 | ||
![]() |
d491063110 | ||
![]() |
e2bfaf0751 | ||
![]() |
f1e1a5ff06 | ||
![]() |
ef2000053a | ||
![]() |
8a7876ded5 | ||
![]() |
b50da46f43 | ||
![]() |
8b0e9706ca | ||
![]() |
1d4a5a7520 | ||
![]() |
8290e1f09a | ||
![]() |
89672fad04 | ||
![]() |
1cb9cfe11d | ||
![]() |
280e297afe | ||
![]() |
fc8de3d0c8 | ||
![]() |
3e2555667f | ||
![]() |
1ecadb6e57 | ||
![]() |
2abee91dbc | ||
![]() |
68645df3a3 | ||
![]() |
d2f79afc1a | ||
![]() |
8a6fa726d3 | ||
![]() |
a3d7ae6214 | ||
![]() |
c0c132a320 | ||
![]() |
0dfb5d3ef7 | ||
![]() |
6480a7ee4a | ||
![]() |
6cc8450f8e | ||
![]() |
7ae4b28bda | ||
![]() |
bb8e6afae6 | ||
![]() |
d7f61e48ac | ||
![]() |
9de6de5802 | ||
![]() |
6e7057426e | ||
![]() |
5306d36522 | ||
![]() |
7990182f56 | ||
![]() |
93a6be08a5 | ||
![]() |
d5d5084151 | ||
![]() |
d3cff9a962 | ||
![]() |
133bbdfefa | ||
![]() |
a8c3470cf2 | ||
![]() |
578e527869 | ||
![]() |
312f215fc3 | ||
![]() |
d639c28e3b | ||
![]() |
c3f7259cbb | ||
![]() |
56e8f98c13 | ||
![]() |
c2217373df | ||
![]() |
4a3781d7db | ||
![]() |
911a838c3a | ||
![]() |
c6106f90d4 | ||
![]() |
ed52e17886 |
46
NEWS
46
NEWS
@@ -1,47 +1,23 @@
|
|||||||
3.22.3
|
3.23.1
|
||||||
======
|
|
||||||
* 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
|
|
||||||
======
|
======
|
||||||
|
* Fix handling of Escape shortcut in force-quit dialog [Landry; #737109]
|
||||||
|
* Improve pointer constraints support [Jonas; #771859]
|
||||||
* Really fix framebuffer capture origin offset [Rui; #771502]
|
* Really fix framebuffer capture origin offset [Rui; #771502]
|
||||||
* Fix session going into idle mode immediately on startup [Rui; #772839]
|
* Fix session going into idle mode immediately on startup [Rui; #772839]
|
||||||
* Fix mirror mode with stage views [Rui; #773115]
|
* Fix mirror mode with stage views [Rui; #773115]
|
||||||
* Improve pointer constraints support [Jonas; #771859]
|
* Fall back to X with connectors spread across multiple GPUs [Ray; #771442]
|
||||||
* Stack docks below other windows on fullscreen monitors [Rui; #772937]
|
* Fix various crashes on wayland [Jonas, Carlos; #771646, #771858, #772929]
|
||||||
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
|
* Fix various placement issues on wayland [Olivier, Jonas, Sjoerd; #772729,
|
||||||
* Fix popup grabs blocking screen lock on wayland [Rui; #771235]
|
#768039, #771841, #771841, #773141]
|
||||||
* 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]
|
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
|
||||||
|
|
||||||
Contributors:
|
Contributors:
|
||||||
Jonas Ådahl, Olivier Fourdan, Rui Matos, Sjoerd Simons
|
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Landry MINOZA,
|
||||||
|
Sjoerd Simons, Ray Strode
|
||||||
|
|
||||||
Translations:
|
Translations:
|
||||||
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], liushuyu [zh_CN],
|
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], Hannie Dumoleyn [nl],
|
||||||
YunQiang Su [zh_CN]
|
liushuyu [zh_CN]
|
||||||
|
|
||||||
3.22.1
|
3.22.1
|
||||||
======
|
======
|
||||||
|
@@ -2261,12 +2261,6 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
|
|||||||
return next_id;
|
return next_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
|
|
||||||
{
|
|
||||||
dispatch_libinput (manager_evdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
compare_ids (gconstpointer a,
|
compare_ids (gconstpointer a,
|
||||||
gconstpointer b)
|
gconstpointer b)
|
||||||
|
@@ -76,8 +76,6 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
|
|||||||
float *new_x,
|
float *new_x,
|
||||||
float *new_y);
|
float *new_y);
|
||||||
|
|
||||||
void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
|
|
||||||
|
|
||||||
static inline guint64
|
static inline guint64
|
||||||
us (guint64 us)
|
us (guint64 us)
|
||||||
{
|
{
|
||||||
|
@@ -185,19 +185,15 @@ keyboard_repeat (gpointer data)
|
|||||||
{
|
{
|
||||||
ClutterSeatEvdev *seat = data;
|
ClutterSeatEvdev *seat = data;
|
||||||
GSource *source;
|
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);
|
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
|
||||||
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
|
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,
|
clutter_seat_evdev_notify_key (seat,
|
||||||
seat->repeat_device,
|
seat->repeat_device,
|
||||||
g_source_get_time (source),
|
ms2us (time_ms),
|
||||||
seat->repeat_key,
|
seat->repeat_key,
|
||||||
AUTOREPEAT_VALUE,
|
AUTOREPEAT_VALUE,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
@@ -261,39 +261,6 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
|
|||||||
g_slice_free (CoglRendererEGL, egl_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
|
static CoglBool
|
||||||
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
||||||
CoglError **error)
|
CoglError **error)
|
||||||
@@ -310,7 +277,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
|||||||
if (!_cogl_xlib_renderer_connect (renderer, error))
|
if (!_cogl_xlib_renderer_connect (renderer, error))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
egl_renderer->edpy = _cogl_winsys_egl_get_display (xlib_renderer->xdpy);
|
egl_renderer->edpy =
|
||||||
|
eglGetDisplay ((EGLNativeDisplayType) xlib_renderer->xdpy);
|
||||||
|
|
||||||
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
|
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
|
||||||
goto error;
|
goto error;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
AC_PREREQ(2.62)
|
AC_PREREQ(2.62)
|
||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [22])
|
m4_define([mutter_minor_version], [23])
|
||||||
m4_define([mutter_micro_version], [3])
|
m4_define([mutter_micro_version], [1])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||||
|
11
po/nl.po
11
po/nl.po
@@ -4,13 +4,14 @@
|
|||||||
# Reinout van Schouwen <reinouts@gnome.org>, 2003–2007, 2013, 2016 (nalezen).
|
# Reinout van Schouwen <reinouts@gnome.org>, 2003–2007, 2013, 2016 (nalezen).
|
||||||
# Michiel Sikkes <michiels@gnome.org>, 2005.
|
# Michiel Sikkes <michiels@gnome.org>, 2005.
|
||||||
# Wouter Bolsterlee <wbolster@gnome.org>, 2006–2012.
|
# Wouter Bolsterlee <wbolster@gnome.org>, 2006–2012.
|
||||||
|
# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2016.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2016-03-23 22:41+0100\n"
|
"POT-Creation-Date: 2016-03-23 22:41+0100\n"
|
||||||
"PO-Revision-Date: 2015-06-20 14:14+0100\n"
|
"PO-Revision-Date: 2016-10-17 18:24+0200\n"
|
||||||
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
|
"Last-Translator: Hannie Dumoleyn <hannie@ubuntu-nl.org>\n"
|
||||||
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
|
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
|
||||||
"Language: nl\n"
|
"Language: nl\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -18,7 +19,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Project-Style: gnome\n"
|
"X-Project-Style: gnome\n"
|
||||||
"X-Generator: Poedit 1.8.1\n"
|
"X-Generator: Lokalize 1.5\n"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
@@ -42,7 +43,7 @@ msgstr "Venster verplaatsen naar werkblad 4"
|
|||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||||
msgid "Move window to last workspace"
|
msgid "Move window to last workspace"
|
||||||
msgstr "Venster verplaatsen naar laatst gebruikte werkblad"
|
msgstr "Venster verplaatsen naar laatste werkblad"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||||
msgid "Move window one workspace to the left"
|
msgid "Move window one workspace to the left"
|
||||||
@@ -154,7 +155,7 @@ msgstr "Schakelen naar werkblad 4"
|
|||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||||
msgid "Switch to last workspace"
|
msgid "Switch to last workspace"
|
||||||
msgstr "Schakelen naar laatst gebruikte werkblad"
|
msgstr "Overschakelen naar laatste werkblad"
|
||||||
|
|
||||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||||
msgid "Move to workspace left"
|
msgid "Move to workspace left"
|
||||||
|
288
po/zh_CN.po
288
po/zh_CN.po
@@ -17,266 +17,266 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2017-02-03 10:06+0000\n"
|
"POT-Creation-Date: 2016-05-05 13:30+0000\n"
|
||||||
"PO-Revision-Date: 2017-01-04 21:52+0800\n"
|
"PO-Revision-Date: 2016-10-30 02:19+0800\n"
|
||||||
"Last-Translator: Mandy Wang <wangmychn@gmail.com>\n"
|
"Last-Translator: Tong Hui <tonghuix@gmail.com>\n"
|
||||||
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
|
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
|
||||||
"Language: zh_CN\n"
|
"Language: zh_CN\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
"X-Generator: Poedit 1.8.7.1\n"
|
"X-Generator: Poedit 1.8.11\n"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:6
|
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
msgstr "导航"
|
msgstr "导航"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:9
|
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||||
msgid "Move window to workspace 1"
|
msgid "Move window to workspace 1"
|
||||||
msgstr "将窗口移到工作区 1"
|
msgstr "将窗口移到工作区 1"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:12
|
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||||
msgid "Move window to workspace 2"
|
msgid "Move window to workspace 2"
|
||||||
msgstr "将窗口移到工作区 2"
|
msgstr "将窗口移到工作区 2"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:15
|
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||||
msgid "Move window to workspace 3"
|
msgid "Move window to workspace 3"
|
||||||
msgstr "将窗口移到工作区 3"
|
msgstr "将窗口移到工作区 3"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:18
|
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||||
msgid "Move window to workspace 4"
|
msgid "Move window to workspace 4"
|
||||||
msgstr "将窗口移到工作区 4"
|
msgstr "将窗口移到工作区 4"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:21
|
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||||
msgid "Move window to last workspace"
|
msgid "Move window to last workspace"
|
||||||
msgstr "将窗口移到最后一个工作区"
|
msgstr "将窗口移到最后一个工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:24
|
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||||
msgid "Move window one workspace to the left"
|
msgid "Move window one workspace to the left"
|
||||||
msgstr "将窗口左移一个工作区"
|
msgstr "将窗口左移一个工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:27
|
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||||
msgid "Move window one workspace to the right"
|
msgid "Move window one workspace to the right"
|
||||||
msgstr "将窗口右移一个工作区"
|
msgstr "将窗口右移一个工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:30
|
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||||
msgid "Move window one workspace up"
|
msgid "Move window one workspace up"
|
||||||
msgstr "将窗口上移一个工作区"
|
msgstr "将窗口上移一个工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:33
|
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||||
msgid "Move window one workspace down"
|
msgid "Move window one workspace down"
|
||||||
msgstr "将窗口下移一个工作区"
|
msgstr "将窗口下移一个工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:36
|
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||||
msgid "Move window one monitor to the left"
|
msgid "Move window one monitor to the left"
|
||||||
msgstr "将窗口左移一个显示器"
|
msgstr "将窗口左移一个显示器"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:39
|
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||||
msgid "Move window one monitor to the right"
|
msgid "Move window one monitor to the right"
|
||||||
msgstr "将窗口右移一个显示器"
|
msgstr "将窗口右移一个显示器"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:42
|
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||||
msgid "Move window one monitor up"
|
msgid "Move window one monitor up"
|
||||||
msgstr "将窗口上移一个显示器"
|
msgstr "将窗口上移一个显示器"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:45
|
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||||
msgid "Move window one monitor down"
|
msgid "Move window one monitor down"
|
||||||
msgstr "将窗口下移一个显示器"
|
msgstr "将窗口下移一个显示器"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:49
|
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||||
msgid "Switch applications"
|
msgid "Switch applications"
|
||||||
msgstr "切换应用程序"
|
msgstr "切换应用程序"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:54
|
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||||
msgid "Switch to previous application"
|
msgid "Switch to previous application"
|
||||||
msgstr "切换到前一个应用程序"
|
msgstr "切换到前一个应用程序"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:58
|
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||||
msgid "Switch windows"
|
msgid "Switch windows"
|
||||||
msgstr "切换窗口"
|
msgstr "切换窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:63
|
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||||
msgid "Switch to previous window"
|
msgid "Switch to previous window"
|
||||||
msgstr "切换到前一个窗口"
|
msgstr "切换到前一个窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:67
|
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||||
msgid "Switch windows of an application"
|
msgid "Switch windows of an application"
|
||||||
msgstr "在应用程序的窗口之间切换窗口"
|
msgstr "在应用程序的窗口之间切换窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:72
|
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||||
msgid "Switch to previous window of an application"
|
msgid "Switch to previous window of an application"
|
||||||
msgstr "切换到一个应用程序的前一个窗口"
|
msgstr "切换到一个应用程序的前一个窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:76
|
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||||
msgid "Switch system controls"
|
msgid "Switch system controls"
|
||||||
msgstr "切换系统控制"
|
msgstr "切换系统控制"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:81
|
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||||
msgid "Switch to previous system control"
|
msgid "Switch to previous system control"
|
||||||
msgstr "切换到前一个系统控制"
|
msgstr "切换到前一个系统控制"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:85
|
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||||
msgid "Switch windows directly"
|
msgid "Switch windows directly"
|
||||||
msgstr "直接切换窗口"
|
msgstr "直接切换窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:90
|
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||||
msgid "Switch directly to previous window"
|
msgid "Switch directly to previous window"
|
||||||
msgstr "直接切换到前一个窗口"
|
msgstr "直接切换到前一个窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:94
|
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||||
msgid "Switch windows of an app directly"
|
msgid "Switch windows of an app directly"
|
||||||
msgstr "在应用程序窗口间直接移动焦点"
|
msgstr "在应用程序窗口间直接移动焦点"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:99
|
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||||
msgid "Switch directly to previous window of an app"
|
msgid "Switch directly to previous window of an app"
|
||||||
msgstr "直接切换到一个应用程序的前一个窗口"
|
msgstr "直接切换到一个应用程序的前一个窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:103
|
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||||
msgid "Switch system controls directly"
|
msgid "Switch system controls directly"
|
||||||
msgstr "直接切换系统控制"
|
msgstr "直接切换系统控制"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:108
|
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||||
msgid "Switch directly to previous system control"
|
msgid "Switch directly to previous system control"
|
||||||
msgstr "直接切换到前一个系统控制"
|
msgstr "直接切换到前一个系统控制"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:111
|
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||||
msgid "Hide all normal windows"
|
msgid "Hide all normal windows"
|
||||||
msgstr "隐藏所有正常窗口"
|
msgstr "隐藏所有正常窗口"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:114
|
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||||
msgid "Switch to workspace 1"
|
msgid "Switch to workspace 1"
|
||||||
msgstr "切换到工作区 1"
|
msgstr "切换到工作区 1"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:117
|
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||||
msgid "Switch to workspace 2"
|
msgid "Switch to workspace 2"
|
||||||
msgstr "切换到工作区 2"
|
msgstr "切换到工作区 2"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:120
|
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||||
msgid "Switch to workspace 3"
|
msgid "Switch to workspace 3"
|
||||||
msgstr "切换到工作区 3"
|
msgstr "切换到工作区 3"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:123
|
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||||
msgid "Switch to workspace 4"
|
msgid "Switch to workspace 4"
|
||||||
msgstr "切换到工作区 4"
|
msgstr "切换到工作区 4"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:126
|
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||||
msgid "Switch to last workspace"
|
msgid "Switch to last workspace"
|
||||||
msgstr "切换到最后一个工作区"
|
msgstr "切换到最后一个工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:129
|
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||||
msgid "Move to workspace left"
|
msgid "Move to workspace left"
|
||||||
msgstr "移动到左侧工作区"
|
msgstr "移动到左侧工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:132
|
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||||
msgid "Move to workspace right"
|
msgid "Move to workspace right"
|
||||||
msgstr "移动到右侧工作区"
|
msgstr "移动到右侧工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:135
|
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||||
msgid "Move to workspace above"
|
msgid "Move to workspace above"
|
||||||
msgstr "移动到上层工作区"
|
msgstr "移动到上层工作区"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:138
|
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||||
msgid "Move to workspace below"
|
msgid "Move to workspace below"
|
||||||
msgstr "移动到下层工作区"
|
msgstr "移动到下层工作区"
|
||||||
|
|
||||||
#: data/50-mutter-system.xml:6
|
#: ../data/50-mutter-system.xml.in.h:1
|
||||||
msgid "System"
|
msgid "System"
|
||||||
msgstr "系统"
|
msgstr "系统"
|
||||||
|
|
||||||
#: data/50-mutter-system.xml:8
|
#: ../data/50-mutter-system.xml.in.h:2
|
||||||
msgid "Show the run command prompt"
|
msgid "Show the run command prompt"
|
||||||
msgstr "显示运行命令提示符"
|
msgstr "显示运行命令提示符"
|
||||||
|
|
||||||
#: data/50-mutter-system.xml:10
|
#: ../data/50-mutter-system.xml.in.h:3
|
||||||
msgid "Show the activities overview"
|
msgid "Show the activities overview"
|
||||||
msgstr "显示活动大纲"
|
msgstr "显示活动大纲"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:6
|
#: ../data/50-mutter-windows.xml.in.h:1
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "窗口"
|
msgstr "窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:8
|
#: ../data/50-mutter-windows.xml.in.h:2
|
||||||
msgid "Activate the window menu"
|
msgid "Activate the window menu"
|
||||||
msgstr "激活窗口菜单"
|
msgstr "激活窗口菜单"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:10
|
#: ../data/50-mutter-windows.xml.in.h:3
|
||||||
msgid "Toggle fullscreen mode"
|
msgid "Toggle fullscreen mode"
|
||||||
msgstr "切换全屏模式"
|
msgstr "切换全屏模式"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:12
|
#: ../data/50-mutter-windows.xml.in.h:4
|
||||||
msgid "Toggle maximization state"
|
msgid "Toggle maximization state"
|
||||||
msgstr "切换最大化状态"
|
msgstr "切换最大化状态"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:14
|
#: ../data/50-mutter-windows.xml.in.h:5
|
||||||
msgid "Maximize window"
|
msgid "Maximize window"
|
||||||
msgstr "最大化窗口"
|
msgstr "最大化窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:16
|
#: ../data/50-mutter-windows.xml.in.h:6
|
||||||
msgid "Restore window"
|
msgid "Restore window"
|
||||||
msgstr "恢复窗口"
|
msgstr "恢复窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:18
|
#: ../data/50-mutter-windows.xml.in.h:7
|
||||||
msgid "Toggle shaded state"
|
msgid "Toggle shaded state"
|
||||||
msgstr "切换卷起状态"
|
msgstr "切换卷起状态"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:20
|
#: ../data/50-mutter-windows.xml.in.h:8
|
||||||
msgid "Close window"
|
msgid "Close window"
|
||||||
msgstr "关闭窗口"
|
msgstr "关闭窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:22
|
#: ../data/50-mutter-windows.xml.in.h:9
|
||||||
msgid "Hide window"
|
msgid "Hide window"
|
||||||
msgstr "隐藏窗口"
|
msgstr "隐藏窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:24
|
#: ../data/50-mutter-windows.xml.in.h:10
|
||||||
msgid "Move window"
|
msgid "Move window"
|
||||||
msgstr "移动窗口"
|
msgstr "移动窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:26
|
#: ../data/50-mutter-windows.xml.in.h:11
|
||||||
msgid "Resize window"
|
msgid "Resize window"
|
||||||
msgstr "改变窗口大小"
|
msgstr "改变窗口大小"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:29
|
#: ../data/50-mutter-windows.xml.in.h:12
|
||||||
msgid "Toggle window on all workspaces or one"
|
msgid "Toggle window on all workspaces or one"
|
||||||
msgstr "在位于所有或仅一个工作区的窗口间切换"
|
msgstr "在位于所有或仅一个工作区的窗口间切换"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:31
|
#: ../data/50-mutter-windows.xml.in.h:13
|
||||||
msgid "Raise window if covered, otherwise lower it"
|
msgid "Raise window if covered, otherwise lower it"
|
||||||
msgstr "如果窗口被其他窗口遮盖,则提升它,否则降低它"
|
msgstr "如果窗口被其他窗口遮盖,则提升它,否则降低它"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:33
|
#: ../data/50-mutter-windows.xml.in.h:14
|
||||||
msgid "Raise window above other windows"
|
msgid "Raise window above other windows"
|
||||||
msgstr "将窗口提升到其它窗口之上"
|
msgstr "将窗口提升到其它窗口之上"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:35
|
#: ../data/50-mutter-windows.xml.in.h:15
|
||||||
msgid "Lower window below other windows"
|
msgid "Lower window below other windows"
|
||||||
msgstr "将窗口降低到其它窗口之下"
|
msgstr "将窗口降低到其它窗口之下"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:37
|
#: ../data/50-mutter-windows.xml.in.h:16
|
||||||
msgid "Maximize window vertically"
|
msgid "Maximize window vertically"
|
||||||
msgstr "垂直最大化窗口"
|
msgstr "垂直最大化窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:39
|
#: ../data/50-mutter-windows.xml.in.h:17
|
||||||
msgid "Maximize window horizontally"
|
msgid "Maximize window horizontally"
|
||||||
msgstr "水平最大化窗口"
|
msgstr "水平最大化窗口"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:43
|
#: ../data/50-mutter-windows.xml.in.h:18
|
||||||
msgid "View split on left"
|
msgid "View split on left"
|
||||||
msgstr "在左侧查看分割"
|
msgstr "在左侧查看分割"
|
||||||
|
|
||||||
#: data/50-mutter-windows.xml:47
|
#: ../data/50-mutter-windows.xml.in.h:19
|
||||||
msgid "View split on right"
|
msgid "View split on right"
|
||||||
msgstr "在右侧查看分割"
|
msgstr "在右侧查看分割"
|
||||||
|
|
||||||
#: data/mutter.desktop.in:4
|
#: ../data/mutter.desktop.in.h:1
|
||||||
msgid "Mutter"
|
msgid "Mutter"
|
||||||
msgstr "Mutter"
|
msgstr "Mutter"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:7
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
|
||||||
msgid "Modifier to use for extended window management operations"
|
msgid "Modifier to use for extended window management operations"
|
||||||
msgstr "用于修改窗口点击动作的修饰键 met"
|
msgstr "用于修改窗口点击动作的修饰键 met"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:8
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key will initiate the \"overlay\", which is a combination window "
|
"This key will initiate the \"overlay\", which is a combination window "
|
||||||
"overview and application launching system. The default is intended to be the "
|
"overview and application launching system. The default is intended to be the "
|
||||||
@@ -286,11 +286,11 @@ msgstr ""
|
|||||||
"这个键指出的“覆盖”是一种混合窗口概述和应用程序运行的系统。默认要求使用 "
|
"这个键指出的“覆盖”是一种混合窗口概述和应用程序运行的系统。默认要求使用 "
|
||||||
"“Super 键”。可能使用默认或者空白。"
|
"“Super 键”。可能使用默认或者空白。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||||
msgid "Attach modal dialogs"
|
msgid "Attach modal dialogs"
|
||||||
msgstr "依附模态对话框"
|
msgstr "依附模态对话框"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:21
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
|
||||||
msgid ""
|
msgid ""
|
||||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||||
"attached to the titlebar of the parent window and are moved together with "
|
"attached to the titlebar of the parent window and are moved together with "
|
||||||
@@ -299,11 +299,11 @@ msgstr ""
|
|||||||
"当为 true 时,模态对话框会依附在父窗口的标题栏出现,并随父窗口移动,而不使用"
|
"当为 true 时,模态对话框会依附在父窗口的标题栏出现,并随父窗口移动,而不使用"
|
||||||
"单独的标题栏。"
|
"单独的标题栏。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:30
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr "当窗口位于屏幕边缘时,启用边缘平铺"
|
msgstr "当窗口位于屏幕边缘时,启用边缘平铺"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:31
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
|
||||||
msgid ""
|
msgid ""
|
||||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||||
"vertically and resizes them horizontally to cover half of the available "
|
"vertically and resizes them horizontally to cover half of the available "
|
||||||
@@ -312,11 +312,11 @@ msgstr ""
|
|||||||
"如果启用,将窗口拖放到屏幕竖直边缘时会将窗口纵向最大化、横向占据半屏;将窗口"
|
"如果启用,将窗口拖放到屏幕竖直边缘时会将窗口纵向最大化、横向占据半屏;将窗口"
|
||||||
"拖放到屏幕上边缘时会将窗口最大化。"
|
"拖放到屏幕上边缘时会将窗口最大化。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:40
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
msgstr "动态管理工作区"
|
msgstr "动态管理工作区"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
|
||||||
msgid ""
|
msgid ""
|
||||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||||
"static number of workspaces (determined by the num-workspaces key in org."
|
"static number of workspaces (determined by the num-workspaces key in org."
|
||||||
@@ -326,32 +326,32 @@ msgstr ""
|
|||||||
"的 num-workspaces 键确定)。"
|
"的 num-workspaces 键确定)。"
|
||||||
|
|
||||||
# 或者 只在主显示器上显示工作区
|
# 或者 只在主显示器上显示工作区
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||||
msgid "Workspaces only on primary"
|
msgid "Workspaces only on primary"
|
||||||
msgstr "只对主显示器上的工作区"
|
msgstr "只对主显示器上的工作区"
|
||||||
|
|
||||||
# monitors 是否该翻译为 屏幕?
|
# monitors 是否该翻译为 屏幕?
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:51
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
|
||||||
msgid ""
|
msgid ""
|
||||||
"Determines whether workspace switching should happen for windows on all "
|
"Determines whether workspace switching should happen for windows on all "
|
||||||
"monitors or only for windows on the primary monitor."
|
"monitors or only for windows on the primary monitor."
|
||||||
msgstr "决定工作区切换对所有显示器上的窗口还是只对主显示器上的有效。"
|
msgstr "决定工作区切换对所有显示器上的窗口还是只对主显示器上的有效。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:59
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||||
msgid "No tab popup"
|
msgid "No tab popup"
|
||||||
msgstr "TAB轮换不弹出"
|
msgstr "TAB轮换不弹出"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:60
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
|
||||||
msgid ""
|
msgid ""
|
||||||
"Determines whether the use of popup and highlight frame should be disabled "
|
"Determines whether the use of popup and highlight frame should be disabled "
|
||||||
"for window cycling."
|
"for window cycling."
|
||||||
msgstr "决定窗口轮换时是否禁用弹出和高亮边框。"
|
msgstr "决定窗口轮换时是否禁用弹出和高亮边框。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:68
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
|
||||||
msgid "Delay focus changes until the pointer stops moving"
|
msgid "Delay focus changes until the pointer stops moving"
|
||||||
msgstr "将焦点改变推迟到光标停止移动之后"
|
msgstr "将焦点改变推迟到光标停止移动之后"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:69
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
|
||||||
msgid ""
|
msgid ""
|
||||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
"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 "
|
"the focus will not be changed immediately when entering a window, but only "
|
||||||
@@ -360,202 +360,187 @@ msgstr ""
|
|||||||
"如果为 true,而聚焦模式为“sloppy”或“mouse”,那么进入某个窗口时焦点将不会立即"
|
"如果为 true,而聚焦模式为“sloppy”或“mouse”,那么进入某个窗口时焦点将不会立即"
|
||||||
"改变,而是等到光标停止移动之后。"
|
"改变,而是等到光标停止移动之后。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||||
msgid "Draggable border width"
|
msgid "Draggable border width"
|
||||||
msgstr "可拖拽的边界宽度"
|
msgstr "可拖拽的边界宽度"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:80
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
|
||||||
msgid ""
|
msgid ""
|
||||||
"The amount of total draggable borders. If the theme's visible borders are "
|
"The amount of total draggable borders. If the theme's visible borders are "
|
||||||
"not enough, invisible borders will be added to meet this value."
|
"not enough, invisible borders will be added to meet this value."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"可拖拽的边界总数。如果主题的可见边界不足,将添加不可见的边界来满足此值。"
|
"可拖拽的边界总数。如果主题的可见边界不足,将添加不可见的边界来满足此值。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:89
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
|
||||||
msgid "Auto maximize nearly monitor sized windows"
|
msgid "Auto maximize nearly monitor sized windows"
|
||||||
msgstr "自动最大化接近显示器大小的窗口"
|
msgstr "自动最大化接近显示器大小的窗口"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:90
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
|
||||||
msgid ""
|
msgid ""
|
||||||
"If enabled, new windows that are initially the size of the monitor "
|
"If enabled, new windows that are initially the size of the monitor "
|
||||||
"automatically get maximized."
|
"automatically get maximized."
|
||||||
msgstr "如果启用,初始时为显示器大小的新窗口将自动最大化"
|
msgstr "如果启用,初始时为显示器大小的新窗口将自动最大化"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:98
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
|
||||||
msgid "Place new windows in the center"
|
msgid "Place new windows in the center"
|
||||||
msgstr "将窗口置于中央"
|
msgstr "将窗口置于中央"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:99
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
|
||||||
msgid ""
|
msgid ""
|
||||||
"When true, the new windows will always be put in the center of the active "
|
"When true, the new windows will always be put in the center of the active "
|
||||||
"screen of the monitor."
|
"screen of the monitor."
|
||||||
msgstr "为 true 时,新窗口将总是置于此显示器已激活屏幕的中央。"
|
msgstr "为 true 时,新窗口将总是置于此显示器已激活屏幕的中央。"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||||
msgid "Select window from tab popup"
|
msgid "Select window from tab popup"
|
||||||
msgstr "从 Tab 轮换弹出界面选择窗口"
|
msgstr "从 Tab 轮换弹出界面选择窗口"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "取消 Tab 轮换弹出"
|
msgstr "取消 Tab 轮换弹出"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||||
msgid "Switch to VT 1"
|
msgid "Switch to VT 1"
|
||||||
msgstr "切换到 VT 1"
|
msgstr "切换到 VT 1"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||||
msgid "Switch to VT 2"
|
msgid "Switch to VT 2"
|
||||||
msgstr "切换到 VT 2"
|
msgstr "切换到 VT 2"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||||
msgid "Switch to VT 3"
|
msgid "Switch to VT 3"
|
||||||
msgstr "切换到 VT 3"
|
msgstr "切换到 VT 3"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||||
msgid "Switch to VT 4"
|
msgid "Switch to VT 4"
|
||||||
msgstr "切换到 VT 4"
|
msgstr "切换到 VT 4"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||||
msgid "Switch to VT 5"
|
msgid "Switch to VT 5"
|
||||||
msgstr "切换到 VT 5"
|
msgstr "切换到 VT 5"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||||
msgid "Switch to VT 6"
|
msgid "Switch to VT 6"
|
||||||
msgstr "切换到 VT 6"
|
msgstr "切换到 VT 6"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "切换到 VT 7"
|
msgstr "切换到 VT 7"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||||
msgid "Switch to VT 8"
|
msgid "Switch to VT 8"
|
||||||
msgstr "切换到 VT 8"
|
msgstr "切换到 VT 8"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||||
msgid "Switch to VT 9"
|
msgid "Switch to VT 9"
|
||||||
msgstr "切换到 VT 9"
|
msgstr "切换到 VT 9"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||||
msgid "Switch to VT 10"
|
msgid "Switch to VT 10"
|
||||||
msgstr "切换到 VT 10"
|
msgstr "切换到 VT 10"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||||
msgid "Switch to VT 11"
|
msgid "Switch to VT 11"
|
||||||
msgstr "切换到 VT 11"
|
msgstr "切换到 VT 11"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||||
msgid "Switch to VT 12"
|
msgid "Switch to VT 12"
|
||||||
msgstr "切换到 VT 12"
|
msgstr "切换到 VT 12"
|
||||||
|
|
||||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
#: ../src/backends/meta-monitor-manager.c:518
|
||||||
#. * mapping through the available outputs.
|
|
||||||
#.
|
|
||||||
#: src/backends/meta-input-settings.c:1861
|
|
||||||
msgid "Switch monitor"
|
|
||||||
msgstr "切换显示器"
|
|
||||||
|
|
||||||
#: src/backends/meta-input-settings.c:1863
|
|
||||||
msgid "Show on-screen help"
|
|
||||||
msgstr "显示在屏帮助"
|
|
||||||
|
|
||||||
#: src/backends/meta-monitor-manager.c:515
|
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "内置显示器"
|
msgstr "内置显示屏"
|
||||||
|
|
||||||
#: src/backends/meta-monitor-manager.c:538
|
#: ../src/backends/meta-monitor-manager.c:544
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "未知"
|
msgstr "未知"
|
||||||
|
|
||||||
#: src/backends/meta-monitor-manager.c:540
|
#: ../src/backends/meta-monitor-manager.c:546
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "未知的 Display"
|
msgstr "未知的显示器"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: src/backends/meta-monitor-manager.c:548
|
#: ../src/backends/meta-monitor-manager.c:554
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: src/compositor/compositor.c:471
|
#: ../src/compositor/compositor.c:456
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
"\"."
|
"\"."
|
||||||
msgstr "显示器 %2$s 的屏幕 %1$i 上已有另外一个混成窗口管理器正在运行。"
|
msgstr "DISPLAY %2$s 的屏幕 %1$i 上已有另外一个混成窗口管理器正在运行。"
|
||||||
|
|
||||||
#: src/core/bell.c:194
|
#: ../src/core/bell.c:185
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "响铃事件"
|
msgstr "响铃事件"
|
||||||
|
|
||||||
#: src/core/delete.c:127
|
#: ../src/core/delete.c:127
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "“%s” is not responding."
|
msgid "“%s” is not responding."
|
||||||
msgstr "“%s” 未响应。"
|
msgstr "“%s” 未响应。"
|
||||||
|
|
||||||
#: src/core/delete.c:129
|
#: ../src/core/delete.c:129
|
||||||
msgid "Application is not responding."
|
msgid "Application is not responding."
|
||||||
msgstr "应用程序未响应。"
|
msgstr "应用程序未响应。"
|
||||||
|
|
||||||
#: src/core/delete.c:134
|
#: ../src/core/delete.c:134
|
||||||
msgid ""
|
msgid ""
|
||||||
"You may choose to wait a short while for it to continue or force the "
|
"You may choose to wait a short while for it to continue or force the "
|
||||||
"application to quit entirely."
|
"application to quit entirely."
|
||||||
msgstr "您可以选择稍等一会儿,或者强制退出该应用程序。"
|
msgstr "您可以选择稍等一会儿,或者强制退出该应用程序。"
|
||||||
|
|
||||||
#: src/core/delete.c:141
|
#: ../src/core/delete.c:141
|
||||||
msgid "_Wait"
|
msgid "_Wait"
|
||||||
msgstr "等待(_W)"
|
msgstr "等待(_W)"
|
||||||
|
|
||||||
#: src/core/delete.c:141
|
#: ../src/core/delete.c:141
|
||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "强制退出(_F)"
|
msgstr "强制退出(_F)"
|
||||||
|
|
||||||
#: src/core/display.c:590
|
#: ../src/core/display.c:563
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "无法打开 X Window System 显示器“%s”\n"
|
msgstr "无法打开 X Window System 显示“%s”\n"
|
||||||
|
|
||||||
#: src/core/main.c:182
|
#: ../src/core/main.c:176
|
||||||
msgid "Disable connection to session manager"
|
msgid "Disable connection to session manager"
|
||||||
msgstr "禁止连接到会话管理器"
|
msgstr "禁止连接到会话管理器"
|
||||||
|
|
||||||
#: src/core/main.c:188
|
#: ../src/core/main.c:182
|
||||||
msgid "Replace the running window manager"
|
msgid "Replace the running window manager"
|
||||||
msgstr "替换正在运行的窗口管理器"
|
msgstr "替换正在运行的窗口管理器"
|
||||||
|
|
||||||
#: src/core/main.c:194
|
#: ../src/core/main.c:188
|
||||||
msgid "Specify session management ID"
|
msgid "Specify session management ID"
|
||||||
msgstr "指定会话管理 ID"
|
msgstr "指定会话管理 ID"
|
||||||
|
|
||||||
#: src/core/main.c:199
|
#: ../src/core/main.c:193
|
||||||
msgid "X Display to use"
|
msgid "X Display to use"
|
||||||
msgstr "要使用的 X Display"
|
msgstr "要使用的 X 显示"
|
||||||
|
|
||||||
#: src/core/main.c:205
|
#: ../src/core/main.c:199
|
||||||
msgid "Initialize session from savefile"
|
msgid "Initialize session from savefile"
|
||||||
msgstr "从保存文件中初始化会话"
|
msgstr "从保存文件中初始化会话"
|
||||||
|
|
||||||
#: src/core/main.c:211
|
#: ../src/core/main.c:205
|
||||||
msgid "Make X calls synchronous"
|
msgid "Make X calls synchronous"
|
||||||
msgstr "使 X 调用同步"
|
msgstr "使 X 调用同步"
|
||||||
|
|
||||||
#: src/core/main.c:218
|
#: ../src/core/main.c:212
|
||||||
msgid "Run as a wayland compositor"
|
msgid "Run as a wayland compositor"
|
||||||
msgstr "作为 wayland 混成管理器运行"
|
msgstr "作为 wayland 混成管理器运行"
|
||||||
|
|
||||||
#: src/core/main.c:224
|
#: ../src/core/main.c:220
|
||||||
msgid "Run as a nested compositor"
|
|
||||||
msgstr "作为嵌套混成器运行"
|
|
||||||
|
|
||||||
#: src/core/main.c:232
|
|
||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "以完整显示服务器方式运行,而不是以嵌套方式"
|
msgstr "以完整显示服务器方式运行,而不是以嵌套方式"
|
||||||
|
|
||||||
#: src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"mutter %s\n"
|
"mutter %s\n"
|
||||||
@@ -569,43 +554,38 @@ msgstr ""
|
|||||||
"本软件为自由软件:版权条款请参见源码\n"
|
"本软件为自由软件:版权条款请参见源码\n"
|
||||||
"不存在任何保证:即便是对商业性或者特定目的的适应性也不作保证。\n"
|
"不存在任何保证:即便是对商业性或者特定目的的适应性也不作保证。\n"
|
||||||
|
|
||||||
#: src/core/mutter.c:53
|
#: ../src/core/mutter.c:53
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "打印版本"
|
msgstr "打印版本"
|
||||||
|
|
||||||
#: src/core/mutter.c:59
|
#: ../src/core/mutter.c:59
|
||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "要使用的 Mutter 插件"
|
msgstr "要使用的 Mutter 插件"
|
||||||
|
|
||||||
#: src/core/prefs.c:1997
|
#: ../src/core/prefs.c:2050
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "工作区 %d"
|
msgstr "工作区 %d"
|
||||||
|
|
||||||
#: src/core/screen.c:521
|
#: ../src/core/screen.c:526
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||||
"to replace the current window manager."
|
"to replace the current window manager."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Display“%s”已经有一个窗口管理器;请尝试使用 --replace 选项替换当前的窗口管理"
|
"显示器“%s”已经有一个窗口管理器,请尝试使用 --replace 选项替换当前的窗口管理"
|
||||||
"器。"
|
"器。"
|
||||||
|
|
||||||
#: src/core/screen.c:606
|
#: ../src/core/screen.c:608
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "显示“%2$s”上的屏幕 %1$d 无效\n"
|
msgstr "显示“%2$s”上的屏幕 %1$d 无效\n"
|
||||||
|
|
||||||
#: src/core/util.c:120
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter 编译的时候没有加入详细模式的支持\n"
|
msgstr "Mutter 编译的时候没有加入详细模式的支持\n"
|
||||||
|
|
||||||
#: src/wayland/meta-wayland-tablet-pad.c:595
|
#: ../src/x11/session.c:1815
|
||||||
#, c-format
|
|
||||||
msgid "Mode Switch: Mode %d"
|
|
||||||
msgstr "模式切换:%d 模式"
|
|
||||||
|
|
||||||
#: src/x11/session.c:1815
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"These windows do not support "save current setup" and will have to "
|
"These windows do not support "save current setup" and will have to "
|
||||||
"be restarted manually next time you log in."
|
"be restarted manually next time you log in."
|
||||||
@@ -613,7 +593,7 @@ msgstr ""
|
|||||||
"这些窗口不支持 "保存当前设置 " 您在下次登录时,必须手动重启动它"
|
"这些窗口不支持 "保存当前设置 " 您在下次登录时,必须手动重启动它"
|
||||||
"们。"
|
"们。"
|
||||||
|
|
||||||
#: src/x11/window-props.c:548
|
#: ../src/x11/window-props.c:549
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (于 %s)"
|
msgstr "%s (于 %s)"
|
||||||
|
@@ -107,9 +107,6 @@ struct _MetaInputSettingsClass
|
|||||||
void (* set_trackball_accel_profile) (MetaInputSettings *settings,
|
void (* set_trackball_accel_profile) (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
GDesktopPointerAccelProfile profile);
|
GDesktopPointerAccelProfile profile);
|
||||||
|
|
||||||
gboolean (* has_two_finger_scroll) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType meta_input_settings_get_type (void) G_GNUC_CONST;
|
GType meta_input_settings_get_type (void) G_GNUC_CONST;
|
||||||
|
@@ -83,8 +83,6 @@ struct _MetaInputSettingsPrivate
|
|||||||
#ifdef HAVE_LIBWACOM
|
#ifdef HAVE_LIBWACOM
|
||||||
WacomDeviceDatabase *wacom_db;
|
WacomDeviceDatabase *wacom_db;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GHashTable *two_finger_devices;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
|
typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
|
||||||
@@ -150,8 +148,6 @@ meta_input_settings_dispose (GObject *object)
|
|||||||
libwacom_database_destroy (priv->wacom_db);
|
libwacom_database_destroy (priv->wacom_db);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
g_clear_pointer (&priv->two_finger_devices, g_hash_table_destroy);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,8 +483,6 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
|||||||
{
|
{
|
||||||
MetaInputSettingsClass *input_settings_class;
|
MetaInputSettingsClass *input_settings_class;
|
||||||
gboolean edge_scroll_enabled;
|
gboolean edge_scroll_enabled;
|
||||||
gboolean two_finger_scroll_enabled;
|
|
||||||
gboolean two_finger_scroll_available;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
|
|
||||||
if (device &&
|
if (device &&
|
||||||
@@ -498,12 +492,6 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
|||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (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");
|
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)
|
if (device)
|
||||||
{
|
{
|
||||||
@@ -535,10 +523,6 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
|
|||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (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");
|
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)
|
if (device)
|
||||||
{
|
{
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
settings_device_set_bool_setting (input_settings, device,
|
||||||
@@ -551,10 +535,6 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
|
|||||||
(ConfigBoolFunc) input_settings_class->set_two_finger_scroll,
|
(ConfigBoolFunc) input_settings_class->set_two_finger_scroll,
|
||||||
two_finger_scroll_enabled);
|
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
|
static void
|
||||||
@@ -685,9 +665,6 @@ update_keyboard_repeat (MetaInputSettings *input_settings)
|
|||||||
delay = g_settings_get_uint (priv->keyboard_settings, "delay");
|
delay = g_settings_get_uint (priv->keyboard_settings, "delay");
|
||||||
interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
|
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 = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
input_settings_class->set_keyboard_repeat (input_settings,
|
input_settings_class->set_keyboard_repeat (input_settings,
|
||||||
repeat, delay, interval);
|
repeat, delay, interval);
|
||||||
@@ -753,9 +730,7 @@ update_tablet_keep_aspect (MetaInputSettings *input_settings,
|
|||||||
MetaOutput *output = NULL;
|
MetaOutput *output = NULL;
|
||||||
gboolean keep_aspect;
|
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;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_LIBWACOM
|
#ifdef HAVE_LIBWACOM
|
||||||
@@ -803,8 +778,6 @@ update_device_display (MetaInputSettings *input_settings,
|
|||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
|
|
||||||
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_TOUCHSCREEN_DEVICE)
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHSCREEN_DEVICE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -838,9 +811,7 @@ update_tablet_mapping (MetaInputSettings *input_settings,
|
|||||||
GDesktopTabletMapping mapping;
|
GDesktopTabletMapping mapping;
|
||||||
DeviceMappingInfo *info;
|
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;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_LIBWACOM
|
#ifdef HAVE_LIBWACOM
|
||||||
@@ -881,9 +852,7 @@ update_tablet_area (MetaInputSettings *input_settings,
|
|||||||
const guint32 *area;
|
const guint32 *area;
|
||||||
gsize n_elems;
|
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;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_LIBWACOM
|
#ifdef HAVE_LIBWACOM
|
||||||
@@ -922,10 +891,7 @@ update_tablet_left_handed (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsClass *input_settings_class;
|
MetaInputSettingsClass *input_settings_class;
|
||||||
gboolean enabled;
|
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;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_LIBWACOM
|
#ifdef HAVE_LIBWACOM
|
||||||
@@ -1418,23 +1384,6 @@ apply_device_settings (MetaInputSettings *input_settings,
|
|||||||
device);
|
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
|
static void
|
||||||
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
@@ -1443,8 +1392,6 @@ meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
|||||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
evaluate_two_finger_scrolling (input_settings, device);
|
|
||||||
|
|
||||||
apply_device_settings (input_settings, device);
|
apply_device_settings (input_settings, device);
|
||||||
check_add_mappable_device (input_settings, device);
|
check_add_mappable_device (input_settings, device);
|
||||||
}
|
}
|
||||||
@@ -1458,10 +1405,6 @@ meta_input_settings_device_removed (ClutterDeviceManager *device_manager,
|
|||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
g_hash_table_remove (priv->mappable_devices, device);
|
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
|
static void
|
||||||
@@ -1488,13 +1431,6 @@ static void
|
|||||||
meta_input_settings_constructed (GObject *object)
|
meta_input_settings_constructed (GObject *object)
|
||||||
{
|
{
|
||||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (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);
|
apply_device_settings (input_settings, NULL);
|
||||||
update_keyboard_repeat (input_settings);
|
update_keyboard_repeat (input_settings);
|
||||||
@@ -1556,8 +1492,6 @@ meta_input_settings_init (MetaInputSettings *settings)
|
|||||||
"expect tablets to misbehave");
|
"expect tablets to misbehave");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
priv->two_finger_devices = g_hash_table_new (NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaInputSettings *
|
MetaInputSettings *
|
||||||
|
@@ -454,7 +454,7 @@ handle_end_element (GMarkupParseContext *context,
|
|||||||
{
|
{
|
||||||
if (strcmp (element_name, "configuration") == 0 && parser->unknown_count == 0)
|
if (strcmp (element_name, "configuration") == 0 && parser->unknown_count == 0)
|
||||||
{
|
{
|
||||||
MetaConfiguration *config = config_new ();
|
MetaConfiguration *config = g_slice_new (MetaConfiguration);
|
||||||
|
|
||||||
g_assert (parser->key_array->len == parser->output_array->len);
|
g_assert (parser->key_array->len == parser->output_array->len);
|
||||||
|
|
||||||
|
@@ -135,7 +135,6 @@ construct_tile_monitor (MetaMonitorManager *manager,
|
|||||||
info.width_mm = output->width_mm;
|
info.width_mm = output->width_mm;
|
||||||
info.height_mm = output->height_mm;
|
info.height_mm = output->height_mm;
|
||||||
info.winsys_id = output->winsys_id;
|
info.winsys_id = output->winsys_id;
|
||||||
info.scale = output->scale;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hack */
|
/* hack */
|
||||||
|
@@ -63,7 +63,6 @@ static GQuark quark_cursor_sprite = 0;
|
|||||||
|
|
||||||
struct _MetaCursorRendererNativePrivate
|
struct _MetaCursorRendererNativePrivate
|
||||||
{
|
{
|
||||||
gboolean hw_state_invalidated;
|
|
||||||
gboolean has_hw_cursor;
|
gboolean has_hw_cursor;
|
||||||
|
|
||||||
MetaCursorSprite *last_cursor;
|
MetaCursorSprite *last_cursor;
|
||||||
@@ -160,7 +159,8 @@ set_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite,
|
|||||||
static void
|
static void
|
||||||
set_crtc_cursor (MetaCursorRendererNative *native,
|
set_crtc_cursor (MetaCursorRendererNative *native,
|
||||||
MetaCRTC *crtc,
|
MetaCRTC *crtc,
|
||||||
MetaCursorSprite *cursor_sprite)
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
gboolean force)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
|||||||
else
|
else
|
||||||
bo = get_active_cursor_sprite_gbm_bo (cursor_sprite);
|
bo = get_active_cursor_sprite_gbm_bo (cursor_sprite);
|
||||||
|
|
||||||
if (!priv->hw_state_invalidated && bo == crtc->cursor_renderer_private)
|
if (!force && bo == crtc->cursor_renderer_private)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
crtc->cursor_renderer_private = bo;
|
crtc->cursor_renderer_private = bo;
|
||||||
@@ -197,7 +197,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (priv->hw_state_invalidated || crtc->cursor_renderer_private != NULL)
|
if (force || crtc->cursor_renderer_private != NULL)
|
||||||
{
|
{
|
||||||
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, 0, 0, 0, 0, 0);
|
||||||
crtc->cursor_renderer_private = NULL;
|
crtc->cursor_renderer_private = NULL;
|
||||||
@@ -207,7 +207,8 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
update_hw_cursor (MetaCursorRendererNative *native,
|
update_hw_cursor (MetaCursorRendererNative *native,
|
||||||
MetaCursorSprite *cursor_sprite)
|
MetaCursorSprite *cursor_sprite,
|
||||||
|
gboolean force)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||||
@@ -240,7 +241,7 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
|||||||
else
|
else
|
||||||
crtc_cursor = NULL;
|
crtc_cursor = NULL;
|
||||||
|
|
||||||
set_crtc_cursor (native, &crtcs[i], crtc_cursor);
|
set_crtc_cursor (native, &crtcs[i], crtc_cursor, force);
|
||||||
|
|
||||||
if (crtc_cursor)
|
if (crtc_cursor)
|
||||||
{
|
{
|
||||||
@@ -251,8 +252,6 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->hw_state_invalidated = FALSE;
|
|
||||||
|
|
||||||
if (painted)
|
if (painted)
|
||||||
meta_cursor_renderer_emit_painted (renderer, cursor_sprite);
|
meta_cursor_renderer_emit_painted (renderer, cursor_sprite);
|
||||||
}
|
}
|
||||||
@@ -395,7 +394,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer,
|
|||||||
meta_cursor_renderer_native_trigger_frame (native, cursor_sprite);
|
meta_cursor_renderer_native_trigger_frame (native, cursor_sprite);
|
||||||
|
|
||||||
priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite);
|
priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite);
|
||||||
update_hw_cursor (native, cursor_sprite);
|
update_hw_cursor (native, cursor_sprite, FALSE);
|
||||||
return priv->has_hw_cursor;
|
return priv->has_hw_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -649,11 +648,8 @@ static void
|
|||||||
force_update_hw_cursor (MetaCursorRendererNative *native)
|
force_update_hw_cursor (MetaCursorRendererNative *native)
|
||||||
{
|
{
|
||||||
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||||
MetaCursorRendererNativePrivate *priv =
|
|
||||||
meta_cursor_renderer_native_get_instance_private (native);
|
|
||||||
|
|
||||||
priv->hw_state_invalidated = TRUE;
|
update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE);
|
||||||
update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -674,8 +670,6 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
|
|||||||
g_signal_connect_object (monitors, "monitors-changed",
|
g_signal_connect_object (monitors, "monitors-changed",
|
||||||
G_CALLBACK (on_monitors_changed), native, 0);
|
G_CALLBACK (on_monitors_changed), native, 0);
|
||||||
|
|
||||||
priv->hw_state_invalidated = TRUE;
|
|
||||||
|
|
||||||
#if defined(CLUTTER_WINDOWING_EGL)
|
#if defined(CLUTTER_WINDOWING_EGL)
|
||||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
||||||
{
|
{
|
||||||
|
@@ -141,18 +141,28 @@ static gboolean
|
|||||||
device_set_scroll_method (struct libinput_device *libinput_device,
|
device_set_scroll_method (struct libinput_device *libinput_device,
|
||||||
enum libinput_config_scroll_method method)
|
enum libinput_config_scroll_method method)
|
||||||
{
|
{
|
||||||
enum libinput_config_status status =
|
enum libinput_config_scroll_method supported;
|
||||||
|
|
||||||
|
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
||||||
|
|
||||||
|
if (method & supported)
|
||||||
libinput_device_config_scroll_set_method (libinput_device, method);
|
libinput_device_config_scroll_set_method (libinput_device, method);
|
||||||
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
|
|
||||||
|
return (method & supported) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
device_set_click_method (struct libinput_device *libinput_device,
|
device_set_click_method (struct libinput_device *libinput_device,
|
||||||
enum libinput_config_click_method method)
|
enum libinput_config_click_method method)
|
||||||
{
|
{
|
||||||
enum libinput_config_status status =
|
enum libinput_config_click_method supported;
|
||||||
|
|
||||||
|
supported = libinput_device_config_click_get_methods (libinput_device);
|
||||||
|
|
||||||
|
if (method & supported)
|
||||||
libinput_device_config_click_set_method (libinput_device, method);
|
libinput_device_config_click_set_method (libinput_device, method);
|
||||||
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
|
|
||||||
|
return (method & supported) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -160,16 +170,32 @@ meta_input_settings_native_set_edge_scroll (MetaInputSettings *settin
|
|||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
gboolean edge_scrolling_enabled)
|
gboolean edge_scrolling_enabled)
|
||||||
{
|
{
|
||||||
|
enum libinput_config_scroll_method scroll_method = 0;
|
||||||
struct libinput_device *libinput_device;
|
struct libinput_device *libinput_device;
|
||||||
enum libinput_config_scroll_method current, method;
|
enum libinput_config_scroll_method supported;
|
||||||
|
enum libinput_config_scroll_method current;
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||||
|
if (!libinput_device)
|
||||||
method = edge_scrolling_enabled ? LIBINPUT_CONFIG_SCROLL_EDGE : LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
return;
|
||||||
|
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
||||||
current = libinput_device_config_scroll_get_method (libinput_device);
|
current = libinput_device_config_scroll_get_method (libinput_device);
|
||||||
current &= ~LIBINPUT_CONFIG_SCROLL_EDGE;
|
|
||||||
|
|
||||||
device_set_scroll_method (libinput_device, current | method);
|
/* 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -177,29 +203,31 @@ meta_input_settings_native_set_two_finger_scroll (MetaInputSettings *
|
|||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
gboolean two_finger_scroll_enabled)
|
gboolean two_finger_scroll_enabled)
|
||||||
{
|
{
|
||||||
|
enum libinput_config_scroll_method scroll_method = 0;
|
||||||
struct libinput_device *libinput_device;
|
struct libinput_device *libinput_device;
|
||||||
enum libinput_config_scroll_method current, method;
|
enum libinput_config_scroll_method supported;
|
||||||
|
enum libinput_config_scroll_method current;
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
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_device_config_scroll_get_method (libinput_device);
|
||||||
current &= ~LIBINPUT_CONFIG_SCROLL_2FG;
|
|
||||||
|
|
||||||
device_set_scroll_method (libinput_device, current | method);
|
if (two_finger_scroll_enabled &&
|
||||||
}
|
!(supported & LIBINPUT_CONFIG_SCROLL_2FG))
|
||||||
|
return;
|
||||||
|
|
||||||
static gboolean
|
if (two_finger_scroll_enabled)
|
||||||
meta_input_settings_native_has_two_finger_scroll (MetaInputSettings *settings,
|
{
|
||||||
ClutterInputDevice *device)
|
scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||||
{
|
}
|
||||||
struct libinput_device *libinput_device;
|
else if (current != LIBINPUT_CONFIG_SCROLL_EDGE)
|
||||||
|
{
|
||||||
|
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
device_set_scroll_method (libinput_device, scroll_method);
|
||||||
if (!libinput_device)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return libinput_device_config_scroll_get_methods (libinput_device) & LIBINPUT_CONFIG_SCROLL_2FG;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -431,8 +459,6 @@ 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_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->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
|
static void
|
||||||
|
@@ -47,6 +47,8 @@
|
|||||||
#include "meta-idle-monitor-native.h"
|
#include "meta-idle-monitor-native.h"
|
||||||
#include "meta-renderer-native.h"
|
#include "meta-renderer-native.h"
|
||||||
|
|
||||||
|
#define DRM_CARD_UDEV_DEVICE_TYPE "drm_minor"
|
||||||
|
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevDevice, g_object_unref)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevDevice, g_object_unref)
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevClient, g_object_unref)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevClient, g_object_unref)
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref)
|
||||||
@@ -282,6 +284,55 @@ on_active_changed (Login1Session *session,
|
|||||||
sync_active (self);
|
sync_active (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
count_devices_with_connectors (const gchar *seat_name,
|
||||||
|
GList *devices)
|
||||||
|
{
|
||||||
|
g_autoptr (GHashTable) cards = NULL;
|
||||||
|
GList *tmp;
|
||||||
|
|
||||||
|
cards = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
|
||||||
|
for (tmp = devices; tmp != NULL; tmp = tmp->next)
|
||||||
|
{
|
||||||
|
GUdevDevice *device = tmp->data;
|
||||||
|
g_autoptr (GUdevDevice) parent_device = NULL;
|
||||||
|
const gchar *parent_device_type = NULL;
|
||||||
|
const gchar *parent_device_name = NULL;
|
||||||
|
const gchar *card_seat;
|
||||||
|
|
||||||
|
/* filter out the real card devices, we only care about the connectors */
|
||||||
|
if (g_udev_device_get_device_type (device) != G_UDEV_DEVICE_TYPE_NONE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* only connectors have a modes attribute */
|
||||||
|
if (!g_udev_device_has_sysfs_attr (device, "modes"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
parent_device = g_udev_device_get_parent (device);
|
||||||
|
|
||||||
|
if (g_udev_device_get_device_type (parent_device) == G_UDEV_DEVICE_TYPE_CHAR)
|
||||||
|
parent_device_type = g_udev_device_get_property (parent_device, "DEVTYPE");
|
||||||
|
|
||||||
|
if (g_strcmp0 (parent_device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
card_seat = g_udev_device_get_property (parent_device, "ID_SEAT");
|
||||||
|
|
||||||
|
if (!card_seat)
|
||||||
|
card_seat = "seat0";
|
||||||
|
|
||||||
|
if (g_strcmp0 (seat_name, card_seat) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
parent_device_name = g_udev_device_get_name (parent_device);
|
||||||
|
g_hash_table_insert (cards,
|
||||||
|
(gpointer) parent_device_name ,
|
||||||
|
g_steal_pointer (&parent_device));
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_hash_table_size (cards);
|
||||||
|
}
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
get_primary_gpu_path (const gchar *seat_name)
|
get_primary_gpu_path (const gchar *seat_name)
|
||||||
{
|
{
|
||||||
@@ -295,22 +346,46 @@ get_primary_gpu_path (const gchar *seat_name)
|
|||||||
g_udev_enumerator_add_match_name (enumerator, "card*");
|
g_udev_enumerator_add_match_name (enumerator, "card*");
|
||||||
g_udev_enumerator_add_match_tag (enumerator, "seat");
|
g_udev_enumerator_add_match_tag (enumerator, "seat");
|
||||||
|
|
||||||
|
/* We need to explicitly match the subsystem for now.
|
||||||
|
* https://bugzilla.gnome.org/show_bug.cgi?id=773224
|
||||||
|
*/
|
||||||
|
g_udev_enumerator_add_match_subsystem (enumerator, "drm");
|
||||||
|
|
||||||
devices = g_udev_enumerator_execute (enumerator);
|
devices = g_udev_enumerator_execute (enumerator);
|
||||||
if (!devices)
|
if (!devices)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* For now, fail on systems where some of the connectors
|
||||||
|
* are connected to secondary gpus.
|
||||||
|
*
|
||||||
|
* https://bugzilla.gnome.org/show_bug.cgi?id=771442
|
||||||
|
*/
|
||||||
|
if (g_getenv ("MUTTER_ALLOW_HYBRID_GPUS") == NULL)
|
||||||
|
{
|
||||||
|
guint num_devices;
|
||||||
|
|
||||||
|
num_devices = count_devices_with_connectors (seat_name, devices);
|
||||||
|
if (num_devices != 1)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
for (tmp = devices; tmp != NULL; tmp = tmp->next)
|
for (tmp = devices; tmp != NULL; tmp = tmp->next)
|
||||||
{
|
{
|
||||||
g_autoptr (GUdevDevice) platform_device = NULL;
|
g_autoptr (GUdevDevice) platform_device = NULL;
|
||||||
g_autoptr (GUdevDevice) pci_device = NULL;
|
g_autoptr (GUdevDevice) pci_device = NULL;
|
||||||
GUdevDevice *dev = tmp->data;
|
GUdevDevice *dev = tmp->data;
|
||||||
gint boot_vga;
|
gint boot_vga;
|
||||||
|
const gchar *device_type;
|
||||||
const gchar *device_seat;
|
const gchar *device_seat;
|
||||||
|
|
||||||
/* filter out devices that are not character device, like card0-VGA-1 */
|
/* filter out devices that are not character device, like card0-VGA-1 */
|
||||||
if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR)
|
if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
device_type = g_udev_device_get_property (dev, "DEVTYPE");
|
||||||
|
if (g_strcmp0 (device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
device_seat = g_udev_device_get_property (dev, "ID_SEAT");
|
device_seat = g_udev_device_get_property (dev, "ID_SEAT");
|
||||||
if (!device_seat)
|
if (!device_seat)
|
||||||
{
|
{
|
||||||
@@ -350,9 +425,9 @@ get_primary_gpu_path (const gchar *seat_name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
g_list_free_full (devices, g_object_unref);
|
g_list_free_full (devices, g_object_unref);
|
||||||
|
|
||||||
out:
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -475,31 +475,18 @@ find_output_by_id (MetaOutput *outputs,
|
|||||||
static int
|
static int
|
||||||
compute_scale (MetaOutput *output)
|
compute_scale (MetaOutput *output)
|
||||||
{
|
{
|
||||||
int scale = 1, width, height;
|
int scale = 1;
|
||||||
|
|
||||||
if (!output->crtc)
|
if (!output->crtc)
|
||||||
goto out;
|
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 */
|
/* Scaling makes no sense */
|
||||||
if (height < HIDPI_MIN_HEIGHT)
|
if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* 4K TV */
|
/* 4K TV */
|
||||||
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
||||||
width >= SMALLEST_4K_WIDTH)
|
output->crtc->rect.width >= SMALLEST_4K_WIDTH)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Somebody encoded the aspect ratio (16/9 or 16/10)
|
/* Somebody encoded the aspect ratio (16/9 or 16/10)
|
||||||
@@ -513,9 +500,8 @@ compute_scale (MetaOutput *output)
|
|||||||
if (output->width_mm > 0 && output->height_mm > 0)
|
if (output->width_mm > 0 && output->height_mm > 0)
|
||||||
{
|
{
|
||||||
double dpi_x, dpi_y;
|
double dpi_x, dpi_y;
|
||||||
|
dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
|
||||||
dpi_x = (double)width / (output->width_mm / 25.4);
|
dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
|
||||||
dpi_y = (double)height / (output->height_mm / 25.4);
|
|
||||||
/* We don't completely trust these values so both
|
/* We don't completely trust these values so both
|
||||||
must be high, and never pick higher ratio than
|
must be high, and never pick higher ratio than
|
||||||
2 automatically */
|
2 automatically */
|
||||||
|
@@ -73,9 +73,6 @@ typedef struct _MetaOnscreenNative
|
|||||||
|
|
||||||
gboolean pending_set_crtc;
|
gboolean pending_set_crtc;
|
||||||
|
|
||||||
int64_t pending_queue_swap_notify_frame_count;
|
|
||||||
int64_t pending_swap_notify_frame_count;
|
|
||||||
|
|
||||||
MetaRendererView *view;
|
MetaRendererView *view;
|
||||||
int pending_flips;
|
int pending_flips;
|
||||||
} MetaOnscreenNative;
|
} MetaOnscreenNative;
|
||||||
@@ -127,19 +124,16 @@ flush_pending_swap_notify (CoglFramebuffer *framebuffer)
|
|||||||
|
|
||||||
if (onscreen_native->pending_swap_notify)
|
if (onscreen_native->pending_swap_notify)
|
||||||
{
|
{
|
||||||
CoglFrameInfo *info;
|
CoglFrameInfo *info =
|
||||||
|
g_queue_pop_head (&onscreen->pending_frame_infos);
|
||||||
|
|
||||||
while ((info = g_queue_peek_head (&onscreen->pending_frame_infos)) &&
|
_cogl_onscreen_notify_frame_sync (onscreen, info);
|
||||||
info->global_frame_counter <= onscreen_native->pending_swap_notify_frame_count)
|
_cogl_onscreen_notify_complete (onscreen, info);
|
||||||
{
|
|
||||||
_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;
|
onscreen_native->pending_swap_notify = FALSE;
|
||||||
cogl_object_unref (onscreen);
|
cogl_object_unref (onscreen);
|
||||||
|
|
||||||
|
cogl_object_unref (info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,9 +200,6 @@ meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen)
|
|||||||
CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
|
CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
|
||||||
MetaRendererNative *renderer_native = egl_renderer->platform;
|
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
|
/* We only want to notify that the swap is complete when the
|
||||||
* application calls cogl_context_dispatch so instead of
|
* application calls cogl_context_dispatch so instead of
|
||||||
* immediately notifying we queue an idle callback */
|
* immediately notifying we queue an idle callback */
|
||||||
@@ -231,39 +222,6 @@ meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen)
|
|||||||
onscreen_native->pending_swap_notify = TRUE;
|
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
|
static CoglBool
|
||||||
meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
||||||
CoglError **error)
|
CoglError **error)
|
||||||
@@ -288,7 +246,8 @@ meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
egl_renderer->edpy = meta_egl_get_display (renderer_native->gbm);
|
egl_renderer->edpy =
|
||||||
|
eglGetDisplay ((EGLNativeDisplayType) renderer_native->gbm);
|
||||||
if (egl_renderer->edpy == EGL_NO_DISPLAY)
|
if (egl_renderer->edpy == EGL_NO_DISPLAY)
|
||||||
{
|
{
|
||||||
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
@@ -681,7 +640,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
|||||||
onscreen_native->pending_set_crtc = FALSE;
|
onscreen_native->pending_set_crtc = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
onscreen_native->pending_queue_swap_notify_frame_count = renderer_native->frame_counter;
|
|
||||||
meta_onscreen_native_flip_crtcs (onscreen);
|
meta_onscreen_native_flip_crtcs (onscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -222,27 +222,32 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
|
|||||||
gboolean edge_scroll_enabled)
|
gboolean edge_scroll_enabled)
|
||||||
{
|
{
|
||||||
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||||
guchar *current = NULL;
|
guchar *defaults;
|
||||||
guchar *available = NULL;
|
guchar *available;
|
||||||
|
|
||||||
available = get_property (device, "libinput Scroll Methods Available",
|
available = get_property (device, "libinput Scroll Methods Available",
|
||||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||||
if (!available || !available[SCROLL_METHOD_FIELD_EDGE])
|
defaults = get_property (device, "libinput Scroll Method Enabled",
|
||||||
|
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||||
|
if (!available || !defaults)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
current = get_property (device, "libinput Scroll Method Enabled",
|
memcpy (values, defaults, SCROLL_METHOD_NUM_FIELDS);
|
||||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
|
||||||
if (!current)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
values[SCROLL_METHOD_FIELD_EDGE] = !!edge_scroll_enabled;
|
out:
|
||||||
change_property (device, "libinput Scroll Method Enabled",
|
if (available)
|
||||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
meta_XFree (available);
|
||||||
out:
|
if (defaults)
|
||||||
meta_XFree (current);
|
meta_XFree (defaults);
|
||||||
meta_XFree (available);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -251,43 +256,44 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *set
|
|||||||
gboolean two_finger_scroll_enabled)
|
gboolean two_finger_scroll_enabled)
|
||||||
{
|
{
|
||||||
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||||
guchar *current = NULL;
|
guchar *defaults;
|
||||||
guchar *available = NULL;
|
guchar *available;
|
||||||
|
gboolean changed;
|
||||||
|
|
||||||
available = get_property (device, "libinput Scroll Methods Available",
|
available = get_property (device, "libinput Scroll Methods Available",
|
||||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||||
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
defaults = get_property (device, "libinput Scroll Method Enabled",
|
||||||
|
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||||
|
if (!available || !defaults)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
current = get_property (device, "libinput Scroll Method Enabled",
|
memcpy (values, defaults, SCROLL_METHOD_NUM_FIELDS);
|
||||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
changed = FALSE;
|
||||||
if (!current)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
|
if (available[SCROLL_METHOD_FIELD_2FG])
|
||||||
|
{
|
||||||
|
values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled;
|
||||||
|
changed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled;
|
/* Disable edge scrolling when two-finger scrolling is enabled */
|
||||||
change_property (device, "libinput Scroll Method Enabled",
|
if (values[SCROLL_METHOD_FIELD_2FG] && values[SCROLL_METHOD_FIELD_EDGE])
|
||||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
{
|
||||||
out:
|
values[SCROLL_METHOD_FIELD_EDGE] = 0;
|
||||||
meta_XFree (current);
|
changed = TRUE;
|
||||||
meta_XFree (available);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
if (changed)
|
||||||
meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings *settings,
|
{
|
||||||
ClutterInputDevice *device)
|
change_property (device, "libinput Scroll Method Enabled",
|
||||||
{
|
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||||
guchar *available = NULL;
|
}
|
||||||
gboolean has_two_finger = TRUE;
|
|
||||||
|
|
||||||
available = get_property (device, "libinput Scroll Methods Available",
|
out:
|
||||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
if (available)
|
||||||
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
meta_XFree (available);
|
||||||
has_two_finger = FALSE;
|
if (defaults)
|
||||||
|
meta_XFree (defaults);
|
||||||
meta_XFree (available);
|
|
||||||
return has_two_finger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -559,8 +565,6 @@ 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_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->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
|
static void
|
||||||
|
@@ -352,14 +352,6 @@ meta_begin_modal_for_plugin (MetaCompositor *compositor,
|
|||||||
*/
|
*/
|
||||||
MetaDisplay *display = compositor->display;
|
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)
|
if (is_modal (display) || display->grab_op != META_GRAB_OP_NONE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@@ -1129,7 +1129,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
MetaPluginEffect event)
|
MetaPluginEffect event)
|
||||||
{
|
{
|
||||||
MetaWindowActorPrivate *priv = self->priv;
|
MetaWindowActorPrivate *priv = self->priv;
|
||||||
gboolean inconsistent = FALSE;
|
|
||||||
|
|
||||||
/* NB: Keep in mind that when effects get completed it possible
|
/* NB: Keep in mind that when effects get completed it possible
|
||||||
* that the corresponding MetaWindow may have be been destroyed.
|
* that the corresponding MetaWindow may have be been destroyed.
|
||||||
@@ -1146,7 +1145,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
{
|
{
|
||||||
g_warning ("Error in minimize accounting.");
|
g_warning ("Error in minimize accounting.");
|
||||||
priv->minimize_in_progress = 0;
|
priv->minimize_in_progress = 0;
|
||||||
inconsistent = TRUE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1157,7 +1155,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
{
|
{
|
||||||
g_warning ("Error in unminimize accounting.");
|
g_warning ("Error in unminimize accounting.");
|
||||||
priv->unminimize_in_progress = 0;
|
priv->unminimize_in_progress = 0;
|
||||||
inconsistent = TRUE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1172,7 +1169,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
{
|
{
|
||||||
g_warning ("Error in map accounting.");
|
g_warning ("Error in map accounting.");
|
||||||
priv->map_in_progress = 0;
|
priv->map_in_progress = 0;
|
||||||
inconsistent = TRUE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case META_PLUGIN_DESTROY:
|
case META_PLUGIN_DESTROY:
|
||||||
@@ -1182,7 +1178,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
{
|
{
|
||||||
g_warning ("Error in destroy accounting.");
|
g_warning ("Error in destroy accounting.");
|
||||||
priv->destroy_in_progress = 0;
|
priv->destroy_in_progress = 0;
|
||||||
inconsistent = TRUE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case META_PLUGIN_SIZE_CHANGE:
|
case META_PLUGIN_SIZE_CHANGE:
|
||||||
@@ -1191,7 +1186,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
{
|
{
|
||||||
g_warning ("Error in size change accounting.");
|
g_warning ("Error in size change accounting.");
|
||||||
priv->size_change_in_progress = 0;
|
priv->size_change_in_progress = 0;
|
||||||
inconsistent = TRUE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case META_PLUGIN_SWITCH_WORKSPACE:
|
case META_PLUGIN_SWITCH_WORKSPACE:
|
||||||
@@ -1199,7 +1193,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_freeze_thaw_effect (event) && !inconsistent)
|
if (is_freeze_thaw_effect (event))
|
||||||
meta_window_actor_thaw (self);
|
meta_window_actor_thaw (self);
|
||||||
|
|
||||||
if (!meta_window_actor_effect_in_progress (self))
|
if (!meta_window_actor_effect_in_progress (self))
|
||||||
|
@@ -784,6 +784,10 @@ constrain_custom_rule (MetaWindow *window,
|
|||||||
if (!placement_rule)
|
if (!placement_rule)
|
||||||
return TRUE;
|
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,
|
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
|
||||||
&intersection);
|
&intersection);
|
||||||
|
|
||||||
|
@@ -44,8 +44,8 @@ dialog_exited (GPid pid, int status, gpointer user_data)
|
|||||||
|
|
||||||
window->dialog_pid = -1;
|
window->dialog_pid = -1;
|
||||||
|
|
||||||
/* exit status of 1 means the user pressed "Force Quit" */
|
/* exit status of 0 means the user pressed "Force Quit" */
|
||||||
if (WIFEXITED (status) && WEXITSTATUS (status) == 1)
|
if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
|
||||||
meta_window_kill (window);
|
meta_window_kill (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ show_delete_dialog (MetaWindow *window,
|
|||||||
meta_show_dialog ("--question",
|
meta_show_dialog ("--question",
|
||||||
window_content, NULL,
|
window_content, NULL,
|
||||||
window->screen->screen_name,
|
window->screen->screen_name,
|
||||||
_("_Wait"), _("_Force Quit"),
|
_("_Force Quit"), _("_Wait"),
|
||||||
"face-sad-symbolic", window->xwindow,
|
"face-sad-symbolic", window->xwindow,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
|
@@ -3205,7 +3205,7 @@ handle_raise_or_lower (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
MetaRectangle tmp, win_rect, above_rect;
|
MetaRectangle tmp, win_rect, above_rect;
|
||||||
|
|
||||||
if (above->mapped && meta_window_should_be_showing (above))
|
if (above->mapped)
|
||||||
{
|
{
|
||||||
meta_window_get_frame_rect (window, &win_rect);
|
meta_window_get_frame_rect (window, &win_rect);
|
||||||
meta_window_get_frame_rect (above, &above_rect);
|
meta_window_get_frame_rect (above, &above_rect);
|
||||||
|
@@ -2888,15 +2888,7 @@ check_fullscreen_func (gpointer data)
|
|||||||
g_slist_free (fullscreen_monitors);
|
g_slist_free (fullscreen_monitors);
|
||||||
|
|
||||||
if (in_fullscreen_changed)
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@@ -286,8 +286,8 @@ get_standalone_layer (MetaWindow *window)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case META_WINDOW_DOCK:
|
case META_WINDOW_DOCK:
|
||||||
if (window->wm_state_below ||
|
/* still experimenting here */
|
||||||
(window->monitor && window->monitor->in_fullscreen))
|
if (window->wm_state_below)
|
||||||
layer = META_LAYER_BOTTOM;
|
layer = META_LAYER_BOTTOM;
|
||||||
else
|
else
|
||||||
layer = META_LAYER_DOCK;
|
layer = META_LAYER_DOCK;
|
||||||
|
@@ -514,11 +514,7 @@ notify_key_repeat_for_resource (MetaWaylandKeyboard *keyboard,
|
|||||||
interval = g_settings_get_uint (keyboard->settings, "repeat-interval");
|
interval = g_settings_get_uint (keyboard->settings, "repeat-interval");
|
||||||
/* Our setting is in the milliseconds between keys. "rate" is the number
|
/* Our setting is in the milliseconds between keys. "rate" is the number
|
||||||
* of keys per second. */
|
* of keys per second. */
|
||||||
if (interval > 0)
|
rate = (1000 / interval);
|
||||||
rate = (1000 / interval);
|
|
||||||
else
|
|
||||||
rate = 0;
|
|
||||||
|
|
||||||
delay = g_settings_get_uint (keyboard->settings, "delay");
|
delay = g_settings_get_uint (keyboard->settings, "delay");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -62,6 +62,7 @@ meta_wayland_tablet_pad_ring_free (MetaWaylandTabletPadRing *ring)
|
|||||||
|
|
||||||
wl_resource_for_each_safe (resource, next, &ring->resource_list)
|
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_remove (wl_resource_get_link (resource));
|
||||||
wl_list_init (wl_resource_get_link (resource));
|
wl_list_init (wl_resource_get_link (resource));
|
||||||
}
|
}
|
||||||
|
@@ -62,6 +62,7 @@ meta_wayland_tablet_pad_strip_free (MetaWaylandTabletPadStrip *strip)
|
|||||||
|
|
||||||
wl_resource_for_each_safe (resource, next, &strip->resource_list)
|
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_remove (wl_resource_get_link (resource));
|
||||||
wl_list_init (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;
|
cursor = NULL;
|
||||||
}
|
}
|
||||||
else if (tool->current_tablet)
|
else if (tool->current_tablet)
|
||||||
cursor = tool->default_sprite;
|
cursor = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
|
||||||
else
|
else
|
||||||
cursor = NULL;
|
cursor = NULL;
|
||||||
|
|
||||||
@@ -380,22 +380,6 @@ tablet_tool_handle_cursor_surface_destroy (struct wl_listener *listener,
|
|||||||
meta_wayland_tablet_tool_set_cursor_surface (tool, NULL);
|
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 *
|
MetaWaylandTabletTool *
|
||||||
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
@@ -413,11 +397,6 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
|||||||
tool->focus_surface_destroy_listener.notify = tablet_tool_handle_focus_surface_destroy;
|
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->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;
|
return tool;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,9 +416,6 @@ meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool)
|
|||||||
wl_list_init (wl_resource_get_link (resource));
|
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);
|
g_slice_free (MetaWaylandTabletTool, tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -43,8 +43,6 @@ struct _MetaWaylandTabletTool
|
|||||||
MetaWaylandSurface *cursor_surface;
|
MetaWaylandSurface *cursor_surface;
|
||||||
struct wl_listener cursor_surface_destroy_listener;
|
struct wl_listener cursor_surface_destroy_listener;
|
||||||
MetaCursorRenderer *cursor_renderer;
|
MetaCursorRenderer *cursor_renderer;
|
||||||
MetaCursorSprite *default_sprite;
|
|
||||||
guint prepare_at_signal_id;
|
|
||||||
|
|
||||||
MetaWaylandSurface *current;
|
MetaWaylandSurface *current;
|
||||||
guint32 pressed_buttons;
|
guint32 pressed_buttons;
|
||||||
|
@@ -541,6 +541,8 @@ meta_wayland_touch_disable (MetaWaylandTouch *touch)
|
|||||||
clutter_evdev_remove_filter (evdev_filter_func, touch);
|
clutter_evdev_remove_filter (evdev_filter_func, touch);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
meta_wayland_touch_cancel (touch);
|
||||||
|
|
||||||
g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
|
||||||
}
|
}
|
||||||
|
@@ -227,15 +227,13 @@ xdg_toplevel_show_window_menu (struct wl_client *client,
|
|||||||
{
|
{
|
||||||
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||||
MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (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))
|
if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
monitor_scale = surface->window->monitor->scale;
|
|
||||||
meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
|
meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
|
||||||
surface->window->buffer_rect.x + (x * monitor_scale),
|
surface->window->buffer_rect.x + x,
|
||||||
surface->window->buffer_rect.y + (y * monitor_scale));
|
surface->window->buffer_rect.y + y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -841,17 +839,6 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
|||||||
|
|
||||||
xdg_popup->popup = 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
|
static void
|
||||||
|
@@ -117,11 +117,24 @@ static void
|
|||||||
meta_window_wayland_focus (MetaWindow *window,
|
meta_window_wayland_focus (MetaWindow *window,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
if (window->input)
|
MetaWaylandSurface *surface = window->surface;
|
||||||
meta_display_set_input_focus_window (window->display,
|
MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
|
||||||
window,
|
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
|
||||||
FALSE,
|
|
||||||
timestamp);
|
/* 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
|
||||||
|
*/
|
||||||
|
if (META_IS_WAYLAND_XDG_POPUP (shell_surface_role))
|
||||||
|
return;
|
||||||
|
|
||||||
|
meta_display_set_input_focus_window (window->display,
|
||||||
|
window,
|
||||||
|
FALSE,
|
||||||
|
timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -546,8 +546,6 @@ static WaylandSelectionData *
|
|||||||
wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
||||||
MetaWaylandCompositor *compositor)
|
MetaWaylandCompositor *compositor)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
MetaScreen *screen = display->screen;
|
|
||||||
MetaWaylandDataDevice *data_device;
|
MetaWaylandDataDevice *data_device;
|
||||||
MetaWaylandDataSource *wayland_source;
|
MetaWaylandDataSource *wayland_source;
|
||||||
MetaSelectionBridge *selection;
|
MetaSelectionBridge *selection;
|
||||||
@@ -597,8 +595,7 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
|||||||
data->window = meta_display_lookup_x_window (meta_get_display (),
|
data->window = meta_display_lookup_x_window (meta_get_display (),
|
||||||
data->request_event.requestor);
|
data->request_event.requestor);
|
||||||
|
|
||||||
/* Do *not* change the event mask on the root window, bugger! */
|
if (!data->window)
|
||||||
if (!data->window && data->request_event.requestor != screen->xroot)
|
|
||||||
{
|
{
|
||||||
/* Not a managed window, set the PropertyChangeMask
|
/* Not a managed window, set the PropertyChangeMask
|
||||||
* for INCR deletion notifications.
|
* for INCR deletion notifications.
|
||||||
@@ -632,12 +629,10 @@ reply_selection_request (XSelectionRequestEvent *request_event,
|
|||||||
static void
|
static void
|
||||||
wayland_selection_data_free (WaylandSelectionData *data)
|
wayland_selection_data_free (WaylandSelectionData *data)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
if (!data->window)
|
||||||
MetaScreen *screen = display->screen;
|
|
||||||
|
|
||||||
/* Do *not* change the event mask on the root window, bugger! */
|
|
||||||
if (!data->window && data->request_event.requestor != screen->xroot)
|
|
||||||
{
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
meta_error_trap_push (display);
|
||||||
XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||||
data->request_event.requestor, NoEventMask);
|
data->request_event.requestor, NoEventMask);
|
||||||
|
Reference in New Issue
Block a user