Compare commits
	
		
			92 Commits
		
	
	
		
			wip/carlos
			...
			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