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
|
||||
======
|
||||
* 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
|
||||
3.23.1
|
||||
======
|
||||
* 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]
|
||||
* Fix session going into idle mode immediately on startup [Rui; #772839]
|
||||
* Fix mirror mode with stage views [Rui; #773115]
|
||||
* Improve pointer constraints support [Jonas; #771859]
|
||||
* Stack docks below other windows on fullscreen monitors [Rui; #772937]
|
||||
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
|
||||
* Fix popup grabs blocking screen lock on wayland [Rui; #771235]
|
||||
* Fix various crashes on wayland [Jonas; #771646, #771858]
|
||||
* Fix various placement issues on wayland [Jonas, Sjoerd, Olivier; #768039,
|
||||
#771841, #773141, #772729]
|
||||
* Fall back to X with connectors spread across multiple GPUs [Ray; #771442]
|
||||
* Fix various crashes on wayland [Jonas, Carlos; #771646, #771858, #772929]
|
||||
* Fix various placement issues on wayland [Olivier, Jonas, Sjoerd; #772729,
|
||||
#768039, #771841, #771841, #773141]
|
||||
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Olivier Fourdan, Rui Matos, Sjoerd Simons
|
||||
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Landry MINOZA,
|
||||
Sjoerd Simons, Ray Strode
|
||||
|
||||
Translations:
|
||||
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], liushuyu [zh_CN],
|
||||
YunQiang Su [zh_CN]
|
||||
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], Hannie Dumoleyn [nl],
|
||||
liushuyu [zh_CN]
|
||||
|
||||
3.22.1
|
||||
======
|
||||
|
@@ -2261,12 +2261,6 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
|
||||
return next_id;
|
||||
}
|
||||
|
||||
void
|
||||
_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
|
||||
{
|
||||
dispatch_libinput (manager_evdev);
|
||||
}
|
||||
|
||||
static int
|
||||
compare_ids (gconstpointer a,
|
||||
gconstpointer b)
|
||||
|
@@ -76,8 +76,6 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
|
||||
float *new_x,
|
||||
float *new_y);
|
||||
|
||||
void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
|
||||
|
||||
static inline guint64
|
||||
us (guint64 us)
|
||||
{
|
||||
|
@@ -185,19 +185,15 @@ keyboard_repeat (gpointer data)
|
||||
{
|
||||
ClutterSeatEvdev *seat = data;
|
||||
GSource *source;
|
||||
|
||||
/* 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;
|
||||
guint32 time_ms;
|
||||
|
||||
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
|
||||
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
|
||||
time_ms = g_source_get_time (source) / 1000;
|
||||
|
||||
clutter_seat_evdev_notify_key (seat,
|
||||
seat->repeat_device,
|
||||
g_source_get_time (source),
|
||||
ms2us (time_ms),
|
||||
seat->repeat_key,
|
||||
AUTOREPEAT_VALUE,
|
||||
FALSE);
|
||||
|
@@ -261,39 +261,6 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
|
||||
g_slice_free (CoglRendererEGL, egl_renderer);
|
||||
}
|
||||
|
||||
static EGLDisplay
|
||||
_cogl_winsys_egl_get_display (void *native)
|
||||
{
|
||||
EGLDisplay dpy = NULL;
|
||||
const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplay");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
return eglGetDisplay ((EGLNativeDisplayType) native);
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
||||
CoglError **error)
|
||||
@@ -310,7 +277,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
||||
if (!_cogl_xlib_renderer_connect (renderer, 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))
|
||||
goto error;
|
||||
|
@@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.62)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [22])
|
||||
m4_define([mutter_micro_version], [3])
|
||||
m4_define([mutter_minor_version], [23])
|
||||
m4_define([mutter_micro_version], [1])
|
||||
|
||||
m4_define([mutter_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).
|
||||
# Michiel Sikkes <michiels@gnome.org>, 2005.
|
||||
# Wouter Bolsterlee <wbolster@gnome.org>, 2006–2012.
|
||||
# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2016.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-03-23 22:41+0100\n"
|
||||
"PO-Revision-Date: 2015-06-20 14:14+0100\n"
|
||||
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
|
||||
"PO-Revision-Date: 2016-10-17 18:24+0200\n"
|
||||
"Last-Translator: Hannie Dumoleyn <hannie@ubuntu-nl.org>\n"
|
||||
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,7 +19,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\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
|
||||
msgid "Navigation"
|
||||
@@ -42,7 +43,7 @@ msgstr "Venster verplaatsen naar werkblad 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
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
|
||||
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
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Schakelen naar laatst gebruikte werkblad"
|
||||
msgstr "Overschakelen naar laatste werkblad"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
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"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-02-03 10:06+0000\n"
|
||||
"PO-Revision-Date: 2017-01-04 21:52+0800\n"
|
||||
"Last-Translator: Mandy Wang <wangmychn@gmail.com>\n"
|
||||
"POT-Creation-Date: 2016-05-05 13:30+0000\n"
|
||||
"PO-Revision-Date: 2016-10-30 02:19+0800\n"
|
||||
"Last-Translator: Tong Hui <tonghuix@gmail.com>\n"
|
||||
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\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"
|
||||
msgstr "导航"
|
||||
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "将窗口移到工作区 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "将窗口移到工作区 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "将窗口移到工作区 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "将窗口移到工作区 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "将窗口移到最后一个工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "将窗口左移一个工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "将窗口右移一个工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "将窗口上移一个工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "将窗口下移一个工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "将窗口左移一个显示器"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "将窗口右移一个显示器"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "将窗口上移一个显示器"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "将窗口下移一个显示器"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
msgid "Switch applications"
|
||||
msgstr "切换应用程序"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
msgid "Switch to previous application"
|
||||
msgstr "切换到前一个应用程序"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
msgid "Switch windows"
|
||||
msgstr "切换窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
msgid "Switch to previous window"
|
||||
msgstr "切换到前一个窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "在应用程序的窗口之间切换窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "切换到一个应用程序的前一个窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
msgid "Switch system controls"
|
||||
msgstr "切换系统控制"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "切换到前一个系统控制"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
msgid "Switch windows directly"
|
||||
msgstr "直接切换窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "直接切换到前一个窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "在应用程序窗口间直接移动焦点"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "直接切换到一个应用程序的前一个窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "直接切换系统控制"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "直接切换到前一个系统控制"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "隐藏所有正常窗口"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "切换到工作区 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "切换到工作区 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "切换到工作区 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "切换到工作区 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "切换到最后一个工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
msgid "Move to workspace left"
|
||||
msgstr "移动到左侧工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
msgid "Move to workspace right"
|
||||
msgstr "移动到右侧工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
msgid "Move to workspace above"
|
||||
msgstr "移动到上层工作区"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
msgid "Move to workspace below"
|
||||
msgstr "移动到下层工作区"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
msgid "System"
|
||||
msgstr "系统"
|
||||
|
||||
#: data/50-mutter-system.xml:8
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "显示运行命令提示符"
|
||||
|
||||
#: data/50-mutter-system.xml:10
|
||||
#: ../data/50-mutter-system.xml.in.h:3
|
||||
msgid "Show the activities overview"
|
||||
msgstr "显示活动大纲"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:8
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
msgid "Activate the window menu"
|
||||
msgstr "激活窗口菜单"
|
||||
|
||||
#: data/50-mutter-windows.xml:10
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "切换全屏模式"
|
||||
|
||||
#: data/50-mutter-windows.xml:12
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "切换最大化状态"
|
||||
|
||||
#: data/50-mutter-windows.xml:14
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
msgid "Maximize window"
|
||||
msgstr "最大化窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:16
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
msgid "Restore window"
|
||||
msgstr "恢复窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "切换卷起状态"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
msgid "Close window"
|
||||
msgstr "关闭窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
msgid "Hide window"
|
||||
msgstr "隐藏窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
msgid "Move window"
|
||||
msgstr "移动窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
msgid "Resize window"
|
||||
msgstr "改变窗口大小"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "在位于所有或仅一个工作区的窗口间切换"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: ../data/50-mutter-windows.xml.in.h:13
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "如果窗口被其他窗口遮盖,则提升它,否则降低它"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "将窗口提升到其它窗口之上"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "将窗口降低到其它窗口之下"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "垂直最大化窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "水平最大化窗口"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
msgid "View split on left"
|
||||
msgstr "在左侧查看分割"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
msgid "View split on right"
|
||||
msgstr "在右侧查看分割"
|
||||
|
||||
#: data/mutter.desktop.in:4
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
msgid "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"
|
||||
msgstr "用于修改窗口点击动作的修饰键 met"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:8
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"This key will initiate the \"overlay\", which is a combination window "
|
||||
"overview and application launching system. The default is intended to be the "
|
||||
@@ -286,11 +286,11 @@ msgstr ""
|
||||
"这个键指出的“覆盖”是一种混合窗口概述和应用程序运行的系统。默认要求使用 "
|
||||
"“Super 键”。可能使用默认或者空白。"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "依附模态对话框"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:21
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -299,11 +299,11 @@ msgstr ""
|
||||
"当为 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"
|
||||
msgstr "当窗口位于屏幕边缘时,启用边缘平铺"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:31
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
@@ -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"
|
||||
msgstr "动态管理工作区"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
@@ -326,32 +326,32 @@ msgstr ""
|
||||
"的 num-workspaces 键确定)。"
|
||||
|
||||
# 或者 只在主显示器上显示工作区
|
||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "只对主显示器上的工作区"
|
||||
|
||||
# monitors 是否该翻译为 屏幕?
|
||||
#: data/org.gnome.mutter.gschema.xml.in:51
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr "决定工作区切换对所有显示器上的窗口还是只对主显示器上的有效。"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:59
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "TAB轮换不弹出"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:60
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr "决定窗口轮换时是否禁用弹出和高亮边框。"
|
||||
|
||||
#: 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"
|
||||
msgstr "将焦点改变推迟到光标停止移动之后"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:69
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
@@ -360,202 +360,187 @@ msgstr ""
|
||||
"如果为 true,而聚焦模式为“sloppy”或“mouse”,那么进入某个窗口时焦点将不会立即"
|
||||
"改变,而是等到光标停止移动之后。"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Draggable border width"
|
||||
msgstr "可拖拽的边界宽度"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:80
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"可拖拽的边界总数。如果主题的可见边界不足,将添加不可见的边界来满足此值。"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:89
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr "自动最大化接近显示器大小的窗口"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:90
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr "如果启用,初始时为显示器大小的新窗口将自动最大化"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:98
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
|
||||
msgid "Place new windows in the center"
|
||||
msgstr "将窗口置于中央"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:99
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
|
||||
msgid ""
|
||||
"When true, the new windows will always be put in the center of the active "
|
||||
"screen of the monitor."
|
||||
msgstr "为 true 时,新窗口将总是置于此显示器已激活屏幕的中央。"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "从 Tab 轮换弹出界面选择窗口"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
msgid "Cancel tab popup"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "切换到 VT 12"
|
||||
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * 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
|
||||
#: ../src/backends/meta-monitor-manager.c:518
|
||||
msgid "Built-in display"
|
||||
msgstr "内置显示器"
|
||||
msgstr "内置显示屏"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:538
|
||||
#: ../src/backends/meta-monitor-manager.c:544
|
||||
msgid "Unknown"
|
||||
msgstr "未知"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:540
|
||||
#: ../src/backends/meta-monitor-manager.c:546
|
||||
msgid "Unknown Display"
|
||||
msgstr "未知的 Display"
|
||||
msgstr "未知的显示器"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:548
|
||||
#: ../src/backends/meta-monitor-manager.c:554
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: src/compositor/compositor.c:471
|
||||
#: ../src/compositor/compositor.c:456
|
||||
#, c-format
|
||||
msgid ""
|
||||
"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"
|
||||
msgstr "响铃事件"
|
||||
|
||||
#: src/core/delete.c:127
|
||||
#: ../src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "“%s” 未响应。"
|
||||
|
||||
#: src/core/delete.c:129
|
||||
#: ../src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "应用程序未响应。"
|
||||
|
||||
#: src/core/delete.c:134
|
||||
#: ../src/core/delete.c:134
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
msgstr "您可以选择稍等一会儿,或者强制退出该应用程序。"
|
||||
|
||||
#: src/core/delete.c:141
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "等待(_W)"
|
||||
|
||||
#: src/core/delete.c:141
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "强制退出(_F)"
|
||||
|
||||
#: src/core/display.c:590
|
||||
#: ../src/core/display.c:563
|
||||
#, c-format
|
||||
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"
|
||||
msgstr "禁止连接到会话管理器"
|
||||
|
||||
#: src/core/main.c:188
|
||||
#: ../src/core/main.c:182
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "替换正在运行的窗口管理器"
|
||||
|
||||
#: src/core/main.c:194
|
||||
#: ../src/core/main.c:188
|
||||
msgid "Specify session management ID"
|
||||
msgstr "指定会话管理 ID"
|
||||
|
||||
#: src/core/main.c:199
|
||||
#: ../src/core/main.c:193
|
||||
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"
|
||||
msgstr "从保存文件中初始化会话"
|
||||
|
||||
#: src/core/main.c:211
|
||||
#: ../src/core/main.c:205
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "使 X 调用同步"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: ../src/core/main.c:212
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "作为 wayland 混成管理器运行"
|
||||
|
||||
#: src/core/main.c:224
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "作为嵌套混成器运行"
|
||||
|
||||
#: src/core/main.c:232
|
||||
#: ../src/core/main.c:220
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "以完整显示服务器方式运行,而不是以嵌套方式"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#: ../src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -569,43 +554,38 @@ msgstr ""
|
||||
"本软件为自由软件:版权条款请参见源码\n"
|
||||
"不存在任何保证:即便是对商业性或者特定目的的适应性也不作保证。\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
#: ../src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "打印版本"
|
||||
|
||||
#: src/core/mutter.c:59
|
||||
#: ../src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "要使用的 Mutter 插件"
|
||||
|
||||
#: src/core/prefs.c:1997
|
||||
#: ../src/core/prefs.c:2050
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "工作区 %d"
|
||||
|
||||
#: src/core/screen.c:521
|
||||
#: ../src/core/screen.c:526
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
"to replace the current window manager."
|
||||
msgstr ""
|
||||
"Display“%s”已经有一个窗口管理器;请尝试使用 --replace 选项替换当前的窗口管理"
|
||||
"显示器“%s”已经有一个窗口管理器,请尝试使用 --replace 选项替换当前的窗口管理"
|
||||
"器。"
|
||||
|
||||
#: src/core/screen.c:606
|
||||
#: ../src/core/screen.c:608
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\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"
|
||||
msgstr "Mutter 编译的时候没有加入详细模式的支持\n"
|
||||
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "模式切换:%d 模式"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: ../src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
"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
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (于 %s)"
|
||||
|
@@ -107,9 +107,6 @@ struct _MetaInputSettingsClass
|
||||
void (* set_trackball_accel_profile) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
GDesktopPointerAccelProfile profile);
|
||||
|
||||
gboolean (* has_two_finger_scroll) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device);
|
||||
};
|
||||
|
||||
GType meta_input_settings_get_type (void) G_GNUC_CONST;
|
||||
|
@@ -83,8 +83,6 @@ struct _MetaInputSettingsPrivate
|
||||
#ifdef HAVE_LIBWACOM
|
||||
WacomDeviceDatabase *wacom_db;
|
||||
#endif
|
||||
|
||||
GHashTable *two_finger_devices;
|
||||
};
|
||||
|
||||
typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
|
||||
@@ -150,8 +148,6 @@ meta_input_settings_dispose (GObject *object)
|
||||
libwacom_database_destroy (priv->wacom_db);
|
||||
#endif
|
||||
|
||||
g_clear_pointer (&priv->two_finger_devices, g_hash_table_destroy);
|
||||
|
||||
G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
@@ -487,8 +483,6 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
||||
{
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
gboolean edge_scroll_enabled;
|
||||
gboolean two_finger_scroll_enabled;
|
||||
gboolean two_finger_scroll_available;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
|
||||
if (device &&
|
||||
@@ -498,12 +492,6 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "edge-scrolling-enabled");
|
||||
two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled");
|
||||
two_finger_scroll_available = g_hash_table_size (priv->two_finger_devices) > 0;
|
||||
|
||||
/* If both are enabled we prefer two finger. */
|
||||
if (edge_scroll_enabled && two_finger_scroll_enabled && two_finger_scroll_available)
|
||||
edge_scroll_enabled = FALSE;
|
||||
|
||||
if (device)
|
||||
{
|
||||
@@ -535,10 +523,6 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled");
|
||||
|
||||
/* Disable edge since they can't both be set. */
|
||||
if (two_finger_scroll_enabled)
|
||||
update_touchpad_edge_scroll (input_settings, device);
|
||||
|
||||
if (device)
|
||||
{
|
||||
settings_device_set_bool_setting (input_settings, device,
|
||||
@@ -551,10 +535,6 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
|
||||
(ConfigBoolFunc) input_settings_class->set_two_finger_scroll,
|
||||
two_finger_scroll_enabled);
|
||||
}
|
||||
|
||||
/* Edge might have been disabled because two finger was on. */
|
||||
if (!two_finger_scroll_enabled)
|
||||
update_touchpad_edge_scroll (input_settings, device);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -685,9 +665,6 @@ update_keyboard_repeat (MetaInputSettings *input_settings)
|
||||
delay = g_settings_get_uint (priv->keyboard_settings, "delay");
|
||||
interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
|
||||
|
||||
delay = MAX (1, delay);
|
||||
interval = MAX (1, interval);
|
||||
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
input_settings_class->set_keyboard_repeat (input_settings,
|
||||
repeat, delay, interval);
|
||||
@@ -753,9 +730,7 @@ update_tablet_keep_aspect (MetaInputSettings *input_settings,
|
||||
MetaOutput *output = NULL;
|
||||
gboolean keep_aspect;
|
||||
|
||||
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)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@@ -803,8 +778,6 @@ update_device_display (MetaInputSettings *input_settings,
|
||||
MetaOutput *output;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHSCREEN_DEVICE)
|
||||
return;
|
||||
|
||||
@@ -838,9 +811,7 @@ update_tablet_mapping (MetaInputSettings *input_settings,
|
||||
GDesktopTabletMapping mapping;
|
||||
DeviceMappingInfo *info;
|
||||
|
||||
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)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@@ -881,9 +852,7 @@ update_tablet_area (MetaInputSettings *input_settings,
|
||||
const guint32 *area;
|
||||
gsize n_elems;
|
||||
|
||||
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)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@@ -922,10 +891,7 @@ update_tablet_left_handed (MetaInputSettings *input_settings,
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
gboolean enabled;
|
||||
|
||||
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)
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
@@ -1418,23 +1384,6 @@ apply_device_settings (MetaInputSettings *input_settings,
|
||||
device);
|
||||
}
|
||||
|
||||
static void
|
||||
evaluate_two_finger_scrolling (MetaInputSettings *input_settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
MetaInputSettingsClass *klass;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||
return;
|
||||
|
||||
klass = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
|
||||
if (klass->has_two_finger_scroll (input_settings, device))
|
||||
g_hash_table_add (priv->two_finger_devices, device);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDevice *device,
|
||||
@@ -1443,8 +1392,6 @@ meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
||||
return;
|
||||
|
||||
evaluate_two_finger_scrolling (input_settings, device);
|
||||
|
||||
apply_device_settings (input_settings, device);
|
||||
check_add_mappable_device (input_settings, device);
|
||||
}
|
||||
@@ -1458,10 +1405,6 @@ meta_input_settings_device_removed (ClutterDeviceManager *device_manager,
|
||||
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
g_hash_table_remove (priv->mappable_devices, device);
|
||||
|
||||
if (g_hash_table_remove (priv->two_finger_devices, device) &&
|
||||
g_hash_table_size (priv->two_finger_devices) == 0)
|
||||
apply_device_settings (input_settings, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1488,13 +1431,6 @@ static void
|
||||
meta_input_settings_constructed (GObject *object)
|
||||
{
|
||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
|
||||
GSList *devices, *d;
|
||||
|
||||
devices = meta_input_settings_get_devices (input_settings, CLUTTER_TOUCHPAD_DEVICE);
|
||||
for (d = devices; d; d = d->next)
|
||||
evaluate_two_finger_scrolling (input_settings, d->data);
|
||||
|
||||
g_slist_free (devices);
|
||||
|
||||
apply_device_settings (input_settings, NULL);
|
||||
update_keyboard_repeat (input_settings);
|
||||
@@ -1556,8 +1492,6 @@ meta_input_settings_init (MetaInputSettings *settings)
|
||||
"expect tablets to misbehave");
|
||||
}
|
||||
#endif
|
||||
|
||||
priv->two_finger_devices = g_hash_table_new (NULL, NULL);
|
||||
}
|
||||
|
||||
MetaInputSettings *
|
||||
|
@@ -454,7 +454,7 @@ handle_end_element (GMarkupParseContext *context,
|
||||
{
|
||||
if (strcmp (element_name, "configuration") == 0 && parser->unknown_count == 0)
|
||||
{
|
||||
MetaConfiguration *config = config_new ();
|
||||
MetaConfiguration *config = g_slice_new (MetaConfiguration);
|
||||
|
||||
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.height_mm = output->height_mm;
|
||||
info.winsys_id = output->winsys_id;
|
||||
info.scale = output->scale;
|
||||
}
|
||||
|
||||
/* hack */
|
||||
|
@@ -63,7 +63,6 @@ static GQuark quark_cursor_sprite = 0;
|
||||
|
||||
struct _MetaCursorRendererNativePrivate
|
||||
{
|
||||
gboolean hw_state_invalidated;
|
||||
gboolean has_hw_cursor;
|
||||
|
||||
MetaCursorSprite *last_cursor;
|
||||
@@ -160,7 +159,8 @@ set_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite,
|
||||
static void
|
||||
set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
MetaCRTC *crtc,
|
||||
MetaCursorSprite *cursor_sprite)
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
gboolean force)
|
||||
{
|
||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||
|
||||
@@ -177,7 +177,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
else
|
||||
bo = get_active_cursor_sprite_gbm_bo (cursor_sprite);
|
||||
|
||||
if (!priv->hw_state_invalidated && bo == crtc->cursor_renderer_private)
|
||||
if (!force && bo == crtc->cursor_renderer_private)
|
||||
return;
|
||||
|
||||
crtc->cursor_renderer_private = bo;
|
||||
@@ -197,7 +197,7 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
}
|
||||
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);
|
||||
crtc->cursor_renderer_private = NULL;
|
||||
@@ -207,7 +207,8 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
|
||||
static void
|
||||
update_hw_cursor (MetaCursorRendererNative *native,
|
||||
MetaCursorSprite *cursor_sprite)
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
gboolean force)
|
||||
{
|
||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
|
||||
@@ -240,7 +241,7 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
||||
else
|
||||
crtc_cursor = NULL;
|
||||
|
||||
set_crtc_cursor (native, &crtcs[i], crtc_cursor);
|
||||
set_crtc_cursor (native, &crtcs[i], crtc_cursor, force);
|
||||
|
||||
if (crtc_cursor)
|
||||
{
|
||||
@@ -251,8 +252,6 @@ update_hw_cursor (MetaCursorRendererNative *native,
|
||||
}
|
||||
}
|
||||
|
||||
priv->hw_state_invalidated = FALSE;
|
||||
|
||||
if (painted)
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -649,11 +648,8 @@ static void
|
||||
force_update_hw_cursor (MetaCursorRendererNative *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));
|
||||
update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer), TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -674,8 +670,6 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
|
||||
g_signal_connect_object (monitors, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed), native, 0);
|
||||
|
||||
priv->hw_state_invalidated = TRUE;
|
||||
|
||||
#if defined(CLUTTER_WINDOWING_EGL)
|
||||
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
|
||||
{
|
||||
|
@@ -141,18 +141,28 @@ static gboolean
|
||||
device_set_scroll_method (struct libinput_device *libinput_device,
|
||||
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);
|
||||
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
|
||||
|
||||
return (method & supported) != 0;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
device_set_click_method (struct libinput_device *libinput_device,
|
||||
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);
|
||||
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
|
||||
|
||||
return (method & supported) != 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -160,16 +170,32 @@ meta_input_settings_native_set_edge_scroll (MetaInputSettings *settin
|
||||
ClutterInputDevice *device,
|
||||
gboolean edge_scrolling_enabled)
|
||||
{
|
||||
enum libinput_config_scroll_method scroll_method = 0;
|
||||
struct libinput_device *libinput_device;
|
||||
enum libinput_config_scroll_method current, method;
|
||||
enum libinput_config_scroll_method supported;
|
||||
enum libinput_config_scroll_method current;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
|
||||
method = edge_scrolling_enabled ? LIBINPUT_CONFIG_SCROLL_EDGE : LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
if (!libinput_device)
|
||||
return;
|
||||
supported = libinput_device_config_scroll_get_methods (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
|
||||
@@ -177,29 +203,31 @@ meta_input_settings_native_set_two_finger_scroll (MetaInputSettings *
|
||||
ClutterInputDevice *device,
|
||||
gboolean two_finger_scroll_enabled)
|
||||
{
|
||||
enum libinput_config_scroll_method scroll_method = 0;
|
||||
struct libinput_device *libinput_device;
|
||||
enum libinput_config_scroll_method current, method;
|
||||
enum libinput_config_scroll_method supported;
|
||||
enum libinput_config_scroll_method current;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
|
||||
method = two_finger_scroll_enabled ? LIBINPUT_CONFIG_SCROLL_2FG : LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
supported = libinput_device_config_scroll_get_methods (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
|
||||
meta_input_settings_native_has_two_finger_scroll (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
struct libinput_device *libinput_device;
|
||||
if (two_finger_scroll_enabled)
|
||||
{
|
||||
scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
}
|
||||
else if (current != LIBINPUT_CONFIG_SCROLL_EDGE)
|
||||
{
|
||||
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
||||
}
|
||||
else
|
||||
return;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
if (!libinput_device)
|
||||
return FALSE;
|
||||
|
||||
return libinput_device_config_scroll_get_methods (libinput_device) & LIBINPUT_CONFIG_SCROLL_2FG;
|
||||
device_set_scroll_method (libinput_device, scroll_method);
|
||||
}
|
||||
|
||||
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_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
|
||||
|
@@ -47,6 +47,8 @@
|
||||
#include "meta-idle-monitor-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(GUdevClient, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref)
|
||||
@@ -282,6 +284,55 @@ on_active_changed (Login1Session *session,
|
||||
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 *
|
||||
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_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);
|
||||
if (!devices)
|
||||
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)
|
||||
{
|
||||
g_autoptr (GUdevDevice) platform_device = NULL;
|
||||
g_autoptr (GUdevDevice) pci_device = NULL;
|
||||
GUdevDevice *dev = tmp->data;
|
||||
gint boot_vga;
|
||||
const gchar *device_type;
|
||||
const gchar *device_seat;
|
||||
|
||||
/* 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)
|
||||
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");
|
||||
if (!device_seat)
|
||||
{
|
||||
@@ -350,9 +425,9 @@ get_primary_gpu_path (const gchar *seat_name)
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
g_list_free_full (devices, g_object_unref);
|
||||
|
||||
out:
|
||||
return path;
|
||||
}
|
||||
|
||||
|
@@ -475,31 +475,18 @@ find_output_by_id (MetaOutput *outputs,
|
||||
static int
|
||||
compute_scale (MetaOutput *output)
|
||||
{
|
||||
int scale = 1, width, height;
|
||||
int scale = 1;
|
||||
|
||||
if (!output->crtc)
|
||||
goto out;
|
||||
|
||||
width = output->crtc->rect.width;
|
||||
height = output->crtc->rect.height;
|
||||
|
||||
/* Swap values on rotated transforms, so pixel and mm sizes
|
||||
* from the same axes is compared.
|
||||
*/
|
||||
if (meta_monitor_transform_is_rotated (output->crtc->transform))
|
||||
{
|
||||
int tmp = width;
|
||||
width = height;
|
||||
height = tmp;
|
||||
}
|
||||
|
||||
/* Scaling makes no sense */
|
||||
if (height < HIDPI_MIN_HEIGHT)
|
||||
if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
|
||||
goto out;
|
||||
|
||||
/* 4K TV */
|
||||
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
||||
width >= SMALLEST_4K_WIDTH)
|
||||
output->crtc->rect.width >= SMALLEST_4K_WIDTH)
|
||||
goto out;
|
||||
|
||||
/* 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)
|
||||
{
|
||||
double dpi_x, dpi_y;
|
||||
|
||||
dpi_x = (double)width / (output->width_mm / 25.4);
|
||||
dpi_y = (double)height / (output->height_mm / 25.4);
|
||||
dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
|
||||
dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
|
||||
/* We don't completely trust these values so both
|
||||
must be high, and never pick higher ratio than
|
||||
2 automatically */
|
||||
|
@@ -73,9 +73,6 @@ typedef struct _MetaOnscreenNative
|
||||
|
||||
gboolean pending_set_crtc;
|
||||
|
||||
int64_t pending_queue_swap_notify_frame_count;
|
||||
int64_t pending_swap_notify_frame_count;
|
||||
|
||||
MetaRendererView *view;
|
||||
int pending_flips;
|
||||
} MetaOnscreenNative;
|
||||
@@ -127,19 +124,16 @@ flush_pending_swap_notify (CoglFramebuffer *framebuffer)
|
||||
|
||||
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)) &&
|
||||
info->global_frame_counter <= onscreen_native->pending_swap_notify_frame_count)
|
||||
{
|
||||
_cogl_onscreen_notify_frame_sync (onscreen, info);
|
||||
_cogl_onscreen_notify_complete (onscreen, info);
|
||||
cogl_object_unref (info);
|
||||
g_queue_pop_head (&onscreen->pending_frame_infos);
|
||||
}
|
||||
_cogl_onscreen_notify_frame_sync (onscreen, info);
|
||||
_cogl_onscreen_notify_complete (onscreen, info);
|
||||
|
||||
onscreen_native->pending_swap_notify = FALSE;
|
||||
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;
|
||||
MetaRendererNative *renderer_native = egl_renderer->platform;
|
||||
|
||||
onscreen_native->pending_swap_notify_frame_count =
|
||||
onscreen_native->pending_queue_swap_notify_frame_count;
|
||||
|
||||
/* We only want to notify that the swap is complete when the
|
||||
* application calls cogl_context_dispatch so instead of
|
||||
* immediately notifying we queue an idle callback */
|
||||
@@ -231,39 +222,6 @@ meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen)
|
||||
onscreen_native->pending_swap_notify = TRUE;
|
||||
}
|
||||
|
||||
static EGLDisplay
|
||||
meta_egl_get_display (void *native)
|
||||
{
|
||||
EGLDisplay dpy = NULL;
|
||||
const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplay");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
|
||||
(void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
|
||||
|
||||
if (get_platform_display)
|
||||
dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL);
|
||||
|
||||
if (dpy)
|
||||
return dpy;
|
||||
}
|
||||
|
||||
return eglGetDisplay ((EGLNativeDisplayType) native);
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
||||
CoglError **error)
|
||||
@@ -288,7 +246,8 @@ meta_renderer_native_connect (CoglRenderer *cogl_renderer,
|
||||
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)
|
||||
{
|
||||
_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_queue_swap_notify_frame_count = renderer_native->frame_counter;
|
||||
meta_onscreen_native_flip_crtcs (onscreen);
|
||||
}
|
||||
|
||||
|
@@ -222,27 +222,32 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
|
||||
gboolean edge_scroll_enabled)
|
||||
{
|
||||
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||
guchar *current = NULL;
|
||||
guchar *available = NULL;
|
||||
guchar *defaults;
|
||||
guchar *available;
|
||||
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
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;
|
||||
|
||||
current = get_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!current)
|
||||
goto out;
|
||||
memcpy (values, defaults, SCROLL_METHOD_NUM_FIELDS);
|
||||
|
||||
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;
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
out:
|
||||
meta_XFree (current);
|
||||
meta_XFree (available);
|
||||
out:
|
||||
if (available)
|
||||
meta_XFree (available);
|
||||
if (defaults)
|
||||
meta_XFree (defaults);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -251,43 +256,44 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *set
|
||||
gboolean two_finger_scroll_enabled)
|
||||
{
|
||||
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
||||
guchar *current = NULL;
|
||||
guchar *available = NULL;
|
||||
guchar *defaults;
|
||||
guchar *available;
|
||||
gboolean changed;
|
||||
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
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;
|
||||
|
||||
current = get_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!current)
|
||||
goto out;
|
||||
memcpy (values, defaults, SCROLL_METHOD_NUM_FIELDS);
|
||||
changed = FALSE;
|
||||
|
||||
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;
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
out:
|
||||
meta_XFree (current);
|
||||
meta_XFree (available);
|
||||
}
|
||||
/* Disable edge scrolling when two-finger scrolling is enabled */
|
||||
if (values[SCROLL_METHOD_FIELD_2FG] && values[SCROLL_METHOD_FIELD_EDGE])
|
||||
{
|
||||
values[SCROLL_METHOD_FIELD_EDGE] = 0;
|
||||
changed = TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
guchar *available = NULL;
|
||||
gboolean has_two_finger = TRUE;
|
||||
if (changed)
|
||||
{
|
||||
change_property (device, "libinput Scroll Method Enabled",
|
||||
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
|
||||
}
|
||||
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
||||
has_two_finger = FALSE;
|
||||
|
||||
meta_XFree (available);
|
||||
return has_two_finger;
|
||||
out:
|
||||
if (available)
|
||||
meta_XFree (available);
|
||||
if (defaults)
|
||||
meta_XFree (defaults);
|
||||
}
|
||||
|
||||
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_trackball_accel_profile = meta_input_settings_x11_set_trackball_accel_profile;
|
||||
|
||||
input_settings_class->has_two_finger_scroll = meta_input_settings_x11_has_two_finger_scroll;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -352,14 +352,6 @@ meta_begin_modal_for_plugin (MetaCompositor *compositor,
|
||||
*/
|
||||
MetaDisplay *display = compositor->display;
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
if (display->grab_op == META_GRAB_OP_WAYLAND_POPUP)
|
||||
{
|
||||
MetaWaylandSeat *seat = meta_wayland_compositor_get_default ()->seat;
|
||||
meta_wayland_pointer_end_popup_grab (seat->pointer);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (is_modal (display) || display->grab_op != META_GRAB_OP_NONE)
|
||||
return FALSE;
|
||||
|
||||
|
@@ -1129,7 +1129,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
MetaPluginEffect event)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
gboolean inconsistent = FALSE;
|
||||
|
||||
/* NB: Keep in mind that when effects get completed it possible
|
||||
* that the corresponding MetaWindow may have be been destroyed.
|
||||
@@ -1146,7 +1145,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in minimize accounting.");
|
||||
priv->minimize_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1157,7 +1155,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in unminimize accounting.");
|
||||
priv->unminimize_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1172,7 +1169,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in map accounting.");
|
||||
priv->map_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_DESTROY:
|
||||
@@ -1182,7 +1178,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in destroy accounting.");
|
||||
priv->destroy_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_SIZE_CHANGE:
|
||||
@@ -1191,7 +1186,6 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
{
|
||||
g_warning ("Error in size change accounting.");
|
||||
priv->size_change_in_progress = 0;
|
||||
inconsistent = TRUE;
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_SWITCH_WORKSPACE:
|
||||
@@ -1199,7 +1193,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_freeze_thaw_effect (event) && !inconsistent)
|
||||
if (is_freeze_thaw_effect (event))
|
||||
meta_window_actor_thaw (self);
|
||||
|
||||
if (!meta_window_actor_effect_in_progress (self))
|
||||
|
@@ -784,6 +784,10 @@ constrain_custom_rule (MetaWindow *window,
|
||||
if (!placement_rule)
|
||||
return TRUE;
|
||||
|
||||
if (!meta_rectangle_could_fit_rect (&info->work_area_monitor,
|
||||
&info->current))
|
||||
return TRUE;
|
||||
|
||||
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
|
||||
&intersection);
|
||||
|
||||
|
@@ -44,8 +44,8 @@ dialog_exited (GPid pid, int status, gpointer user_data)
|
||||
|
||||
window->dialog_pid = -1;
|
||||
|
||||
/* exit status of 1 means the user pressed "Force Quit" */
|
||||
if (WIFEXITED (status) && WEXITSTATUS (status) == 1)
|
||||
/* exit status of 0 means the user pressed "Force Quit" */
|
||||
if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
|
||||
meta_window_kill (window);
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ show_delete_dialog (MetaWindow *window,
|
||||
meta_show_dialog ("--question",
|
||||
window_content, NULL,
|
||||
window->screen->screen_name,
|
||||
_("_Wait"), _("_Force Quit"),
|
||||
_("_Force Quit"), _("_Wait"),
|
||||
"face-sad-symbolic", window->xwindow,
|
||||
NULL, NULL);
|
||||
|
||||
|
@@ -3205,7 +3205,7 @@ handle_raise_or_lower (MetaDisplay *display,
|
||||
{
|
||||
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 (above, &above_rect);
|
||||
|
@@ -2888,15 +2888,7 @@ check_fullscreen_func (gpointer data)
|
||||
g_slist_free (fullscreen_monitors);
|
||||
|
||||
if (in_fullscreen_changed)
|
||||
{
|
||||
/* 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);
|
||||
}
|
||||
g_signal_emit (screen, screen_signals[IN_FULLSCREEN_CHANGED], 0, NULL);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@@ -286,8 +286,8 @@ get_standalone_layer (MetaWindow *window)
|
||||
break;
|
||||
|
||||
case META_WINDOW_DOCK:
|
||||
if (window->wm_state_below ||
|
||||
(window->monitor && window->monitor->in_fullscreen))
|
||||
/* still experimenting here */
|
||||
if (window->wm_state_below)
|
||||
layer = META_LAYER_BOTTOM;
|
||||
else
|
||||
layer = META_LAYER_DOCK;
|
||||
|
@@ -514,11 +514,7 @@ notify_key_repeat_for_resource (MetaWaylandKeyboard *keyboard,
|
||||
interval = g_settings_get_uint (keyboard->settings, "repeat-interval");
|
||||
/* Our setting is in the milliseconds between keys. "rate" is the number
|
||||
* of keys per second. */
|
||||
if (interval > 0)
|
||||
rate = (1000 / interval);
|
||||
else
|
||||
rate = 0;
|
||||
|
||||
rate = (1000 / interval);
|
||||
delay = g_settings_get_uint (keyboard->settings, "delay");
|
||||
}
|
||||
else
|
||||
|
@@ -62,6 +62,7 @@ meta_wayland_tablet_pad_ring_free (MetaWaylandTabletPadRing *ring)
|
||||
|
||||
wl_resource_for_each_safe (resource, next, &ring->resource_list)
|
||||
{
|
||||
zwp_tablet_tool_v2_send_removed (resource);
|
||||
wl_list_remove (wl_resource_get_link (resource));
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
}
|
||||
|
@@ -62,6 +62,7 @@ meta_wayland_tablet_pad_strip_free (MetaWaylandTabletPadStrip *strip)
|
||||
|
||||
wl_resource_for_each_safe (resource, next, &strip->resource_list)
|
||||
{
|
||||
zwp_tablet_tool_v2_send_removed (resource);
|
||||
wl_list_remove (wl_resource_get_link (resource));
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
}
|
||||
|
@@ -98,7 +98,7 @@ meta_wayland_tablet_tool_update_cursor_surface (MetaWaylandTabletTool *tool)
|
||||
cursor = NULL;
|
||||
}
|
||||
else if (tool->current_tablet)
|
||||
cursor = tool->default_sprite;
|
||||
cursor = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
|
||||
else
|
||||
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);
|
||||
}
|
||||
|
||||
static void
|
||||
tool_cursor_prepare_at (MetaCursorSprite *cursor_sprite,
|
||||
int x,
|
||||
int y,
|
||||
MetaWaylandTabletTool *tool)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
const MetaMonitorInfo *monitor;
|
||||
|
||||
monitor = meta_screen_get_monitor_for_point (display->screen, x, y);
|
||||
|
||||
/* Reload the cursor texture if the scale has changed. */
|
||||
if (monitor)
|
||||
meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale);
|
||||
}
|
||||
|
||||
MetaWaylandTabletTool *
|
||||
meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||
ClutterInputDevice *device,
|
||||
@@ -413,11 +397,6 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat *seat,
|
||||
tool->focus_surface_destroy_listener.notify = tablet_tool_handle_focus_surface_destroy;
|
||||
tool->cursor_surface_destroy_listener.notify = tablet_tool_handle_cursor_surface_destroy;
|
||||
|
||||
tool->default_sprite = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
|
||||
tool->prepare_at_signal_id =
|
||||
g_signal_connect (tool->default_sprite, "prepare-at",
|
||||
G_CALLBACK (tool_cursor_prepare_at), tool);
|
||||
|
||||
return tool;
|
||||
}
|
||||
|
||||
@@ -437,9 +416,6 @@ meta_wayland_tablet_tool_free (MetaWaylandTabletTool *tool)
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
}
|
||||
|
||||
g_signal_handler_disconnect (tool->default_sprite, tool->prepare_at_signal_id);
|
||||
g_object_unref (tool->default_sprite);
|
||||
|
||||
g_slice_free (MetaWaylandTabletTool, tool);
|
||||
}
|
||||
|
||||
|
@@ -43,8 +43,6 @@ struct _MetaWaylandTabletTool
|
||||
MetaWaylandSurface *cursor_surface;
|
||||
struct wl_listener cursor_surface_destroy_listener;
|
||||
MetaCursorRenderer *cursor_renderer;
|
||||
MetaCursorSprite *default_sprite;
|
||||
guint prepare_at_signal_id;
|
||||
|
||||
MetaWaylandSurface *current;
|
||||
guint32 pressed_buttons;
|
||||
|
@@ -541,6 +541,8 @@ meta_wayland_touch_disable (MetaWaylandTouch *touch)
|
||||
clutter_evdev_remove_filter (evdev_filter_func, touch);
|
||||
#endif
|
||||
|
||||
meta_wayland_touch_cancel (touch);
|
||||
|
||||
g_clear_pointer (&touch->touch_surfaces, (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);
|
||||
MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
|
||||
int monitor_scale;
|
||||
|
||||
if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
|
||||
return;
|
||||
|
||||
monitor_scale = surface->window->monitor->scale;
|
||||
meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
|
||||
surface->window->buffer_rect.x + (x * monitor_scale),
|
||||
surface->window->buffer_rect.y + (y * monitor_scale));
|
||||
surface->window->buffer_rect.x + x,
|
||||
surface->window->buffer_rect.y + y);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -841,17 +839,6 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
|
||||
xdg_popup->popup = popup;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
|
||||
* is pretty undefined. Same applies for subsurfaces, but in practice,
|
||||
* subsurfaces never receive keyboard focus, so it makes sense to
|
||||
* do the same for non-grabbing popups.
|
||||
*
|
||||
* See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
|
||||
*/
|
||||
window->input = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -117,11 +117,24 @@ static void
|
||||
meta_window_wayland_focus (MetaWindow *window,
|
||||
guint32 timestamp)
|
||||
{
|
||||
if (window->input)
|
||||
meta_display_set_input_focus_window (window->display,
|
||||
window,
|
||||
FALSE,
|
||||
timestamp);
|
||||
MetaWaylandSurface *surface = window->surface;
|
||||
MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
|
||||
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
|
||||
|
||||
/* 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
|
||||
|
@@ -546,8 +546,6 @@ static WaylandSelectionData *
|
||||
wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
||||
MetaWaylandCompositor *compositor)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaScreen *screen = display->screen;
|
||||
MetaWaylandDataDevice *data_device;
|
||||
MetaWaylandDataSource *wayland_source;
|
||||
MetaSelectionBridge *selection;
|
||||
@@ -597,8 +595,7 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event,
|
||||
data->window = meta_display_lookup_x_window (meta_get_display (),
|
||||
data->request_event.requestor);
|
||||
|
||||
/* Do *not* change the event mask on the root window, bugger! */
|
||||
if (!data->window && data->request_event.requestor != screen->xroot)
|
||||
if (!data->window)
|
||||
{
|
||||
/* Not a managed window, set the PropertyChangeMask
|
||||
* for INCR deletion notifications.
|
||||
@@ -632,12 +629,10 @@ reply_selection_request (XSelectionRequestEvent *request_event,
|
||||
static void
|
||||
wayland_selection_data_free (WaylandSelectionData *data)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaScreen *screen = display->screen;
|
||||
|
||||
/* Do *not* change the event mask on the root window, bugger! */
|
||||
if (!data->window && data->request_event.requestor != screen->xroot)
|
||||
if (!data->window)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
|
||||
meta_error_trap_push (display);
|
||||
XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
data->request_event.requestor, NoEventMask);
|
||||
|
Reference in New Issue
Block a user