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