Compare commits
83 Commits
wip/carlos
...
3.27.91
Author | SHA1 | Date | |
---|---|---|---|
f0f88e4d3f | |||
bcd5882081 | |||
69f56578a3 | |||
c00e092456 | |||
a8cee14417 | |||
8a89b0007c | |||
6934b83f44 | |||
37aab9280a | |||
49e8bc8a52 | |||
abd6b7affd | |||
748223b896 | |||
c75eac27a8 | |||
ac502c921d | |||
134765c634 | |||
5149d6eb40 | |||
006cdac531 | |||
61bc1a7d6f | |||
86ab3878e7 | |||
f2d0e5021a | |||
6d8286614f | |||
70fcf745b8 | |||
589e999049 | |||
d8f2f583e6 | |||
db866eb052 | |||
d092e913d6 | |||
6147be3dff | |||
57f55d486d | |||
6be56de140 | |||
206ca43c91 | |||
f8f1bcfa9e | |||
91df801ffb | |||
97f142d1cc | |||
5ea3a4ecbb | |||
fbd5a74a0b | |||
58bb61e161 | |||
dbd053020a | |||
c063d43be8 | |||
35b77a61c8 | |||
32547d2eff | |||
dc37ee2782 | |||
371e5df568 | |||
cc4e007148 | |||
c0d9b08ef9 | |||
d99cd279d2 | |||
d670a1aa78 | |||
76b396846d | |||
bd0105ba8d | |||
6dcce19932 | |||
cc40a885ef | |||
513c278077 | |||
ac8ee9a08c | |||
952c1fefa2 | |||
18b8f9bfed | |||
f08417b618 | |||
62c9713361 | |||
efd7a4af5e | |||
3a914a915e | |||
aa6561a3b1 | |||
9eb9623288 | |||
8c988aa632 | |||
13cf19e0b6 | |||
eac0e253e1 | |||
7346419295 | |||
3e77f6704b | |||
01e27a4366 | |||
4e3b26d2ed | |||
5f05112b9a | |||
6cf7d2d47f | |||
1139ace244 | |||
bd9a300801 | |||
2d090f9232 | |||
1c8aebd811 | |||
31eafba93a | |||
5eacdf7af7 | |||
ca638d1354 | |||
f12e6ad4f1 | |||
0bbda3ad87 | |||
dd43d04d42 | |||
383ac76d00 | |||
e59ca14f6c | |||
7917b083cb | |||
2b3040d04f | |||
6cc48d8cbb |
48
NEWS
48
NEWS
@ -1,3 +1,51 @@
|
||||
3.27.91
|
||||
=======
|
||||
* Fix handling of trackball settings on wayland [Carlos; #787804]
|
||||
* Apply font settings on wayland [Daniel; #645433]
|
||||
* Fix keybindings getting mixed up with some layouts [Jonas; #789300]
|
||||
* Fix bluetooth mouse cursor disappearing after idle [Benoit; #761067]
|
||||
* Support platforms that export EGL_KHR_platform_gbm [memeka; #780668]
|
||||
* Add keyboard accessibility support on wayland [Olivier; #788564]
|
||||
* Fix missing cursor when using screen magnifier [Carlos; #754806]
|
||||
* Fix external monitor shutting off on wayland when lid closes [Jonas; #788915]
|
||||
* Add xdg-output support [Olivier; #787363]
|
||||
* Add Xwayland grab keyboard support [Olivier; #783342]
|
||||
* Allow shortcut inhibition of the super key [Olivier; #790627]
|
||||
* Take "panel orientation" drm_connector property into account [Hans; #782294]
|
||||
* Fix focus window ending up below other windows on wayland [Olivier; #780820]
|
||||
* Fix maximized windows restoring to a tiny size on wayland [Olivier; #783901]
|
||||
* Fix tap-and-drag setting on X11 [Jonas; #775755]
|
||||
* Fix handling of single-touch devices on wayland [Carlos; #792005]
|
||||
* Support tiled/compressed buffers [Daniel; #785779]
|
||||
* Port screencast support to pipewire 0.1.8 [Jonas; #792854]
|
||||
* Add support for third stylus button on newer tablets [Jason; #790033]
|
||||
* Fix background corruption regression on nvidia [Jonas; #739178]
|
||||
* Misc. bug fixes [Jonas, Rui, Michael, Marco, Carlos, Olivier, Philip, Piotr,
|
||||
Ting-Wei, Daniel, Jeremy, Hans, Florian, Ray, Jeff, George, Gwan-gyeong;
|
||||
#789153, #788493, #784314, #789227, #789223, #789277, #782344, #789552,
|
||||
#789553, #788695, #789984, #788764, #789386, #784545, #790336, #790358,
|
||||
#791022, #791006, #789070, #772218, #791383, #791809, #776220, #791916,
|
||||
#792281, #790309, #791371, #792527, #792599, #788834, #792765, #792062,
|
||||
#645460, #792853, !2, #792818, #8, #12, #789501, #10, #789961, #13, !15, #1,
|
||||
#26, #28, #35, #36]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Jeremy Bicha, Michael Catanzaro, Piotr Drąg, Olivier Fourdan,
|
||||
Carlos Garnacho, Jason Gerecke, Hans de Goede, Benoit Gschwind,
|
||||
Peter Hutterer, George Kiagiadakis, Ting-Wei Lan, Rui Matos, memeka,
|
||||
Florian Müllner, Gwan-gyeong Mun, Jeremy Nickurak, Marc-Antoine Perennou,
|
||||
Jeff Smith, Daniel Stone, Ray Strode, Marco Trevisan (Treviño),
|
||||
Daniel van Vugt, Philip Withnall
|
||||
|
||||
Translators:
|
||||
Khaled Hosny [ar], Kjartan Maraas [nb], Piotr Drąg [pl],
|
||||
Rafael Fontenelle [pt_BR], Christian Kirbach [de], Anders Jonsson [sv],
|
||||
Charles Monzat [fr], Marek Cernocky [cs], Muhammet Kara [tr],
|
||||
Milo Casagrande [it], Pawan Chitrakar [ne], Yosef Or Boczko [he],
|
||||
Kukuh Syafaat [id], Daniel Mustieles [es], Fabio Tomat [fur],
|
||||
Kristjan SCHMIDT [eo], Balázs Úr [hu], Andika Triwidada [id],
|
||||
Fran Dieguez [gl], gogo [hr]
|
||||
|
||||
3.27.1
|
||||
======
|
||||
* Work with clients that require older linux_dmabuf protocol [Daniel; #788558]
|
||||
|
@ -87,6 +87,8 @@ source_h = \
|
||||
clutter-image.h \
|
||||
clutter-input-device.h \
|
||||
clutter-input-device-tool.h \
|
||||
clutter-input-focus.h \
|
||||
clutter-input-method.h \
|
||||
clutter-interval.h \
|
||||
clutter-keyframe-transition.h \
|
||||
clutter-keysyms.h \
|
||||
@ -169,6 +171,8 @@ source_c = \
|
||||
clutter-image.c \
|
||||
clutter-input-device.c \
|
||||
clutter-input-device-tool.c \
|
||||
clutter-input-focus.c \
|
||||
clutter-input-method.c \
|
||||
clutter-virtual-input-device.c \
|
||||
clutter-interval.c \
|
||||
clutter-keyframe-transition.c \
|
||||
@ -229,6 +233,8 @@ source_h_priv = \
|
||||
clutter-flatten-effect.h \
|
||||
clutter-gesture-action-private.h \
|
||||
clutter-id-pool.h \
|
||||
clutter-input-focus-private.h \
|
||||
clutter-input-method-private.h \
|
||||
clutter-master-clock.h \
|
||||
clutter-master-clock-default.h \
|
||||
clutter-offscreen-effect-private.h \
|
||||
|
@ -58,6 +58,8 @@ struct _ClutterBackend
|
||||
gint32 units_serial;
|
||||
|
||||
GList *event_translators;
|
||||
|
||||
ClutterInputMethod *input_method;
|
||||
};
|
||||
|
||||
struct _ClutterBackendClass
|
||||
|
@ -127,6 +127,7 @@ clutter_backend_finalize (GObject *gobject)
|
||||
|
||||
g_free (backend->font_name);
|
||||
clutter_backend_set_font_options (backend, NULL);
|
||||
g_clear_object (&backend->input_method);
|
||||
|
||||
G_OBJECT_CLASS (clutter_backend_parent_class)->finalize (gobject);
|
||||
}
|
||||
@ -1373,3 +1374,31 @@ clutter_backend_bell_notify (ClutterBackend *backend)
|
||||
if (klass->bell_notify)
|
||||
klass->bell_notify (backend);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_backend_get_input_method:
|
||||
* @backend: the #CLutterBackend
|
||||
*
|
||||
* Returns the input method used by Clutter
|
||||
*
|
||||
* Returns: (transfer none): the input method
|
||||
**/
|
||||
ClutterInputMethod *
|
||||
clutter_backend_get_input_method (ClutterBackend *backend)
|
||||
{
|
||||
return backend->input_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_backend_set_input_method:
|
||||
* @backend: the #ClutterBackend
|
||||
* @method: the input method
|
||||
*
|
||||
* Sets the input method to be used by Clutter
|
||||
**/
|
||||
void
|
||||
clutter_backend_set_input_method (ClutterBackend *backend,
|
||||
ClutterInputMethod *method)
|
||||
{
|
||||
g_set_object (&backend->input_method, method);
|
||||
}
|
||||
|
@ -77,6 +77,12 @@ CoglContext * clutter_backend_get_cogl_context (Clutter
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_backend_bell_notify (ClutterBackend *backend);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
ClutterInputMethod * clutter_backend_get_input_method (ClutterBackend *backend);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_backend_set_input_method (ClutterBackend *backend,
|
||||
ClutterInputMethod *method);
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_BACKEND_H__ */
|
||||
|
@ -767,8 +767,9 @@ typedef enum { /*< prefix=CLUTTER_DRAG >*/
|
||||
* Since: 0.6
|
||||
*/
|
||||
typedef enum { /*< flags prefix=CLUTTER_EVENT >*/
|
||||
CLUTTER_EVENT_NONE = 0,
|
||||
CLUTTER_EVENT_FLAG_SYNTHETIC = 1 << 0
|
||||
CLUTTER_EVENT_NONE = 0,
|
||||
CLUTTER_EVENT_FLAG_SYNTHETIC = 1 << 0,
|
||||
CLUTTER_EVENT_FLAG_INPUT_METHOD = 1 << 1
|
||||
} ClutterEventFlags;
|
||||
|
||||
/**
|
||||
@ -1573,6 +1574,41 @@ typedef enum {
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE,
|
||||
} ClutterInputDeviceMapping;
|
||||
|
||||
typedef enum {
|
||||
CLUTTER_INPUT_CONTENT_HINT_COMPLETION = 1 << 0,
|
||||
CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK = 1 << 1,
|
||||
CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION = 1 << 2,
|
||||
CLUTTER_INPUT_CONTENT_HINT_LOWERCASE = 1 << 3,
|
||||
CLUTTER_INPUT_CONTENT_HINT_UPPERCASE = 1 << 4,
|
||||
CLUTTER_INPUT_CONTENT_HINT_TITLECASE = 1 << 5,
|
||||
CLUTTER_INPUT_CONTENT_HINT_HIDDEN_TEXT = 1 << 6,
|
||||
CLUTTER_INPUT_CONTENT_HINT_SENSITIVE_DATA = 1 << 7,
|
||||
CLUTTER_INPUT_CONTENT_HINT_LATIN = 1 << 8,
|
||||
CLUTTER_INPUT_CONTENT_HINT_MULTILINE = 1 << 9,
|
||||
} ClutterInputContentHintFlags;
|
||||
|
||||
typedef enum {
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_NUMBER,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_PHONE,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_URL,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_EMAIL,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_NAME,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_PASSWORD,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_DATE,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_TIME,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_DATETIME,
|
||||
CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL,
|
||||
} ClutterInputContentPurpose;
|
||||
|
||||
typedef enum {
|
||||
CLUTTER_INPUT_PANEL_STATE_OFF,
|
||||
CLUTTER_INPUT_PANEL_STATE_ON,
|
||||
CLUTTER_INPUT_PANEL_STATE_TOGGLE,
|
||||
} ClutterInputPanelState;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_ENUMS_H__ */
|
||||
|
40
clutter/clutter/clutter-input-focus-private.h
Normal file
40
clutter/clutter/clutter-input-focus-private.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2017,2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_INPUT_FOCUS_PRIVATE_H__
|
||||
#define __CLUTTER_INPUT_FOCUS_PRIVATE_H__
|
||||
|
||||
void clutter_input_focus_focus_in (ClutterInputFocus *focus,
|
||||
ClutterInputMethod *method);
|
||||
void clutter_input_focus_focus_out (ClutterInputFocus *focus);
|
||||
|
||||
void clutter_input_focus_commit (ClutterInputFocus *focus,
|
||||
const gchar *text);
|
||||
void clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||
guint offset,
|
||||
guint len);
|
||||
void clutter_input_focus_request_surrounding (ClutterInputFocus *focus);
|
||||
|
||||
void clutter_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||
const gchar *preedit,
|
||||
guint cursor);
|
||||
|
||||
#endif /* __CLUTTER_INPUT_FOCUS_PRIVATE_H__ */
|
243
clutter/clutter/clutter-input-focus.c
Normal file
243
clutter/clutter/clutter-input-focus.c
Normal file
@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Copyright (C) 2017,2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter/clutter-input-focus.h"
|
||||
#include "clutter/clutter-input-focus-private.h"
|
||||
#include "clutter/clutter-input-method-private.h"
|
||||
|
||||
typedef struct _ClutterInputFocusPrivate ClutterInputFocusPrivate;
|
||||
|
||||
struct _ClutterInputFocusPrivate
|
||||
{
|
||||
ClutterInputMethod *im;
|
||||
};
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterInputFocus, clutter_input_focus, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
clutter_input_focus_real_focus_in (ClutterInputFocus *focus,
|
||||
ClutterInputMethod *im)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
priv->im = im;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_focus_real_focus_out (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
priv->im = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_focus_class_init (ClutterInputFocusClass *klass)
|
||||
{
|
||||
klass->focus_in = clutter_input_focus_real_focus_in;
|
||||
klass->focus_out = clutter_input_focus_real_focus_out;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_focus_init (ClutterInputFocus *focus)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_input_focus_is_focused (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
return !!priv->im;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_reset (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_reset (priv->im);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
|
||||
const ClutterRect *rect)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_set_cursor_location (priv->im, rect);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_set_surrounding (priv->im, text, cursor, anchor);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_content_hints (ClutterInputFocus *focus,
|
||||
ClutterInputContentHintFlags hints)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_set_content_hints (priv->im, hints);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_content_purpose (ClutterInputFocus *focus,
|
||||
ClutterInputContentPurpose purpose)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_set_content_purpose (priv->im, purpose);
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_input_focus_filter_key_event (ClutterInputFocus *focus,
|
||||
const ClutterKeyEvent *key)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_FOCUS (focus), FALSE);
|
||||
g_return_val_if_fail (clutter_input_focus_is_focused (focus), FALSE);
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
return clutter_input_method_filter_key_event (priv->im, key);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
|
||||
gboolean can_show_preedit)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_set_can_show_preedit (priv->im, can_show_preedit);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterInputFocusPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (clutter_input_focus_is_focused (focus));
|
||||
|
||||
priv = clutter_input_focus_get_instance_private (focus);
|
||||
|
||||
clutter_input_method_toggle_input_panel (priv->im);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_focus_in (ClutterInputFocus *focus,
|
||||
ClutterInputMethod *im)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->focus_in (focus, im);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_focus_out (ClutterInputFocus *focus)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->focus_out (focus);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_commit (ClutterInputFocus *focus,
|
||||
const gchar *text)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->commit_text (focus, text);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||
guint offset,
|
||||
guint len)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->delete_surrounding (focus, offset, len);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_request_surrounding (ClutterInputFocus *focus)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->request_surrounding (focus);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||
const gchar *preedit,
|
||||
guint cursor)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
CLUTTER_INPUT_FOCUS_GET_CLASS (focus)->set_preedit_text (focus, preedit, cursor);
|
||||
}
|
83
clutter/clutter/clutter-input-focus.h
Normal file
83
clutter/clutter/clutter-input-focus.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2017,2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_INPUT_FOCUS_H__
|
||||
#define __CLUTTER_INPUT_FOCUS_H__
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#define CLUTTER_TYPE_INPUT_FOCUS (clutter_input_focus_get_type ())
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
G_DECLARE_DERIVABLE_TYPE (ClutterInputFocus, clutter_input_focus,
|
||||
CLUTTER, INPUT_FOCUS, GObject)
|
||||
|
||||
struct _ClutterInputFocusClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
GTypeInterface iface;
|
||||
|
||||
void (* focus_in) (ClutterInputFocus *focus,
|
||||
ClutterInputMethod *input_method);
|
||||
void (* focus_out) (ClutterInputFocus *focus);
|
||||
|
||||
void (* request_surrounding) (ClutterInputFocus *focus);
|
||||
void (* delete_surrounding) (ClutterInputFocus *focus,
|
||||
guint offset,
|
||||
guint len);
|
||||
void (* commit_text) (ClutterInputFocus *focus,
|
||||
const gchar *text);
|
||||
|
||||
void (* set_preedit_text) (ClutterInputFocus *focus,
|
||||
const gchar *preedit,
|
||||
guint cursor);
|
||||
};
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
gboolean clutter_input_focus_is_focused (ClutterInputFocus *focus);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_reset (ClutterInputFocus *focus);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
|
||||
const ClutterRect *rect);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_set_content_hints (ClutterInputFocus *focus,
|
||||
ClutterInputContentHintFlags hint);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_set_content_purpose (ClutterInputFocus *focus,
|
||||
ClutterInputContentPurpose purpose);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
gboolean clutter_input_focus_filter_key_event (ClutterInputFocus *focus,
|
||||
const ClutterKeyEvent *key);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
|
||||
gboolean can_show_preedit);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus);
|
||||
|
||||
#endif /* __CLUTTER_INPUT_FOCUS_H__ */
|
46
clutter/clutter/clutter-input-method-private.h
Normal file
46
clutter/clutter/clutter-input-method-private.h
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (C) 2017,2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_INPUT_METHOD_PRIVATE_H__
|
||||
#define __CLUTTER_INPUT_METHOD_PRIVATE_H__
|
||||
|
||||
ClutterInputFocus * clutter_input_method_get_focus (ClutterInputMethod *method);
|
||||
|
||||
void clutter_input_method_reset (ClutterInputMethod *method);
|
||||
|
||||
void clutter_input_method_set_cursor_location (ClutterInputMethod *method,
|
||||
const ClutterRect *rect);
|
||||
void clutter_input_method_set_surrounding (ClutterInputMethod *method,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor);
|
||||
void clutter_input_method_set_content_hints (ClutterInputMethod *method,
|
||||
ClutterInputContentHintFlags hints);
|
||||
void clutter_input_method_set_content_purpose (ClutterInputMethod *method,
|
||||
ClutterInputContentPurpose purpose);
|
||||
void clutter_input_method_set_can_show_preedit (ClutterInputMethod *method,
|
||||
gboolean can_show_preedit);
|
||||
gboolean clutter_input_method_filter_key_event (ClutterInputMethod *method,
|
||||
const ClutterKeyEvent *key);
|
||||
|
||||
void clutter_input_method_toggle_input_panel (ClutterInputMethod *method);
|
||||
|
||||
#endif /* __CLUTTER_INPUT_METHOD_PRIVATE_H__ */
|
442
clutter/clutter/clutter-input-method.c
Normal file
442
clutter/clutter/clutter-input-method.c
Normal file
@ -0,0 +1,442 @@
|
||||
/*
|
||||
* Copyright (C) 2017,2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter-private.h"
|
||||
#include "clutter/clutter-input-method.h"
|
||||
#include "clutter/clutter-input-method-private.h"
|
||||
#include "clutter/clutter-input-focus-private.h"
|
||||
|
||||
typedef struct _ClutterInputMethodPrivate ClutterInputMethodPrivate;
|
||||
|
||||
struct _ClutterInputMethodPrivate
|
||||
{
|
||||
ClutterInputFocus *focus;
|
||||
ClutterInputContentHintFlags content_hints;
|
||||
ClutterInputContentPurpose content_purpose;
|
||||
gboolean can_show_preedit;
|
||||
};
|
||||
|
||||
enum {
|
||||
COMMIT,
|
||||
DELETE_SURROUNDING,
|
||||
REQUEST_SURROUNDING,
|
||||
INPUT_PANEL_STATE,
|
||||
CURSOR_LOCATION_CHANGED,
|
||||
N_SIGNALS,
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_CONTENT_HINTS,
|
||||
PROP_CONTENT_PURPOSE,
|
||||
PROP_CAN_SHOW_PREEDIT,
|
||||
N_PROPS
|
||||
};
|
||||
|
||||
static guint signals[N_SIGNALS] = { 0 };
|
||||
static GParamSpec *pspecs[N_PROPS] = { 0 };
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterInputMethod, clutter_input_method, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
set_content_hints (ClutterInputMethod *im,
|
||||
ClutterInputContentHintFlags content_hints)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
priv->content_hints = content_hints;
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (im)->update_content_hints (im, content_hints);
|
||||
}
|
||||
|
||||
static void
|
||||
set_content_purpose (ClutterInputMethod *im,
|
||||
ClutterInputContentPurpose content_purpose)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
priv->content_purpose = content_purpose;
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (im)->update_content_purpose (im,
|
||||
content_purpose);
|
||||
}
|
||||
|
||||
static void
|
||||
set_can_show_preedit (ClutterInputMethod *im,
|
||||
gboolean can_show_preedit)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
priv->can_show_preedit = can_show_preedit;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_method_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_CONTENT_HINTS:
|
||||
set_content_hints (CLUTTER_INPUT_METHOD (object),
|
||||
g_value_get_flags (value));
|
||||
break;
|
||||
case PROP_CONTENT_PURPOSE:
|
||||
set_content_purpose (CLUTTER_INPUT_METHOD (object),
|
||||
g_value_get_enum (value));
|
||||
break;
|
||||
case PROP_CAN_SHOW_PREEDIT:
|
||||
set_can_show_preedit (CLUTTER_INPUT_METHOD (object),
|
||||
g_value_get_boolean (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_method_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
ClutterInputMethod *im;
|
||||
|
||||
im = CLUTTER_INPUT_METHOD (object);
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_CONTENT_HINTS:
|
||||
g_value_set_flags (value, priv->content_hints);
|
||||
break;
|
||||
case PROP_CONTENT_PURPOSE:
|
||||
g_value_set_enum (value, priv->content_purpose);
|
||||
break;
|
||||
case PROP_CAN_SHOW_PREEDIT:
|
||||
g_value_set_boolean (value, priv->can_show_preedit);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_method_class_init (ClutterInputMethodClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->set_property = clutter_input_method_set_property;
|
||||
object_class->get_property = clutter_input_method_get_property;
|
||||
|
||||
signals[COMMIT] =
|
||||
g_signal_new ("commit",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1, G_TYPE_STRING);
|
||||
signals[DELETE_SURROUNDING] =
|
||||
g_signal_new ("delete-surrounding",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
|
||||
signals[REQUEST_SURROUNDING] =
|
||||
g_signal_new ("request-surrounding",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
signals[INPUT_PANEL_STATE] =
|
||||
g_signal_new ("input-panel-state",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1,
|
||||
CLUTTER_TYPE_INPUT_PANEL_STATE);
|
||||
signals[CURSOR_LOCATION_CHANGED] =
|
||||
g_signal_new ("cursor-location-changed",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1, CLUTTER_TYPE_RECT);
|
||||
|
||||
pspecs[PROP_CONTENT_HINTS] =
|
||||
g_param_spec_flags ("content-hints",
|
||||
P_("Content hints"),
|
||||
P_("Content hints"),
|
||||
CLUTTER_TYPE_INPUT_CONTENT_HINT_FLAGS, 0,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
pspecs[PROP_CONTENT_PURPOSE] =
|
||||
g_param_spec_enum ("content-purpose",
|
||||
P_("Content purpose"),
|
||||
P_("Content purpose"),
|
||||
CLUTTER_TYPE_INPUT_CONTENT_PURPOSE, 0,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
pspecs[PROP_CAN_SHOW_PREEDIT] =
|
||||
g_param_spec_boolean ("can-show-preedit",
|
||||
P_("Can show preedit"),
|
||||
P_("Can show preedit"),
|
||||
FALSE,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, N_PROPS, pspecs);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_method_init (ClutterInputMethod *im)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_focus_in (ClutterInputMethod *im,
|
||||
ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
ClutterInputMethodClass *klass;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
|
||||
if (priv->focus == focus)
|
||||
return;
|
||||
|
||||
if (priv->focus)
|
||||
clutter_input_method_focus_out (im);
|
||||
|
||||
g_set_object (&priv->focus, focus);
|
||||
|
||||
if (focus)
|
||||
{
|
||||
klass = CLUTTER_INPUT_METHOD_GET_CLASS (im);
|
||||
klass->focus_in (im, focus);
|
||||
|
||||
clutter_input_focus_focus_in (priv->focus, im);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_focus_out (ClutterInputMethod *im)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
ClutterInputMethodClass *klass;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
|
||||
if (!priv->focus)
|
||||
return;
|
||||
|
||||
clutter_input_focus_focus_out (priv->focus);
|
||||
g_clear_object (&priv->focus);
|
||||
|
||||
klass = CLUTTER_INPUT_METHOD_GET_CLASS (im);
|
||||
klass->focus_out (im);
|
||||
|
||||
g_signal_emit (im, signals[INPUT_PANEL_STATE],
|
||||
0, CLUTTER_INPUT_PANEL_STATE_OFF);
|
||||
}
|
||||
|
||||
ClutterInputFocus *
|
||||
clutter_input_method_get_focus (ClutterInputMethod *im)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
return priv->focus;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_commit (ClutterInputMethod *im,
|
||||
const gchar *text)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
if (priv->focus)
|
||||
clutter_input_focus_commit (priv->focus, text);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_delete_surrounding (ClutterInputMethod *im,
|
||||
guint offset,
|
||||
guint len)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
if (priv->focus)
|
||||
clutter_input_focus_delete_surrounding (priv->focus, offset, len);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_request_surrounding (ClutterInputMethod *im)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
if (priv->focus)
|
||||
clutter_input_focus_request_surrounding (priv->focus);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_input_method_set_preedit_text:
|
||||
* @method: a #ClutterInputMethod
|
||||
* @preedit: (nullable): the preedit text, or %NULL
|
||||
*
|
||||
* Sets the preedit text on the current input focus.
|
||||
**/
|
||||
void
|
||||
clutter_input_method_set_preedit_text (ClutterInputMethod *im,
|
||||
const gchar *preedit,
|
||||
guint cursor)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (im);
|
||||
if (priv->focus)
|
||||
clutter_input_focus_set_preedit_text (priv->focus, preedit, cursor);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_notify_key_event (ClutterInputMethod *im,
|
||||
const ClutterEvent *event,
|
||||
gboolean filtered)
|
||||
{
|
||||
if (!filtered)
|
||||
{
|
||||
ClutterEvent *copy;
|
||||
|
||||
/* XXX: we rely on the IM implementation to notify back of
|
||||
* key events in the exact same order they were given.
|
||||
*/
|
||||
copy = clutter_event_copy (event);
|
||||
clutter_event_set_flags (copy, clutter_event_get_flags (event) |
|
||||
CLUTTER_EVENT_FLAG_INPUT_METHOD);
|
||||
clutter_event_put (copy);
|
||||
clutter_event_free (copy);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_toggle_input_panel (ClutterInputMethod *im)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
g_signal_emit (im, signals[INPUT_PANEL_STATE], 0,
|
||||
CLUTTER_INPUT_PANEL_STATE_TOGGLE);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_reset (ClutterInputMethod *im)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (im)->reset (im);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_set_cursor_location (ClutterInputMethod *im,
|
||||
const ClutterRect *rect)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (im)->set_cursor_location (im, rect);
|
||||
|
||||
g_signal_emit (im, signals[CURSOR_LOCATION_CHANGED], 0, rect);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_set_surrounding (ClutterInputMethod *im,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (im)->set_surrounding (im, text,
|
||||
cursor, anchor);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_set_content_hints (ClutterInputMethod *im,
|
||||
ClutterInputContentHintFlags hints)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
g_object_set (G_OBJECT (im), "content-hints", hints, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_set_content_purpose (ClutterInputMethod *im,
|
||||
ClutterInputContentPurpose purpose)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
g_object_set (G_OBJECT (im), "content-purpose", purpose, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_set_can_show_preedit (ClutterInputMethod *im,
|
||||
gboolean can_show_preedit)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
|
||||
|
||||
g_object_set (G_OBJECT (im), "can-show-preedit", can_show_preedit, NULL);
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_input_method_filter_key_event (ClutterInputMethod *im,
|
||||
const ClutterKeyEvent *key)
|
||||
{
|
||||
ClutterInputMethodClass *im_class = CLUTTER_INPUT_METHOD_GET_CLASS (im);
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_METHOD (im), FALSE);
|
||||
g_return_val_if_fail (key != NULL, FALSE);
|
||||
|
||||
if (clutter_event_get_flags ((ClutterEvent *) key) & CLUTTER_EVENT_FLAG_INPUT_METHOD)
|
||||
return FALSE;
|
||||
if (!im_class->filter_key_event)
|
||||
return FALSE;
|
||||
|
||||
return im_class->filter_key_event (im, (const ClutterEvent *) key);
|
||||
}
|
88
clutter/clutter/clutter-input-method.h
Normal file
88
clutter/clutter/clutter-input-method.h
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (C) 2017,2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_INPUT_METHOD_H__
|
||||
#define __CLUTTER_INPUT_METHOD_H__
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#define CLUTTER_TYPE_INPUT_METHOD (clutter_input_method_get_type ())
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
G_DECLARE_DERIVABLE_TYPE (ClutterInputMethod, clutter_input_method,
|
||||
CLUTTER, INPUT_METHOD, GObject)
|
||||
|
||||
typedef struct _ClutterInputMethodClass ClutterInputMethodClass;
|
||||
|
||||
struct _ClutterInputMethodClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
void (* focus_in) (ClutterInputMethod *im,
|
||||
ClutterInputFocus *actor);
|
||||
void (* focus_out) (ClutterInputMethod *im);
|
||||
|
||||
void (* reset) (ClutterInputMethod *im);
|
||||
|
||||
void (* set_cursor_location) (ClutterInputMethod *im,
|
||||
const ClutterRect *rect);
|
||||
void (* set_surrounding) (ClutterInputMethod *im,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor);
|
||||
void (* update_content_hints) (ClutterInputMethod *im,
|
||||
ClutterInputContentHintFlags hint);
|
||||
void (* update_content_purpose) (ClutterInputMethod *im,
|
||||
ClutterInputContentPurpose purpose);
|
||||
|
||||
gboolean (* filter_key_event) (ClutterInputMethod *im,
|
||||
const ClutterEvent *key);
|
||||
};
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_focus_in (ClutterInputMethod *im,
|
||||
ClutterInputFocus *focus);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_focus_out (ClutterInputMethod *im);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_commit (ClutterInputMethod *im,
|
||||
const gchar *text);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_delete_surrounding (ClutterInputMethod *im,
|
||||
guint offset,
|
||||
guint len);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_request_surrounding (ClutterInputMethod *im);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_set_preedit_text (ClutterInputMethod *im,
|
||||
const gchar *preedit,
|
||||
guint cursor);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_notify_key_event (ClutterInputMethod *im,
|
||||
const ClutterEvent *event,
|
||||
gboolean filtered);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_request_toggle_input_panel (ClutterInputMethod *im);
|
||||
|
||||
#endif /* __CLUTTER_INPUT_METHOD_H__ */
|
@ -1486,10 +1486,11 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
||||
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||
priv->viewport[2] * fb_scale,
|
||||
priv->viewport[3] * fb_scale);
|
||||
cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||
priv->viewport[2] * fb_scale,
|
||||
priv->viewport[3] * fb_scale);
|
||||
cogl_framebuffer_set_viewport (fb,
|
||||
priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||
priv->viewport[2] * fb_scale,
|
||||
priv->viewport[3] * fb_scale);
|
||||
|
||||
read_x = dirty_x * fb_scale;
|
||||
read_y = dirty_y * fb_scale;
|
||||
@ -3617,6 +3618,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
||||
ClutterStageView *view)
|
||||
{
|
||||
ClutterStagePrivate *priv = stage->priv;
|
||||
CoglFramebuffer *fb = clutter_stage_view_get_framebuffer (view);
|
||||
|
||||
if (clutter_stage_view_is_dirty_viewport (view))
|
||||
{
|
||||
@ -3637,10 +3639,11 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
||||
|
||||
viewport_offset_x = view_layout.x * fb_scale;
|
||||
viewport_offset_y = view_layout.y * fb_scale;
|
||||
cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||
priv->viewport[2] * fb_scale,
|
||||
priv->viewport[3] * fb_scale);
|
||||
cogl_framebuffer_set_viewport (fb,
|
||||
priv->viewport[0] * fb_scale - viewport_offset_x,
|
||||
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||||
priv->viewport[2] * fb_scale,
|
||||
priv->viewport[3] * fb_scale);
|
||||
|
||||
perspective = priv->perspective;
|
||||
|
||||
@ -3679,7 +3682,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
||||
|
||||
if (clutter_stage_view_is_dirty_projection (view))
|
||||
{
|
||||
cogl_set_projection_matrix (&priv->projection);
|
||||
cogl_framebuffer_set_projection_matrix (fb, &priv->projection);
|
||||
|
||||
clutter_stage_view_set_dirty_projection (view, FALSE);
|
||||
}
|
||||
|
@ -63,6 +63,7 @@
|
||||
#include "clutter-units.h"
|
||||
#include "clutter-paint-volume-private.h"
|
||||
#include "clutter-scriptable.h"
|
||||
#include "clutter-input-focus.h"
|
||||
|
||||
/* cursor width in pixels */
|
||||
#define DEFAULT_CURSOR_SIZE 2
|
||||
@ -98,6 +99,12 @@ struct _LayoutCache
|
||||
guint age;
|
||||
};
|
||||
|
||||
struct _ClutterTextInputFocus
|
||||
{
|
||||
ClutterInputFocus parent_instance;
|
||||
ClutterText *text;
|
||||
};
|
||||
|
||||
struct _ClutterTextPrivate
|
||||
{
|
||||
PangoFontDescription *font_desc;
|
||||
@ -176,6 +183,10 @@ struct _ClutterTextPrivate
|
||||
/* Signal handler for when the :text-direction changes */
|
||||
guint direction_changed_id;
|
||||
|
||||
ClutterInputFocus *input_focus;
|
||||
ClutterInputContentHintFlags input_hints;
|
||||
ClutterInputContentPurpose input_purpose;
|
||||
|
||||
/* bitfields */
|
||||
guint alignment : 2;
|
||||
guint wrap : 1;
|
||||
@ -236,6 +247,8 @@ enum
|
||||
PROP_SINGLE_LINE_MODE,
|
||||
PROP_SELECTED_TEXT_COLOR,
|
||||
PROP_SELECTED_TEXT_COLOR_SET,
|
||||
PROP_INPUT_HINTS,
|
||||
PROP_INPUT_PURPOSE,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
@ -269,6 +282,112 @@ static const ClutterColor default_selected_text_color = { 0, 0, 0, 255 };
|
||||
static ClutterAnimatableIface *parent_animatable_iface = NULL;
|
||||
static ClutterScriptableIface *parent_scriptable_iface = NULL;
|
||||
|
||||
/* ClutterTextInputFocus */
|
||||
#define CLUTTER_TYPE_TEXT_INPUT_FOCUS (clutter_text_input_focus_get_type ())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (ClutterTextInputFocus, clutter_text_input_focus,
|
||||
CLUTTER, TEXT_INPUT_FOCUS, ClutterInputFocus)
|
||||
G_DEFINE_TYPE (ClutterTextInputFocus, clutter_text_input_focus,
|
||||
CLUTTER_TYPE_INPUT_FOCUS)
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_request_surrounding (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
|
||||
ClutterTextBuffer *buffer;
|
||||
const gchar *text;
|
||||
gint anchor_pos, cursor_pos;
|
||||
|
||||
buffer = clutter_text_get_buffer (clutter_text);
|
||||
text = clutter_text_buffer_get_text (buffer);
|
||||
|
||||
cursor_pos = clutter_text_get_cursor_position (clutter_text);
|
||||
if (cursor_pos < 0)
|
||||
cursor_pos = clutter_text_buffer_get_length (buffer);
|
||||
|
||||
anchor_pos = clutter_text_get_selection_bound (clutter_text);
|
||||
if (anchor_pos < 0)
|
||||
anchor_pos = cursor_pos;
|
||||
|
||||
clutter_input_focus_set_surrounding (focus, text,
|
||||
g_utf8_offset_to_pointer (text, cursor_pos) - text,
|
||||
g_utf8_offset_to_pointer (text, anchor_pos) - text);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||
guint offset,
|
||||
guint len)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
|
||||
|
||||
if (clutter_text_get_editable (clutter_text))
|
||||
clutter_text_delete_text (clutter_text, offset, len);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_commit_text (ClutterInputFocus *focus,
|
||||
const gchar *text)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
|
||||
|
||||
if (clutter_text_get_editable (clutter_text))
|
||||
{
|
||||
clutter_text_delete_selection (clutter_text);
|
||||
clutter_text_insert_text (clutter_text, text,
|
||||
clutter_text_get_cursor_position (clutter_text));
|
||||
clutter_text_set_preedit_string (clutter_text, NULL, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||
const gchar *preedit_text,
|
||||
guint cursor_pos)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
|
||||
|
||||
if (clutter_text_get_editable (clutter_text))
|
||||
{
|
||||
PangoAttrList *list;
|
||||
|
||||
list = pango_attr_list_new ();
|
||||
pango_attr_list_insert (list, pango_attr_underline_new (PANGO_UNDERLINE_SINGLE));
|
||||
clutter_text_set_preedit_string (clutter_text,
|
||||
preedit_text, list,
|
||||
cursor_pos);
|
||||
pango_attr_list_unref (list);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_class_init (ClutterTextInputFocusClass *klass)
|
||||
{
|
||||
ClutterInputFocusClass *focus_class = CLUTTER_INPUT_FOCUS_CLASS (klass);
|
||||
|
||||
focus_class->request_surrounding = clutter_text_input_focus_request_surrounding;
|
||||
focus_class->delete_surrounding = clutter_text_input_focus_delete_surrounding;
|
||||
focus_class->commit_text = clutter_text_input_focus_commit_text;
|
||||
focus_class->set_preedit_text = clutter_text_input_focus_set_preedit_text;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_init (ClutterTextInputFocus *focus)
|
||||
{
|
||||
}
|
||||
|
||||
static ClutterInputFocus *
|
||||
clutter_text_input_focus_new (ClutterText *text)
|
||||
{
|
||||
ClutterTextInputFocus *focus;
|
||||
|
||||
focus = g_object_new (CLUTTER_TYPE_TEXT_INPUT_FOCUS, NULL);
|
||||
focus->text = text;
|
||||
|
||||
return CLUTTER_INPUT_FOCUS (focus);
|
||||
}
|
||||
|
||||
/* ClutterText */
|
||||
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
|
||||
|
||||
@ -1009,6 +1128,22 @@ clutter_text_position_to_coords (ClutterText *self,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
update_cursor_location (ClutterText *self)
|
||||
{
|
||||
ClutterTextPrivate *priv = self->priv;
|
||||
ClutterRect rect;
|
||||
float x, y;
|
||||
|
||||
if (!priv->editable)
|
||||
return;
|
||||
|
||||
rect = priv->cursor_rect;
|
||||
clutter_actor_get_transformed_position (CLUTTER_ACTOR (self), &x, &y);
|
||||
clutter_rect_offset (&rect, x, y);
|
||||
clutter_input_focus_set_cursor_location (priv->input_focus, &rect);
|
||||
}
|
||||
|
||||
static inline void
|
||||
clutter_text_ensure_cursor_position (ClutterText *self)
|
||||
{
|
||||
@ -1057,6 +1192,8 @@ clutter_text_ensure_cursor_position (ClutterText *self)
|
||||
g_signal_emit (self, text_signals[CURSOR_EVENT], 0, &cursor_pos);
|
||||
|
||||
g_signal_emit (self, text_signals[CURSOR_CHANGED], 0);
|
||||
|
||||
update_cursor_location (self);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1503,6 +1640,8 @@ clutter_text_finalize (GObject *gobject)
|
||||
clutter_text_set_buffer (self, NULL);
|
||||
g_free (priv->font_name);
|
||||
|
||||
g_clear_object (&priv->input_focus);
|
||||
|
||||
G_OBJECT_CLASS (clutter_text_parent_class)->finalize (gobject);
|
||||
}
|
||||
|
||||
@ -1859,6 +1998,7 @@ clutter_text_press (ClutterActor *actor,
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
|
||||
clutter_actor_grab_key_focus (actor);
|
||||
clutter_input_focus_request_toggle_input_panel (priv->input_focus);
|
||||
|
||||
/* if the actor is empty we just reset everything and not
|
||||
* set up the dragging of the selection since there's nothing
|
||||
@ -2085,9 +2225,11 @@ clutter_text_key_press (ClutterActor *actor,
|
||||
g_assert (pool != NULL);
|
||||
|
||||
/* we allow passing synthetic events that only contain
|
||||
* the Unicode value and not the key symbol
|
||||
* the Unicode value and not the key symbol, unless they
|
||||
* contain the input method flag.
|
||||
*/
|
||||
if (event->keyval == 0 && (event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC))
|
||||
if (event->keyval == 0 && (event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC) &&
|
||||
!(event->flags & CLUTTER_EVENT_FLAG_INPUT_METHOD))
|
||||
res = FALSE;
|
||||
else
|
||||
res = clutter_binding_pool_activate (pool, event->keyval,
|
||||
@ -2105,6 +2247,10 @@ clutter_text_key_press (ClutterActor *actor,
|
||||
{
|
||||
gunichar key_unichar;
|
||||
|
||||
if (clutter_input_focus_is_focused (priv->input_focus) &&
|
||||
clutter_input_focus_filter_key_event (priv->input_focus, event))
|
||||
return CLUTTER_EVENT_STOP;
|
||||
|
||||
/* Skip keys when control is pressed */
|
||||
key_unichar = clutter_event_get_key_unicode ((ClutterEvent *) event);
|
||||
|
||||
@ -2141,6 +2287,20 @@ clutter_text_key_press (ClutterActor *actor,
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
clutter_text_key_release (ClutterActor *actor,
|
||||
ClutterKeyEvent *event)
|
||||
{
|
||||
ClutterText *self = CLUTTER_TEXT (actor);
|
||||
ClutterTextPrivate *priv = self->priv;
|
||||
|
||||
if (clutter_input_focus_is_focused (priv->input_focus) &&
|
||||
clutter_input_focus_filter_key_event (priv->input_focus, event))
|
||||
return CLUTTER_EVENT_STOP;
|
||||
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_compute_layout_offsets (ClutterText *self,
|
||||
PangoLayout *layout,
|
||||
@ -2663,6 +2823,14 @@ static void
|
||||
clutter_text_key_focus_in (ClutterActor *actor)
|
||||
{
|
||||
ClutterTextPrivate *priv = CLUTTER_TEXT (actor)->priv;
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
if (method && priv->editable)
|
||||
{
|
||||
clutter_input_method_focus_in (method, priv->input_focus);
|
||||
update_cursor_location (CLUTTER_TEXT (actor));
|
||||
}
|
||||
|
||||
priv->has_focus = TRUE;
|
||||
|
||||
@ -2673,9 +2841,17 @@ static void
|
||||
clutter_text_key_focus_out (ClutterActor *actor)
|
||||
{
|
||||
ClutterTextPrivate *priv = CLUTTER_TEXT (actor)->priv;
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
priv->has_focus = FALSE;
|
||||
|
||||
if (priv->editable && clutter_input_focus_is_focused (priv->input_focus))
|
||||
{
|
||||
clutter_text_set_preedit_string (CLUTTER_TEXT (actor), NULL, NULL, 0);
|
||||
clutter_input_method_focus_out (method);
|
||||
}
|
||||
|
||||
clutter_text_queue_redraw (actor);
|
||||
}
|
||||
|
||||
@ -3369,6 +3545,7 @@ clutter_text_class_init (ClutterTextClass *klass)
|
||||
actor_class->get_preferred_height = clutter_text_get_preferred_height;
|
||||
actor_class->allocate = clutter_text_allocate;
|
||||
actor_class->key_press_event = clutter_text_key_press;
|
||||
actor_class->key_release_event = clutter_text_key_release;
|
||||
actor_class->button_press_event = clutter_text_button_press;
|
||||
actor_class->button_release_event = clutter_text_button_release;
|
||||
actor_class->motion_event = clutter_text_motion;
|
||||
@ -3869,6 +4046,22 @@ clutter_text_class_init (ClutterTextClass *klass)
|
||||
obj_props[PROP_SELECTED_TEXT_COLOR_SET] = pspec;
|
||||
g_object_class_install_property (gobject_class, PROP_SELECTED_TEXT_COLOR_SET, pspec);
|
||||
|
||||
pspec = g_param_spec_flags ("input-hints",
|
||||
P_("Input hints"),
|
||||
P_("Input hints"),
|
||||
CLUTTER_TYPE_INPUT_CONTENT_HINT_FLAGS,
|
||||
0, CLUTTER_PARAM_READWRITE);
|
||||
obj_props[PROP_INPUT_HINTS] = pspec;
|
||||
g_object_class_install_property (gobject_class, PROP_INPUT_HINTS, pspec);
|
||||
|
||||
pspec = g_param_spec_enum ("input-purpose",
|
||||
P_("Input purpose"),
|
||||
P_("Input purpose"),
|
||||
CLUTTER_TYPE_INPUT_CONTENT_PURPOSE,
|
||||
0, CLUTTER_PARAM_READWRITE);
|
||||
obj_props[PROP_INPUT_PURPOSE] = pspec;
|
||||
g_object_class_install_property (gobject_class, PROP_INPUT_PURPOSE, pspec);
|
||||
|
||||
/**
|
||||
* ClutterText::text-changed:
|
||||
* @self: the #ClutterText that emitted the signal
|
||||
@ -4169,6 +4362,8 @@ clutter_text_init (ClutterText *self)
|
||||
g_signal_connect (self, "notify::text-direction",
|
||||
G_CALLBACK (clutter_text_direction_changed_cb),
|
||||
NULL);
|
||||
|
||||
priv->input_focus = clutter_text_input_focus_new (self);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4459,6 +4654,8 @@ void
|
||||
clutter_text_set_editable (ClutterText *self,
|
||||
gboolean editable)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
ClutterTextPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
||||
@ -4469,6 +4666,14 @@ clutter_text_set_editable (ClutterText *self,
|
||||
{
|
||||
priv->editable = editable;
|
||||
|
||||
if (method)
|
||||
{
|
||||
if (!priv->editable && clutter_input_focus_is_focused (priv->input_focus))
|
||||
clutter_input_method_focus_out (method);
|
||||
else if (priv->has_focus)
|
||||
clutter_input_method_focus_in (method, priv->input_focus);
|
||||
}
|
||||
|
||||
clutter_text_queue_redraw (CLUTTER_ACTOR (self));
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_EDITABLE]);
|
||||
@ -6298,3 +6503,49 @@ clutter_text_get_cursor_rect (ClutterText *self,
|
||||
|
||||
*rect = self->priv->cursor_rect;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_text_set_input_hints (ClutterText *self,
|
||||
ClutterInputContentHintFlags hints)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
||||
|
||||
self->priv->input_hints = hints;
|
||||
clutter_input_focus_set_content_hints (self->priv->input_focus, hints);
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_HINTS]);
|
||||
}
|
||||
|
||||
ClutterInputContentHintFlags
|
||||
clutter_text_get_input_hints (ClutterText *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_TEXT (self), 0);
|
||||
|
||||
return self->priv->input_hints;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_text_set_input_purpose (ClutterText *self,
|
||||
ClutterInputContentPurpose purpose)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
||||
|
||||
self->priv->input_purpose = purpose;
|
||||
clutter_input_focus_set_content_purpose (self->priv->input_focus, purpose);
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_PURPOSE]);
|
||||
}
|
||||
|
||||
ClutterInputContentPurpose
|
||||
clutter_text_get_input_purpose (ClutterText *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_TEXT (self), 0);
|
||||
|
||||
return self->priv->input_purpose;
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_text_has_preedit (ClutterText *self)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_TEXT (self), FALSE);
|
||||
|
||||
return self->priv->preedit_set;
|
||||
}
|
||||
|
@ -302,6 +302,20 @@ void clutter_text_get_layout_offsets (ClutterText *
|
||||
gint *x,
|
||||
gint *y);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_text_set_input_hints (ClutterText *self,
|
||||
ClutterInputContentHintFlags hints);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_text_set_input_purpose (ClutterText *self,
|
||||
ClutterInputContentPurpose purpose);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
ClutterInputContentHintFlags clutter_text_get_input_hints (ClutterText *self);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
ClutterInputContentPurpose clutter_text_get_input_purpose (ClutterText *self);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
gboolean clutter_text_has_preedit (ClutterText *self);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_TEXT_H__ */
|
||||
|
@ -97,6 +97,9 @@ typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool;
|
||||
typedef struct _ClutterInputDevice ClutterInputDevice;
|
||||
typedef struct _ClutterVirtualInputDevice ClutterVirtualInputDevice;
|
||||
|
||||
typedef struct _ClutterInputMethod ClutterInputMethod;
|
||||
typedef struct _ClutterInputFocus ClutterInputFocus;
|
||||
|
||||
typedef CoglMatrix ClutterMatrix;
|
||||
|
||||
typedef union _ClutterEvent ClutterEvent;
|
||||
|
@ -72,6 +72,8 @@
|
||||
#include "clutter-image.h"
|
||||
#include "clutter-input-device.h"
|
||||
#include "clutter-input-device-tool.h"
|
||||
#include "clutter-input-method.h"
|
||||
#include "clutter-input-focus.h"
|
||||
#include "clutter-interval.h"
|
||||
#include "clutter-keyframe-transition.h"
|
||||
#include "clutter-keysyms.h"
|
||||
|
@ -432,7 +432,7 @@ notify_touch_event (ClutterInputDevice *input_device,
|
||||
&event->touch.y);
|
||||
|
||||
/* "NULL" sequences are special cased in clutter */
|
||||
event->touch.sequence = GINT_TO_POINTER (slot + 1);
|
||||
event->touch.sequence = GINT_TO_POINTER (MAX (1, slot + 1));
|
||||
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
|
||||
|
||||
if (evtype == CLUTTER_TOUCH_BEGIN ||
|
||||
@ -1459,6 +1459,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
slot = libinput_event_touch_get_slot (touch_event);
|
||||
time_us = libinput_event_touch_get_time_usec (touch_event);
|
||||
touch_state = clutter_seat_evdev_get_touch (seat, slot);
|
||||
if (!touch_state)
|
||||
break;
|
||||
|
||||
notify_touch_event (device, CLUTTER_TOUCH_END, time_us, slot,
|
||||
touch_state->coords.x, touch_state->coords.y);
|
||||
@ -1497,6 +1499,9 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
stage_height);
|
||||
|
||||
touch_state = clutter_seat_evdev_get_touch (seat, slot);
|
||||
if (!touch_state)
|
||||
break;
|
||||
|
||||
touch_state->coords.x = x;
|
||||
touch_state->coords.y = y;
|
||||
|
||||
|
@ -45,6 +45,10 @@
|
||||
|
||||
#define DISCRETE_SCROLL_STEP 10.0
|
||||
|
||||
#ifndef BTN_STYLUS3
|
||||
#define BTN_STYLUS3 0x149 /* Linux 4.15 */
|
||||
#endif
|
||||
|
||||
void
|
||||
clutter_seat_evdev_set_libinput_seat (ClutterSeatEvdev *seat,
|
||||
struct libinput_seat *libinput_seat)
|
||||
@ -492,6 +496,10 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat,
|
||||
button_nr = CLUTTER_BUTTON_MIDDLE;
|
||||
break;
|
||||
|
||||
case 0x149: /* BTN_STYLUS3 */
|
||||
button_nr = 8;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* For compatibility reasons, all additional buttons go after the old 4-7 scroll ones */
|
||||
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
|
||||
|
@ -109,7 +109,6 @@ static const gchar *atom_names[] = {
|
||||
#define N_ATOM_NAMES G_N_ELEMENTS (atom_names)
|
||||
|
||||
/* various flags corresponding to pre init setup calls */
|
||||
static gboolean _want_reset_on_video_memory_purge = FALSE;
|
||||
static gboolean _no_xevent_retrieval = FALSE;
|
||||
static gboolean clutter_enable_xinput = TRUE;
|
||||
static gboolean clutter_enable_argb = FALSE;
|
||||
@ -682,8 +681,7 @@ clutter_backend_x11_get_renderer (ClutterBackend *backend,
|
||||
|
||||
/* set the display object we're using */
|
||||
cogl_xlib_renderer_set_foreign_display (renderer, xdisplay);
|
||||
cogl_xlib_renderer_request_reset_on_video_memory_purge (renderer,
|
||||
_want_reset_on_video_memory_purge);
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
@ -1028,30 +1026,6 @@ clutter_x11_has_event_retrieval (void)
|
||||
return !_no_xevent_retrieval;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_request_reset_on_video_memory_purge:
|
||||
*
|
||||
* If the GL driver supports the NV_robustness_video_memory_purge
|
||||
* extension, this call lets applications request that it gets
|
||||
* initialized, thus allowing cogl_get_graphics_reset_status() to
|
||||
* report memory purged errors if they happen. Checking for the
|
||||
* graphics reset status is the application's responsibility.
|
||||
*
|
||||
* This function can only be called before calling clutter_init().
|
||||
*/
|
||||
void
|
||||
clutter_x11_request_reset_on_video_memory_purge (void)
|
||||
{
|
||||
if (_clutter_context_is_initialized ())
|
||||
{
|
||||
g_warning ("%s() can only be used before calling clutter_init()",
|
||||
G_STRFUNC);
|
||||
return;
|
||||
}
|
||||
|
||||
_want_reset_on_video_memory_purge = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_get_default_screen:
|
||||
*
|
||||
|
@ -161,9 +161,6 @@ gint clutter_x11_event_get_key_group (const ClutterEvent *event);
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
guint clutter_x11_event_sequence_get_touch_detail (const ClutterEventSequence *sequence);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_x11_request_reset_on_video_memory_purge (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_X11_H__ */
|
||||
|
@ -542,285 +542,6 @@ cogl_texture_set_data (CoglTexture *texture,
|
||||
error);
|
||||
}
|
||||
|
||||
/* Reads back the contents of a texture by rendering it to the framebuffer
|
||||
* and reading back the resulting pixels.
|
||||
*
|
||||
* It will perform multiple renders if the texture is larger than the
|
||||
* current glViewport.
|
||||
*
|
||||
* It assumes the projection and modelview have already been setup so
|
||||
* that rendering to 0,0 with the same width and height of the viewport
|
||||
* will exactly cover the viewport.
|
||||
*
|
||||
* NB: Normally this approach isn't normally used since we can just use
|
||||
* glGetTexImage, but may be used as a fallback in some circumstances.
|
||||
*/
|
||||
static CoglBool
|
||||
do_texture_draw_and_read (CoglFramebuffer *fb,
|
||||
CoglPipeline *pipeline,
|
||||
CoglTexture *texture,
|
||||
CoglBitmap *target_bmp,
|
||||
float *viewport,
|
||||
CoglError **error)
|
||||
{
|
||||
float rx1, ry1;
|
||||
float rx2, ry2;
|
||||
float tx1, ty1;
|
||||
float tx2, ty2;
|
||||
int bw, bh;
|
||||
CoglBitmap *rect_bmp;
|
||||
unsigned int tex_width, tex_height;
|
||||
CoglContext *ctx = fb->context;
|
||||
|
||||
tex_width = cogl_texture_get_width (texture);
|
||||
tex_height = cogl_texture_get_height (texture);
|
||||
|
||||
ry2 = 0;
|
||||
ty2 = 0;
|
||||
|
||||
/* Walk Y axis until whole bitmap height consumed */
|
||||
for (bh = tex_height; bh > 0; bh -= viewport[3])
|
||||
{
|
||||
/* Rectangle Y coords */
|
||||
ry1 = ry2;
|
||||
ry2 += (bh < viewport[3]) ? bh : viewport[3];
|
||||
|
||||
/* Normalized texture Y coords */
|
||||
ty1 = ty2;
|
||||
ty2 = (ry2 / (float) tex_height);
|
||||
|
||||
rx2 = 0;
|
||||
tx2 = 0;
|
||||
|
||||
/* Walk X axis until whole bitmap width consumed */
|
||||
for (bw = tex_width; bw > 0; bw-=viewport[2])
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
|
||||
/* Rectangle X coords */
|
||||
rx1 = rx2;
|
||||
rx2 += (bw < viewport[2]) ? bw : viewport[2];
|
||||
|
||||
width = rx2 - rx1;
|
||||
height = ry2 - ry1;
|
||||
|
||||
/* Normalized texture X coords */
|
||||
tx1 = tx2;
|
||||
tx2 = (rx2 / (float) tex_width);
|
||||
|
||||
/* Draw a portion of texture */
|
||||
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||
pipeline,
|
||||
0, 0,
|
||||
rx2 - rx1,
|
||||
ry2 - ry1,
|
||||
tx1, ty1,
|
||||
tx2, ty2);
|
||||
|
||||
/* Read into a temporary bitmap */
|
||||
rect_bmp = _cogl_bitmap_new_with_malloc_buffer
|
||||
(ctx,
|
||||
width, height,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
error);
|
||||
if (!rect_bmp)
|
||||
return FALSE;
|
||||
|
||||
if (!_cogl_framebuffer_read_pixels_into_bitmap
|
||||
(fb,
|
||||
viewport[0], viewport[1],
|
||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||
rect_bmp,
|
||||
error))
|
||||
{
|
||||
cogl_object_unref (rect_bmp);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Copy to target bitmap */
|
||||
if (!_cogl_bitmap_copy_subregion (rect_bmp,
|
||||
target_bmp,
|
||||
0, 0,
|
||||
rx1, ry1,
|
||||
width,
|
||||
height,
|
||||
error))
|
||||
{
|
||||
cogl_object_unref (rect_bmp);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Free temp bitmap */
|
||||
cogl_object_unref (rect_bmp);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Reads back the contents of a texture by rendering it to the framebuffer
|
||||
* and reading back the resulting pixels.
|
||||
*
|
||||
* NB: Normally this approach isn't normally used since we can just use
|
||||
* glGetTexImage, but may be used as a fallback in some circumstances.
|
||||
*/
|
||||
static CoglBool
|
||||
_cogl_texture_draw_and_read (CoglTexture *texture,
|
||||
CoglBitmap *target_bmp,
|
||||
GLuint target_gl_format,
|
||||
GLuint target_gl_type,
|
||||
CoglError **error)
|
||||
{
|
||||
CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
|
||||
CoglContext *ctx = framebuffer->context;
|
||||
float save_viewport[4];
|
||||
float viewport[4];
|
||||
CoglBool status = FALSE;
|
||||
|
||||
viewport[0] = 0;
|
||||
viewport[1] = 0;
|
||||
viewport[2] = cogl_framebuffer_get_width (framebuffer);
|
||||
viewport[3] = cogl_framebuffer_get_height (framebuffer);
|
||||
|
||||
cogl_framebuffer_get_viewport4fv (framebuffer, save_viewport);
|
||||
_cogl_framebuffer_push_projection (framebuffer);
|
||||
cogl_framebuffer_orthographic (framebuffer,
|
||||
0, 0,
|
||||
viewport[2],
|
||||
viewport[3],
|
||||
0, 100);
|
||||
|
||||
cogl_framebuffer_push_matrix (framebuffer);
|
||||
cogl_framebuffer_identity_matrix (framebuffer);
|
||||
|
||||
/* Direct copy operation */
|
||||
|
||||
if (ctx->texture_download_pipeline == NULL)
|
||||
{
|
||||
ctx->texture_download_pipeline = cogl_pipeline_new (ctx);
|
||||
cogl_pipeline_set_blend (ctx->texture_download_pipeline,
|
||||
"RGBA = ADD (SRC_COLOR, 0)",
|
||||
NULL);
|
||||
}
|
||||
|
||||
cogl_pipeline_set_layer_texture (ctx->texture_download_pipeline, 0, texture);
|
||||
|
||||
cogl_pipeline_set_layer_combine (ctx->texture_download_pipeline,
|
||||
0, /* layer */
|
||||
"RGBA = REPLACE (TEXTURE)",
|
||||
NULL);
|
||||
|
||||
cogl_pipeline_set_layer_filters (ctx->texture_download_pipeline, 0,
|
||||
COGL_PIPELINE_FILTER_NEAREST,
|
||||
COGL_PIPELINE_FILTER_NEAREST);
|
||||
|
||||
if (!do_texture_draw_and_read (framebuffer,
|
||||
ctx->texture_download_pipeline,
|
||||
texture, target_bmp, viewport,
|
||||
error))
|
||||
return FALSE;
|
||||
|
||||
/* XXX: As an alleged PowerVR driver bug workaround where the driver
|
||||
* is apparently not maintaining the alpha component of some
|
||||
* framebuffers we render the alpha component of the texture
|
||||
* separately to be sure we retrieve all components of the texture.
|
||||
*
|
||||
* TODO: verify if this is still an issue
|
||||
*/
|
||||
if ((_cogl_texture_get_format (texture) & COGL_A_BIT)/* && a_bits == 0*/)
|
||||
{
|
||||
uint8_t *srcdata;
|
||||
uint8_t *dstdata;
|
||||
uint8_t *srcpixel;
|
||||
uint8_t *dstpixel;
|
||||
int target_width = cogl_bitmap_get_width (target_bmp);
|
||||
int target_height = cogl_bitmap_get_height (target_bmp);
|
||||
int target_rowstride = cogl_bitmap_get_rowstride (target_bmp);
|
||||
int bpp = _cogl_pixel_format_get_bytes_per_pixel (COGL_PIXEL_FORMAT_RGBA_8888);
|
||||
int alpha_rowstride = bpp * target_width;
|
||||
CoglBitmap *alpha_bmp;
|
||||
int x,y;
|
||||
|
||||
if ((dstdata = _cogl_bitmap_map (target_bmp,
|
||||
COGL_BUFFER_ACCESS_WRITE,
|
||||
COGL_BUFFER_MAP_HINT_DISCARD,
|
||||
error)) == NULL)
|
||||
goto EXIT;
|
||||
|
||||
/* Create temp bitmap for alpha values */
|
||||
alpha_bmp =
|
||||
_cogl_bitmap_new_with_malloc_buffer (ctx,
|
||||
target_width,
|
||||
target_height,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||
error);
|
||||
if (!alpha_bmp)
|
||||
{
|
||||
_cogl_bitmap_unmap (target_bmp);
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
|
||||
/* Draw alpha values into RGB channels */
|
||||
cogl_pipeline_set_layer_combine (ctx->texture_download_pipeline,
|
||||
0, /* layer */
|
||||
"RGBA = REPLACE (TEXTURE[A])",
|
||||
NULL);
|
||||
|
||||
if (!do_texture_draw_and_read (framebuffer,
|
||||
ctx->texture_download_pipeline,
|
||||
texture, alpha_bmp, viewport,
|
||||
error))
|
||||
{
|
||||
cogl_object_unref (alpha_bmp);
|
||||
_cogl_bitmap_unmap (target_bmp);
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
/* Copy temp R to target A */
|
||||
|
||||
/* Note: we don't try to catch errors since "mapping" an
|
||||
* malloc buffer should never fail */
|
||||
srcdata = _cogl_bitmap_map (alpha_bmp,
|
||||
COGL_BUFFER_ACCESS_READ,
|
||||
0 /* hints */,
|
||||
NULL);
|
||||
|
||||
for (y=0; y<target_height; ++y)
|
||||
{
|
||||
for (x=0; x<target_width; ++x)
|
||||
{
|
||||
srcpixel = srcdata + x*bpp;
|
||||
dstpixel = dstdata + x*bpp;
|
||||
dstpixel[3] = srcpixel[0];
|
||||
}
|
||||
srcdata += alpha_rowstride;
|
||||
dstdata += target_rowstride;
|
||||
}
|
||||
|
||||
_cogl_bitmap_unmap (alpha_bmp);
|
||||
|
||||
_cogl_bitmap_unmap (target_bmp);
|
||||
|
||||
cogl_object_unref (alpha_bmp);
|
||||
}
|
||||
|
||||
status = TRUE;
|
||||
|
||||
EXIT:
|
||||
/* Restore old state */
|
||||
cogl_framebuffer_pop_matrix (framebuffer);
|
||||
_cogl_framebuffer_pop_projection (framebuffer);
|
||||
cogl_framebuffer_set_viewport (framebuffer,
|
||||
save_viewport[0],
|
||||
save_viewport[1],
|
||||
save_viewport[2],
|
||||
save_viewport[3]);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static CoglBool
|
||||
get_texture_bits_via_offscreen (CoglTexture *meta_texture,
|
||||
CoglTexture *sub_texture,
|
||||
@ -1156,25 +877,13 @@ cogl_texture_get_data (CoglTexture *texture,
|
||||
tg_data.success = FALSE;
|
||||
}
|
||||
|
||||
/* XXX: In some cases _cogl_texture_2d_download_from_gl may fail
|
||||
* to read back the texture data; such as for GLES which doesn't
|
||||
* support glGetTexImage, so here we fallback to drawing the
|
||||
* texture and reading the pixels from the framebuffer. */
|
||||
/* XXX: In some cases this api may fail to read back the texture
|
||||
* data; such as for GLES which doesn't support glGetTexImage
|
||||
*/
|
||||
if (!tg_data.success)
|
||||
{
|
||||
if (!_cogl_texture_draw_and_read (texture, target_bmp,
|
||||
closest_gl_format,
|
||||
closest_gl_type,
|
||||
&ignore_error))
|
||||
{
|
||||
/* We have no more fallbacks so we just give up and
|
||||
* hope for the best */
|
||||
g_warning ("Failed to read texture since draw-and-read "
|
||||
"fallback failed: %s", ignore_error->message);
|
||||
cogl_error_free (ignore_error);
|
||||
cogl_object_unref (target_bmp);
|
||||
return 0;
|
||||
}
|
||||
cogl_object_unref (target_bmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Was intermediate used? */
|
||||
|
@ -168,7 +168,7 @@ cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer,
|
||||
CoglBool enable);
|
||||
|
||||
/**
|
||||
* cogl_xlib_renderer_set_threaded_swap_wait_enabled:
|
||||
* cogl_xlib_renderer_set_threaded_swap_wait_enabled: (skip)
|
||||
* @renderer: a #CoglRenderer
|
||||
* @enable: The new value
|
||||
*
|
||||
|
10
configure.ac
10
configure.ac
@ -2,7 +2,7 @@ AC_PREREQ(2.62)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [27])
|
||||
m4_define([mutter_micro_version], [1])
|
||||
m4_define([mutter_micro_version], [91])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@ -245,11 +245,7 @@ AC_ARG_ENABLE(remote-desktop,
|
||||
enable_remote_desktop=no
|
||||
)
|
||||
AS_IF([test "$enable_remote_desktop" = "yes"], [
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.1 >= 0.1.4"
|
||||
PKG_CHECK_EXISTS([libpipewire-0.1], [
|
||||
pw_micro=`$PKG_CONFIG --modversion libpipewire-0.1 | cut -d. -f3`
|
||||
AC_DEFINE_UNQUOTED([PIPEWIRE_VERSION_MICRO],[$pw_micro], [Pipewire micro version used])
|
||||
])
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.1 >= 0.1.8"
|
||||
AC_DEFINE([HAVE_REMOTE_DESKTOP],[1], [Defined if screen cast and remote desktop support is enabled])
|
||||
])
|
||||
AM_CONDITIONAL([HAVE_REMOTE_DESKTOP],[test "$enable_remote_desktop" = "yes"])
|
||||
@ -266,7 +262,7 @@ AC_SUBST(XWAYLAND_PATH)
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm libsystemd libinput >= 1.4 gudev-1.0 gbm >= 10.3"
|
||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm >= 2.4.83 libsystemd libinput >= 1.4 gudev-1.0 gbm >= 17.1"
|
||||
|
||||
AC_ARG_ENABLE(native-backend,
|
||||
AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
|
||||
|
@ -20,12 +20,6 @@
|
||||
<KeyListEntry name="move-to-workspace-last"
|
||||
description="Move window to last workspace" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-left"
|
||||
description="Move window one workspace to the left" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-right"
|
||||
description="Move window one workspace to the right" />
|
||||
|
||||
<KeyListEntry name="move-to-workspace-up"
|
||||
description="Move window one workspace up" />
|
||||
|
||||
@ -125,12 +119,6 @@
|
||||
<KeyListEntry name="switch-to-workspace-last"
|
||||
description="Switch to last workspace" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-left"
|
||||
description="Move to workspace left" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-right"
|
||||
description="Move to workspace right" />
|
||||
|
||||
<KeyListEntry name="switch-to-workspace-up"
|
||||
description="Move to workspace above" />
|
||||
|
||||
|
@ -15,8 +15,6 @@
|
||||
|
||||
<KeyListEntry name="unmaximize" description="Restore window"/>
|
||||
|
||||
<KeyListEntry name="toggle-shaded" description="Toggle shaded state"/>
|
||||
|
||||
<KeyListEntry name="close" description="Close window"/>
|
||||
|
||||
<KeyListEntry name="minimize" description="Hide window"/>
|
||||
|
@ -28,6 +28,7 @@ clutter/clutter/clutter-grid-layout.c
|
||||
clutter/clutter/clutter-image.c
|
||||
clutter/clutter/clutter-input-device.c
|
||||
clutter/clutter/clutter-input-device-tool.c
|
||||
clutter/clutter/clutter-input-method.c
|
||||
clutter/clutter/clutter-interval.c
|
||||
clutter/clutter/clutter-layout-manager.c
|
||||
clutter/clutter/clutter-layout-meta.c
|
||||
|
518
po/eo.po
518
po/eo.po
@ -2,16 +2,16 @@
|
||||
# Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
# Michael MORONI < >, 2011.
|
||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015.
|
||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2018.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||
"&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2015-02-14 11:06+0000\n"
|
||||
"PO-Revision-Date: 2015-02-14 22:34+0200\n"
|
||||
"POT-Creation-Date: 2017-12-18 16:24+0000\n"
|
||||
"PO-Revision-Date: 2018-01-22 20:12+0200\n"
|
||||
"Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
|
||||
"Language-Team: Esperanto <gnome-l10n-eo@lists.launchpad.net>\n"
|
||||
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
|
||||
"Language: eo\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -20,553 +20,675 @@ 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 "Navigado"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Movi la fenestron al laborspaco 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Movi la fenestron al laborspaco 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Movi la fenestron al laborspaco 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Movi la fenestron al laborspaco 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "Movi la fenestron al lasta laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Movi la fenestron al la maldekstra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Movi la fenestron al la dekstra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Movi la fenestron al la supra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Movi la fenestron al la suba laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Movi la fenestron al la maldekstra ekrano"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Movi la fenestron al la dekstra ekrano"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Movi la fenestron al la supra ekrano"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Movi la fenestron al la suba ekrano"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
msgid "Switch applications"
|
||||
msgstr "Ŝanĝi aplikaĵojn"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Ŝalti al antaŭa aplikaĵo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
msgid "Switch windows"
|
||||
msgstr "Ŝanĝi fenestrojn"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Ŝalti al antaŭa fenestro"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Ŝanĝi fenestrojn de aplikaĵo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Ŝalti al antaŭa fenestro de aplikaĵo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
msgid "Switch system controls"
|
||||
msgstr "Ŝanĝi sistem-kontrolojn"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Ŝalti al antaŭa sistem-kontrolo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Ŝanĝi rekte fenestrojn"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Ŝalti rekte al antaŭa fenestro"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Ŝanĝi rekte fenestrojn de aplikaĵo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Ŝalti rekte al antaŭa fenestro de aplikaĵo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Ŝalti rekte sistem-kontrolojn"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Ŝalti rekte al antaŭa sistem-kontrolo"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Kaŝi ĉiujn normalajn fenestrojn"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Ŝalti al laborspaco 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Ŝalti al laborspaco 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Ŝalti al laborspaco 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Ŝalti al laborspaco 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Ŝalti al lasta laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Movi al la maldekstra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Movi al la dekstra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Movi al la supra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Movi al la malsupra laborspaco"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistemo"
|
||||
|
||||
#: ../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 ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Fenestroj"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Aktivigi la fenestromenuon"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Baskuligi tutekranan reĝimon"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "Maksimumigi la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "Restaŭri la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Fermi la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Hide window"
|
||||
msgstr "Kaŝi la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Move window"
|
||||
msgstr "Movi la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
#: data/50-mutter-windows.xml:26
|
||||
msgid "Resize window"
|
||||
msgstr "Ŝanĝi la fenestrograndon"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:13
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Raise window above other windows"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Lower window below other windows"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Vertikale maksimumigi la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
#: data/50-mutter-windows.xml:39
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Horizontale maksimumigi la fenestron"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
#: data/50-mutter-windows.xml:43
|
||||
msgid "View split on left"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
#: data/50-mutter-windows.xml:47
|
||||
msgid "View split on right"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
#: data/mutter.desktop.in:4
|
||||
msgid "Mutter"
|
||||
msgstr "Mutero"
|
||||
|
||||
#: ../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 "
|
||||
"\"Windows key\" on PC hardware. It's expected that this binding either the "
|
||||
"default or set to the empty string."
|
||||
"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 ""
|
||||
|
||||
#: ../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 "
|
||||
"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."
|
||||
"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 "
|
||||
"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:107
|
||||
msgid "Enable experimental features"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:108
|
||||
msgid ""
|
||||
"To enable experimental features, add the feature keyword to the list. "
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
"feature. Any experimental feature is not required to still be available, or "
|
||||
"configurable. Don’t expect adding anything in this setting to be future "
|
||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
|
||||
"mutter default to layout logical monitors in a logical pixel coordinate "
|
||||
"space, while scaling monitor framebuffers instead of window content, to "
|
||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
|
||||
"enables remote desktop support. To support remote desktop with screen "
|
||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
|
||||
"screen cast support."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
#, fuzzy
|
||||
#| msgid "Switch applications"
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Ŝanĝi aplikaĵojn"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Ŝalti al VT 1"
|
||||
msgstr "Ŝalti al virtuala terminalo 1"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
#, fuzzy
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "Ŝalti al VT 2"
|
||||
msgstr "Ŝalti al virtuala terminalo 2"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
#, fuzzy
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "Ŝalti al VT 3"
|
||||
msgstr "Ŝalti al virtuala terminalo 3"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
#, fuzzy
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "Ŝalti al VT 4"
|
||||
msgstr "Ŝalti al virtuala terminalo 4"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
#, fuzzy
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
#| msgid "Switch to workspace 5"
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "Ŝalti al VT 5"
|
||||
msgstr "Ŝalti al virtuala terminalo 5"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
#, fuzzy
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
#| msgid "Switch to workspace 6"
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "Ŝalti al VT 6"
|
||||
msgstr "Ŝalti al virtuala terminalo 6"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
#, fuzzy
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
#| msgid "Switch to workspace 7"
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "Ŝalti al VT 7"
|
||||
msgstr "Ŝalti al virtuala terminalo 7"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:364
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "Ŝalti al virtuala terminalo 8"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "Ŝalti al virtuala terminalo 9"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "Ŝalti al virtuala terminalo 10"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "Ŝalti al virtuala terminalo 11"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Ŝalti al virtuala terminalo 12"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Re-ŝalti klavkombinojn"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
#, fuzzy
|
||||
#| msgid "Switch system controls"
|
||||
msgid "Switch monitor"
|
||||
msgstr "Ŝanĝi sistem-kontrolojn"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Montri ekranhelpon"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:391
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Nekonate"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:393
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Nekonata ekrano"
|
||||
|
||||
#. 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:933
|
||||
#, 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
|
||||
#, c-format
|
||||
#: src/compositor/compositor.c:479
|
||||
#, fuzzy, c-format
|
||||
#| msgid ""
|
||||
#| "Another compositing manager is already running on screen %i on display "
|
||||
#| "\"%s\"."
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "Alia kunmetanta administrilo jam rulas sur ekrano %i de montrilo \"%s\"."
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr "Alia kunmetanta administrilo jam rulas sur ekrano %i de montrilo “%s”."
|
||||
|
||||
#: ../src/core/bell.c:185
|
||||
#: src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Sonoril-evento"
|
||||
|
||||
#: ../src/core/delete.c:127
|
||||
#: src/core/display.c:608
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Failed to open X Window System display '%s'\n"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Malsukcesis malfermi jenan vidigon de fenestra sistemo X “%s”\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Elŝalti konekton al la seancoadministrilo"
|
||||
|
||||
#: src/core/main.c:195
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Anstataŭigi la nun ruliĝantan fenestromastrumilon"
|
||||
|
||||
#: src/core/main.c:201
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Specifi identigilon de la seancoadministrilo"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#, fuzzy
|
||||
msgid "X Display to use"
|
||||
msgstr "X-Vidigo uzenda"
|
||||
|
||||
#: src/core/main.c:212
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Pravalorizi la seancon el konservita dosiero"
|
||||
|
||||
#: src/core/main.c:218
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Fari X-vokojn sinkrone"
|
||||
|
||||
#: src/core/main.c:225
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr ""
|
||||
|
||||
#: src/core/main.c:231
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr ""
|
||||
|
||||
#: src/core/main.c:239
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
#| msgid "<tt>%s</tt> is not responding."
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "“%s” ne respondas."
|
||||
|
||||
#: ../src/core/delete.c:129
|
||||
#: src/core/meta-close-dialog-default.c:149
|
||||
msgid "Application is not responding."
|
||||
msgstr "Aplikaĵo ne respondas."
|
||||
|
||||
#: ../src/core/delete.c:134
|
||||
#: src/core/meta-close-dialog-default.c:154
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
msgstr "Vi povas elekti ĉu atendi iomete por la aplikaĵo aŭ perforte ĉesi ĝin."
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Atendi"
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Force Quit"
|
||||
msgstr "Per_forta eliro"
|
||||
|
||||
#: ../src/core/display.c:562
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Malsukcesis malfermi jenan vidigon de fenestra sistemo X: '%s'\n"
|
||||
|
||||
#: ../src/core/main.c:176
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Elŝalti konekton al la seancoadministrilo"
|
||||
|
||||
#: ../src/core/main.c:182
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Anstataŭigi la nun ruliĝantan fenestromastrumilon"
|
||||
|
||||
#: ../src/core/main.c:188
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Specifi identigilon de la seancoadministrilo"
|
||||
|
||||
#: ../src/core/main.c:193
|
||||
#, fuzzy
|
||||
msgid "X Display to use"
|
||||
msgstr "X-Vidigo uzenda"
|
||||
|
||||
#: ../src/core/main.c:199
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Pravalorizi la seancon el konservita dosiero"
|
||||
|
||||
#: ../src/core/main.c:205
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Fari X-vokojn sinkrone"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/core/main.c:220
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/core/mutter.c:39
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Wait"
|
||||
msgstr "_Atendi"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "mutter %s\n"
|
||||
#| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
#| "This is free software; see the source for copying conditions.\n"
|
||||
#| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
|
||||
#| "PARTICULAR PURPOSE.\n"
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
"This is free software; see the source for copying conditions.\n"
|
||||
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
|
||||
"PARTICULAR PURPOSE.\n"
|
||||
msgstr ""
|
||||
"Mutero %s\n"
|
||||
"Kopirajto (C) 2001-%d Havoc PENNIGTON, Red Hat, Inc., kaj aliaj\n"
|
||||
"Ĉi tio estas libera programaro; rigardu la fontkodon por pli da informoj.\n"
|
||||
"Ekzistas neniu GARANTIO; nek por NEGOCEBLO nek por ADAPTADO AL IU APARTA "
|
||||
"Kopirajto © 2001-%d Havoc PENNIGTON, Red Hat, Inc., kaj aliaj\n"
|
||||
"Ĉi tio estas libera programaro; rigardu la fontkodon por kondiĉoj pri "
|
||||
"kopiado.\n"
|
||||
"Ekzistas NENIU garantio; nek por NEGOCEBLO nek por ADAPTADO AL IU APARTA "
|
||||
"CELO.\n"
|
||||
|
||||
#: ../src/core/mutter.c:53
|
||||
#: src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "Motri version"
|
||||
|
||||
#: ../src/core/mutter.c:59
|
||||
#: src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/core/prefs.c:2004
|
||||
#: src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Laborspaco %d"
|
||||
|
||||
#: ../src/core/screen.c:525
|
||||
#: src/core/screen.c:583
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
#| "replace option to replace the current window manager.\n"
|
||||
#| "Display \"%s\" already has a window manager; try using the --replace "
|
||||
#| "option to replace the current window manager."
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
"to replace the current window manager."
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
msgstr ""
|
||||
"Ekrano \"%s\" jam havas fenestroadministrilon; provu uzi opcion --replace por "
|
||||
"anstataŭigi la nunan fenestroadministrilon."
|
||||
"Ekrano “%s” jam havas fenestroadministrilon; provu uzi la opcion --replace "
|
||||
"por anstataŭigi la nunan fenestroadministrilon."
|
||||
|
||||
#: ../src/core/screen.c:607
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Ekrano %d en vidigilo '%s' estas nevalida\n"
|
||||
#: src/core/screen.c:668
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Ekrano %d en vidigilo “%s” estas nevalida\n"
|
||||
|
||||
#: ../src/core/util.c:118
|
||||
#: src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutero estis kompilita sen subteno por eksplicita reĝimo\n"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:563
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Reĝim-ŝaltilo: Reĝimo %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."
|
||||
"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:559
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (ĉe %s)"
|
||||
|
264
po/fur.po
264
po/fur.po
@ -6,17 +6,16 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-07-22 09:45+0000\n"
|
||||
"PO-Revision-Date: 2017-07-22 22:53+0200\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-02-06 04:14+0000\n"
|
||||
"PO-Revision-Date: 2018-02-06 22:43+0100\n"
|
||||
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
|
||||
"Language-Team: Friulian <fur@li.org>\n"
|
||||
"Language: fur\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.2\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@ -43,145 +42,133 @@ msgid "Move window to last workspace"
|
||||
msgstr "Sposte barcon tal ultin spazi di lavôr"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Sposte barcon tal spazi di lavôr a çampe"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Sposte barcon tal spazi di lavôr a drete"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Sposte barcon tal spazi di lavôr parsore"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Sposte barcon tal spazi di lavôr sot"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Sposte barcon tal visôr a çampe"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Sposte barcon tal visôr a drete"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Sposte barcon tal visôr parsore"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Sposte barcon tal visôr sot"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Passâ di une aplicazion in chê altre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Passe ae aplicazion prime"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Passâ di un barcon in chel altri"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Passe al barcon prime"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Passâ di un barcon in chel altri di une aplicazion"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Passe al barcon prime di une aplicazion"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Passâ di un control di sisteme in chel altri"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Passe al control di sisteme precedent"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Passe dret ai barcons"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Passe dret al barcon precedent"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Passe dret a un barcon di une aplicazion"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Passe dret al barcon precedent di une aplicazion"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Passe dret ai controi dal sisteme"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Passe dret al control precedent dal sisteme"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Plate ducj i barcons normâi"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Passe al spazi di lavôr 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Passe al spazi di lavôr 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Passe al spazi di lavôr 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Passe al spazi di lavôr 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Passe al ultin spazi di lavôr"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Sposte il spazi di lavôr a çampe"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Sposte il spazi di lavôr a drete"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Sposte il spazi di lavôr parsore"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Sposte il spazi di lavôr sot"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sisteme"
|
||||
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "Mostre la richieste \"eseguìs comant\""
|
||||
msgstr "Mostre la richieste “eseguìs comant”"
|
||||
|
||||
#: data/50-mutter-system.xml:10
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Mostre la panoramiche ativitâts"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Ripristine lis scurtis di tastiere"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Barcons"
|
||||
@ -207,54 +194,50 @@ msgid "Restore window"
|
||||
msgstr "Ripristine barcon"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Ative/Disative stât inrodolât"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Siere il barcon"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Plate il barcon"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Sposte il barcon"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Ridimensione barcon"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Ative/Disative barcon su ducj i spazis di lavôr o nome un"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Tire sù il barcon se al è cuviert, se no sbassilu"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Met il barcon parsore di chei altris"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Bute il barcon sot di chei altris"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Slargje il barcon par verticâl"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Slargje il barcon par orizontâl"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Slargje dividint ae çampe"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Slargje dividint ae drete"
|
||||
|
||||
@ -405,14 +388,13 @@ msgid ""
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
"feature. Any experimental feature is not required to still be available, or "
|
||||
"configurable. Don’t expect adding anything in this setting to be future "
|
||||
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
|
||||
"monitor configuration system, aimed to replace the old one. This enables a "
|
||||
"higher level configuration API to be used by configuration applications, as "
|
||||
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
|
||||
"framebuffer” — makes mutter default to layout logical monitors in a logical "
|
||||
"pixel coordinate space, while scaling monitor framebuffers instead of window "
|
||||
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
|
||||
"“monitor-config-manager” is required for this feature to be enabled."
|
||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
|
||||
"mutter default to layout logical monitors in a logical pixel coordinate "
|
||||
"space, while scaling monitor framebuffers instead of window content, to "
|
||||
"manage HiDPI monitors. Does not require a restart. • “remote-desktop” — "
|
||||
"enables remote desktop support. To support remote desktop with screen "
|
||||
"sharing, “screen-cast” must also be enabled. • “screen-cast” — enables "
|
||||
"screen cast support."
|
||||
msgstr ""
|
||||
"Par abilitâ lis funzionalitâts sperimentâls, zonte la peraule clâf de "
|
||||
"funzionalitât ae liste. Il fat che la funzionalitât e vedi bisugne di tornâ "
|
||||
@ -420,30 +402,28 @@ msgstr ""
|
||||
"funzionalitât sperimentâl no je necessarie che e sedi disponibile o "
|
||||
"configurabile. No sta spietâti di zontâ alc in cheste impostazion e pensâ "
|
||||
"che e duredi tal timp. Atualmentri lis peraulis clâf pussibilis a son: • "
|
||||
"“monitor-config-manager” — al dopre il gnûf sisteme di configurazion dal "
|
||||
"visôr, fat par sostituî chel vecjo. Chest al abilite une API di nivel "
|
||||
"superiôr che e pues jessi doprade di aplicazions di configurazion, cussì "
|
||||
"come la capacitât di configurâ par scjale di monitor logjic. • “scale-"
|
||||
"monitor-framebuffer” — al rint come predefinît par mutter la disposizion dai "
|
||||
"visôrs logjics intun spazi logjic di coordenadis dai pixel, intant i "
|
||||
"framebuffer dai visôrs par scjalâ, invezit dal contignût dal barcon, a "
|
||||
"gjestissin i visôrs HiDPI. Nol covente tornâ a inviâ. In plui al è necessari "
|
||||
"abilitâ “monitor-config-manager” par fâ in mût che cheste funzionalitât e "
|
||||
"sedi abilitade."
|
||||
"“scale-monitor-framebuffer” — al rint come predefinît par mutter, la "
|
||||
"disposizion logjiche dai visôrs intun spazi logjic di coordenadis di pixel, "
|
||||
"in plui si fâs il scjalâ dai framebuffer dai visôrs invezit che il contignût "
|
||||
"dal barcon; dut chest par gjestî i visôrs HiDPI. Nol covente tornâ a inviâ. "
|
||||
"• “remote-desktop” — al abilite il supuart pal scritori rimot. Par podê "
|
||||
"supuartâ il scritori rimot cun la condivision dal schermi si scugne abilitâ "
|
||||
"ancje “screen-cast”. • “screen-cast” — al abilite il supuart pe trasmission "
|
||||
"dal schermi."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Selezione barcon dal tab popup"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Anule tab popup"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:161
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Cambie configurazions visôr"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:166
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "Al volte la configurazion dal visôr integrât"
|
||||
|
||||
@ -495,10 +475,61 @@ msgstr "Passe al VT 11"
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Passe al VT 12"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Torne abilite lis scurtis"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr "Permet cjapadis di control cun Xwayland"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
"Permet che il cjapâ il control de tastiere emetût di aplicazions X11 che a "
|
||||
"zirin in Xwayland, di jessi tignûts in considerazion. Par une cjapade di "
|
||||
"control di X11, par che e sedi tignude in considerazion sot Wayland, il "
|
||||
"client al scugne ancje inviâ un specific messaç (X11 ClientMessage) al "
|
||||
"barcon lidrîs o jessi tra lis aplicazions metudis te liste blancje inte clâf "
|
||||
"“xwayland-grab-access-rules”."
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr "Aplicazions Xwayland che a puedin cjapâ la tastiere"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
"Liste di nons di risorsis o classis di risorsis di barcons X11 che a puedin "
|
||||
"o no puedin cjapâ i segnâi di tastiere X11 sot di Xwayland. Il non de "
|
||||
"risorse o la classe de risorse di un dât barcon X11 al pues jessi otignût "
|
||||
"doprant il comant “xprop WM_CLASS”. I caratars “*” e “?” tai valôrs a son "
|
||||
"supuartâts. I valôrs che a tachin cun “!” a son metûts te liste nere, che e "
|
||||
"à precedence su la liste blancje, par revocâ lis aplicazions de liste di "
|
||||
"sisteme predefinide. La liste di sisteme predefinide e inclût lis "
|
||||
"aplicazions chi daurman: “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” I utents a "
|
||||
"puedin interompi il control cjapât doprant la specifiche scurte di tastiere "
|
||||
"definide de clâf di associazion tast “restore-shortcuts”."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2118
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Cambie mût (Grup %d)"
|
||||
@ -506,37 +537,37 @@ msgstr "Cambie mût (Grup %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2141
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "Cambie visôr"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2143
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostre jutori a schermi"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Display integrât"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:948
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "No cognossût"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:950
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Display no cognossût"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:958
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, 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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -553,42 +584,46 @@ msgstr "Event cjampane"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Impussibil vierzi il display “%s” di X Window System\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: src/core/main.c:190
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Disabilite la conession al gjestôr de session"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: src/core/main.c:196
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Rimplace il window manager in vore"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: src/core/main.c:202
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Specifiche il ID di gjestion session"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: src/core/main.c:207
|
||||
msgid "X Display to use"
|
||||
msgstr "Display X di doprâ"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: src/core/main.c:213
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inizialize session da file salvât"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:219
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Fâs lis clamadis X sincronis"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: src/core/main.c:226
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Eseguìs come compositor wayland"
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Eseguìs come compositor nidiât"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:240
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Eseguìs come servidôr display complet, invezit che nidiât"
|
||||
|
||||
#: src/core/main.c:246
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Eseguìs cul backend X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
@ -643,7 +678,7 @@ msgstr "Plugin Mutter di doprâ"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Spazi di lavôr %d"
|
||||
|
||||
#: src/core/screen.c:580
|
||||
#: src/core/screen.c:583
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
@ -652,7 +687,7 @@ msgstr ""
|
||||
"Il display “%s” al à za un window manager; prove dopre la opzion --replace "
|
||||
"par rimplaçâ chel atuâl."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Schermi %d su display “%s” no valit\n"
|
||||
@ -666,7 +701,7 @@ msgstr "Mutter al è stât compilât cence supuart pe modalitât fetose\n"
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Cambie mût: mût %d"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: src/x11/session.c:1818
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@ -678,3 +713,18 @@ msgstr ""
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (su %s)"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "Sposte barcon tal spazi di lavôr a çampe"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "Sposte barcon tal spazi di lavôr a drete"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "Sposte il spazi di lavôr a çampe"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "Sposte il spazi di lavôr a drete"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "Ative/Disative stât inrodolât"
|
||||
|
211
po/gl.po
211
po/gl.po
@ -9,14 +9,13 @@
|
||||
# Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009.
|
||||
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
|
||||
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
|
||||
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017.
|
||||
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017, 2018.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gl\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||
"&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-08-30 22:29+0200\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-02-06 04:14+0000\n"
|
||||
"PO-Revision-Date: 2018-02-14 23:45+0200\n"
|
||||
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
|
||||
"Language-Team: Galician\n"
|
||||
"Language: gl\n"
|
||||
@ -52,134 +51,118 @@ msgid "Move window to last workspace"
|
||||
msgstr "Mover xanela ao último espazo de traballo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Mover xanela un espazo de traballo cara á esquerda"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Mover xanela un espazo de traballo cara á dereita"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Mover xanela un espazo de traballo cara a arriba"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Mover xanela un espazo de traballo cara a abaixo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Mover xanela un monitor á esquerda"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Mover xanela un monitor á dereita"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Mover xanela un monitor arriba"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Mover xanela un espazo de traballo abaixo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Cambiar entre aplicativos"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Cambiar ao aplicativo aplicativos"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Cambiar xanelas"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Cambiar á xanela anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Cambiar entre as xanelas dun aplicativo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Cambia á xanela anterior dun aplicativo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Cambiar entre os controles do sistema"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Cambia ao control do sistema anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Cambiar xanelas directamente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Cambia directamente á xanela anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Cambiar entre as xanelas dun aplicativo directamente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Cambia directamente á xanela anterior do aplicativo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Cambiar entre os controles do sistema directamente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Cambiar directamente ao control do sistema anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Ocultar todas as xanelas normais"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Cambiar ao espazo de traballo 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Cambiar ao espazo de traballo 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Cambiar ao espazo de traballo 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Cambiar ao espazo de traballo 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Cambiar ao último espazo de traballo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Mover ao espazo da esquerda"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Mover ao espazo da dereita"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Mover ao espazo de arriba"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Mover ao espazo de traballo de abaixo"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
@ -191,6 +174,10 @@ msgstr "Mostrar o diálogo de executar orde"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Mostrar a vista xeral de actividades"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Restaurar os atallos de teclado"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Xanelas"
|
||||
@ -216,54 +203,50 @@ msgid "Restore window"
|
||||
msgstr "Restaurar xanela"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Trocar o estado ensombrecido"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Pechar xanela"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Ocultar xanela"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Mover xanela"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Redimensionar xanela"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Trocar que a xanela apareza en tódolos espazos de traballo ou nun"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Elevar a xanela se está cuberta por outra, en caso contrario baixala"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Subir a xanela por enriba doutras xanelas"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Baixar xanela debaixo doutras xanelas"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maximizar xanela verticalmente"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maximizar xanela horizontalmente"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Dividir vista á esquerda"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Dividir vista á dereita"
|
||||
|
||||
@ -411,16 +394,6 @@ msgid "Enable experimental features"
|
||||
msgstr "Activar as características experimentais"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:108
|
||||
#| msgid ""
|
||||
#| "To enable experimental features, add the feature keyword to the list. "
|
||||
#| "Whether the feature requires restarting the compositor depends on the "
|
||||
#| "given feature. Any experimental feature is not required to still be "
|
||||
#| "available, or configurable. Don’t expect adding anything in this setting "
|
||||
#| "to be future proof. Currently possible keywords: • “scale-monitor-"
|
||||
#| "framebuffer” — makes mutter default to layout logical monitors in a "
|
||||
#| "logical pixel coordinate space, while scaling monitor framebuffers "
|
||||
#| "instead of window content, to manage HiDPI monitors. Does not require a "
|
||||
#| "restart."
|
||||
msgid ""
|
||||
"To enable experimental features, add the feature keyword to the list. "
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
@ -516,10 +489,41 @@ msgstr "Cambiar á VT 12"
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Reactivar os atallos"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2151
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Modo conmutador (Grupo %d)"
|
||||
@ -527,37 +531,37 @@ msgstr "Modo conmutador (Grupo %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2174
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "Cambiar monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostrar axuda en pantalla"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Pantalla embebida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Descoñecido"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Pantalla descoñecida"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:936
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, 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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -574,42 +578,46 @@ msgstr "Evento de campá"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Produciuse un erro ao abrir a visualización do X Window System «%s»\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: src/core/main.c:190
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Desactivar a conexión ao xestor de sesión"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: src/core/main.c:196
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Substituír o xestor de xanelas en execución"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: src/core/main.c:202
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Especificar o ID de xestión de sesión"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: src/core/main.c:207
|
||||
msgid "X Display to use"
|
||||
msgstr "Pantalla X que se vai usar"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: src/core/main.c:213
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inicializar sesión desde o ficheiro de salvagarda"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:219
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Facer que as chamadas a X sexan sincrónicas"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: src/core/main.c:226
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Executar como compositor de wayland"
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Executar como compositor anidado"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:240
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Executar como un servidor de pantalla completo, fronte a un aniñado"
|
||||
|
||||
#: src/core/main.c:246
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Executar coa infraestructura de X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
@ -664,7 +672,7 @@ msgstr "Engadido de mutter que usar"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espazo de traballo %d"
|
||||
|
||||
#: src/core/screen.c:580
|
||||
#: src/core/screen.c:583
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
@ -673,7 +681,7 @@ msgstr ""
|
||||
"A pantalla «%s» ten xa un xestor de xanelas, tente usar a opción --replace "
|
||||
"para substituír o xestor de xanelas."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "A pantalla %d na visualización «%s» non é válida\n"
|
||||
@ -687,7 +695,7 @@ msgstr "Mutter foi compilado sen compatibilidade para o modo detallado\n"
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Modo conmutador: Modo %d"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: src/x11/session.c:1818
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@ -700,6 +708,21 @@ msgstr ""
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (en %s)"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "Mover xanela un espazo de traballo cara á esquerda"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "Mover xanela un espazo de traballo cara á dereita"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "Mover ao espazo da esquerda"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "Mover ao espazo da dereita"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "Trocar o estado ensombrecido"
|
||||
|
||||
#~ msgid "background texture could not be created from file"
|
||||
#~ msgstr "a textura do fondo non puido crearse desde o ficheiro"
|
||||
|
||||
|
215
po/hr.po
215
po/hr.po
@ -4,10 +4,9 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity 0\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-09-22 20:51+0200\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-02-06 04:14+0000\n"
|
||||
"PO-Revision-Date: 2018-02-17 16:00+0100\n"
|
||||
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
|
||||
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
|
||||
"Language: hr\n"
|
||||
@ -17,7 +16,7 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Launchpad-Export-Date: 2008-05-28 13:28+0000\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@ -44,134 +43,118 @@ msgid "Move window to last workspace"
|
||||
msgstr "Premjesti prozor posljednji radni prostor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Premjesti prozor jedan radni prostor nalijevo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Premjesti prozor jedan radni prostor udesno"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Premjesti prozor jedan radni prostor gore"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Premjesti prozor jedan radni prostor dolje"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Premjesti prozor jedan zaslon nalijevo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Premjesti prozor jedan zaslon udesno"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Premjesti prozor jedan zaslon gore"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Premjesti prozor jedan zaslon dolje"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Prebacivanje aplikacija"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Prebaci na prijašnju aplikaciju"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Prebacivanje prozora"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Prebaci na prijašnji prozor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Prebacivanje prozora aplikacija"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Prebaci na prijašnji prozor aplikacije"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Prebacivanje upravljanja sustavom"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Prebaci na prijašnje upravljanje sustavom"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Prebacivanje izravno na prozor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Prebaci izravno na prijašnji prozor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Prebacivanje prozora aplikacije izravno"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Prebaci izravno na prijašnji prozor aplikacije"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Prebacivanje upravljanja sustavom izravno"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Prebaci izravno na prijašnje upravljanje sustavom"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Sakrij sve normalne prozore"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Prebaci se na radni prostor 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Prebaci se na radni prostor 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Prebaci se na radni prostor 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Prebaci se na radni prostor 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Prebaci na prijašnji radni prostor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Premjesti na lijevi radni prostor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Premjesti na desni radni prostor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Premjesti na gornji radni prostor"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Premjesti na donji radni prostor"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sustav"
|
||||
|
||||
@ -183,6 +166,10 @@ msgstr "Prikaži dijalog pokretanja naredbe"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Prikaži pregled aktivnosti"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Vrati izvorne prečace tipkovnice"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Prozori"
|
||||
@ -208,54 +195,50 @@ msgid "Restore window"
|
||||
msgstr "Vrati prozor"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Uklj/Isklj stanje zasjenjenosti"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Zatvori prozor"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Sakrij prozor"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Premjesti prozor"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Promijeni veličinu prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Uklj/Isklj prozor na svim radnim prostorima"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Podigni prekriven prozor, u suprotnome smanji"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Podigni prozor iznad ostalih prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Spusti prozor ispod ostalih prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Uvećaj prozor okomito"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Uvećaj prozor vodoravno"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Podijeli pogled ulijevo"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Podijeli pogled udesno"
|
||||
|
||||
@ -493,10 +476,55 @@ msgstr "Prebaci na VT 12"
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Ponovno omogući prečace"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr "Dopusti hvatanje sa Xwaylandom"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
"Dopusti hvatanje tipkovnicom aplikacije izdane za X11 pokrenute u Xwaylandu "
|
||||
"kako bi se obuhvatile u računu. Kako bi X11 hvatanje bilo obuhvaćeno računom "
|
||||
"u Waylandu, klijent mora poslati ili određenu X11 poruku klijenta u "
|
||||
"korijenski prozor ili mora biti naveden među aplikacijama dopuštenim u "
|
||||
"ključu “xwayland-grab-access-rules”."
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr "Xwayland aplikacije dopuštene za izdavanje hvatanja tipkovnice"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
"Popis naziva ili razreda resursa X11 prozora koji dopuštaju ili nedopuštaju "
|
||||
"izdavanje X11 hvatanja tipkovnice u Xwaylandu. Popis naziva ili razreda "
|
||||
"resursa danog X11 prozora može se omogućiti naredbom “xprop WM_CLASS”. "
|
||||
"Zvjezdice “*” i upitnici “?” u vrijednostima su podržani. Vrijednosti koje "
|
||||
"počinju sa “!” nisu dopuštene, a imaju prednost nad dopuštenim, kako bi "
|
||||
"opozvali aplikaciju iz zadanog popisa sustavom. Zadani popis sustava "
|
||||
"uključuje sljedeće aplikacije: “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” "
|
||||
"Korisnici mogu prekinuti postojeće hvatanje koristeći određeni prečac "
|
||||
"tipkovnice određen ključem prečaca tipkovnice “restore-shortcuts”."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2151
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Način prebacivanja (Grupa %d)"
|
||||
@ -504,37 +532,37 @@ msgstr "Način prebacivanja (Grupa %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2174
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "Prebaci zaslon"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Prikaži zaslonsku pomoć"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Ugrađeni zaslon"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Nepoznat"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Nepoznat zaslon"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:936
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, 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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -550,42 +578,46 @@ msgstr "Događaj zvona"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Neuspjelo otvaranje sustava prikaza X prozora \"%s\"\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: src/core/main.c:190
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Onemogući povezivanje sa upraviteljem sesija"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: src/core/main.c:196
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Zamijeni pokrenutoga upravitelja porozora"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: src/core/main.c:202
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Odredite ID upravljanja sesijama"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: src/core/main.c:207
|
||||
msgid "X Display to use"
|
||||
msgstr "X Prikaz za korištenje"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: src/core/main.c:213
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Pokreni sesiju iz spremljene datoteke"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:219
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Napravi X pozive usklađenim"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: src/core/main.c:226
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Pokreni wayland kompozitor"
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Pokreni kao ugrađeni kompozitor"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:240
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Pokreni kao potpuni poslužitelj zaslona, radije nego ugrađeni"
|
||||
|
||||
#: src/core/main.c:246
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Pokreni s X11 pozadinskim programom"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
@ -640,7 +672,7 @@ msgstr "Mutter priključak koji se koristi"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Radni prostor %d"
|
||||
|
||||
#: src/core/screen.c:580
|
||||
#: src/core/screen.c:583
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
@ -649,7 +681,7 @@ msgstr ""
|
||||
"Prikaz \"%s\" već ima upravitelja prozora; pokušajte koristiti --replace "
|
||||
"mogućnost za zamjenu trenutnog upravitelja prozora."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Zaslon %d na prikazu '%s' je neispravan\n"
|
||||
@ -663,7 +695,7 @@ msgstr "Mutter je kompiliran bez podrške za opširan način rada\n"
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Način prebacivanja: Način %d"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: src/x11/session.c:1818
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@ -676,6 +708,21 @@ msgstr ""
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (na %s)"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "Premjesti prozor jedan radni prostor nalijevo"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "Premjesti prozor jedan radni prostor udesno"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "Premjesti na lijevi radni prostor"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "Premjesti na desni radni prostor"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "Uklj/Isklj stanje zasjenjenosti"
|
||||
|
||||
#~ msgid "Desktop"
|
||||
#~ msgstr "Radna površina"
|
||||
|
||||
|
207
po/hu.po
207
po/hu.po
@ -1,19 +1,18 @@
|
||||
# Hungarian translation of mutter.
|
||||
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Free Software Foundation, Inc.
|
||||
# Hungarian translation for mutter.
|
||||
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
#
|
||||
# Andras Timar <timar at gnome dot hu>, 2002, 2003.
|
||||
# Gabor Sari <saga at externet dot hu>, 2003.
|
||||
# Laszlo Dvornik <dvornik at gnome dot hu>, 2004.
|
||||
# Gabor Kelemen <kelemeng at gnome dot hu>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
|
||||
# Balázs Úr <urbalazs at gmail dot com>, 2013, 2014, 2015, 2016, 2017.
|
||||
# Balázs Úr <urbalazs at gmail dot com>, 2013, 2014, 2015, 2016, 2017, 2018.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-09-05 17:35+0200\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-01-24 21:11+0000\n"
|
||||
"PO-Revision-Date: 2018-01-26 21:46+0100\n"
|
||||
"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
|
||||
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
|
||||
"Language: hu\n"
|
||||
@ -48,134 +47,118 @@ msgid "Move window to last workspace"
|
||||
msgstr "Ablak áthelyezése az utolsó munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Ablak áthelyezése a balra lévő munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Ablak áthelyezése a jobbra lévő munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Ablak áthelyezése egy munkaterülettel feljebb"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Ablak áthelyezése egy munkaterülettel lejjebb"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Ablak áthelyezése a balra lévő monitorra"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Ablak áthelyezése a jobbra lévő monitorra"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Ablak áthelyezése egy monitorral feljebb"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Ablak áthelyezése egy monitorral lejjebb"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Alkalmazásváltás"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Váltás az előző alkalmazásra"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Ablakváltás"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Váltás az előző ablakra"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Váltás egy alkalmazás ablakai között"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Váltás egy alkalmazás előző ablakára"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Váltás a rendszer vezérlői közt"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Váltás az előző rendszervezérlőre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Váltás az ablakok közt közvetlenül"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Váltás közvetlenül az előző ablakra"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Váltás egy alkalmazás ablakai között közvetlenül"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Váltás közvetlenül egy alkalmazás előző ablakára"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Váltás a rendszer vezérlői közt közvetlenül"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Váltás közvetlenül az előző rendszervezérlőre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Minden normál ablak elrejtése"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Váltás az 1. munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Váltás a 2. munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Váltás a 3. munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Váltás a 4. munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Váltás az utolsó munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Áthelyezés a bal oldali munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Áthelyezés a jobb oldali munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Áthelyezés a felső munkaterületre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Áthelyezés az alsó munkaterületre"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Rendszer"
|
||||
|
||||
@ -187,6 +170,10 @@ msgstr "A parancs futtatása ablak megjelenítése"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "A tevékenységek áttekintés megjelenítése"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Gyorsbillentyűk helyreállítása"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Ablakok"
|
||||
@ -212,54 +199,50 @@ msgid "Restore window"
|
||||
msgstr "Ablak visszaállítása"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Felgördített állapot átváltása"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Ablak bezárása"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Ablak elrejtése"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Ablak áthelyezése"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Ablak átméretezése"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Ablak megjelenítése minden munkaterületen vagy csak az egyiken"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Fedett ablak előtérbe hozása, egyébként háttérbe küldése"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Ablak más ablakok elé hozása"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Ablak más ablakok mögé küldése"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Ablak függőleges maximalizálása"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Ablak vízszintes maximalizálása"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Bal oldali felosztás megjelenítése"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Jobb oldali felosztás megjelenítése"
|
||||
|
||||
@ -404,20 +387,6 @@ msgid "Enable experimental features"
|
||||
msgstr "Kísérleti funkciók engedélyezése"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:108
|
||||
#| msgid ""
|
||||
#| "To enable experimental features, add the feature keyword to the list. "
|
||||
#| "Whether the feature requires restarting the compositor depends on the "
|
||||
#| "given feature. Any experimental feature is not required to still be "
|
||||
#| "available, or configurable. Don’t expect adding anything in this setting "
|
||||
#| "to be future proof. Currently possible keywords: • “monitor-config-"
|
||||
#| "manager” — use the new monitor configuration system, aimed to replace the "
|
||||
#| "old one. This enables a higher level configuration API to be used by "
|
||||
#| "configuration applications, as well as the ability to configure per "
|
||||
#| "logical monitor scale. • “scale-monitor-framebuffer” — makes mutter "
|
||||
#| "default to layout logical monitors in a logical pixel coordinate space, "
|
||||
#| "while scaling monitor framebuffers instead of window content, to manage "
|
||||
#| "HiDPI monitors. Does not require a restart. Also enabling “monitor-config-"
|
||||
#| "manager” is required for this feature to be enabled."
|
||||
msgid ""
|
||||
"To enable experimental features, add the feature keyword to the list. "
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
@ -432,12 +401,12 @@ msgid ""
|
||||
"screen cast support."
|
||||
msgstr ""
|
||||
"A kísérleti funkciók engedélyezéséhez adja hozzá a funkció kulcsszavát a "
|
||||
"listához. A funkció a betűszedő újraindítását igényelheti az adott funkciótól "
|
||||
"függően. Egyik kísérleti funkciónál sem szükséges, hogy továbbra is elérhető "
|
||||
"vagy beállítható legyen. Ne várja el azt, hogy ha bármit hozzáad ehhez a "
|
||||
"beállításhoz, akkor az a jövőben is elérhető lesz. Jelenleg lehetséges "
|
||||
"kulcsszavak: • „scale-monitor-framebuffer” — alapértelmezetté teszi a mutter "
|
||||
"programot a logikai monitorok elrendezéséhez egy logikai "
|
||||
"listához. A funkció a betűszedő újraindítását igényelheti az adott "
|
||||
"funkciótól függően. Egyik kísérleti funkciónál sem szükséges, hogy továbbra "
|
||||
"is elérhető vagy beállítható legyen. Ne várja el azt, hogy ha bármit hozzáad "
|
||||
"ehhez a beállításhoz, akkor az a jövőben is elérhető lesz. Jelenleg "
|
||||
"lehetséges kulcsszavak: • „scale-monitor-framebuffer” — alapértelmezetté "
|
||||
"teszi a mutter programot a logikai monitorok elrendezéséhez egy logikai "
|
||||
"képpontkoordináta-térben, miközben átméretezi a monitor keretpufferét az "
|
||||
"ablaktartalom helyett azért, hogy kezelje a HiDPI monitorokat. Nem igényel "
|
||||
"újraindítást. • „remote-desktop” — engedélyezi a távoli asztal támogatást. A "
|
||||
@ -513,10 +482,56 @@ msgstr "Váltás a 12. VT-re"
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Gyorsbillentyűk újraengedélyezése"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr "Xwayland megragadások engedélyezése"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
"Engedélyezi az Xwayland alatti X11 alkalmazások által kért billentyűzet "
|
||||
"megragadások figyelembe vételét. Ahhoz, hogy Wayland alatt figyelembe "
|
||||
"legyenek véve az X11 megragadások, a kliensnek vagy küldenie kell egy "
|
||||
"meghatározott X11 ClientMessage üzenetet a gyökérablaknak, vagy az „xwayland-"
|
||||
"grab-access-rules” kulcsban megadott fehérlistában kell szerepelnie."
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr "Xwayland alkalmazások, amelyek kérhetnek billentyűzet megragadást"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
"Felsorolja azokat az X11 ablak erőforrásneveket vagy erőforrásosztályokat, "
|
||||
"amelyek Xwayland alatt vagy kiadhatnak X11 billentyűzet megragadásokat, vagy "
|
||||
"sem. A megadott X11 ablak erőforrásneve vagy erőforrásosztálya az „xprop "
|
||||
"WM_CLASS” paranccsal kérhető le. Az értékekben a „*” vagy „?” helyettesítő "
|
||||
"karakterek támogatottak. A „!” karakterrel kezdődő értékek feketelistára "
|
||||
"kerülnek, és a fehérlista előtt lesznek figyelembe véve, így felülbírálva az "
|
||||
"alapértelmezett rendszerlistát. Az alapértelmezett rendszerlistán a következő "
|
||||
"alkalmazások szerepelnek: „@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@”. A "
|
||||
"felhasználók megszakíthatják a létező megragadásokat a „restore-shortcuts” "
|
||||
"kulcsban megadott gyorsbillentyűvel."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2151
|
||||
#: src/backends/meta-input-settings.c:2259
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Módkapcsoló (%d. csoport)"
|
||||
@ -524,37 +539,37 @@ msgstr "Módkapcsoló (%d. csoport)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2174
|
||||
#: src/backends/meta-input-settings.c:2282
|
||||
msgid "Switch monitor"
|
||||
msgstr "Monitorváltás"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2284
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Képernyősúgó megjelenítése"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Beépített kijelző"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Ismeretlen"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Ismeretlen kijelző"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:936
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, 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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -662,7 +677,7 @@ msgstr "Használandó Mutter bővítmény"
|
||||
msgid "Workspace %d"
|
||||
msgstr "%d. munkaterület"
|
||||
|
||||
#: src/core/screen.c:580
|
||||
#: src/core/screen.c:583
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
@ -671,7 +686,7 @@ msgstr ""
|
||||
"A(z) „%s” kijelző már rendelkezik ablakkezelővel; próbálja a --replace "
|
||||
"kapcsolóval helyettesíteni a jelenlegi ablakkezelőt."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "A(z) %d. képernyő a(z) „%s” megjelenítőn érvénytelen\n"
|
||||
|
201
po/id.po
201
po/id.po
@ -9,17 +9,16 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:16+0000\n"
|
||||
"PO-Revision-Date: 2017-11-16 11:36+0700\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-02-07 18:39+0000\n"
|
||||
"PO-Revision-Date: 2018-02-09 17:00+0700\n"
|
||||
"Last-Translator: Kukuh Syafaat <syafaatkukuh@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 2.0.4\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
@ -47,130 +46,114 @@ 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
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Pindahkan jendela satu ruang kerja ke bawah"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Pindahkan jendela satu monitor ke kiri"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Pindahkan jendela satu monitor ke kanan"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Pindahkan jendela satu monitor ke atas"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Pindahkan jendela satu monitor ke bawah"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Bertukar aplikasi"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Bertukar ke aplikasi sebelumnya"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Bertukar jendela"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Bertukar ke jendela sebelumnya"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Bertukar jendela dari suatu aplikasi"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Bertukar ke jendela aplikasi sebelumnya"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Bertukar kendali sistem"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Bertukar ke kendali sistem sebelumnya"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Bertukar jendela secara langsung"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Bertukar secara langsung ke jendela sebelumnya"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Bertukar jendela dari suatu app secara langsung"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
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
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Bertukar kendali sistem secara langsung"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Bertukar secara langsung ke kendali sistem sebelumnya"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Sembunyikan semua jendela normal"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Bertukar ke ruang kerja 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Bertukar ke ruang kerja 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Bertukar ke ruang kerja 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Bertukar ke ruang kerja 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
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
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Pindahkan ke ruang kerja di atas"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Pindahkan ke ruang kerja di bawah"
|
||||
|
||||
@ -215,54 +198,50 @@ 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
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Sembunyikan jendela"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Pindahkan jendela"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Ubah ukuran jendela"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Jungkitkan jendela pada semua atau satu area kerja"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Naikkan jendela bila tertutup jendela lain, sebaliknya turunkan"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Naikkan jendela di atas jendela-jendela lain"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Turunkan jendela di bawah jendela-jendela lain"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maksimalkan ukuran jendela secara vertikal"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maksimalkan ukuran jendela secara horisontal"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Tilik belah di kiri"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Tilik belah di kanan"
|
||||
|
||||
@ -501,10 +480,59 @@ msgstr "Bertukar ke VT 12"
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Aktifkan kembali pintasan"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr "Izinkan menggenggam dengan Xwayland"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
"Mengizinkan pengambilalihan papan ketik yang dikeluarkan oleh aplikasi X11 "
|
||||
"yang berjalan di Xwayland untuk diperhitungkan. Agar pengambilalihan X11 "
|
||||
"diperhitungkan di bawah Wayland, klien juga harus mengirimkan ClientMessage "
|
||||
"X11 tertentu ke jendela root atau berada di antara aplikasi yang tercantum "
|
||||
"dalam daftar putih \"xwayland-grab-access-rules\"."
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr ""
|
||||
"Aplikasi Xwayland yang diizinkan untuk mengeluarkan pengambilalihan papan "
|
||||
"ketik"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
"Buat daftar nama sumber daya atau kelas sumber daya dari jendela X11 yang "
|
||||
"diizinkan atau tidak diizinkan untuk melakukan pengambilalihan papan ketik "
|
||||
"X11 di bawah Xwayland. Nama sumber daya atau kelas sumber daya dari jendela "
|
||||
"X11 yang diberikan dapat diperoleh memakai perintah \"xprop WM_CLASS\". "
|
||||
"Wildcard \"*\" dan joker \"?\" dalam nilai didukung. Nilai yang dimulai "
|
||||
"dengan \"!\" masuk daftar hitam, yang punya preseden atas daftar putih, "
|
||||
"untuk mencabut aplikasi dari daftar sistem bawaan. Daftar sistem bawaan "
|
||||
"termasuk aplikasi-aplikasi berikut: \"@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@"
|
||||
"\". Pengguna dapat memutus pengambilalihan yang ada dengan memakai pintasan "
|
||||
"papan ketik spesifik yang didefinisikan oleh tombol pengikatan \"restore-"
|
||||
"shortcuts\"."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2167
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Tukar Mode: (Grup %d)"
|
||||
@ -512,11 +540,11 @@ msgstr "Tukar Mode: (Grup %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "Berpindah monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Tampilkan bantuan pada layar"
|
||||
|
||||
@ -542,7 +570,7 @@ 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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -558,42 +586,46 @@ msgstr "Bel peristiwa"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Gagal membuka tampilan X Window System \"%s\"\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: src/core/main.c:190
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Menonaktifkan koneksi ke manajer sesi"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: src/core/main.c:196
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Mengganti manajer jendela yang tengah berjalan"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: src/core/main.c:202
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Tentukan kode pengaturan sesi"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: src/core/main.c:207
|
||||
msgid "X Display to use"
|
||||
msgstr "Tampilan X yang digunakna"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: src/core/main.c:213
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Aktifkan sesi dari berkas simpanan"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:219
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Buat panggilan X selaras"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: src/core/main.c:226
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Jalankan sebagai kompositor wayland"
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Jalankan sebagai kompositor bersarang"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:240
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Jalankan sebagai server tampilan penuh, ketimbang tampilan bersarang"
|
||||
|
||||
#: src/core/main.c:246
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Jalankan dengan backend X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
@ -671,7 +703,7 @@ msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Tukar Mode: Mode %d"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: src/x11/session.c:1818
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@ -683,3 +715,18 @@ msgstr ""
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (pada %s)"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "Pindahkan jendela satu ruang kerja ke kiri"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "Pindahkan jendela satu ruang kerja ke kanan"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "Pindahkan ke ruang kerja kiri"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "Pindahkan ke ruang kerja kanan"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "Jungkitkan keadaan berbayang"
|
||||
|
194
po/pl.po
194
po/pl.po
@ -1,21 +1,20 @@
|
||||
# Polish translation for mutter.
|
||||
# Copyright © 2002-2017 the mutter authors.
|
||||
# Copyright © 2002-2018 the mutter authors.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
# Zbigniew Chyla <chyla@alice.ci.pwr.wroc.pl>, 2002-2003.
|
||||
# Artur Flinta <aflinta@at.kernel.pl>, 2003-2005.
|
||||
# Marek Stępień <marcoos@aviary.pl>, 2007.
|
||||
# Wadim Dziedzic <wdziedzic@aviary.pl>, 2007.
|
||||
# Tomasz Dominikowski <dominikowski@gmail.com>, 2008-2009.
|
||||
# Piotr Drąg <piotrdrag@gmail.com>, 2010-2017.
|
||||
# Aviary.pl <community-poland@mozilla.org>, 2007-2017.
|
||||
# Piotr Drąg <piotrdrag@gmail.com>, 2010-2018.
|
||||
# Aviary.pl <community-poland@mozilla.org>, 2007-2018.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-10 18:30+0100\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-02-06 04:14+0000\n"
|
||||
"PO-Revision-Date: 2018-02-08 02:05+0100\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <community-poland@mozilla.org>\n"
|
||||
"Language: pl\n"
|
||||
@ -50,130 +49,114 @@ msgid "Move window to last workspace"
|
||||
msgstr "Przeniesienie okna na ostatni obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Przeniesienie okna o obszar roboczy w lewo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Przeniesienie okna o obszar roboczy w prawo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Przeniesienie okna o obszar roboczy w górę"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Przeniesienie okna o obszar roboczy w dół"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Przeniesienie okna na monitor po lewej"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Przeniesienie okna na monitor po prawej"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Przeniesienie okna na monitor na górze"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Przeniesienie okna na monitor na dole"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Przełączenie programów"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Przełączenie na poprzedni program"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Przełączenie okien"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Przełączenie na poprzednie okno"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Przełączenie między oknami programu"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Przełączenie na poprzednie okno programu"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Przełączenie kontroli systemowej"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Przełączenie na poprzednią kontrolę systemową"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Bezpośrednie przełączenie między oknami"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Bezpośrednie przełączenie na poprzednie okno"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Bezpośrednie przełączenie między oknami programu"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Bezpośrednie przełączenie na poprzednie okno programu"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Bezpośrednie przełączenie kontroli systemowej"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Bezpośrednie przełączenie na poprzednią kontrolę systemową"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Ukrycie wszystkich zwykłych okien"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Przełączenie na 1. obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Przełączenie na 2. obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Przełączenie na 3. obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Przełączenie na 4. obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Przełączenie na ostatni obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Przeniesienie na lewy obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Przeniesienie na prawy obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Przeniesienie na górny obszar roboczy"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Przeniesienie na dolny obszar roboczy"
|
||||
|
||||
@ -218,56 +201,52 @@ msgid "Restore window"
|
||||
msgstr "Przywrócenie okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Przełączenie trybu zwinięcia"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Zamknięcie okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Ukrycie okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Przeniesienie okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Zmiana rozmiaru okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr ""
|
||||
"Przełączenie obecności okna na wszystkich obszarach roboczych lub jednym"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr ""
|
||||
"Wysunięcie okna, jeśli jest zasłonięte, odsunięcie w przeciwnym wypadku"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Wysunięcie okna przed pozostałe"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Odsunięcie okna pod pozostałe"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Pionowa maksymalizacja okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Pozioma maksymalizacja okna"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Podział widoku po lewej"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Podział widoku po prawej"
|
||||
|
||||
@ -511,10 +490,55 @@ msgstr "Przełączenie na 12. konsolę wirtualną"
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Ponowne włączenie skrótów"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr "Zezwolenie na przechwycenia za pomocą Xwayland"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
"Zezwolenie na uwzględnianie przechwyceń klawiatury wywoływanych przez "
|
||||
"programy X11 działające w systemie Xwayland. Aby przechwycenie X11 zostało "
|
||||
"uwzględnione w systemie Wayland, klient musi także wysłać konkretny "
|
||||
"komunikat ClientMessage systemu X11 do głównego okna lub być na liście "
|
||||
"programów w kluczu „xwayland-grab-access-rules”."
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr "Programy Xwayland, które mogą wywoływać przechwycenia klawiatury"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
"Lista nazw zasobów lub klas zasobów okien X11, które mogą lub nie mogą "
|
||||
"wywoływać przechwyceń klawiatury X11 w systemie Xwayland. Można uzyskać "
|
||||
"nazwę zasobu lub klasę zasobów danego okna X11 za pomocą polecenia „xprop "
|
||||
"WM_CLASS”. W wartościach obsługiwane są wieloznaczniki „*” i „?”. Wartości "
|
||||
"zaczynające się od znaku „!” nie mają zezwolenia, co ma pierwszeństwo przed "
|
||||
"zezwoleniami, aby usunąć je z domyślnej listy systemu. Domyślna lista "
|
||||
"systemu zawiera te programy: „@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@”. "
|
||||
"Użytkownicy mogą przerwać istniejące przechwycenie za pomocą skrótu "
|
||||
"klawiszowego określonego w kluczu „restore-shortcuts”."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2167
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Przełącznik trybu (%d. grupa)"
|
||||
@ -522,37 +546,37 @@ msgstr "Przełącznik trybu (%d. grupa)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "Przełączenie monitora"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Ekran pomocy"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Wbudowany ekran"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Nieznany ekran"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:941
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, 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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -568,42 +592,46 @@ msgstr "Zdarzenie sygnału dźwiękowego"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Otwarcie połączenia z ekranem „%s” systemu X Window się nie powiodło\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: src/core/main.c:190
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Rozłącza połączenie z menedżerem sesji"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: src/core/main.c:196
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Zastępuje uruchomionego menedżera okien"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: src/core/main.c:202
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Podaje identyfikator zarządzania sesją"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: src/core/main.c:207
|
||||
msgid "X Display to use"
|
||||
msgstr "Używany ekran X"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: src/core/main.c:213
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inicjuje sesję z zapisanego pliku"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:219
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Synchroniczne wywołania X"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: src/core/main.c:226
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Uruchamia jako menedżer składania Wayland"
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Uruchamia jako osadzony menedżer składania"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:240
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Uruchamia jako pełny serwer wyświetlania zamiast osadzonego"
|
||||
|
||||
#: src/core/main.c:246
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Uruchamia za pomocą mechanizmu X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
@ -681,7 +709,7 @@ msgstr ""
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Przełącznik trybu: %d. tryb"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: src/x11/session.c:1818
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
|
210
po/pt_BR.po
210
po/pt_BR.po
@ -1,5 +1,5 @@
|
||||
# Brazilian Portuguese translation of mutter.
|
||||
# Copyright (C) 2002-2017 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2002-2018 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
# Sun G11n <gnome_int_l10n@ireland.sun.com>, 2002.
|
||||
# Evandro Fernandes Giovanini <evandrofg@ig.com.br>, 2002, 2003, 2006.
|
||||
@ -14,15 +14,14 @@
|
||||
# Antonio Fernandes C. Neto <fernandes@pelivre.org>, 2010.
|
||||
# Rodrigo Padula de Oliveira <contato@rodrigopadula.com>, 2011.
|
||||
# Artur de Aquino Morais <artur.morais93@outlook.com>, 2016.
|
||||
# Enrico Nicoletto <liverig@gmail.com>, 2012, 2014, 2016.
|
||||
# Rafael Fontenelle <rafaelff@gnome.org>, 2013, 2014, 2016, 2017.
|
||||
# Enrico Nicoletto <liverig@gmail.com>, 2012-2016.
|
||||
# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2018.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||
"&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-11 16:55-0200\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-02-06 04:14+0000\n"
|
||||
"PO-Revision-Date: 2018-02-16 15:02-0200\n"
|
||||
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language: pt_BR\n"
|
||||
@ -58,134 +57,118 @@ msgid "Move window to last workspace"
|
||||
msgstr "Mover a janela para o último espaço de trabalho"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Mover a janela um espaço de trabalho à esquerda"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Mover a janela um espaço de trabalho à direita"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Mover a janela um espaço de trabalho acima"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Mover a janela um espaço de trabalho abaixo"
|
||||
|
||||
# Em conformidade com a tradução do gsettings-desktop-schemas --Enrico
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "Mover janela para o monitor da esquerda"
|
||||
|
||||
# Em conformidade com a tradução do gsettings-desktop-schemas --Enrico
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "Mover janela para o monitor da direita"
|
||||
|
||||
# Em conformidade com a tradução do gsettings-desktop-schemas --Enrico
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "Mover janela para o monitor acima"
|
||||
|
||||
# Em conformidade com a tradução do gsettings-desktop-schemas --Enrico
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "Mover janela para o monitor abaixo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "Alternar aplicativos"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "Alternar para o aplicativo anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Alternar janelas"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "Alternar para a janela anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "Alternar as janelas de um aplicativo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "Alternar para a janela anterior de um aplicativo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "Alternar controles do sistema"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "Alternar para o controle de sistema anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "Alternar as janelas diretamente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "Alternar diretamente para a janela anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Alternar as janelas de um aplicativo diretamente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "Alternar diretamente para a janela anterior de um aplicativo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "Alternar os controles de sistema diretamente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "Alternar diretamente para o controle de sistema anterior"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "Ocultar todas as janelas normais"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Trocar para o espaço de trabalho 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Trocar para o espaço de trabalho 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Trocar para o espaço de trabalho 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Trocar para o espaço de trabalho 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "Trocar para o último espaço de trabalho"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "Move para o espaço de trabalho à esquerda"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "Move para o espaço de trabalho à direita"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Mover para o espaço de trabalho acima"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Mover para o espaço de trabalho abaixo"
|
||||
|
||||
@ -230,54 +213,50 @@ msgid "Restore window"
|
||||
msgstr "Restaurar janela"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Alternar estado sombreado"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "Fechar janela"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Ocultar janela"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "Mover janela"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "Redimensionar janela"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "Alternar a janela em todos os espaços de trabalho ou em apenas um"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Elevar a janela se estiver coberta; caso contrário, a abaixa"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Elevar a janela para frente das outras"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Colocar a janela atrás das outras"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maximizar a janela verticalmente"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maximizar a janela horizontalmente"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "Visualizar divisão à esquerda"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "Visualizar divisão à direita"
|
||||
|
||||
@ -520,10 +499,56 @@ msgstr "Trocar para o VT 12"
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Reabilita atalhos"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr "Permitir capturas com Xwayland"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
"Permite capturas de teclado emitidas por aplicativos X11 em execução no "
|
||||
"Xwayland para serem levadas em consideração. Para que uma captura de X11 "
|
||||
"seja levada em consideração no Wayland, o cliente também deve enviar um X11 "
|
||||
"ClientMessage específica para a janela raiz ou estar entre os aplicativos "
|
||||
"listados em branco na chave “xwayland-grab-access-rules”."
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr "Aplicativos Xwayland com permissão para emitir capturas de teclado"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
"Lista os nomes dos recursos ou classe de recursos do janelas X11 com ou sem "
|
||||
"permissão para emitir capturas de teclado X11 no Xwayland. O nome do recurso "
|
||||
"ou a classe de recurso de uma determinada janela X11 podem ser obtidos "
|
||||
"usando o comando “xprop WM_CLASS”. Há suporte a curingas “*” e “?” nos "
|
||||
"valores. Os valores que começam com “!” são colocados em uma lista negra, "
|
||||
"que tem precedência sobre a lista branca, para revogar aplicativos da lista "
|
||||
"padrão do sistema. A lista de sistema padrão inclui os seguintes "
|
||||
"aplicativos: “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@”. Os usuários podem "
|
||||
"quebrar uma captura existente usando o atalho de teclado específico definido "
|
||||
"pela chave de associação de tecla “restore-shortcuts”."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2167
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Alternador de modo (Grupo %d)"
|
||||
@ -531,37 +556,37 @@ msgstr "Alternador de modo (Grupo %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "Trocar monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostrar ajuda na tela"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Tela embutida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Desconhecido"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Monitor desconhecido"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:941
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s de %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:476
|
||||
#: src/compositor/compositor.c:481
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@ -576,42 +601,46 @@ msgstr "Evento de som"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Falha ao abrir a exibição “%s” do sistema de janelas X\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: src/core/main.c:190
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Desabilitar a conexão com o gerenciador de sessões"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: src/core/main.c:196
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Substituir o gerenciador de janelas em execução"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: src/core/main.c:202
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Especificar o ID do gerenciador de sessões"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: src/core/main.c:207
|
||||
msgid "X Display to use"
|
||||
msgstr "Exibição do X a ser utilizada"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: src/core/main.c:213
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inicializar a sessão a partir do arquivo salvo"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:219
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Fazer X chamadas síncronas"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: src/core/main.c:226
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Executar como um compositor wayland"
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: src/core/main.c:232
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Executar como um compositor aninhado"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:240
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Executar como um servidor de tela cheia, ao invés de aninhado"
|
||||
|
||||
#: src/core/main.c:246
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Executar com backend X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
@ -690,7 +719,7 @@ msgstr "O Mutter foi compilado sem suporte para modo detalhado\n"
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Alternador de modo: Modo %d"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#: src/x11/session.c:1818
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@ -703,6 +732,21 @@ msgstr ""
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (em %s)"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "Mover a janela um espaço de trabalho à esquerda"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "Mover a janela um espaço de trabalho à direita"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "Move para o espaço de trabalho à esquerda"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "Move para o espaço de trabalho à direita"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "Alternar estado sombreado"
|
||||
|
||||
#~ msgid "background texture could not be created from file"
|
||||
#~ msgstr "textura de plano de fundo não pôde ser criado de arquivo"
|
||||
|
||||
|
@ -86,12 +86,15 @@ mutter_built_sources += \
|
||||
xdg-output-unstable-v1-server-protocol.h \
|
||||
xwayland-keyboard-grab-unstable-v1-protocol.c \
|
||||
xwayland-keyboard-grab-unstable-v1-server-protocol.h \
|
||||
gtk-text-input-protocol.c \
|
||||
gtk-text-input-server-protocol.h \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
wayland_protocols = \
|
||||
wayland/protocol/gtk-shell.xml \
|
||||
wayland/protocol/gtk-primary-selection.xml \
|
||||
wayland/protocol/gtk-text-input.xml \
|
||||
$(NULL)
|
||||
|
||||
libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||
@ -431,6 +434,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
|
||||
wayland/meta-wayland-surface-role-cursor.h \
|
||||
wayland/meta-wayland-surface-role-tablet-cursor.c \
|
||||
wayland/meta-wayland-surface-role-tablet-cursor.h \
|
||||
wayland/meta-wayland-text-input.c \
|
||||
wayland/meta-wayland-text-input.h \
|
||||
wayland/meta-wayland-types.h \
|
||||
wayland/meta-wayland-versions.h \
|
||||
wayland/meta-wayland-outputs.c \
|
||||
|
@ -111,7 +111,8 @@ struct _MetaInputSettingsClass
|
||||
ClutterInputDevice *device,
|
||||
ClutterInputDeviceTool *tool,
|
||||
GDesktopStylusButtonAction primary,
|
||||
GDesktopStylusButtonAction secondary);
|
||||
GDesktopStylusButtonAction secondary,
|
||||
GDesktopStylusButtonAction tertiary);
|
||||
gboolean (* has_two_finger_scroll) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device);
|
||||
};
|
||||
|
@ -772,12 +772,11 @@ update_keyboard_repeat (MetaInputSettings *input_settings)
|
||||
repeat, delay, interval);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
logical_monitor_has_monitor (MetaMonitorManager *monitor_manager,
|
||||
MetaLogicalMonitor *logical_monitor,
|
||||
const char *vendor,
|
||||
const char *product,
|
||||
const char *serial)
|
||||
static MetaMonitor *
|
||||
logical_monitor_find_monitor (MetaLogicalMonitor *logical_monitor,
|
||||
const char *vendor,
|
||||
const char *product,
|
||||
const char *serial)
|
||||
{
|
||||
GList *monitors;
|
||||
GList *l;
|
||||
@ -790,20 +789,22 @@ logical_monitor_has_monitor (MetaMonitorManager *monitor_manager,
|
||||
if (g_strcmp0 (meta_monitor_get_vendor (monitor), vendor) == 0 &&
|
||||
g_strcmp0 (meta_monitor_get_product (monitor), product) == 0 &&
|
||||
g_strcmp0 (meta_monitor_get_serial (monitor), serial) == 0)
|
||||
return TRUE;
|
||||
return monitor;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static MetaLogicalMonitor *
|
||||
meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings,
|
||||
GSettings *settings,
|
||||
ClutterInputDevice *device)
|
||||
static void
|
||||
meta_input_settings_find_monitor (MetaInputSettings *input_settings,
|
||||
GSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
MetaMonitor **out_monitor,
|
||||
MetaLogicalMonitor **out_logical_monitor)
|
||||
{
|
||||
MetaInputSettingsPrivate *priv;
|
||||
MetaMonitorManager *monitor_manager;
|
||||
MetaLogicalMonitor *ret = NULL;
|
||||
MetaMonitor *monitor;
|
||||
guint n_values;
|
||||
GList *logical_monitors;
|
||||
GList *l;
|
||||
@ -831,20 +832,20 @@ meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings,
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
if (logical_monitor_has_monitor (monitor_manager,
|
||||
logical_monitor,
|
||||
edid[0],
|
||||
edid[1],
|
||||
edid[2]))
|
||||
monitor = logical_monitor_find_monitor (logical_monitor,
|
||||
edid[0], edid[1], edid[2]);
|
||||
if (monitor)
|
||||
{
|
||||
ret = logical_monitor;
|
||||
if (out_monitor)
|
||||
*out_monitor = monitor;
|
||||
if (out_logical_monitor)
|
||||
*out_logical_monitor = logical_monitor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
g_strfreev (edid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -880,9 +881,8 @@ update_tablet_keep_aspect (MetaInputSettings *input_settings,
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE)
|
||||
{
|
||||
keep_aspect = g_settings_get_boolean (settings, "keep-aspect");
|
||||
logical_monitor = meta_input_settings_find_logical_monitor (input_settings,
|
||||
settings,
|
||||
device);
|
||||
meta_input_settings_find_monitor (input_settings, settings, device,
|
||||
NULL, &logical_monitor);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -901,7 +901,8 @@ update_device_display (MetaInputSettings *input_settings,
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
gfloat matrix[6] = { 1, 0, 0, 0, 1, 0 };
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
MetaMonitor *monitor = NULL;
|
||||
MetaLogicalMonitor *logical_monitor = NULL;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
|
||||
@ -916,15 +917,12 @@ update_device_display (MetaInputSettings *input_settings,
|
||||
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
|
||||
clutter_input_device_get_mapping_mode (device) ==
|
||||
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE)
|
||||
logical_monitor = meta_input_settings_find_logical_monitor (input_settings,
|
||||
settings,
|
||||
device);
|
||||
else
|
||||
logical_monitor = NULL;
|
||||
meta_input_settings_find_monitor (input_settings, settings, device,
|
||||
&monitor, &logical_monitor);
|
||||
|
||||
if (logical_monitor)
|
||||
if (monitor)
|
||||
meta_monitor_manager_get_monitor_matrix (priv->monitor_manager,
|
||||
logical_monitor, matrix);
|
||||
monitor, logical_monitor, matrix);
|
||||
|
||||
input_settings_class->set_matrix (input_settings, device, matrix);
|
||||
|
||||
@ -1527,7 +1525,7 @@ update_stylus_buttonmap (MetaInputSettings *input_settings,
|
||||
ClutterInputDeviceTool *tool)
|
||||
{
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
GDesktopStylusButtonAction primary, secondary;
|
||||
GDesktopStylusButtonAction primary, secondary, tertiary;
|
||||
GSettings *tool_settings;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
|
||||
@ -1542,10 +1540,11 @@ update_stylus_buttonmap (MetaInputSettings *input_settings,
|
||||
|
||||
primary = g_settings_get_enum (tool_settings, "button-action");
|
||||
secondary = g_settings_get_enum (tool_settings, "secondary-button-action");
|
||||
tertiary = g_settings_get_enum (tool_settings, "tertiary-button-action");
|
||||
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
input_settings_class->set_stylus_button_map (input_settings, device, tool,
|
||||
primary, secondary);
|
||||
primary, secondary, tertiary);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1745,6 +1744,7 @@ MetaLogicalMonitor *
|
||||
meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = NULL;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
DeviceMappingInfo *info;
|
||||
|
||||
@ -1756,9 +1756,9 @@ meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings,
|
||||
if (!info)
|
||||
return NULL;
|
||||
|
||||
return meta_input_settings_find_logical_monitor (settings,
|
||||
info->settings,
|
||||
device);
|
||||
meta_input_settings_find_monitor (settings, info->settings, device,
|
||||
NULL, &logical_monitor);
|
||||
return logical_monitor;
|
||||
}
|
||||
|
||||
GDesktopTabletMapping
|
||||
@ -1862,7 +1862,7 @@ meta_input_settings_cycle_tablet_output (MetaInputSettings *input_settings,
|
||||
{
|
||||
MetaInputSettingsPrivate *priv;
|
||||
DeviceMappingInfo *info;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
MetaLogicalMonitor *logical_monitor = NULL;
|
||||
const gchar *edid[4] = { 0 }, *pretty_name = NULL;
|
||||
|
||||
g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
|
||||
@ -1885,9 +1885,9 @@ meta_input_settings_cycle_tablet_output (MetaInputSettings *input_settings,
|
||||
}
|
||||
#endif
|
||||
|
||||
logical_monitor = meta_input_settings_find_logical_monitor (input_settings,
|
||||
info->settings,
|
||||
device);
|
||||
meta_input_settings_find_monitor (input_settings, info->settings, device,
|
||||
NULL, &logical_monitor);
|
||||
|
||||
if (!cycle_logical_monitors (input_settings,
|
||||
logical_monitor,
|
||||
&logical_monitor))
|
||||
|
@ -103,7 +103,8 @@ derive_monitor_transform (MetaMonitor *monitor)
|
||||
|
||||
main_output = meta_monitor_get_main_output (monitor);
|
||||
|
||||
return main_output->crtc->transform;
|
||||
return meta_monitor_crtc_to_logical_transform (monitor,
|
||||
main_output->crtc->transform);
|
||||
}
|
||||
|
||||
MetaLogicalMonitor *
|
||||
|
@ -152,11 +152,10 @@ assign_monitor_crtc (MetaMonitor *monitor,
|
||||
}
|
||||
|
||||
transform = data->logical_monitor_config->transform;
|
||||
if (meta_monitor_manager_is_transform_handled (data->monitor_manager,
|
||||
crtc,
|
||||
transform))
|
||||
crtc_transform = transform;
|
||||
else
|
||||
crtc_transform = meta_monitor_logical_to_crtc_transform (monitor, transform);
|
||||
if (!meta_monitor_manager_is_transform_handled (data->monitor_manager,
|
||||
crtc,
|
||||
crtc_transform))
|
||||
crtc_transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||
|
||||
meta_monitor_calculate_crtc_pos (monitor, mode, output, crtc_transform,
|
||||
@ -755,6 +754,20 @@ create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
|
||||
|
||||
if (rotate)
|
||||
transform = (current_logical_monitor_config->transform + 1) % META_MONITOR_TRANSFORM_FLIPPED;
|
||||
else
|
||||
{
|
||||
/*
|
||||
* The transform coming from the accelerometer should be applied to
|
||||
* the crtc as is, without taking panel-orientation into account, this
|
||||
* is done so that non panel-orientation aware desktop environments do the
|
||||
* right thing. Mutter corrects for panel-orientation when applying the
|
||||
* transform from a logical-monitor-config, so we must convert here.
|
||||
*/
|
||||
MetaMonitor *panel =
|
||||
meta_monitor_manager_get_laptop_panel (config_manager->monitor_manager);
|
||||
|
||||
transform = meta_monitor_crtc_to_logical_transform (panel, transform);
|
||||
}
|
||||
|
||||
if (current_logical_monitor_config->transform == transform)
|
||||
return NULL;
|
||||
|
@ -316,6 +316,7 @@ void meta_monitor_manager_read_current_state (MetaMonitorManager *
|
||||
void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager);
|
||||
|
||||
gboolean meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
||||
MetaMonitor *monitor,
|
||||
MetaLogicalMonitor *logical_monitor,
|
||||
gfloat matrix[6]);
|
||||
|
||||
@ -384,4 +385,11 @@ meta_monitor_transform_is_rotated (MetaMonitorTransform transform)
|
||||
return (transform % 2);
|
||||
}
|
||||
|
||||
/* Returns true if transform involves flipping */
|
||||
static inline gboolean
|
||||
meta_monitor_transform_is_flipped (MetaMonitorTransform transform)
|
||||
{
|
||||
return (transform >= META_MONITOR_TRANSFORM_FLIPPED);
|
||||
}
|
||||
|
||||
#endif /* META_MONITOR_MANAGER_PRIVATE_H */
|
||||
|
@ -2856,6 +2856,7 @@ multiply_matrix (float a[6],
|
||||
|
||||
gboolean
|
||||
meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
||||
MetaMonitor *monitor,
|
||||
MetaLogicalMonitor *logical_monitor,
|
||||
gfloat matrix[6])
|
||||
{
|
||||
@ -2865,7 +2866,9 @@ meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
||||
if (!calculate_viewport_matrix (manager, logical_monitor, viewport))
|
||||
return FALSE;
|
||||
|
||||
/* Get transform corrected for LCD panel-orientation. */
|
||||
transform = logical_monitor->transform;
|
||||
transform = meta_monitor_logical_to_crtc_transform (monitor, transform);
|
||||
multiply_matrix (viewport, transform_matrices[transform],
|
||||
matrix);
|
||||
return TRUE;
|
||||
|
@ -34,7 +34,7 @@
|
||||
#define MINIMUM_SCALE_FACTOR 1.0f
|
||||
#define MAXIMUM_SCALE_FACTOR 4.0f
|
||||
#define MINIMUM_LOGICAL_WIDTH 800
|
||||
#define MINIMUM_LOGICAL_HEIGHT 600
|
||||
#define MINIMUM_LOGICAL_HEIGHT 480
|
||||
#define MAXIMUM_REFRESH_RATE_DIFF 0.001
|
||||
|
||||
typedef struct _MetaMonitorMode
|
||||
@ -354,6 +354,37 @@ meta_monitor_get_connector_type (MetaMonitor *monitor)
|
||||
return output->connector_type;
|
||||
}
|
||||
|
||||
MetaMonitorTransform
|
||||
meta_monitor_logical_to_crtc_transform (MetaMonitor *monitor,
|
||||
MetaMonitorTransform transform)
|
||||
{
|
||||
MetaOutput *output = meta_monitor_get_main_output (monitor);
|
||||
MetaMonitorTransform new_transform;
|
||||
|
||||
new_transform = (transform + output->panel_orientation_transform) %
|
||||
META_MONITOR_TRANSFORM_FLIPPED;
|
||||
if (meta_monitor_transform_is_flipped (transform))
|
||||
new_transform += META_MONITOR_TRANSFORM_FLIPPED;
|
||||
|
||||
return new_transform;
|
||||
}
|
||||
|
||||
MetaMonitorTransform
|
||||
meta_monitor_crtc_to_logical_transform (MetaMonitor *monitor,
|
||||
MetaMonitorTransform transform)
|
||||
{
|
||||
MetaOutput *output = meta_monitor_get_main_output (monitor);
|
||||
MetaMonitorTransform new_transform;
|
||||
|
||||
new_transform = (transform + META_MONITOR_TRANSFORM_FLIPPED -
|
||||
output->panel_orientation_transform) %
|
||||
META_MONITOR_TRANSFORM_FLIPPED;
|
||||
if (meta_monitor_transform_is_flipped (transform))
|
||||
new_transform += META_MONITOR_TRANSFORM_FLIPPED;
|
||||
|
||||
return new_transform;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_finalize (GObject *object)
|
||||
{
|
||||
@ -423,6 +454,29 @@ meta_monitor_add_mode (MetaMonitor *monitor,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static MetaMonitorModeSpec
|
||||
meta_monitor_create_spec (MetaMonitor *monitor,
|
||||
int width,
|
||||
int height,
|
||||
MetaCrtcMode *crtc_mode)
|
||||
{
|
||||
MetaOutput *output = meta_monitor_get_main_output (monitor);
|
||||
|
||||
if (meta_monitor_transform_is_rotated (output->panel_orientation_transform))
|
||||
{
|
||||
int temp = width;
|
||||
width = height;
|
||||
height = temp;
|
||||
}
|
||||
|
||||
return (MetaMonitorModeSpec) {
|
||||
.width = width,
|
||||
.height = height,
|
||||
.refresh_rate = crtc_mode->refresh_rate,
|
||||
.flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
|
||||
};
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
|
||||
{
|
||||
@ -443,12 +497,10 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
|
||||
gboolean replace;
|
||||
|
||||
mode = g_new0 (MetaMonitorMode, 1);
|
||||
mode->spec = (MetaMonitorModeSpec) {
|
||||
.width = crtc_mode->width,
|
||||
.height = crtc_mode->height,
|
||||
.refresh_rate = crtc_mode->refresh_rate,
|
||||
.flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
|
||||
},
|
||||
mode->spec = meta_monitor_create_spec (monitor,
|
||||
crtc_mode->width,
|
||||
crtc_mode->height,
|
||||
crtc_mode);
|
||||
mode->id = generate_mode_id (&mode->spec);
|
||||
mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1);
|
||||
mode->crtc_modes[0] = (MetaMonitorCrtcMode) {
|
||||
@ -780,12 +832,8 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||
mode->is_tiled = TRUE;
|
||||
meta_monitor_tiled_calculate_tiled_size (monitor, &width, &height);
|
||||
|
||||
mode->parent.spec = (MetaMonitorModeSpec) {
|
||||
.width = width,
|
||||
.height = height,
|
||||
.refresh_rate = reference_crtc_mode->refresh_rate,
|
||||
.flags = reference_crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
|
||||
};
|
||||
mode->parent.spec =
|
||||
meta_monitor_create_spec (monitor, width, height, reference_crtc_mode);
|
||||
mode->parent.id = generate_mode_id (&mode->parent.spec);
|
||||
|
||||
mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
|
||||
@ -895,12 +943,10 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||
mode = g_new0 (MetaMonitorModeTiled, 1);
|
||||
|
||||
mode->is_tiled = FALSE;
|
||||
mode->parent.spec = (MetaMonitorModeSpec) {
|
||||
.width = crtc_mode->width,
|
||||
.height = crtc_mode->height,
|
||||
.refresh_rate = crtc_mode->refresh_rate,
|
||||
.flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
|
||||
};
|
||||
mode->parent.spec = meta_monitor_create_spec (monitor,
|
||||
crtc_mode->width,
|
||||
crtc_mode->height,
|
||||
crtc_mode);
|
||||
mode->parent.id = generate_mode_id (&mode->parent.spec);
|
||||
mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
|
||||
g_list_length (monitor_priv->outputs));
|
||||
@ -1156,8 +1202,8 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor)
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_derived_derive_layout (MetaMonitor *monitor,
|
||||
MetaRectangle *layout)
|
||||
meta_monitor_tiled_derive_layout (MetaMonitor *monitor,
|
||||
MetaRectangle *layout)
|
||||
{
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
@ -1248,7 +1294,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
|
||||
object_class->finalize = meta_monitor_tiled_finalize;
|
||||
|
||||
monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
|
||||
monitor_class->derive_layout = meta_monitor_derived_derive_layout;
|
||||
monitor_class->derive_layout = meta_monitor_tiled_derive_layout;
|
||||
monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
|
||||
monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position;
|
||||
}
|
||||
|
@ -145,6 +145,16 @@ const char * meta_monitor_get_serial (MetaMonitor *monitor);
|
||||
|
||||
MetaConnectorType meta_monitor_get_connector_type (MetaMonitor *monitor);
|
||||
|
||||
/* This function returns the transform corrected for the panel orientation */
|
||||
MetaMonitorTransform meta_monitor_logical_to_crtc_transform (MetaMonitor *monitor,
|
||||
MetaMonitorTransform transform);
|
||||
/*
|
||||
* This function converts a transform corrected for the panel orientation
|
||||
* to its logical (user-visible) transform.
|
||||
*/
|
||||
MetaMonitorTransform meta_monitor_crtc_to_logical_transform (MetaMonitor *monitor,
|
||||
MetaMonitorTransform transform);
|
||||
|
||||
uint32_t meta_monitor_tiled_get_tile_group_id (MetaMonitorTiled *monitor_tiled);
|
||||
|
||||
gboolean meta_monitor_get_suggested_position (MetaMonitor *monitor,
|
||||
|
@ -78,6 +78,7 @@ struct _MetaOutput
|
||||
CoglSubpixelOrder subpixel_order;
|
||||
|
||||
MetaConnectorType connector_type;
|
||||
MetaMonitorTransform panel_orientation_transform;
|
||||
|
||||
MetaCrtcMode *preferred_mode;
|
||||
MetaCrtcMode **modes;
|
||||
|
@ -392,7 +392,7 @@ handle_notify_pointer_axis_discrete (MetaDBusRemoteDesktopSession *skeleton,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (steps != -1 || steps != 1)
|
||||
if (steps != -1 && steps != 1)
|
||||
g_warning ("Multiple steps at at once not yet implemented, treating as one.");
|
||||
|
||||
/*
|
||||
|
@ -26,11 +26,9 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <pipewire/pipewire.h>
|
||||
#include <spa/format-builder.h>
|
||||
#include <spa/format-utils.h>
|
||||
#include <spa/props.h>
|
||||
#include <spa/type-map.h>
|
||||
#include <spa/video/format-utils.h>
|
||||
#include <spa/param/props.h>
|
||||
#include <spa/param/format-utils.h>
|
||||
#include <spa/param/video/format-utils.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
@ -61,10 +59,6 @@ static guint signals[N_SIGNALS];
|
||||
|
||||
typedef struct _MetaSpaType
|
||||
{
|
||||
uint32_t format;
|
||||
uint32_t props;
|
||||
struct spa_type_meta meta;
|
||||
struct spa_type_data data;
|
||||
struct spa_type_media_type media_type;
|
||||
struct spa_type_media_subtype media_subtype;
|
||||
struct spa_type_format_video format_video;
|
||||
@ -94,7 +88,6 @@ typedef struct _MetaScreenCastStreamSrcPrivate
|
||||
struct spa_hook pipewire_stream_listener;
|
||||
|
||||
MetaSpaType spa_type;
|
||||
uint8_t params_buffer[1024];
|
||||
struct spa_video_info_raw video_format;
|
||||
|
||||
uint64_t last_frame_timestamp_us;
|
||||
@ -110,12 +103,7 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStreamSrc,
|
||||
meta_screen_cast_stream_src_init_initable_iface)
|
||||
G_ADD_PRIVATE (MetaScreenCastStreamSrc))
|
||||
|
||||
#define PROP(f, key, type, ...) \
|
||||
SPA_POD_PROP (f, key, 0, type, 1, __VA_ARGS__)
|
||||
#define PROP_U_MM(f, key, type, ...) \
|
||||
SPA_POD_PROP (f, key, (SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX), \
|
||||
type, 3, __VA_ARGS__)
|
||||
#define PROP_RANGE(min, max) 2, (min), (max)
|
||||
|
||||
static void
|
||||
meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
|
||||
@ -166,7 +154,7 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
|
||||
|
||||
buffer = pw_stream_peek_buffer (priv->pipewire_stream, buffer_id);
|
||||
|
||||
if (buffer->datas[0].type == priv->spa_type.data.MemFd)
|
||||
if (buffer->datas[0].type == priv->pipewire_type->data.MemFd)
|
||||
{
|
||||
map = mmap (NULL, buffer->datas[0].maxsize + buffer->datas[0].mapoffset,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
@ -180,7 +168,7 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
|
||||
|
||||
data = SPA_MEMBER (map, buffer->datas[0].mapoffset, uint8_t);
|
||||
}
|
||||
else if (buffer->datas[0].type == priv->spa_type.data.MemPtr)
|
||||
else if (buffer->datas[0].type == priv->pipewire_type->data.MemPtr)
|
||||
{
|
||||
data = buffer->datas[0].data;
|
||||
}
|
||||
@ -195,6 +183,8 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
|
||||
if (map)
|
||||
munmap (map, buffer->datas[0].maxsize + buffer->datas[0].mapoffset);
|
||||
|
||||
buffer->datas[0].chunk->size = buffer->datas[0].maxsize;
|
||||
|
||||
pw_stream_send_buffer (priv->pipewire_stream, buffer_id);
|
||||
}
|
||||
|
||||
@ -271,23 +261,22 @@ on_stream_state_changed (void *data,
|
||||
}
|
||||
|
||||
static void
|
||||
on_stream_format_changed (void *data,
|
||||
struct spa_format *format)
|
||||
on_stream_format_changed (void *data,
|
||||
struct spa_pod *format)
|
||||
{
|
||||
MetaScreenCastStreamSrc *src = data;
|
||||
MetaScreenCastStreamSrcPrivate *priv =
|
||||
meta_screen_cast_stream_src_get_instance_private (src);
|
||||
struct pw_type *pipewire_type = priv->pipewire_type;
|
||||
struct spa_type_param_alloc_buffers *param_alloc_buffers;
|
||||
struct spa_pod_builder pod_builder = { NULL };
|
||||
struct spa_pod_frame object_frame;
|
||||
struct spa_pod_frame prop_frame;
|
||||
struct spa_param *params[1];
|
||||
uint8_t params_buffer[1024];
|
||||
int32_t width, height, stride, size;
|
||||
struct spa_pod_builder pod_builder;
|
||||
struct spa_pod *params[1];
|
||||
const int bpp = 4;
|
||||
|
||||
if (!format)
|
||||
{
|
||||
pw_stream_finish_format (priv->pipewire_stream, SPA_RESULT_OK, NULL, 0);
|
||||
pw_stream_finish_format (priv->pipewire_stream, 0, NULL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -295,31 +284,22 @@ on_stream_format_changed (void *data,
|
||||
&priv->video_format,
|
||||
&priv->spa_type.format_video);
|
||||
|
||||
spa_pod_builder_init (&pod_builder,
|
||||
priv->params_buffer,
|
||||
sizeof (priv->params_buffer));
|
||||
width = priv->video_format.size.width;
|
||||
height = priv->video_format.size.height;
|
||||
stride = SPA_ROUND_UP_N (width * bpp, 4);
|
||||
size = height * stride;
|
||||
|
||||
param_alloc_buffers = &pipewire_type->param_alloc_buffers;
|
||||
spa_pod_builder_object (&pod_builder, &object_frame, 0,
|
||||
param_alloc_buffers->Buffers,
|
||||
PROP (&prop_frame, param_alloc_buffers->size,
|
||||
SPA_POD_TYPE_INT,
|
||||
(priv->video_format.size.width *
|
||||
priv->video_format.size.height *
|
||||
bpp)),
|
||||
PROP (&prop_frame, param_alloc_buffers->stride,
|
||||
SPA_POD_TYPE_INT,
|
||||
priv->video_format.size.width * bpp),
|
||||
PROP_U_MM (&prop_frame, param_alloc_buffers->buffers,
|
||||
SPA_POD_TYPE_INT,
|
||||
16, 2, 16),
|
||||
PROP (&prop_frame, param_alloc_buffers->align,
|
||||
SPA_POD_TYPE_INT,
|
||||
16));
|
||||
params[0] = SPA_POD_BUILDER_DEREF (&pod_builder, object_frame.ref,
|
||||
struct spa_param);
|
||||
pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer));
|
||||
|
||||
pw_stream_finish_format (priv->pipewire_stream, SPA_RESULT_OK,
|
||||
params[0] = spa_pod_builder_object (
|
||||
&pod_builder,
|
||||
pipewire_type->param.idBuffers, pipewire_type->param_buffers.Buffers,
|
||||
":", pipewire_type->param_buffers.size, "i", size,
|
||||
":", pipewire_type->param_buffers.stride, "i", stride,
|
||||
":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
|
||||
":", pipewire_type->param_buffers.align, "i", 16);
|
||||
|
||||
pw_stream_finish_format (priv->pipewire_stream, 0,
|
||||
params, G_N_ELEMENTS (params));
|
||||
}
|
||||
|
||||
@ -336,16 +316,17 @@ create_pipewire_stream (MetaScreenCastStreamSrc *src,
|
||||
MetaScreenCastStreamSrcPrivate *priv =
|
||||
meta_screen_cast_stream_src_get_instance_private (src);
|
||||
struct pw_stream *pipewire_stream;
|
||||
const struct spa_format *format;
|
||||
uint8_t buffer[1024];
|
||||
struct spa_pod_builder pod_builder =
|
||||
SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
|
||||
struct spa_pod_frame format_frame;
|
||||
struct spa_pod_frame prop_frame;
|
||||
MetaSpaType *spa_type = &priv->spa_type;
|
||||
struct pw_type *pipewire_type = priv->pipewire_type;
|
||||
int width, height;
|
||||
float frame_rate;
|
||||
MetaFraction frame_rate_fraction;
|
||||
struct spa_fraction max_framerate;
|
||||
struct spa_fraction min_framerate;
|
||||
const struct spa_pod *params[1];
|
||||
|
||||
pipewire_stream = pw_stream_new (priv->pipewire_remote,
|
||||
"meta-screen-cast-src",
|
||||
@ -354,42 +335,32 @@ create_pipewire_stream (MetaScreenCastStreamSrc *src,
|
||||
meta_screen_cast_stream_src_get_specs (src, &width, &height, &frame_rate);
|
||||
frame_rate_fraction = meta_fraction_from_double (frame_rate);
|
||||
|
||||
spa_pod_builder_format (&pod_builder, &format_frame,
|
||||
spa_type->format,
|
||||
spa_type->media_type.video,
|
||||
spa_type->media_subtype.raw,
|
||||
PROP (&prop_frame,
|
||||
spa_type->format_video.format,
|
||||
SPA_POD_TYPE_ID, spa_type->video_format.BGRx),
|
||||
PROP (&prop_frame,
|
||||
spa_type->format_video.size,
|
||||
SPA_POD_TYPE_RECTANGLE,
|
||||
width, height),
|
||||
PROP (&prop_frame,
|
||||
spa_type->format_video.framerate,
|
||||
SPA_POD_TYPE_FRACTION,
|
||||
0, 1),
|
||||
PROP_U_MM (&prop_frame,
|
||||
spa_type->format_video.max_framerate,
|
||||
SPA_POD_TYPE_FRACTION,
|
||||
frame_rate_fraction.num,
|
||||
frame_rate_fraction.denom,
|
||||
1, 1,
|
||||
frame_rate_fraction.num,
|
||||
frame_rate_fraction.denom));
|
||||
format = SPA_POD_BUILDER_DEREF (&pod_builder, format_frame.ref, struct spa_format);
|
||||
min_framerate = SPA_FRACTION (1, 1);
|
||||
max_framerate = SPA_FRACTION (frame_rate_fraction.num,
|
||||
frame_rate_fraction.denom);
|
||||
|
||||
params[0] = spa_pod_builder_object (
|
||||
&pod_builder,
|
||||
pipewire_type->param.idEnumFormat, pipewire_type->spa_format,
|
||||
"I", spa_type->media_type.video,
|
||||
"I", spa_type->media_subtype.raw,
|
||||
":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
|
||||
":", spa_type->format_video.size, "R", &SPA_RECTANGLE (width, height),
|
||||
":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
|
||||
":", spa_type->format_video.max_framerate, "Fr", &max_framerate,
|
||||
PROP_RANGE (&min_framerate,
|
||||
&max_framerate));
|
||||
|
||||
pw_stream_add_listener (pipewire_stream,
|
||||
&priv->pipewire_stream_listener,
|
||||
&stream_events,
|
||||
src);
|
||||
|
||||
if (!pw_stream_connect (pipewire_stream,
|
||||
PW_DIRECTION_OUTPUT,
|
||||
PW_STREAM_MODE_BUFFER,
|
||||
NULL,
|
||||
PW_STREAM_FLAG_NONE,
|
||||
1, &format))
|
||||
if (pw_stream_connect (pipewire_stream,
|
||||
PW_DIRECTION_OUTPUT,
|
||||
NULL,
|
||||
PW_STREAM_FLAG_NONE,
|
||||
params, G_N_ELEMENTS (¶ms)) != 0)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Could not connect");
|
||||
@ -453,10 +424,8 @@ pipewire_loop_source_dispatch (GSource *source,
|
||||
int result;
|
||||
|
||||
result = pw_loop_iterate (pipewire_source->pipewire_loop, 0);
|
||||
if (result == SPA_RESULT_ERRNO)
|
||||
g_warning ("pipewire_loop_iterate failed: %s", strerror (errno));
|
||||
else if (result != SPA_RESULT_OK)
|
||||
g_warning ("pipewire_loop_iterate failed: %d", result);
|
||||
if (result < 0)
|
||||
g_warning ("pipewire_loop_iterate failed: %s", spa_strerror (result));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -482,10 +451,6 @@ static void
|
||||
init_spa_type (MetaSpaType *type,
|
||||
struct spa_type_map *map)
|
||||
{
|
||||
type->format = spa_type_map_get_id (map, SPA_TYPE__Format);
|
||||
type->props = spa_type_map_get_id (map, SPA_TYPE__Props);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_video_map (map, &type->format_video);
|
||||
@ -535,13 +500,7 @@ meta_screen_cast_stream_src_initable_init (GInitable *initable,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if PIPEWIRE_VERSION_MICRO == 4
|
||||
priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL);
|
||||
#elif PIPEWIRE_VERSION_MICRO >= 5
|
||||
priv->pipewire_remote = pw_remote_new (priv->pipewire_core, NULL, 0);
|
||||
#else
|
||||
priv->pipewire_remote = NULL;
|
||||
#endif
|
||||
if (!priv->pipewire_remote)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
|
@ -348,11 +348,13 @@ update_xwayland_grab_access_rules (MetaSettings *settings)
|
||||
int i;
|
||||
|
||||
/* Free previous patterns and create new arrays */
|
||||
g_ptr_array_free (settings->xwayland_grab_whitelist_patterns, TRUE);
|
||||
g_clear_pointer (&settings->xwayland_grab_whitelist_patterns,
|
||||
g_ptr_array_unref);
|
||||
settings->xwayland_grab_whitelist_patterns =
|
||||
g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free);
|
||||
|
||||
g_ptr_array_free (settings->xwayland_grab_blacklist_patterns, TRUE);
|
||||
g_clear_pointer (&settings->xwayland_grab_blacklist_patterns,
|
||||
g_ptr_array_unref);
|
||||
settings->xwayland_grab_blacklist_patterns =
|
||||
g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free);
|
||||
|
||||
|
@ -51,7 +51,7 @@ common_resolutions = [
|
||||
|
||||
output_lines = [
|
||||
"/* Generated by gen-default-modes.py */\n",
|
||||
"static const drmModeModeInfo meta_default_drm_mode_infos[] = {",
|
||||
"static const drmModeModeInfo meta_default_landscape_drm_mode_infos[] = {",
|
||||
]
|
||||
|
||||
def sync_flags(hsync, vsync):
|
||||
@ -76,6 +76,21 @@ def drm_mode_info_from_modeline(line):
|
||||
sync_flags(sline[11], sline[12]),
|
||||
sline[1])
|
||||
|
||||
def portrait_drm_mode_info_from_modeline(line):
|
||||
sline = line.split()
|
||||
return "{ %d, %d, %d, %d, %d, 0, %d, %d, %d, %d, 0, 0, %s, DRM_MODE_TYPE_DEFAULT, \"%dx%d_60.00\" }," % \
|
||||
(int(float(sline[2]) * 1000),
|
||||
int(sline[7]),
|
||||
int(sline[8]),
|
||||
int(sline[9]),
|
||||
int(sline[10]),
|
||||
int(sline[3]),
|
||||
int(sline[4]),
|
||||
int(sline[5]),
|
||||
int(sline[6]),
|
||||
sync_flags(sline[12], sline[11]),
|
||||
int(sline[7]), int(sline[3]))
|
||||
|
||||
for resolution in common_resolutions:
|
||||
cvt = os.popen("%s %s %s" % ('cvt', resolution[0], resolution[1]))
|
||||
cvt.readline() # discard comment line
|
||||
@ -84,6 +99,16 @@ for resolution in common_resolutions:
|
||||
cvt.close()
|
||||
output_lines.append("};")
|
||||
|
||||
output_lines.append("")
|
||||
output_lines.append("static const drmModeModeInfo meta_default_portrait_drm_mode_infos[] = {")
|
||||
for resolution in common_resolutions:
|
||||
cvt = os.popen("%s %s %s" % ('cvt', resolution[0], resolution[1]))
|
||||
cvt.readline() # discard comment line
|
||||
line = cvt.readline()
|
||||
output_lines.append(portrait_drm_mode_info_from_modeline(line))
|
||||
cvt.close()
|
||||
output_lines.append("};")
|
||||
|
||||
for line in output_lines:
|
||||
sys.stdout.write(line + "\n")
|
||||
sys.stdout.flush()
|
||||
|
@ -23,9 +23,14 @@
|
||||
|
||||
#include "backends/native/meta-crtc-kms.h"
|
||||
|
||||
#include <drm_fourcc.h>
|
||||
#include <drm_mode.h>
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/native/meta-gpu-kms.h"
|
||||
|
||||
#include <drm_fourcc.h>
|
||||
|
||||
#define ALL_TRANSFORMS (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)
|
||||
#define ALL_TRANSFORMS_MASK ((1 << ALL_TRANSFORMS) - 1)
|
||||
|
||||
@ -36,9 +41,12 @@ typedef struct _MetaCrtcKms
|
||||
uint32_t underscan_hborder_prop_id;
|
||||
uint32_t underscan_vborder_prop_id;
|
||||
uint32_t primary_plane_id;
|
||||
uint32_t formats_prop_id;
|
||||
uint32_t rotation_prop_id;
|
||||
uint32_t rotation_map[ALL_TRANSFORMS];
|
||||
uint32_t all_hw_transforms;
|
||||
|
||||
GArray *modifiers_xrgb8888;
|
||||
} MetaCrtcKms;
|
||||
|
||||
gboolean
|
||||
@ -168,6 +176,101 @@ find_property_index (MetaGpu *gpu,
|
||||
return -1;
|
||||
}
|
||||
|
||||
GArray *
|
||||
meta_crtc_kms_get_modifiers (MetaCrtc *crtc,
|
||||
uint32_t format)
|
||||
{
|
||||
MetaCrtcKms *crtc_kms = crtc->driver_private;
|
||||
|
||||
if (format != DRM_FORMAT_XRGB8888)
|
||||
return NULL;
|
||||
|
||||
return crtc_kms->modifiers_xrgb8888;
|
||||
}
|
||||
|
||||
static inline uint32_t *
|
||||
formats_ptr (struct drm_format_modifier_blob *blob)
|
||||
{
|
||||
return (uint32_t *) (((char *) blob) + blob->formats_offset);
|
||||
}
|
||||
|
||||
static inline struct drm_format_modifier *
|
||||
modifiers_ptr (struct drm_format_modifier_blob *blob)
|
||||
{
|
||||
return (struct drm_format_modifier *) (((char *) blob) +
|
||||
blob->modifiers_offset);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_formats (MetaCrtc *crtc,
|
||||
int kms_fd,
|
||||
uint32_t blob_id)
|
||||
{
|
||||
MetaCrtcKms *crtc_kms = crtc->driver_private;
|
||||
drmModePropertyBlobPtr blob;
|
||||
struct drm_format_modifier_blob *blob_fmt;
|
||||
uint32_t *formats;
|
||||
struct drm_format_modifier *modifiers;
|
||||
unsigned int i;
|
||||
unsigned int xrgb_idx = UINT_MAX;
|
||||
|
||||
if (blob_id == 0)
|
||||
return;
|
||||
|
||||
blob = drmModeGetPropertyBlob (kms_fd, blob_id);
|
||||
if (!blob)
|
||||
return;
|
||||
|
||||
if (blob->length < sizeof (struct drm_format_modifier_blob))
|
||||
{
|
||||
drmModeFreePropertyBlob (blob);
|
||||
return;
|
||||
}
|
||||
|
||||
blob_fmt = blob->data;
|
||||
|
||||
/* Find the index of our XRGB8888 format. */
|
||||
formats = formats_ptr (blob_fmt);
|
||||
for (i = 0; i < blob_fmt->count_formats; i++)
|
||||
{
|
||||
if (formats[i] == DRM_FORMAT_XRGB8888)
|
||||
{
|
||||
xrgb_idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (xrgb_idx == UINT_MAX)
|
||||
{
|
||||
drmModeFreePropertyBlob (blob);
|
||||
return;
|
||||
}
|
||||
|
||||
modifiers = modifiers_ptr (blob_fmt);
|
||||
crtc_kms->modifiers_xrgb8888 = g_array_new (FALSE, FALSE, sizeof (uint64_t));
|
||||
for (i = 0; i < blob_fmt->count_modifiers; i++)
|
||||
{
|
||||
/* The modifier advertisement blob is partitioned into groups of
|
||||
* 64 formats. */
|
||||
if (xrgb_idx < modifiers[i].offset ||
|
||||
xrgb_idx > modifiers[i].offset + 63)
|
||||
continue;
|
||||
|
||||
if (!(modifiers[i].formats & (1 << (xrgb_idx - modifiers[i].offset))))
|
||||
continue;
|
||||
|
||||
g_array_append_val (crtc_kms->modifiers_xrgb8888, modifiers[i].modifier);
|
||||
}
|
||||
|
||||
if (crtc_kms->modifiers_xrgb8888->len == 0)
|
||||
{
|
||||
g_array_free (crtc_kms->modifiers_xrgb8888, TRUE);
|
||||
crtc_kms->modifiers_xrgb8888 = NULL;
|
||||
}
|
||||
|
||||
drmModeFreePropertyBlob (blob);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_transforms (MetaCrtc *crtc,
|
||||
drmModePropertyPtr prop)
|
||||
@ -246,7 +349,7 @@ init_crtc_rotations (MetaCrtc *crtc,
|
||||
|
||||
if (props && is_primary_plane (gpu, props))
|
||||
{
|
||||
int rotation_idx;
|
||||
int rotation_idx, fmts_idx;
|
||||
|
||||
crtc_kms->primary_plane_id = drm_plane->plane_id;
|
||||
rotation_idx = find_property_index (gpu, props,
|
||||
@ -257,6 +360,15 @@ init_crtc_rotations (MetaCrtc *crtc,
|
||||
parse_transforms (crtc, prop);
|
||||
drmModeFreeProperty (prop);
|
||||
}
|
||||
|
||||
fmts_idx = find_property_index (gpu, props,
|
||||
"IN_FORMATS", &prop);
|
||||
if (fmts_idx >= 0)
|
||||
{
|
||||
crtc_kms->formats_prop_id = props->props[fmts_idx];
|
||||
parse_formats (crtc, kms_fd, props->prop_values[fmts_idx]);
|
||||
drmModeFreeProperty (prop);
|
||||
}
|
||||
}
|
||||
|
||||
if (props)
|
||||
@ -311,6 +423,10 @@ find_crtc_properties (MetaCrtc *crtc,
|
||||
static void
|
||||
meta_crtc_destroy_notify (MetaCrtc *crtc)
|
||||
{
|
||||
MetaCrtcKms *crtc_kms = crtc->driver_private;
|
||||
|
||||
if (crtc_kms->modifiers_xrgb8888)
|
||||
g_array_free (crtc_kms->modifiers_xrgb8888, TRUE);
|
||||
g_free (crtc->driver_private);
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,9 @@ void meta_crtc_kms_apply_transform (MetaCrtc *crtc);
|
||||
void meta_crtc_kms_set_underscan (MetaCrtc *crtc,
|
||||
gboolean is_underscanning);
|
||||
|
||||
GArray * meta_crtc_kms_get_modifiers (MetaCrtc *crtc,
|
||||
uint32_t format);
|
||||
|
||||
MetaCrtc * meta_create_kms_crtc (MetaGpuKms *gpu_kms,
|
||||
drmModeCrtc *drm_crtc,
|
||||
unsigned int crtc_index);
|
||||
|
@ -465,6 +465,7 @@ cursor_over_transformed_logical_monitor (MetaCursorRenderer *renderer,
|
||||
MetaRectangle logical_monitor_layout;
|
||||
ClutterRect logical_monitor_rect;
|
||||
MetaMonitorTransform transform;
|
||||
GList *monitors, *l_mon;
|
||||
|
||||
logical_monitor_layout =
|
||||
meta_logical_monitor_get_layout (logical_monitor);
|
||||
@ -475,9 +476,17 @@ cursor_over_transformed_logical_monitor (MetaCursorRenderer *renderer,
|
||||
NULL))
|
||||
continue;
|
||||
|
||||
transform = meta_logical_monitor_get_transform (logical_monitor);
|
||||
if (transform != META_MONITOR_TRANSFORM_NORMAL)
|
||||
return TRUE;
|
||||
monitors = meta_logical_monitor_get_monitors (logical_monitor);
|
||||
for (l_mon = monitors; l_mon; l_mon = l_mon->next)
|
||||
{
|
||||
MetaMonitor *monitor = l_mon->data;
|
||||
|
||||
transform = meta_logical_monitor_get_transform (logical_monitor);
|
||||
/* Get transform corrected for LCD panel-orientation. */
|
||||
transform = meta_monitor_logical_to_crtc_transform (monitor, transform);
|
||||
if (transform != META_MONITOR_TRANSFORM_NORMAL)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Generated by gen-default-modes.py */
|
||||
|
||||
static const drmModeModeInfo meta_default_drm_mode_infos[] = {
|
||||
static const drmModeModeInfo meta_default_landscape_drm_mode_infos[] = {
|
||||
{ 38250, 800, 832, 912, 1024, 0, 600, 603, 607, 624, 0, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC, DRM_MODE_TYPE_DEFAULT, "800x600_60.00" },
|
||||
{ 63500, 1024, 1072, 1176, 1328, 0, 768, 771, 775, 798, 0, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC, DRM_MODE_TYPE_DEFAULT, "1024x768_60.00" },
|
||||
{ 81750, 1152, 1216, 1336, 1520, 0, 864, 867, 871, 897, 0, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC, DRM_MODE_TYPE_DEFAULT, "1152x864_60.00" },
|
||||
@ -27,3 +27,31 @@ static const drmModeModeInfo meta_default_drm_mode_infos[] = {
|
||||
{ 813000, 4096, 4440, 4888, 5680, 0, 2304, 2307, 2312, 2386, 0, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC, DRM_MODE_TYPE_DEFAULT, "4096x2304_60.00" },
|
||||
{ 1276500, 5120, 5560, 6128, 7136, 0, 2880, 2883, 2888, 2982, 0, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC, DRM_MODE_TYPE_DEFAULT, "5120x2880_60.00" },
|
||||
};
|
||||
|
||||
static const drmModeModeInfo meta_default_portrait_drm_mode_infos[] = {
|
||||
{ 38250, 600, 603, 607, 624, 0, 800, 832, 912, 1024, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "600x800_60.00" },
|
||||
{ 63500, 768, 771, 775, 798, 0, 1024, 1072, 1176, 1328, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "768x1024_60.00" },
|
||||
{ 81750, 864, 867, 871, 897, 0, 1152, 1216, 1336, 1520, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "864x1152_60.00" },
|
||||
{ 101250, 960, 963, 967, 996, 0, 1280, 1360, 1488, 1696, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "960x1280_60.00" },
|
||||
{ 121750, 1050, 1053, 1057, 1089, 0, 1400, 1488, 1632, 1864, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1050x1400_60.00" },
|
||||
{ 129000, 1080, 1083, 1087, 1120, 0, 1440, 1528, 1680, 1920, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1080x1440_60.00" },
|
||||
{ 161000, 1200, 1203, 1207, 1245, 0, 1600, 1712, 1880, 2160, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1200x1600_60.00" },
|
||||
{ 233500, 1440, 1443, 1447, 1493, 0, 1920, 2064, 2264, 2608, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1440x1920_60.00" },
|
||||
{ 267250, 1536, 1539, 1543, 1592, 0, 2048, 2208, 2424, 2800, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1536x2048_60.00" },
|
||||
{ 83500, 800, 803, 809, 831, 0, 1280, 1352, 1480, 1680, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "800x1280_60.00" },
|
||||
{ 106500, 900, 903, 909, 934, 0, 1440, 1528, 1672, 1904, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "900x1440_60.00" },
|
||||
{ 146250, 1050, 1053, 1059, 1089, 0, 1680, 1784, 1960, 2240, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1050x1680_60.00" },
|
||||
{ 193250, 1200, 1203, 1209, 1245, 0, 1920, 2056, 2256, 2592, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1200x1920_60.00" },
|
||||
{ 348500, 1600, 1603, 1609, 1658, 0, 2560, 2760, 3032, 3504, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1600x2560_60.00" },
|
||||
{ 74500, 720, 723, 728, 748, 0, 1280, 1344, 1472, 1664, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "720x1280_60.00" },
|
||||
{ 85250, 768, 771, 781, 798, 0, 1368, 1440, 1576, 1784, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "768x1368_60.00" },
|
||||
{ 118250, 900, 903, 908, 934, 0, 1600, 1696, 1856, 2112, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "900x1600_60.00" },
|
||||
{ 173000, 1080, 1083, 1088, 1120, 0, 1920, 2048, 2248, 2576, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1080x1920_60.00" },
|
||||
{ 197000, 1152, 1155, 1160, 1195, 0, 2048, 2184, 2400, 2752, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1152x2048_60.00" },
|
||||
{ 312250, 1440, 1443, 1448, 1493, 0, 2560, 2752, 3024, 3488, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1440x2560_60.00" },
|
||||
{ 396250, 1620, 1623, 1628, 1679, 0, 2880, 3096, 3408, 3936, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1620x2880_60.00" },
|
||||
{ 492000, 1800, 1803, 1808, 1865, 0, 3200, 3456, 3800, 4400, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "1800x3200_60.00" },
|
||||
{ 712750, 2160, 2163, 2168, 2237, 0, 3840, 4160, 4576, 5312, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "2160x3840_60.00" },
|
||||
{ 813000, 2304, 2307, 2312, 2386, 0, 4096, 4440, 4888, 5680, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "2304x4096_60.00" },
|
||||
{ 1276500, 2880, 2883, 2888, 2982, 0, 5120, 5560, 6128, 7136, 0, 0, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC, DRM_MODE_TYPE_DEFAULT, "2880x5120_60.00" },
|
||||
};
|
||||
|
@ -601,11 +601,21 @@ init_modes (MetaGpuKms *gpu_kms,
|
||||
|
||||
g_hash_table_destroy (modes_table);
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (meta_default_drm_mode_infos); i++)
|
||||
for (i = 0; i < G_N_ELEMENTS (meta_default_landscape_drm_mode_infos); i++)
|
||||
{
|
||||
MetaCrtcMode *mode;
|
||||
|
||||
mode = create_mode (&meta_default_drm_mode_infos[i], (long) mode_id);
|
||||
mode = create_mode (&meta_default_landscape_drm_mode_infos[i], mode_id);
|
||||
modes = g_list_append (modes, mode);
|
||||
|
||||
mode_id++;
|
||||
}
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (meta_default_portrait_drm_mode_infos); i++)
|
||||
{
|
||||
MetaCrtcMode *mode;
|
||||
|
||||
mode = create_mode (&meta_default_portrait_drm_mode_infos[i], mode_id);
|
||||
modes = g_list_append (modes, mode);
|
||||
|
||||
mode_id++;
|
||||
@ -665,11 +675,21 @@ init_outputs (MetaGpuKms *gpu_kms,
|
||||
{
|
||||
MetaOutput *output;
|
||||
MetaOutput *old_output;
|
||||
GError *error = NULL;
|
||||
|
||||
old_output = find_output_by_id (old_outputs, connector->connector_id);
|
||||
output = meta_create_kms_output (gpu_kms, connector, resources,
|
||||
old_output);
|
||||
outputs = g_list_prepend (outputs, output);
|
||||
old_output,
|
||||
&error);
|
||||
if (!output)
|
||||
{
|
||||
g_warning ("Failed to create KMS output: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
else
|
||||
{
|
||||
outputs = g_list_prepend (outputs, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -547,12 +547,15 @@ meta_input_settings_native_set_stylus_button_map (MetaInputSettings *se
|
||||
ClutterInputDevice *device,
|
||||
ClutterInputDeviceTool *tool,
|
||||
GDesktopStylusButtonAction primary,
|
||||
GDesktopStylusButtonAction secondary)
|
||||
GDesktopStylusButtonAction secondary,
|
||||
GDesktopStylusButtonAction tertiary)
|
||||
{
|
||||
clutter_evdev_input_device_tool_set_button_code (tool, CLUTTER_BUTTON_MIDDLE,
|
||||
action_to_evcode (primary));
|
||||
clutter_evdev_input_device_tool_set_button_code (tool, CLUTTER_BUTTON_SECONDARY,
|
||||
action_to_evcode (secondary));
|
||||
clutter_evdev_input_device_tool_set_button_code (tool, 8, /* Back */
|
||||
action_to_evcode (tertiary));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -229,9 +229,37 @@ meta_output_kms_read_edid (MetaOutput *output)
|
||||
}
|
||||
|
||||
static void
|
||||
find_connector_properties (MetaGpuKms *gpu_kms,
|
||||
MetaOutputKms *output_kms)
|
||||
handle_panel_orientation (MetaOutput *output,
|
||||
drmModePropertyPtr prop,
|
||||
int orientation)
|
||||
{
|
||||
const char *name = prop->enums[orientation].name;
|
||||
|
||||
if (strcmp (name, "Upside Down") == 0)
|
||||
{
|
||||
output->panel_orientation_transform = META_MONITOR_TRANSFORM_180;
|
||||
}
|
||||
else if (strcmp (name, "Left Side Up") == 0)
|
||||
{
|
||||
/* Left side up, rotate 90 degrees counter clockwise to correct */
|
||||
output->panel_orientation_transform = META_MONITOR_TRANSFORM_90;
|
||||
}
|
||||
else if (strcmp (name, "Right Side Up") == 0)
|
||||
{
|
||||
/* Right side up, rotate 270 degrees counter clockwise to correct */
|
||||
output->panel_orientation_transform = META_MONITOR_TRANSFORM_270;
|
||||
}
|
||||
else
|
||||
{
|
||||
output->panel_orientation_transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
find_connector_properties (MetaGpuKms *gpu_kms,
|
||||
MetaOutput *output)
|
||||
{
|
||||
MetaOutputKms *output_kms = output->driver_private;
|
||||
drmModeConnector *connector = output_kms->connector;
|
||||
int fd;
|
||||
int i;
|
||||
@ -268,6 +296,10 @@ find_connector_properties (MetaGpuKms *gpu_kms,
|
||||
output_kms->hotplug_mode_update = connector->prop_values[i];
|
||||
else if (strcmp (prop->name, "scaling mode") == 0)
|
||||
output_kms->has_scaling = TRUE;
|
||||
else if ((prop->flags & DRM_MODE_PROP_ENUM) &&
|
||||
strcmp (prop->name, "panel orientation") == 0)
|
||||
handle_panel_orientation (output, prop,
|
||||
output_kms->connector->prop_values[i]);
|
||||
|
||||
drmModeFreeProperty (prop);
|
||||
}
|
||||
@ -325,7 +357,10 @@ static void
|
||||
add_common_modes (MetaOutput *output,
|
||||
MetaGpuKms *gpu_kms)
|
||||
{
|
||||
const drmModeModeInfo *drm_mode;
|
||||
MetaCrtcMode *crtc_mode;
|
||||
GPtrArray *array;
|
||||
float refresh_rate;
|
||||
unsigned i;
|
||||
unsigned max_hdisplay = 0;
|
||||
unsigned max_vdisplay = 0;
|
||||
@ -333,9 +368,6 @@ add_common_modes (MetaOutput *output,
|
||||
|
||||
for (i = 0; i < output->n_modes; i++)
|
||||
{
|
||||
const drmModeModeInfo *drm_mode;
|
||||
float refresh_rate;
|
||||
|
||||
drm_mode = output->modes[i]->driver_private;
|
||||
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
|
||||
max_hdisplay = MAX (max_hdisplay, drm_mode->hdisplay);
|
||||
@ -347,22 +379,37 @@ add_common_modes (MetaOutput *output,
|
||||
max_refresh_rate *= (1 + SYNC_TOLERANCE);
|
||||
|
||||
array = g_ptr_array_new ();
|
||||
for (i = 0; i < G_N_ELEMENTS (meta_default_drm_mode_infos); i++)
|
||||
if (max_hdisplay > max_vdisplay)
|
||||
{
|
||||
const drmModeModeInfo *drm_mode;
|
||||
float refresh_rate;
|
||||
MetaCrtcMode *crtc_mode;
|
||||
for (i = 0; i < G_N_ELEMENTS (meta_default_landscape_drm_mode_infos); i++)
|
||||
{
|
||||
drm_mode = &meta_default_landscape_drm_mode_infos[i];
|
||||
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
|
||||
if (drm_mode->hdisplay > max_hdisplay ||
|
||||
drm_mode->vdisplay > max_vdisplay ||
|
||||
refresh_rate > max_refresh_rate)
|
||||
continue;
|
||||
|
||||
drm_mode = &meta_default_drm_mode_infos[i];
|
||||
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
|
||||
if (drm_mode->hdisplay > max_hdisplay ||
|
||||
drm_mode->vdisplay > max_vdisplay ||
|
||||
refresh_rate > max_refresh_rate)
|
||||
continue;
|
||||
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms,
|
||||
drm_mode);
|
||||
g_ptr_array_add (array, crtc_mode);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < G_N_ELEMENTS (meta_default_portrait_drm_mode_infos); i++)
|
||||
{
|
||||
drm_mode = &meta_default_portrait_drm_mode_infos[i];
|
||||
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
|
||||
if (drm_mode->hdisplay > max_hdisplay ||
|
||||
drm_mode->vdisplay > max_vdisplay ||
|
||||
refresh_rate > max_refresh_rate)
|
||||
continue;
|
||||
|
||||
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms,
|
||||
drm_mode);
|
||||
g_ptr_array_add (array, crtc_mode);
|
||||
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms,
|
||||
drm_mode);
|
||||
g_ptr_array_add (array, crtc_mode);
|
||||
}
|
||||
}
|
||||
|
||||
output->modes = g_renew (MetaCrtcMode *, output->modes,
|
||||
@ -391,9 +438,10 @@ compare_modes (const void *one,
|
||||
return g_strcmp0 (b->name, a->name);
|
||||
}
|
||||
|
||||
static void
|
||||
init_output_modes (MetaOutput *output,
|
||||
MetaGpuKms *gpu_kms)
|
||||
static gboolean
|
||||
init_output_modes (MetaOutput *output,
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
{
|
||||
MetaOutputKms *output_kms = output->driver_private;
|
||||
unsigned int i;
|
||||
@ -413,15 +461,35 @@ init_output_modes (MetaOutput *output,
|
||||
output->preferred_mode = output->modes[i];
|
||||
}
|
||||
|
||||
/* FIXME: MSC feature bit? */
|
||||
/* Presume that if the output supports scaling, then we have
|
||||
* a panel fitter capable of adjusting any mode to suit.
|
||||
*/
|
||||
if (output_kms->has_scaling)
|
||||
add_common_modes (output, gpu_kms);
|
||||
|
||||
if (!output->modes)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"No modes available");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
qsort (output->modes, output->n_modes,
|
||||
sizeof (MetaCrtcMode *), compare_modes);
|
||||
|
||||
if (!output->preferred_mode)
|
||||
output->preferred_mode = output->modes[0];
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
MetaOutput *
|
||||
meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
drmModeConnector *connector,
|
||||
MetaKmsResources *resources,
|
||||
MetaOutput *old_output)
|
||||
meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
drmModeConnector *connector,
|
||||
MetaKmsResources *resources,
|
||||
MetaOutput *old_output,
|
||||
GError **error)
|
||||
{
|
||||
MetaGpu *gpu = META_GPU (gpu_kms);
|
||||
MetaOutput *output;
|
||||
@ -442,8 +510,6 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
output->gpu = gpu;
|
||||
output->winsys_id = connector->connector_id;
|
||||
output->name = make_output_name (connector);
|
||||
output->width_mm = connector->mmWidth;
|
||||
output->height_mm = connector->mmHeight;
|
||||
|
||||
switch (connector->subpixel)
|
||||
{
|
||||
@ -469,19 +535,24 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
}
|
||||
|
||||
output_kms->connector = connector;
|
||||
find_connector_properties (gpu_kms, output_kms);
|
||||
find_connector_properties (gpu_kms, output);
|
||||
|
||||
init_output_modes (output, gpu_kms);
|
||||
if (meta_monitor_transform_is_rotated (output->panel_orientation_transform))
|
||||
{
|
||||
output->width_mm = connector->mmHeight;
|
||||
output->height_mm = connector->mmWidth;
|
||||
}
|
||||
else
|
||||
{
|
||||
output->width_mm = connector->mmWidth;
|
||||
output->height_mm = connector->mmHeight;
|
||||
}
|
||||
|
||||
/* FIXME: MSC feature bit? */
|
||||
/* Presume that if the output supports scaling, then we have
|
||||
* a panel fitter capable of adjusting any mode to suit.
|
||||
*/
|
||||
if (output_kms->has_scaling)
|
||||
add_common_modes (output, gpu_kms);
|
||||
|
||||
qsort (output->modes, output->n_modes,
|
||||
sizeof (MetaCrtcMode *), compare_modes);
|
||||
if (!init_output_modes (output, gpu_kms, error))
|
||||
{
|
||||
g_object_unref (output);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
output_kms->n_encoders = connector->count_encoders;
|
||||
output_kms->encoders = g_new0 (drmModeEncoderPtr, output_kms->n_encoders);
|
||||
|
@ -35,9 +35,10 @@ gboolean meta_output_kms_can_clone (MetaOutput *output,
|
||||
|
||||
GBytes * meta_output_kms_read_edid (MetaOutput *output);
|
||||
|
||||
MetaOutput * meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
drmModeConnector *connector,
|
||||
MetaKmsResources *resources,
|
||||
MetaOutput *old_output);
|
||||
MetaOutput * meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
drmModeConnector *connector,
|
||||
MetaKmsResources *resources,
|
||||
MetaOutput *old_output,
|
||||
GError **error);
|
||||
|
||||
#endif /* META_OUTPUT_KMS_H */
|
||||
|
@ -26,11 +26,13 @@
|
||||
|
||||
#include "backends/native/meta-renderer-native-gles3.h"
|
||||
|
||||
#include <drm_fourcc.h>
|
||||
#include <errno.h>
|
||||
#include <gio/gio.h>
|
||||
#include <GLES3/gl3.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "backends/meta-egl-ext.h"
|
||||
#include "backends/meta-gles3.h"
|
||||
#include "backends/meta-gles3-table.h"
|
||||
|
||||
@ -48,24 +50,91 @@ create_egl_image (MetaEgl *egl,
|
||||
EGLContext egl_context,
|
||||
unsigned int width,
|
||||
unsigned int height,
|
||||
uint32_t stride,
|
||||
uint32_t n_planes,
|
||||
uint32_t *strides,
|
||||
uint32_t *offsets,
|
||||
uint64_t *modifiers,
|
||||
uint32_t format,
|
||||
int fd,
|
||||
GError **error)
|
||||
{
|
||||
EGLint attributes[] = {
|
||||
EGL_WIDTH, width,
|
||||
EGL_HEIGHT, height,
|
||||
EGL_LINUX_DRM_FOURCC_EXT, format,
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT, fd,
|
||||
EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0,
|
||||
EGL_DMA_BUF_PLANE0_PITCH_EXT, stride,
|
||||
EGL_NONE
|
||||
};
|
||||
EGLint attribs[37];
|
||||
int atti = 0;
|
||||
gboolean has_modifier;
|
||||
|
||||
/* This requires the Mesa commit in
|
||||
* Mesa 10.3 (08264e5dad4df448e7718e782ad9077902089a07) or
|
||||
* Mesa 10.2.7 (55d28925e6109a4afd61f109e845a8a51bd17652).
|
||||
* Otherwise Mesa closes the fd behind our back and re-importing
|
||||
* will fail.
|
||||
* https://bugs.freedesktop.org/show_bug.cgi?id=76188
|
||||
*/
|
||||
|
||||
attribs[atti++] = EGL_WIDTH;
|
||||
attribs[atti++] = width;
|
||||
attribs[atti++] = EGL_HEIGHT;
|
||||
attribs[atti++] = height;
|
||||
attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
|
||||
attribs[atti++] = format;
|
||||
|
||||
has_modifier = (modifiers[0] != DRM_FORMAT_MOD_INVALID);
|
||||
|
||||
if (n_planes > 0)
|
||||
{
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
|
||||
attribs[atti++] = fd;
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
|
||||
attribs[atti++] = offsets[0];
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
|
||||
attribs[atti++] = strides[0];
|
||||
if (has_modifier)
|
||||
{
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
|
||||
attribs[atti++] = modifiers[0] & 0xFFFFFFFF;
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT;
|
||||
attribs[atti++] = modifiers[0] >> 32;
|
||||
}
|
||||
}
|
||||
|
||||
if (n_planes > 1)
|
||||
{
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE1_FD_EXT;
|
||||
attribs[atti++] = fd;
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE1_OFFSET_EXT;
|
||||
attribs[atti++] = offsets[1];
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
|
||||
attribs[atti++] = strides[1];
|
||||
if (has_modifier)
|
||||
{
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
|
||||
attribs[atti++] = modifiers[1] & 0xFFFFFFFF;
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT;
|
||||
attribs[atti++] = modifiers[1] >> 32;
|
||||
}
|
||||
}
|
||||
|
||||
if (n_planes > 2)
|
||||
{
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE2_FD_EXT;
|
||||
attribs[atti++] = fd;
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE2_OFFSET_EXT;
|
||||
attribs[atti++] = offsets[2];
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE2_PITCH_EXT;
|
||||
attribs[atti++] = strides[2];
|
||||
if (has_modifier)
|
||||
{
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
|
||||
attribs[atti++] = modifiers[2] & 0xFFFFFFFF;
|
||||
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT;
|
||||
attribs[atti++] = modifiers[2] >> 32;
|
||||
}
|
||||
}
|
||||
|
||||
attribs[atti++] = EGL_NONE;
|
||||
|
||||
return meta_egl_create_image (egl, egl_display, EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT, NULL,
|
||||
attributes,
|
||||
attribs,
|
||||
error);
|
||||
}
|
||||
|
||||
@ -120,7 +189,10 @@ meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
|
||||
int shared_bo_fd;
|
||||
unsigned int width;
|
||||
unsigned int height;
|
||||
uint32_t stride;
|
||||
uint32_t i, n_planes;
|
||||
uint32_t strides[4] = { 0, };
|
||||
uint32_t offsets[4] = { 0, };
|
||||
uint64_t modifiers[4] = { 0, };
|
||||
uint32_t format;
|
||||
EGLImageKHR egl_image;
|
||||
|
||||
@ -134,14 +206,23 @@ meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
|
||||
|
||||
width = gbm_bo_get_width (shared_bo);
|
||||
height = gbm_bo_get_height (shared_bo);
|
||||
stride = gbm_bo_get_stride (shared_bo);
|
||||
format = gbm_bo_get_format (shared_bo);
|
||||
|
||||
n_planes = gbm_bo_get_plane_count (shared_bo);
|
||||
for (i = 0; i < n_planes; i++)
|
||||
{
|
||||
strides[i] = gbm_bo_get_stride_for_plane (shared_bo, i);
|
||||
offsets[i] = gbm_bo_get_offset (shared_bo, i);
|
||||
modifiers[i] = gbm_bo_get_modifier (shared_bo);
|
||||
}
|
||||
|
||||
egl_image = create_egl_image (egl,
|
||||
egl_display,
|
||||
egl_context,
|
||||
width, height, stride,
|
||||
format,
|
||||
width, height,
|
||||
n_planes,
|
||||
strides, offsets,
|
||||
modifiers, format,
|
||||
shared_bo_fd,
|
||||
error);
|
||||
close (shared_bo_fd);
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <xf86drm.h>
|
||||
#include <drm_fourcc.h>
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
@ -55,6 +56,7 @@
|
||||
#include "backends/meta-logical-monitor.h"
|
||||
#include "backends/meta-output.h"
|
||||
#include "backends/meta-renderer-view.h"
|
||||
#include "backends/native/meta-crtc-kms.h"
|
||||
#include "backends/native/meta-gpu-kms.h"
|
||||
#include "backends/native/meta-monitor-manager-kms.h"
|
||||
#include "backends/native/meta-renderer-native.h"
|
||||
@ -1276,31 +1278,69 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms,
|
||||
struct gbm_bo **out_next_bo,
|
||||
uint32_t *out_next_fb_id)
|
||||
{
|
||||
uint32_t handle, stride;
|
||||
struct gbm_bo *next_bo;
|
||||
uint32_t next_fb_id;
|
||||
int kms_fd;
|
||||
uint32_t handles[4] = { 0, };
|
||||
uint32_t strides[4] = { 0, };
|
||||
uint32_t offsets[4] = { 0, };
|
||||
uint64_t modifiers[4] = { 0, };
|
||||
int i;
|
||||
|
||||
/* Now we need to set the CRTC to whatever is the front buffer */
|
||||
next_bo = gbm_surface_lock_front_buffer (gbm_surface);
|
||||
|
||||
stride = gbm_bo_get_stride (next_bo);
|
||||
handle = gbm_bo_get_handle (next_bo).u32;
|
||||
for (i = 0; i < gbm_bo_get_plane_count (next_bo); i++)
|
||||
{
|
||||
strides[i] = gbm_bo_get_stride_for_plane (next_bo, i);
|
||||
handles[i] = gbm_bo_get_handle_for_plane (next_bo, i).u32;
|
||||
offsets[i] = gbm_bo_get_offset (next_bo, i);
|
||||
modifiers[i] = gbm_bo_get_modifier (next_bo);
|
||||
}
|
||||
|
||||
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
|
||||
if (drmModeAddFB (kms_fd,
|
||||
gbm_bo_get_width (next_bo),
|
||||
gbm_bo_get_height (next_bo),
|
||||
24, /* depth */
|
||||
32, /* bpp */
|
||||
stride,
|
||||
handle,
|
||||
&next_fb_id))
|
||||
if (modifiers[0] != DRM_FORMAT_MOD_INVALID)
|
||||
{
|
||||
g_warning ("Failed to create new back buffer handle: %m");
|
||||
gbm_surface_release_buffer (gbm_surface, next_bo);
|
||||
return FALSE;
|
||||
if (drmModeAddFB2WithModifiers (kms_fd,
|
||||
gbm_bo_get_width (next_bo),
|
||||
gbm_bo_get_height (next_bo),
|
||||
gbm_bo_get_format (next_bo),
|
||||
handles,
|
||||
strides,
|
||||
offsets,
|
||||
modifiers,
|
||||
&next_fb_id,
|
||||
DRM_MODE_FB_MODIFIERS))
|
||||
{
|
||||
g_warning ("Failed to create new back buffer handle: %m");
|
||||
gbm_surface_release_buffer (gbm_surface, next_bo);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (drmModeAddFB2 (kms_fd,
|
||||
gbm_bo_get_width (next_bo),
|
||||
gbm_bo_get_height (next_bo),
|
||||
gbm_bo_get_format (next_bo),
|
||||
handles,
|
||||
strides,
|
||||
offsets,
|
||||
&next_fb_id,
|
||||
0))
|
||||
{
|
||||
if (drmModeAddFB (kms_fd,
|
||||
gbm_bo_get_width (next_bo),
|
||||
gbm_bo_get_height (next_bo),
|
||||
24, /* depth */
|
||||
32, /* bpp */
|
||||
strides[0],
|
||||
handles[0],
|
||||
&next_fb_id))
|
||||
{
|
||||
g_warning ("Failed to create new back buffer handle: %m");
|
||||
gbm_surface_release_buffer (gbm_surface, next_bo);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
*out_next_bo = next_bo;
|
||||
@ -1599,6 +1639,146 @@ meta_renderer_native_init_egl_context (CoglContext *cogl_context,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GArray *
|
||||
get_supported_modifiers (CoglOnscreen *onscreen,
|
||||
uint32_t format)
|
||||
{
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
MetaLogicalMonitor *logical_monitor = onscreen_native->logical_monitor;
|
||||
MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native);
|
||||
CoglContext *cogl_context = COGL_FRAMEBUFFER (onscreen)->context;
|
||||
CoglRenderer *cogl_renderer = cogl_context->display->renderer;
|
||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||
GArray *modifiers;
|
||||
GArray *base_mods;
|
||||
GList *l_crtc, *l_monitor;
|
||||
MetaCrtc *base_crtc = NULL;
|
||||
GList *other_crtcs = NULL;
|
||||
unsigned int i;
|
||||
|
||||
if (!logical_monitor)
|
||||
return NULL;
|
||||
|
||||
/* Find our base CRTC to intersect against. */
|
||||
for (l_monitor = meta_logical_monitor_get_monitors (logical_monitor);
|
||||
l_monitor;
|
||||
l_monitor = l_monitor->next)
|
||||
{
|
||||
MetaMonitor *monitor = l_monitor->data;
|
||||
MetaGpu *gpu = meta_monitor_get_gpu (monitor);
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
|
||||
/* All secondary GPUs need to be able to import DMA BUF with modifiers */
|
||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
META_GPU_KMS (gpu));
|
||||
if (cogl_renderer_egl->platform != renderer_gpu_data &&
|
||||
!meta_egl_has_extensions (egl, renderer_gpu_data->egl_display, NULL,
|
||||
"EGL_EXT_image_dma_buf_import_modifiers",
|
||||
NULL))
|
||||
goto out;
|
||||
|
||||
for (l_crtc = meta_gpu_get_crtcs (gpu); l_crtc; l_crtc = l_crtc->next)
|
||||
{
|
||||
MetaCrtc *crtc = l_crtc->data;
|
||||
|
||||
if (crtc->logical_monitor != logical_monitor)
|
||||
continue;
|
||||
|
||||
if (!base_crtc)
|
||||
base_crtc = crtc;
|
||||
else if (crtc == base_crtc)
|
||||
continue;
|
||||
else if (g_list_index (other_crtcs, crtc) == -1)
|
||||
other_crtcs = g_list_append (other_crtcs, crtc);
|
||||
}
|
||||
}
|
||||
|
||||
if (!base_crtc)
|
||||
goto out;
|
||||
|
||||
base_mods = meta_crtc_kms_get_modifiers (base_crtc, format);
|
||||
if (!base_mods)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* If this is the only CRTC we have, we don't need to intersect the sets of
|
||||
* modifiers.
|
||||
*/
|
||||
if (other_crtcs == NULL)
|
||||
{
|
||||
modifiers = g_array_sized_new (FALSE, FALSE, sizeof (uint64_t),
|
||||
base_mods->len);
|
||||
g_array_append_vals (modifiers, base_mods->data, base_mods->len);
|
||||
return modifiers;
|
||||
}
|
||||
|
||||
modifiers = g_array_new (FALSE, FALSE, sizeof (uint64_t));
|
||||
|
||||
/*
|
||||
* For each modifier from base_crtc, check if it's available on all other
|
||||
* CRTCs.
|
||||
*/
|
||||
for (i = 0; i < base_mods->len; i++)
|
||||
{
|
||||
uint64_t modifier = g_array_index (base_mods, uint64_t, i);
|
||||
gboolean found_everywhere = TRUE;
|
||||
GList *k;
|
||||
|
||||
/* Check if we have the same modifier available for all CRTCs. */
|
||||
for (k = other_crtcs; k; k = k->next)
|
||||
{
|
||||
MetaCrtc *crtc = k->data;
|
||||
GArray *crtc_mods;
|
||||
unsigned int m;
|
||||
gboolean found_here = FALSE;
|
||||
|
||||
if (crtc->logical_monitor != logical_monitor)
|
||||
continue;
|
||||
|
||||
crtc_mods = meta_crtc_kms_get_modifiers (crtc, format);
|
||||
if (!crtc_mods)
|
||||
{
|
||||
g_array_free (modifiers, TRUE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (m = 0; m < crtc_mods->len; m++)
|
||||
{
|
||||
uint64_t local_mod = g_array_index (crtc_mods, uint64_t, m);
|
||||
|
||||
if (local_mod == modifier)
|
||||
{
|
||||
found_here = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_here)
|
||||
{
|
||||
found_everywhere = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_everywhere)
|
||||
g_array_append_val (modifiers, modifier);
|
||||
}
|
||||
|
||||
if (modifiers->len == 0)
|
||||
{
|
||||
g_array_free (modifiers, TRUE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
return modifiers;
|
||||
|
||||
out:
|
||||
g_list_free (other_crtcs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
should_surface_be_sharable (CoglOnscreen *onscreen)
|
||||
{
|
||||
@ -1651,19 +1831,36 @@ meta_renderer_native_create_surface_gbm (CoglOnscreen *onscreen,
|
||||
struct gbm_surface *new_gbm_surface;
|
||||
EGLNativeWindowType egl_native_window;
|
||||
EGLSurface new_egl_surface;
|
||||
uint32_t flags;
|
||||
|
||||
flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
|
||||
if (should_surface_be_sharable (onscreen))
|
||||
flags |= GBM_BO_USE_LINEAR;
|
||||
uint32_t format = GBM_FORMAT_XRGB8888;
|
||||
GArray *modifiers;
|
||||
|
||||
renderer_gpu_data =
|
||||
meta_renderer_native_get_gpu_data (renderer_native,
|
||||
onscreen_native->render_gpu);
|
||||
new_gbm_surface = gbm_surface_create (renderer_gpu_data->gbm.device,
|
||||
width, height,
|
||||
GBM_FORMAT_XRGB8888,
|
||||
flags);
|
||||
|
||||
modifiers = get_supported_modifiers (onscreen, format);
|
||||
|
||||
if (modifiers)
|
||||
{
|
||||
new_gbm_surface =
|
||||
gbm_surface_create_with_modifiers (renderer_gpu_data->gbm.device,
|
||||
width, height, format,
|
||||
(uint64_t *) modifiers->data,
|
||||
modifiers->len);
|
||||
g_array_free (modifiers, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
|
||||
|
||||
if (should_surface_be_sharable (onscreen))
|
||||
flags |= GBM_BO_USE_LINEAR;
|
||||
|
||||
new_gbm_surface = gbm_surface_create (renderer_gpu_data->gbm.device,
|
||||
width, height,
|
||||
format,
|
||||
flags);
|
||||
}
|
||||
|
||||
if (!new_gbm_surface)
|
||||
{
|
||||
@ -2342,8 +2539,12 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
|
||||
{
|
||||
MetaMonitor *main_monitor;
|
||||
MetaOutput *main_output;
|
||||
MetaMonitorTransform crtc_transform;
|
||||
main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
|
||||
main_output = meta_monitor_get_main_output (main_monitor);
|
||||
crtc_transform =
|
||||
meta_monitor_logical_to_crtc_transform (main_monitor,
|
||||
logical_monitor->transform);
|
||||
|
||||
/*
|
||||
* Pick any monitor and output and check; all CRTCs of a logical monitor will
|
||||
@ -2352,10 +2553,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
|
||||
|
||||
if (meta_monitor_manager_is_transform_handled (monitor_manager,
|
||||
main_output->crtc,
|
||||
logical_monitor->transform))
|
||||
crtc_transform))
|
||||
return META_MONITOR_TRANSFORM_NORMAL;
|
||||
else
|
||||
return logical_monitor->transform;
|
||||
return crtc_transform;
|
||||
}
|
||||
|
||||
static MetaRendererView *
|
||||
|
@ -112,7 +112,7 @@ translate_device_event (MetaBackendX11 *x11,
|
||||
|
||||
if (!device_event->send_event && device_event->time != CurrentTime)
|
||||
{
|
||||
if (device_event->time < priv->latest_evtime)
|
||||
if (XSERVER_TIME_IS_BEFORE (device_event->time, priv->latest_evtime))
|
||||
{
|
||||
/* Emulated pointer events received after XIRejectTouch is received
|
||||
* on a passive touch grab will contain older timestamps, update those
|
||||
@ -705,8 +705,6 @@ meta_backend_x11_init (MetaBackendX11 *x11)
|
||||
*/
|
||||
XInitThreads();
|
||||
|
||||
clutter_x11_request_reset_on_video_memory_purge ();
|
||||
|
||||
/* We do X11 event retrieval ourselves */
|
||||
clutter_x11_disable_event_retrieval ();
|
||||
}
|
||||
|
@ -55,6 +55,46 @@ enum {
|
||||
SCROLL_METHOD_NUM_FIELDS
|
||||
};
|
||||
|
||||
static void
|
||||
device_free_xdevice (gpointer user_data)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
XDevice *xdev = user_data;
|
||||
|
||||
meta_error_trap_push (display);
|
||||
XCloseDevice (xdisplay, xdev);
|
||||
meta_error_trap_pop (display);
|
||||
}
|
||||
|
||||
static XDevice *
|
||||
device_ensure_xdevice (ClutterInputDevice *device)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
int device_id = clutter_input_device_get_device_id (device);
|
||||
XDevice *xdev = NULL;
|
||||
|
||||
xdev = g_object_get_data (G_OBJECT (device), "meta-input-settings-xdevice");
|
||||
if (xdev)
|
||||
return xdev;
|
||||
|
||||
meta_error_trap_push (display);
|
||||
xdev = XOpenDevice (xdisplay, device_id);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (xdev)
|
||||
{
|
||||
g_object_set_data_full (G_OBJECT (device),
|
||||
"meta-input-settings-xdevice",
|
||||
xdev, device_free_xdevice);
|
||||
}
|
||||
|
||||
return xdev;
|
||||
}
|
||||
|
||||
static void *
|
||||
get_property (ClutterInputDevice *device,
|
||||
const gchar *property,
|
||||
@ -239,7 +279,7 @@ meta_input_settings_x11_set_tap_and_drag_enabled (MetaInputSettings *settings,
|
||||
{
|
||||
guchar value = (enabled) ? 1 : 0;
|
||||
|
||||
change_property (device, "libinput TappingDrag Enabled",
|
||||
change_property (device, "libinput Tapping Drag Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
}
|
||||
|
||||
@ -540,7 +580,6 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
int device_id = clutter_input_device_get_device_id (device);
|
||||
XDevice *xdev;
|
||||
|
||||
if (!display)
|
||||
@ -548,13 +587,12 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
|
||||
|
||||
/* Grab the puke bucket! */
|
||||
meta_error_trap_push (display);
|
||||
xdev = XOpenDevice (xdisplay, device_id);
|
||||
xdev = device_ensure_xdevice (device);
|
||||
if (xdev)
|
||||
{
|
||||
XSetDeviceMode (xdisplay, xdev,
|
||||
mapping == G_DESKTOP_TABLET_MAPPING_ABSOLUTE ?
|
||||
Absolute : Relative);
|
||||
XCloseDevice (xdisplay, xdev);
|
||||
}
|
||||
|
||||
if (meta_error_trap_pop_with_return (display))
|
||||
@ -732,12 +770,12 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
|
||||
ClutterInputDevice *device,
|
||||
ClutterInputDeviceTool *tool,
|
||||
GDesktopStylusButtonAction primary,
|
||||
GDesktopStylusButtonAction secondary)
|
||||
GDesktopStylusButtonAction secondary,
|
||||
GDesktopStylusButtonAction tertiary)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
int device_id = clutter_input_device_get_device_id (device);
|
||||
XDevice *xdev;
|
||||
|
||||
if (!display)
|
||||
@ -745,17 +783,21 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
|
||||
|
||||
/* Grab the puke bucket! */
|
||||
meta_error_trap_push (display);
|
||||
xdev = XOpenDevice (xdisplay, device_id);
|
||||
xdev = device_ensure_xdevice (device);
|
||||
if (xdev)
|
||||
{
|
||||
guchar map[3] = {
|
||||
guchar map[8] = {
|
||||
CLUTTER_BUTTON_PRIMARY,
|
||||
action_to_button (primary, CLUTTER_BUTTON_MIDDLE),
|
||||
action_to_button (secondary, CLUTTER_BUTTON_SECONDARY),
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
action_to_button (tertiary, 8), /* "Back" */
|
||||
};
|
||||
|
||||
XSetDeviceButtonMapping (xdisplay, xdev, map, G_N_ELEMENTS (map));
|
||||
XCloseDevice (xdisplay, xdev);
|
||||
}
|
||||
|
||||
if (meta_error_trap_pop_with_return (display))
|
||||
@ -771,9 +813,9 @@ meta_input_settings_x11_set_stylus_pressure (MetaInputSettings *settings,
|
||||
ClutterInputDeviceTool *tool,
|
||||
const gint32 pressure[4])
|
||||
{
|
||||
guchar values[4] = { pressure[0], pressure[1], pressure[2], pressure[3] };
|
||||
guint32 values[4] = { pressure[0], pressure[1], pressure[2], pressure[3] };
|
||||
|
||||
change_property (device, "Wacom Pressurecurve", XA_INTEGER, 8,
|
||||
change_property (device, "Wacom Pressurecurve", XA_INTEGER, 32,
|
||||
&values, G_N_ELEMENTS (values));
|
||||
}
|
||||
|
||||
|
@ -604,6 +604,38 @@ output_get_connector_type (MetaOutput *output)
|
||||
return META_CONNECTOR_TYPE_Unknown;
|
||||
}
|
||||
|
||||
static gint
|
||||
output_get_panel_orientation_transform (MetaOutput *output)
|
||||
{
|
||||
Display *xdisplay = xdisplay_from_output (output);
|
||||
unsigned long nitems, bytes_after;
|
||||
Atom atom, actual_type;
|
||||
int actual_format;
|
||||
g_autofree unsigned char *buffer = NULL;
|
||||
g_autofree char *str = NULL;
|
||||
|
||||
atom = XInternAtom (xdisplay, "panel orientation", False);
|
||||
XRRGetOutputProperty (xdisplay, (XID)output->winsys_id, atom,
|
||||
0, G_MAXLONG, False, False, XA_ATOM,
|
||||
&actual_type, &actual_format,
|
||||
&nitems, &bytes_after, &buffer);
|
||||
|
||||
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
|
||||
return META_MONITOR_TRANSFORM_NORMAL;
|
||||
|
||||
str = XGetAtomName (xdisplay, *(Atom *)buffer);
|
||||
if (strcmp (str, "Upside Down") == 0)
|
||||
return META_MONITOR_TRANSFORM_180;
|
||||
|
||||
if (strcmp (str, "Left Side Up") == 0)
|
||||
return META_MONITOR_TRANSFORM_90;
|
||||
|
||||
if (strcmp (str, "Right Side Up") == 0)
|
||||
return META_MONITOR_TRANSFORM_270;
|
||||
|
||||
return META_MONITOR_TRANSFORM_NORMAL;
|
||||
}
|
||||
|
||||
static void
|
||||
output_get_tile_info (MetaOutput *output)
|
||||
{
|
||||
@ -737,13 +769,25 @@ meta_create_xrandr_output (MetaGpuXrandr *gpu_xrandr,
|
||||
meta_output_parse_edid (output, edid);
|
||||
g_bytes_unref (edid);
|
||||
|
||||
output->width_mm = xrandr_output->mm_width;
|
||||
output->height_mm = xrandr_output->mm_height;
|
||||
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||
output->hotplug_mode_update = output_get_hotplug_mode_update (output);
|
||||
output->suggested_x = output_get_suggested_x (output);
|
||||
output->suggested_y = output_get_suggested_y (output);
|
||||
output->connector_type = output_get_connector_type (output);
|
||||
output->panel_orientation_transform =
|
||||
output_get_panel_orientation_transform (output);
|
||||
|
||||
if (meta_monitor_transform_is_rotated (
|
||||
output->panel_orientation_transform))
|
||||
{
|
||||
output->width_mm = xrandr_output->mm_height;
|
||||
output->height_mm = xrandr_output->mm_width;
|
||||
}
|
||||
else
|
||||
{
|
||||
output->width_mm = xrandr_output->mm_width;
|
||||
output->height_mm = xrandr_output->mm_height;
|
||||
}
|
||||
|
||||
output_get_tile_info (output);
|
||||
output_get_modes (output, xrandr_output);
|
||||
|
@ -74,6 +74,7 @@ meta_renderer_x11_create_cogl_renderer (MetaRenderer *renderer)
|
||||
cogl_renderer_set_custom_winsys (cogl_renderer, get_x11_cogl_winsys_vtable,
|
||||
NULL);
|
||||
cogl_xlib_renderer_set_foreign_display (cogl_renderer, xdisplay);
|
||||
cogl_xlib_renderer_request_reset_on_video_memory_purge (cogl_renderer, TRUE);
|
||||
|
||||
/* Set up things so that if the INTEL_swap_event extension is not present,
|
||||
* but the driver is known to have good thread support, we use an extra
|
||||
|
@ -50,8 +50,12 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
|
||||
{
|
||||
MetaMonitor *main_monitor;
|
||||
MetaOutput *main_output;
|
||||
MetaMonitorTransform crtc_transform;
|
||||
main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
|
||||
main_output = meta_monitor_get_main_output (main_monitor);
|
||||
crtc_transform =
|
||||
meta_monitor_logical_to_crtc_transform (main_monitor,
|
||||
logical_monitor->transform);
|
||||
|
||||
/*
|
||||
* Pick any monitor and output and check; all CRTCs of a logical monitor will
|
||||
@ -60,10 +64,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
|
||||
|
||||
if (meta_monitor_manager_is_transform_handled (monitor_manager,
|
||||
main_output->crtc,
|
||||
logical_monitor->transform))
|
||||
crtc_transform))
|
||||
return META_MONITOR_TRANSFORM_NORMAL;
|
||||
else
|
||||
return logical_monitor->transform;
|
||||
return crtc_transform;
|
||||
}
|
||||
|
||||
static MetaRendererView *
|
||||
|
@ -419,11 +419,13 @@ meta_end_modal_for_plugin (MetaCompositor *compositor,
|
||||
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
if (meta_is_wayland_compositor ())
|
||||
{
|
||||
meta_dnd_wayland_handle_end_modal (compositor);
|
||||
meta_display_sync_wayland_input_focus (display);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -181,6 +181,7 @@ static gboolean opt_nested;
|
||||
#ifdef HAVE_NATIVE_BACKEND
|
||||
static gboolean opt_display_server;
|
||||
#endif
|
||||
static gboolean opt_x11;
|
||||
|
||||
static GOptionEntry meta_options[] = {
|
||||
{
|
||||
@ -239,6 +240,11 @@ static GOptionEntry meta_options[] = {
|
||||
N_("Run as a full display server, rather than nested")
|
||||
},
|
||||
#endif
|
||||
{
|
||||
"x11", 0, 0, G_OPTION_ARG_NONE,
|
||||
&opt_x11,
|
||||
N_("Run with X11 backend")
|
||||
},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
@ -424,7 +430,13 @@ calculate_compositor_configuration (MetaCompositorType *compositor_type,
|
||||
GType *backend_gtype)
|
||||
{
|
||||
#ifdef HAVE_WAYLAND
|
||||
gboolean run_as_wayland_compositor = opt_wayland;
|
||||
gboolean run_as_wayland_compositor = opt_wayland && !opt_x11;
|
||||
|
||||
if ((opt_wayland || opt_nested || opt_display_server) && opt_x11)
|
||||
{
|
||||
meta_warning ("Can't run both as Wayland compositor and X11 compositing manager\n");
|
||||
meta_exit (META_EXIT_ERROR);
|
||||
}
|
||||
|
||||
#ifdef HAVE_NATIVE_BACKEND
|
||||
if (opt_nested && opt_display_server)
|
||||
@ -433,7 +445,7 @@ calculate_compositor_configuration (MetaCompositorType *compositor_type,
|
||||
meta_exit (META_EXIT_ERROR);
|
||||
}
|
||||
|
||||
if (!run_as_wayland_compositor)
|
||||
if (!run_as_wayland_compositor && !opt_x11)
|
||||
run_as_wayland_compositor = check_for_wayland_session_type ();
|
||||
#endif /* HAVE_NATIVE_BACKEND */
|
||||
|
||||
|
@ -70,10 +70,10 @@ struct _MetaGestureTrackerPrivate
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_AUTODENY_TIMEOUT,
|
||||
LAST_PROP,
|
||||
PROP_LAST,
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[LAST_PROP];
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
enum {
|
||||
STATE_CHANGED,
|
||||
@ -161,7 +161,7 @@ meta_gesture_tracker_class_init (MetaGestureTrackerClass *klass)
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
g_object_class_install_properties (object_class, LAST_PROP, obj_props);
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
|
||||
signals[STATE_CHANGED] =
|
||||
g_signal_new ("state-changed",
|
||||
|
@ -49,8 +49,6 @@
|
||||
#define WINDOW_TRANSIENT_FOR_WHOLE_GROUP(w) \
|
||||
(WINDOW_HAS_TRANSIENT_TYPE (w) && w->transient_for == NULL)
|
||||
|
||||
#define WINDOW_IN_STACK(w) (w->stack_position >= 0)
|
||||
|
||||
static void stack_sync_to_xserver (MetaStack *stack);
|
||||
static void meta_window_set_stack_position_no_sync (MetaWindow *window,
|
||||
int position);
|
||||
@ -102,11 +100,11 @@ void
|
||||
meta_stack_add (MetaStack *stack,
|
||||
MetaWindow *window)
|
||||
{
|
||||
g_return_if_fail (!window->override_redirect);
|
||||
g_return_if_fail (meta_window_is_stackable (window));
|
||||
|
||||
meta_topic (META_DEBUG_STACK, "Adding window %s to the stack\n", window->desc);
|
||||
|
||||
if (window->stack_position >= 0)
|
||||
if (meta_window_is_in_stack (window))
|
||||
meta_bug ("Window %s had stack position already\n", window->desc);
|
||||
|
||||
stack->added = g_list_prepend (stack->added, window);
|
||||
@ -127,10 +125,6 @@ meta_stack_remove (MetaStack *stack,
|
||||
{
|
||||
meta_topic (META_DEBUG_STACK, "Removing window %s from the stack\n", window->desc);
|
||||
|
||||
if (window->stack_position < 0)
|
||||
meta_bug ("Window %s removed from stack but had no stack position\n",
|
||||
window->desc);
|
||||
|
||||
/* Set window to top position, so removing it will not leave gaps
|
||||
* in the set of positions
|
||||
*/
|
||||
@ -530,7 +524,7 @@ create_constraints (Constraint **constraints,
|
||||
{
|
||||
MetaWindow *w = tmp->data;
|
||||
|
||||
if (!WINDOW_IN_STACK (w))
|
||||
if (!meta_window_is_in_stack (w))
|
||||
{
|
||||
meta_topic (META_DEBUG_STACK, "Window %s not in the stack, not constraining it\n",
|
||||
w->desc);
|
||||
@ -557,7 +551,7 @@ create_constraints (Constraint **constraints,
|
||||
{
|
||||
MetaWindow *group_window = tmp2->data;
|
||||
|
||||
if (!WINDOW_IN_STACK (group_window) ||
|
||||
if (!meta_window_is_in_stack (group_window) ||
|
||||
w->screen != group_window->screen ||
|
||||
group_window->override_redirect)
|
||||
{
|
||||
@ -592,7 +586,7 @@ create_constraints (Constraint **constraints,
|
||||
|
||||
parent = w->transient_for;
|
||||
|
||||
if (parent && WINDOW_IN_STACK (parent))
|
||||
if (parent && meta_window_is_in_stack (parent))
|
||||
{
|
||||
meta_topic (META_DEBUG_STACK, "Constraining %s above %s due to transiency\n",
|
||||
w->desc, parent->desc);
|
||||
|
@ -74,11 +74,13 @@ typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
META_MOVE_RESIZE_CONFIGURE_REQUEST = 1 << 0,
|
||||
META_MOVE_RESIZE_USER_ACTION = 1 << 1,
|
||||
META_MOVE_RESIZE_MOVE_ACTION = 1 << 2,
|
||||
META_MOVE_RESIZE_RESIZE_ACTION = 1 << 3,
|
||||
META_MOVE_RESIZE_WAYLAND_RESIZE = 1 << 4,
|
||||
META_MOVE_RESIZE_STATE_CHANGED = 1 << 5,
|
||||
META_MOVE_RESIZE_USER_ACTION = 1 << 1,
|
||||
META_MOVE_RESIZE_MOVE_ACTION = 1 << 2,
|
||||
META_MOVE_RESIZE_RESIZE_ACTION = 1 << 3,
|
||||
META_MOVE_RESIZE_WAYLAND_RESIZE = 1 << 4,
|
||||
META_MOVE_RESIZE_STATE_CHANGED = 1 << 5,
|
||||
META_MOVE_RESIZE_UNMAXIMIZE = 1 << 6,
|
||||
META_MOVE_RESIZE_FORCE_MOVE = 1 << 7,
|
||||
} MetaMoveResizeFlags;
|
||||
|
||||
typedef enum
|
||||
@ -553,6 +555,7 @@ struct _MetaWindowClass
|
||||
ClutterInputDevice *source);
|
||||
gboolean (*shortcuts_inhibited) (MetaWindow *window,
|
||||
ClutterInputDevice *source);
|
||||
gboolean (*is_stackable) (MetaWindow *window);
|
||||
};
|
||||
|
||||
/* These differ from window->has_foo_func in that they consider
|
||||
@ -699,6 +702,8 @@ void meta_window_set_type (MetaWindow *window,
|
||||
|
||||
void meta_window_frame_size_changed (MetaWindow *window);
|
||||
|
||||
gboolean meta_window_is_in_stack (MetaWindow *window);
|
||||
|
||||
void meta_window_stack_just_below (MetaWindow *window,
|
||||
MetaWindow *below_this_one);
|
||||
|
||||
@ -788,11 +793,13 @@ void meta_window_emit_size_changed (MetaWindow *window);
|
||||
|
||||
MetaPlacementRule *meta_window_get_placement_rule (MetaWindow *window);
|
||||
|
||||
void meta_window_force_placement (MetaWindow *window);
|
||||
void meta_window_force_placement (MetaWindow *window,
|
||||
gboolean force_move);
|
||||
|
||||
void meta_window_force_restore_shortcuts (MetaWindow *window,
|
||||
ClutterInputDevice *source);
|
||||
|
||||
gboolean meta_window_shortcuts_inhibited (MetaWindow *window,
|
||||
ClutterInputDevice *source);
|
||||
gboolean meta_window_is_stackable (MetaWindow *window);
|
||||
#endif
|
||||
|
@ -180,10 +180,10 @@ enum {
|
||||
PROP_GTK_MENUBAR_OBJECT_PATH,
|
||||
PROP_ON_ALL_WORKSPACES,
|
||||
|
||||
LAST_PROP,
|
||||
PROP_LAST,
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[LAST_PROP];
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
enum
|
||||
{
|
||||
@ -589,7 +589,7 @@ meta_window_class_init (MetaWindowClass *klass)
|
||||
FALSE,
|
||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, LAST_PROP, obj_props);
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
|
||||
window_signals[WORKSPACE_CHANGED] =
|
||||
g_signal_new ("workspace-changed",
|
||||
@ -1298,10 +1298,10 @@ _meta_window_shared_new (MetaDisplay *display,
|
||||
* and thus constraints may try to auto-fullscreen it which also
|
||||
* means restacking it.
|
||||
*/
|
||||
if (!window->override_redirect)
|
||||
if (meta_window_is_stackable (window))
|
||||
meta_stack_add (window->screen->stack,
|
||||
window);
|
||||
else
|
||||
else if (window->override_redirect)
|
||||
window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */
|
||||
|
||||
if (!window->override_redirect)
|
||||
@ -1535,7 +1535,7 @@ meta_window_unmanage (MetaWindow *window,
|
||||
meta_window_main_monitor_changed (window, old);
|
||||
}
|
||||
|
||||
if (!window->override_redirect)
|
||||
if (meta_window_is_in_stack (window))
|
||||
meta_stack_remove (window->screen->stack, window);
|
||||
|
||||
/* If an undecorated window is being withdrawn, that will change the
|
||||
@ -1698,6 +1698,10 @@ implement_showing (MetaWindow *window,
|
||||
meta_verbose ("Implement showing = %d for window %s\n",
|
||||
showing, window->desc);
|
||||
|
||||
/* Some windows are not stackable until being showed, so add those now. */
|
||||
if (meta_window_is_stackable (window) && !meta_window_is_in_stack (window))
|
||||
meta_stack_add (window->screen->stack, window);
|
||||
|
||||
if (!showing)
|
||||
{
|
||||
/* When we manage a new window, we normally delay placing it
|
||||
@ -1709,7 +1713,7 @@ implement_showing (MetaWindow *window,
|
||||
* see #751887
|
||||
*/
|
||||
if (!window->placed && client_window_should_be_mapped (window))
|
||||
meta_window_force_placement (window);
|
||||
meta_window_force_placement (window, FALSE);
|
||||
|
||||
meta_window_hide (window);
|
||||
}
|
||||
@ -2290,8 +2294,11 @@ window_would_be_covered (const MetaWindow *newbie)
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_force_placement (MetaWindow *window)
|
||||
meta_window_force_placement (MetaWindow *window,
|
||||
gboolean force_move)
|
||||
{
|
||||
MetaMoveResizeFlags flags;
|
||||
|
||||
if (window->placed)
|
||||
return;
|
||||
|
||||
@ -2304,7 +2311,15 @@ meta_window_force_placement (MetaWindow *window)
|
||||
* show the window.
|
||||
*/
|
||||
window->calc_placement = TRUE;
|
||||
meta_window_move_resize_now (window);
|
||||
|
||||
flags = META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION;
|
||||
if (force_move)
|
||||
flags |= META_MOVE_RESIZE_FORCE_MOVE;
|
||||
|
||||
meta_window_move_resize_internal (window,
|
||||
flags,
|
||||
NorthWestGravity,
|
||||
window->unconstrained_rect);
|
||||
window->calc_placement = FALSE;
|
||||
|
||||
/* don't ever do the initial position constraint thing again.
|
||||
@ -2383,7 +2398,7 @@ meta_window_show (MetaWindow *window)
|
||||
window->maximize_vertically_after_placement = TRUE;
|
||||
}
|
||||
}
|
||||
meta_window_force_placement (window);
|
||||
meta_window_force_placement (window, FALSE);
|
||||
}
|
||||
|
||||
if (needs_stacking_adjustment)
|
||||
@ -3313,7 +3328,8 @@ meta_window_unmaximize (MetaWindow *window,
|
||||
meta_window_move_resize_internal (window,
|
||||
(META_MOVE_RESIZE_MOVE_ACTION |
|
||||
META_MOVE_RESIZE_RESIZE_ACTION |
|
||||
META_MOVE_RESIZE_STATE_CHANGED),
|
||||
META_MOVE_RESIZE_STATE_CHANGED |
|
||||
META_MOVE_RESIZE_UNMAXIMIZE),
|
||||
NorthWestGravity,
|
||||
target_rect);
|
||||
|
||||
@ -6897,6 +6913,12 @@ ensure_mru_position_after (MetaWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_window_is_in_stack (MetaWindow *window)
|
||||
{
|
||||
return window->stack_position >= 0;
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_stack_just_below (MetaWindow *window,
|
||||
MetaWindow *below_this_one)
|
||||
@ -8425,3 +8447,9 @@ meta_window_shortcuts_inhibited (MetaWindow *window,
|
||||
{
|
||||
return META_WINDOW_GET_CLASS (window)->shortcuts_inhibited (window, source);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_window_is_stackable (MetaWindow *window)
|
||||
{
|
||||
return META_WINDOW_GET_CLASS (window)->is_stackable (window);
|
||||
}
|
||||
|
@ -64,10 +64,10 @@ enum {
|
||||
PROP_N_WINDOWS,
|
||||
PROP_WORKSPACE_INDEX,
|
||||
|
||||
LAST_PROP,
|
||||
PROP_LAST,
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[LAST_PROP];
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
enum
|
||||
{
|
||||
@ -214,7 +214,7 @@ meta_workspace_class_init (MetaWorkspaceClass *klass)
|
||||
0, G_MAXUINT, 0,
|
||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, LAST_PROP, obj_props);
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -112,6 +112,7 @@ typedef struct _MonitorTestCaseOutput
|
||||
gboolean is_laptop_panel;
|
||||
gboolean is_underscanning;
|
||||
const char *serial;
|
||||
MetaMonitorTransform panel_orientation_transform;
|
||||
} MonitorTestCaseOutput;
|
||||
|
||||
typedef struct _MonitorTestCaseCrtc
|
||||
@ -1009,6 +1010,8 @@ create_monitor_test_setup (MonitorTestCase *test_case,
|
||||
: META_CONNECTOR_TYPE_DisplayPort);
|
||||
output->tile_info = test_case->setup.outputs[i].tile_info;
|
||||
output->is_underscanning = test_case->setup.outputs[i].is_underscanning;
|
||||
output->panel_orientation_transform =
|
||||
test_case->setup.outputs[i].panel_orientation_transform;
|
||||
output->driver_private = output_test;
|
||||
output->driver_notify = (GDestroyNotify) meta_output_test_destroy_notify;
|
||||
|
||||
@ -3090,6 +3093,39 @@ meta_test_monitor_preferred_non_first_mode (void)
|
||||
check_monitor_configuration (&test_case);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_monitor_non_upright_panel (void)
|
||||
{
|
||||
MonitorTestCase test_case = initial_test_case;
|
||||
MetaMonitorTestSetup *test_setup;
|
||||
|
||||
test_case.setup.modes[1] = (MonitorTestCaseMode) {
|
||||
.width = 768,
|
||||
.height = 1024,
|
||||
.refresh_rate = 60.0,
|
||||
};
|
||||
test_case.setup.n_modes = 2;
|
||||
test_case.setup.outputs[0].modes[0] = 1;
|
||||
test_case.setup.outputs[0].preferred_mode = 1;
|
||||
test_case.setup.outputs[0].panel_orientation_transform =
|
||||
META_MONITOR_TRANSFORM_90;
|
||||
/*
|
||||
* Note we do not swap outputs[0].width_mm and height_mm, because these get
|
||||
* swapped for rotated panels inside the xrandr / kms code and we directly
|
||||
* create a dummy output here, skipping this code.
|
||||
*/
|
||||
test_case.setup.crtcs[0].current_mode = 1;
|
||||
|
||||
test_case.expect.monitors[0].modes[0].crtc_modes[0].crtc_mode = 1;
|
||||
test_case.expect.crtcs[0].current_mode = 1;
|
||||
test_case.expect.crtcs[0].transform = META_MONITOR_TRANSFORM_90;
|
||||
|
||||
test_setup = create_monitor_test_setup (&test_case,
|
||||
MONITOR_TEST_FLAG_NO_STORED);
|
||||
emulate_hotplug (test_setup);
|
||||
check_monitor_configuration (&test_case);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_monitor_custom_vertical_config (void)
|
||||
{
|
||||
@ -5884,6 +5920,8 @@ init_monitor_tests (void)
|
||||
meta_test_monitor_underscanning_config);
|
||||
add_monitor_test ("/backends/monitor/preferred-non-first-mode",
|
||||
meta_test_monitor_preferred_non_first_mode);
|
||||
add_monitor_test ("/backends/monitor/non-upright-panel",
|
||||
meta_test_monitor_non_upright_panel);
|
||||
|
||||
add_monitor_test ("/backends/monitor/custom/vertical-config",
|
||||
meta_test_monitor_custom_vertical_config);
|
||||
|
@ -89,19 +89,13 @@ static void
|
||||
shortcuts_inhibited_cb (MetaWaylandSurface *surface,
|
||||
MetaWaylandKeyboardShotscutsInhibit *shortcut_inhibit)
|
||||
{
|
||||
MetaWaylandKeyboard *keyboard = shortcut_inhibit->seat->keyboard;
|
||||
|
||||
/* Send active event only if the surface has keyboard focus */
|
||||
if (keyboard->focus_surface == surface)
|
||||
zwp_keyboard_shortcuts_inhibitor_v1_send_active (shortcut_inhibit->resource);
|
||||
zwp_keyboard_shortcuts_inhibitor_v1_send_active (shortcut_inhibit->resource);
|
||||
}
|
||||
|
||||
static void
|
||||
shortcuts_restored_cb (MetaWaylandSurface *surface,
|
||||
gpointer user_data)
|
||||
shortcuts_restored_cb (MetaWaylandSurface *surface,
|
||||
MetaWaylandKeyboardShotscutsInhibit *shortcut_inhibit)
|
||||
{
|
||||
MetaWaylandKeyboardShotscutsInhibit *shortcut_inhibit = user_data;
|
||||
|
||||
zwp_keyboard_shortcuts_inhibitor_v1_send_inactive (shortcut_inhibit->resource);
|
||||
}
|
||||
|
||||
@ -148,7 +142,9 @@ zwp_keyboard_shortcuts_inhibit_manager_inhibit_shortcuts (struct wl_client *cl
|
||||
G_CALLBACK (surface_destroyed_cb),
|
||||
shortcut_inhibit);
|
||||
|
||||
meta_wayland_surface_show_inhibit_shortcuts_dialog (surface, seat);
|
||||
/* Cannot grant shortcuts to a surface without any window */
|
||||
if (meta_wayland_surface_get_toplevel_window (surface))
|
||||
meta_wayland_surface_show_inhibit_shortcuts_dialog (surface, seat);
|
||||
|
||||
wl_resource_set_implementation (keyboard_shortcuts_inhibit_resource,
|
||||
&meta_keyboard_shortcuts_inhibit_interface,
|
||||
|
@ -442,6 +442,7 @@ maybe_restore_numlock_state (MetaWaylandKeyboard *keyboard)
|
||||
static void
|
||||
maybe_save_numlock_state (MetaWaylandKeyboard *keyboard)
|
||||
{
|
||||
#ifdef HAVE_NATIVE_BACKEND
|
||||
MetaWaylandXkbInfo *xkb_info = &keyboard->xkb_info;
|
||||
GsdKeyboardNumLockState numlock_state;
|
||||
int numlock_active;
|
||||
@ -474,6 +475,7 @@ maybe_save_numlock_state (MetaWaylandKeyboard *keyboard)
|
||||
break;
|
||||
}
|
||||
g_settings_set_enum (keyboard->gsd_settings, "numlock-state", numlock_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
@ -643,7 +645,8 @@ default_grab_key (MetaWaylandKeyboardGrab *grab,
|
||||
|
||||
/* Synthetic key events are for autorepeat. Ignore those, as
|
||||
* autorepeat in Wayland is done on the client side. */
|
||||
if (event->key.flags & CLUTTER_EVENT_FLAG_SYNTHETIC)
|
||||
if ((event->key.flags & CLUTTER_EVENT_FLAG_SYNTHETIC) &&
|
||||
!(event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD))
|
||||
return FALSE;
|
||||
|
||||
#ifdef HAVE_NATIVE_BACKEND
|
||||
@ -786,7 +789,8 @@ meta_wayland_keyboard_handle_event (MetaWaylandKeyboard *keyboard,
|
||||
|
||||
/* Synthetic key events are for autorepeat. Ignore those, as
|
||||
* autorepeat in Wayland is done on the client side. */
|
||||
if (event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC)
|
||||
if ((event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC) &&
|
||||
!(event->flags & CLUTTER_EVENT_FLAG_INPUT_METHOD))
|
||||
return FALSE;
|
||||
|
||||
meta_verbose ("Handling key %s event code %d\n",
|
||||
|
@ -541,9 +541,9 @@ send_xdg_output_events (struct wl_resource *resource,
|
||||
old_layout.width != new_layout.width ||
|
||||
old_layout.height != new_layout.height)
|
||||
{
|
||||
zxdg_output_v1_send_logical_position (resource,
|
||||
new_layout.width,
|
||||
new_layout.height);
|
||||
zxdg_output_v1_send_logical_size (resource,
|
||||
new_layout.width,
|
||||
new_layout.height);
|
||||
need_done = TRUE;
|
||||
}
|
||||
|
||||
|
@ -225,6 +225,8 @@ meta_wayland_seat_new (MetaWaylandCompositor *compositor,
|
||||
"seat", seat,
|
||||
NULL);
|
||||
|
||||
seat->text_input = meta_wayland_text_input_new (seat);
|
||||
|
||||
meta_wayland_data_device_init (&seat->data_device);
|
||||
|
||||
device_manager = clutter_device_manager_get_default ();
|
||||
@ -260,6 +262,7 @@ meta_wayland_seat_free (MetaWaylandSeat *seat)
|
||||
g_object_unref (seat->pointer);
|
||||
g_object_unref (seat->keyboard);
|
||||
g_object_unref (seat->touch);
|
||||
meta_wayland_text_input_destroy (seat->text_input);
|
||||
|
||||
g_slice_free (MetaWaylandSeat, seat);
|
||||
}
|
||||
@ -374,17 +377,23 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
|
||||
if (meta_wayland_seat_has_pointer (seat))
|
||||
return meta_wayland_pointer_handle_event (seat->pointer, event);
|
||||
|
||||
break;
|
||||
case CLUTTER_KEY_PRESS:
|
||||
case CLUTTER_KEY_RELEASE:
|
||||
if (meta_wayland_text_input_handle_event (seat->text_input, event))
|
||||
return TRUE;
|
||||
|
||||
if (meta_wayland_seat_has_keyboard (seat))
|
||||
return meta_wayland_keyboard_handle_event (seat->keyboard,
|
||||
(const ClutterKeyEvent *) event);
|
||||
break;
|
||||
case CLUTTER_TOUCH_BEGIN:
|
||||
case CLUTTER_TOUCH_UPDATE:
|
||||
case CLUTTER_TOUCH_END:
|
||||
if (meta_wayland_seat_has_touch (seat))
|
||||
return meta_wayland_touch_handle_event (seat->touch, event);
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -416,6 +425,8 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat,
|
||||
|
||||
tablet_seat = meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat);
|
||||
meta_wayland_tablet_seat_set_pad_focus (tablet_seat, surface);
|
||||
|
||||
meta_wayland_text_input_set_focus (seat->text_input, surface);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "meta-wayland-touch.h"
|
||||
#include "meta-wayland-data-device.h"
|
||||
#include "meta-wayland-tablet-tool.h"
|
||||
#include "meta-wayland-text-input.h"
|
||||
|
||||
struct _MetaWaylandSeat
|
||||
{
|
||||
@ -44,6 +45,8 @@ struct _MetaWaylandSeat
|
||||
|
||||
MetaWaylandDataDevice data_device;
|
||||
|
||||
MetaWaylandTextInput *text_input;
|
||||
|
||||
guint capabilities;
|
||||
};
|
||||
|
||||
|
@ -277,9 +277,13 @@ meta_wayland_tablet_pad_notify (MetaWaylandTabletPad *pad,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
struct wl_client *client = wl_resource_get_client (resource);
|
||||
const gchar *node_path;
|
||||
GList *l;
|
||||
|
||||
zwp_tablet_pad_v2_send_path (resource, clutter_input_device_get_device_node (pad->device));
|
||||
node_path = clutter_input_device_get_device_node (pad->device);
|
||||
if (node_path)
|
||||
zwp_tablet_pad_v2_send_path (resource, node_path);
|
||||
|
||||
zwp_tablet_pad_v2_send_buttons (resource, pad->n_buttons);
|
||||
|
||||
for (l = pad->groups; l; l = l->next)
|
||||
|
@ -85,13 +85,20 @@ meta_wayland_tablet_notify (MetaWaylandTablet *tablet,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
ClutterInputDevice *device = tablet->device;
|
||||
const gchar *node_path, *vendor, *product;
|
||||
guint vid, pid;
|
||||
|
||||
zwp_tablet_v2_send_name (resource, clutter_input_device_get_device_name (device));
|
||||
zwp_tablet_v2_send_path (resource, clutter_input_device_get_device_node (device));
|
||||
|
||||
if (sscanf (clutter_input_device_get_vendor_id (device), "%x", &vid) == 1 &&
|
||||
sscanf (clutter_input_device_get_product_id (device), "%x", &pid) == 1)
|
||||
node_path = clutter_input_device_get_device_node (device);
|
||||
if (node_path)
|
||||
zwp_tablet_v2_send_path (resource, node_path);
|
||||
|
||||
vendor = clutter_input_device_get_vendor_id (device);
|
||||
product = clutter_input_device_get_product_id (device);
|
||||
|
||||
if (vendor && sscanf (vendor, "%x", &vid) == 1 &&
|
||||
product && sscanf (product, "%x", &pid) == 1)
|
||||
zwp_tablet_v2_send_id (resource, vid, pid);
|
||||
|
||||
zwp_tablet_v2_send_done (resource);
|
||||
|
627
src/wayland/meta-wayland-text-input.c
Normal file
627
src/wayland/meta-wayland-text-input.c
Normal file
@ -0,0 +1,627 @@
|
||||
/*
|
||||
* Copyright (C) 2017, 2018 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <wayland-server.h>
|
||||
|
||||
#include "gtk-text-input-server-protocol.h"
|
||||
#include "wayland/meta-wayland-private.h"
|
||||
#include "wayland/meta-wayland-seat.h"
|
||||
#include "wayland/meta-wayland-text-input.h"
|
||||
#include "wayland/meta-wayland-versions.h"
|
||||
|
||||
#define META_TYPE_WAYLAND_TEXT_INPUT_FOCUS (meta_wayland_text_input_focus_get_type ())
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_WAYLAND_PENDING_STATE_NONE = 0,
|
||||
META_WAYLAND_PENDING_STATE_INPUT_RECT = 1 << 0,
|
||||
META_WAYLAND_PENDING_STATE_CONTENT_TYPE = 1 << 1,
|
||||
META_WAYLAND_PENDING_STATE_SURROUNDING_TEXT = 1 << 2,
|
||||
} MetaWaylandTextInputPendingState;
|
||||
|
||||
typedef struct _MetaWaylandTextInput MetaWaylandTextInput;
|
||||
|
||||
struct _MetaWaylandTextInput
|
||||
{
|
||||
MetaWaylandSeat *seat;
|
||||
ClutterInputFocus *input_focus;
|
||||
|
||||
struct wl_list resource_list;
|
||||
struct wl_list focus_resource_list;
|
||||
MetaWaylandSurface *surface;
|
||||
struct wl_listener surface_listener;
|
||||
uint32_t focus_serial;
|
||||
|
||||
MetaWaylandTextInputPendingState pending_state;
|
||||
|
||||
struct
|
||||
{
|
||||
char *text;
|
||||
uint32_t cursor;
|
||||
uint32_t anchor;
|
||||
} surrounding;
|
||||
|
||||
cairo_rectangle_int_t cursor_rect;
|
||||
|
||||
uint32_t content_type_hint;
|
||||
uint32_t content_type_purpose;
|
||||
};
|
||||
|
||||
struct _MetaWaylandTextInputFocus
|
||||
{
|
||||
ClutterInputFocus parent_instance;
|
||||
MetaWaylandTextInput *text_input;
|
||||
};
|
||||
|
||||
G_DECLARE_FINAL_TYPE (MetaWaylandTextInputFocus, meta_wayland_text_input_focus,
|
||||
META, WAYLAND_TEXT_INPUT_FOCUS, ClutterInputFocus)
|
||||
G_DEFINE_TYPE (MetaWaylandTextInputFocus, meta_wayland_text_input_focus,
|
||||
CLUTTER_TYPE_INPUT_FOCUS)
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_request_surrounding (ClutterInputFocus *focus)
|
||||
{
|
||||
MetaWaylandTextInput *text_input;
|
||||
|
||||
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||
clutter_input_focus_set_surrounding (focus,
|
||||
text_input->surrounding.text,
|
||||
text_input->surrounding.cursor,
|
||||
text_input->surrounding.anchor);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||
guint cursor,
|
||||
guint len)
|
||||
{
|
||||
MetaWaylandTextInput *text_input;
|
||||
struct wl_resource *resource;
|
||||
|
||||
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
gtk_text_input_send_delete_surrounding_text (resource, cursor, len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_commit_text (ClutterInputFocus *focus,
|
||||
const gchar *text)
|
||||
{
|
||||
MetaWaylandTextInput *text_input;
|
||||
struct wl_resource *resource;
|
||||
|
||||
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
gtk_text_input_send_preedit_string (resource, NULL, 0);
|
||||
gtk_text_input_send_commit_string (resource, text);
|
||||
}
|
||||
|
||||
clutter_input_focus_reset (focus);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||
const gchar *text,
|
||||
guint cursor)
|
||||
{
|
||||
MetaWaylandTextInput *text_input;
|
||||
struct wl_resource *resource;
|
||||
|
||||
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
gtk_text_input_send_preedit_string (resource, text, cursor);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_class_init (MetaWaylandTextInputFocusClass *klass)
|
||||
{
|
||||
ClutterInputFocusClass *focus_class = CLUTTER_INPUT_FOCUS_CLASS (klass);
|
||||
|
||||
focus_class->request_surrounding = meta_wayland_text_input_focus_request_surrounding;
|
||||
focus_class->delete_surrounding = meta_wayland_text_input_focus_delete_surrounding;
|
||||
focus_class->commit_text = meta_wayland_text_input_focus_commit_text;
|
||||
focus_class->set_preedit_text = meta_wayland_text_input_focus_set_preedit_text;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_init (MetaWaylandTextInputFocus *focus)
|
||||
{
|
||||
}
|
||||
|
||||
static ClutterInputFocus *
|
||||
meta_wayland_text_input_focus_new (MetaWaylandTextInput *text_input)
|
||||
{
|
||||
MetaWaylandTextInputFocus *focus;
|
||||
|
||||
focus = g_object_new (META_TYPE_WAYLAND_TEXT_INPUT_FOCUS, NULL);
|
||||
focus->text_input = text_input;
|
||||
|
||||
return CLUTTER_INPUT_FOCUS (focus);
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_handle_focus_surface_destroy (struct wl_listener *listener,
|
||||
void *data)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_container_of (listener, text_input,
|
||||
surface_listener);
|
||||
|
||||
meta_wayland_text_input_set_focus (text_input, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
move_resources (struct wl_list *destination, struct wl_list *source)
|
||||
{
|
||||
wl_list_insert_list (destination, source);
|
||||
wl_list_init (source);
|
||||
}
|
||||
|
||||
static void
|
||||
move_resources_for_client (struct wl_list *destination,
|
||||
struct wl_list *source,
|
||||
struct wl_client *client)
|
||||
{
|
||||
struct wl_resource *resource, *tmp;
|
||||
wl_resource_for_each_safe (resource, tmp, source)
|
||||
{
|
||||
if (wl_resource_get_client (resource) == client)
|
||||
{
|
||||
wl_list_remove (wl_resource_get_link (resource));
|
||||
wl_list_insert (destination, wl_resource_get_link (resource));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
if (text_input->surface == surface)
|
||||
return;
|
||||
|
||||
text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE;
|
||||
|
||||
if (text_input->surface)
|
||||
{
|
||||
if (!wl_list_empty (&text_input->focus_resource_list))
|
||||
{
|
||||
ClutterInputFocus *focus = text_input->input_focus;
|
||||
ClutterInputMethod *input_method;
|
||||
struct wl_resource *resource;
|
||||
uint32_t serial;
|
||||
|
||||
if (clutter_input_focus_is_focused (focus))
|
||||
{
|
||||
input_method = clutter_backend_get_input_method (clutter_get_default_backend ());
|
||||
clutter_input_method_focus_out (input_method);
|
||||
}
|
||||
|
||||
serial = wl_display_next_serial (text_input->seat->wl_display);
|
||||
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
gtk_text_input_send_leave (resource, serial,
|
||||
text_input->surface->resource);
|
||||
}
|
||||
|
||||
move_resources (&text_input->resource_list,
|
||||
&text_input->focus_resource_list);
|
||||
}
|
||||
|
||||
wl_list_remove (&text_input->surface_listener.link);
|
||||
text_input->surface = NULL;
|
||||
}
|
||||
|
||||
if (surface)
|
||||
{
|
||||
struct wl_resource *focus_surface_resource;
|
||||
|
||||
text_input->surface = surface;
|
||||
focus_surface_resource = text_input->surface->resource;
|
||||
wl_resource_add_destroy_listener (focus_surface_resource,
|
||||
&text_input->surface_listener);
|
||||
|
||||
move_resources_for_client (&text_input->focus_resource_list,
|
||||
&text_input->resource_list,
|
||||
wl_resource_get_client (focus_surface_resource));
|
||||
|
||||
if (!wl_list_empty (&text_input->focus_resource_list))
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
|
||||
text_input->focus_serial =
|
||||
wl_display_next_serial (text_input->seat->wl_display);
|
||||
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
gtk_text_input_send_enter (resource, text_input->focus_serial,
|
||||
surface->resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
unbind_resource (struct wl_resource *resource)
|
||||
{
|
||||
wl_list_remove (wl_resource_get_link (resource));
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_destroy (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
wl_resource_destroy (resource);
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_enable (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
uint32_t serial,
|
||||
uint32_t flags)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
|
||||
ClutterInputFocus *focus = text_input->input_focus;
|
||||
ClutterInputMethod *input_method;
|
||||
gboolean show_preedit;
|
||||
|
||||
if (serial != text_input->focus_serial)
|
||||
return;
|
||||
|
||||
if (!clutter_input_focus_is_focused (focus))
|
||||
{
|
||||
input_method = clutter_backend_get_input_method (clutter_get_default_backend ());
|
||||
if (input_method)
|
||||
clutter_input_method_focus_in (input_method, focus);
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
show_preedit = (flags & GTK_TEXT_INPUT_ENABLE_FLAGS_CAN_SHOW_PREEDIT) != 0;
|
||||
clutter_input_focus_set_can_show_preedit (focus, show_preedit);
|
||||
|
||||
if (flags & GTK_TEXT_INPUT_ENABLE_FLAGS_TOGGLE_INPUT_PANEL)
|
||||
clutter_input_focus_request_toggle_input_panel (focus);
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_disable (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
|
||||
ClutterInputFocus *focus = text_input->input_focus;
|
||||
ClutterInputMethod *input_method;
|
||||
|
||||
if (!clutter_input_focus_is_focused (focus))
|
||||
return;
|
||||
|
||||
clutter_input_focus_reset (text_input->input_focus);
|
||||
text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE;
|
||||
|
||||
input_method = clutter_backend_get_input_method (clutter_get_default_backend ());
|
||||
clutter_input_method_focus_out (input_method);
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_set_surrounding_text (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
const char *text,
|
||||
int32_t cursor,
|
||||
int32_t anchor)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
|
||||
|
||||
g_free (text_input->surrounding.text);
|
||||
text_input->surrounding.text = g_strdup (text);
|
||||
text_input->surrounding.cursor = cursor;
|
||||
text_input->surrounding.anchor = anchor;
|
||||
text_input->pending_state |= META_WAYLAND_PENDING_STATE_SURROUNDING_TEXT;
|
||||
}
|
||||
|
||||
static ClutterInputContentHintFlags
|
||||
translate_hints (uint32_t hints)
|
||||
{
|
||||
ClutterInputContentHintFlags clutter_hints = 0;
|
||||
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_COMPLETION)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_COMPLETION;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_SPELLCHECK)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_LOWERCASE)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_LOWERCASE;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_UPPERCASE)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_UPPERCASE;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_TITLECASE)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_TITLECASE;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_HIDDEN_TEXT)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_HIDDEN_TEXT;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_SENSITIVE_DATA)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_SENSITIVE_DATA;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_LATIN)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_LATIN;
|
||||
if (hints & GTK_TEXT_INPUT_CONTENT_HINT_MULTILINE)
|
||||
clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_MULTILINE;
|
||||
|
||||
return clutter_hints;
|
||||
}
|
||||
|
||||
static ClutterInputContentPurpose
|
||||
translate_purpose (uint32_t purpose)
|
||||
{
|
||||
switch (purpose)
|
||||
{
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_NORMAL:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_ALPHA:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_DIGITS:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_NUMBER:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_NUMBER;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_PHONE:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_PHONE;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_URL:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_URL;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_EMAIL:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_EMAIL;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_NAME:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_NAME;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_PASSWORD:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_PASSWORD;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_DATE:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_DATE;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_TIME:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_TIME;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_DATETIME:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_DATETIME;
|
||||
case GTK_TEXT_INPUT_CONTENT_PURPOSE_TERMINAL:
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL;
|
||||
}
|
||||
|
||||
g_warn_if_reached ();
|
||||
return CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL;
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_set_content_type (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
uint32_t hint,
|
||||
uint32_t purpose)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
|
||||
|
||||
if (!text_input->surface)
|
||||
return;
|
||||
|
||||
text_input->content_type_hint = hint;
|
||||
text_input->content_type_purpose = purpose;
|
||||
text_input->pending_state |= META_WAYLAND_PENDING_STATE_CONTENT_TYPE;
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_set_cursor_rectangle (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
int32_t x,
|
||||
int32_t y,
|
||||
int32_t width,
|
||||
int32_t height)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
|
||||
|
||||
if (!text_input->surface)
|
||||
return;
|
||||
|
||||
text_input->cursor_rect = (cairo_rectangle_int_t) { x, y, width, height };
|
||||
text_input->pending_state |= META_WAYLAND_PENDING_STATE_INPUT_RECT;
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_commit_state (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
MetaWaylandTextInput *text_input = wl_resource_get_user_data (resource);
|
||||
ClutterInputFocus *focus = text_input->input_focus;
|
||||
|
||||
if (!clutter_input_focus_is_focused (focus))
|
||||
return;
|
||||
if (text_input->surface == NULL)
|
||||
return;
|
||||
|
||||
if (text_input->pending_state & META_WAYLAND_PENDING_STATE_CONTENT_TYPE)
|
||||
{
|
||||
clutter_input_focus_set_content_hints (text_input->input_focus,
|
||||
translate_hints (text_input->content_type_hint));
|
||||
clutter_input_focus_set_content_purpose (text_input->input_focus,
|
||||
translate_purpose (text_input->content_type_purpose));
|
||||
}
|
||||
|
||||
if (text_input->pending_state & META_WAYLAND_PENDING_STATE_SURROUNDING_TEXT)
|
||||
{
|
||||
clutter_input_focus_set_surrounding (text_input->input_focus,
|
||||
text_input->surrounding.text,
|
||||
text_input->surrounding.cursor,
|
||||
text_input->surrounding.anchor);
|
||||
}
|
||||
|
||||
if (text_input->pending_state & META_WAYLAND_PENDING_STATE_INPUT_RECT)
|
||||
{
|
||||
ClutterRect cursor_rect;
|
||||
float x1, y1, x2, y2;
|
||||
cairo_rectangle_int_t rect;
|
||||
|
||||
rect = text_input->cursor_rect;
|
||||
meta_wayland_surface_get_absolute_coordinates (text_input->surface,
|
||||
rect.x, rect.y, &x1, &y1);
|
||||
meta_wayland_surface_get_absolute_coordinates (text_input->surface,
|
||||
rect.x + rect.width,
|
||||
rect.y + rect.height,
|
||||
&x2, &y2);
|
||||
|
||||
clutter_rect_init (&cursor_rect, x1, y1, x2 - x1, y2 - y1);
|
||||
clutter_input_focus_set_cursor_location (text_input->input_focus,
|
||||
&cursor_rect);
|
||||
}
|
||||
|
||||
text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE;
|
||||
}
|
||||
|
||||
static struct gtk_text_input_interface meta_text_input_interface = {
|
||||
text_input_destroy,
|
||||
text_input_enable,
|
||||
text_input_disable,
|
||||
text_input_set_surrounding_text,
|
||||
text_input_set_content_type,
|
||||
text_input_set_cursor_rectangle,
|
||||
text_input_commit_state,
|
||||
};
|
||||
|
||||
MetaWaylandTextInput *
|
||||
meta_wayland_text_input_new (MetaWaylandSeat *seat)
|
||||
{
|
||||
MetaWaylandTextInput *text_input;
|
||||
|
||||
text_input = g_new0 (MetaWaylandTextInput, 1);
|
||||
text_input->input_focus = meta_wayland_text_input_focus_new (text_input);
|
||||
text_input->seat = seat;
|
||||
|
||||
wl_list_init (&text_input->resource_list);
|
||||
wl_list_init (&text_input->focus_resource_list);
|
||||
text_input->surface_listener.notify = text_input_handle_focus_surface_destroy;
|
||||
|
||||
return text_input;
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_text_input_destroy (MetaWaylandTextInput *text_input)
|
||||
{
|
||||
meta_wayland_text_input_set_focus (text_input, NULL);
|
||||
g_object_unref (text_input->input_focus);
|
||||
g_free (text_input);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_create_new_resource (MetaWaylandTextInput *text_input,
|
||||
struct wl_client *client,
|
||||
struct wl_resource *seat_resource,
|
||||
uint32_t id)
|
||||
{
|
||||
struct wl_resource *text_input_resource;
|
||||
|
||||
text_input_resource = wl_resource_create (client,
|
||||
>k_text_input_interface,
|
||||
META_GTK_TEXT_INPUT_VERSION,
|
||||
id);
|
||||
|
||||
wl_resource_set_implementation (text_input_resource,
|
||||
&meta_text_input_interface,
|
||||
text_input, unbind_resource);
|
||||
|
||||
if (text_input->surface &&
|
||||
wl_resource_get_client (text_input->surface->resource) == client)
|
||||
{
|
||||
wl_list_insert (&text_input->focus_resource_list,
|
||||
wl_resource_get_link (text_input_resource));
|
||||
|
||||
gtk_text_input_send_enter (text_input_resource,
|
||||
text_input->focus_serial,
|
||||
text_input->surface->resource);
|
||||
}
|
||||
else
|
||||
{
|
||||
wl_list_insert (&text_input->resource_list,
|
||||
wl_resource_get_link (text_input_resource));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_manager_destroy (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
wl_resource_destroy (resource);
|
||||
}
|
||||
|
||||
static void
|
||||
text_input_manager_get_text_input (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
uint32_t id,
|
||||
struct wl_resource *seat_resource)
|
||||
{
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||
|
||||
meta_wayland_text_input_create_new_resource (seat->text_input, client,
|
||||
seat_resource, id);
|
||||
}
|
||||
|
||||
static struct gtk_text_input_manager_interface meta_text_input_manager_interface = {
|
||||
text_input_manager_destroy,
|
||||
text_input_manager_get_text_input,
|
||||
};
|
||||
|
||||
static void
|
||||
bind_text_input (struct wl_client *client,
|
||||
void *data,
|
||||
uint32_t version,
|
||||
uint32_t id)
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
|
||||
resource = wl_resource_create (client,
|
||||
>k_text_input_manager_interface,
|
||||
META_GTK_TEXT_INPUT_VERSION,
|
||||
id);
|
||||
wl_resource_set_implementation (resource,
|
||||
&meta_text_input_manager_interface,
|
||||
NULL, NULL);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_wayland_text_input_init (MetaWaylandCompositor *compositor)
|
||||
{
|
||||
return (wl_global_create (compositor->wayland_display,
|
||||
>k_text_input_manager_interface,
|
||||
META_GTK_TEXT_INPUT_VERSION,
|
||||
compositor->seat->text_input,
|
||||
bind_text_input) != NULL);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_wayland_text_input_handle_event (MetaWaylandTextInput *text_input,
|
||||
const ClutterEvent *event)
|
||||
{
|
||||
if (!text_input->surface ||
|
||||
!clutter_input_focus_is_focused (text_input->input_focus))
|
||||
return FALSE;
|
||||
|
||||
return clutter_input_focus_filter_key_event (text_input->input_focus,
|
||||
(const ClutterKeyEvent *) event);
|
||||
}
|
46
src/wayland/meta-wayland-text-input.h
Normal file
46
src/wayland/meta-wayland-text-input.h
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Red Hat
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef META_WAYLAND_TEXT_INPUT_H
|
||||
#define META_WAYLAND_TEXT_INPUT_H
|
||||
|
||||
#include <wayland-server.h>
|
||||
#include "wayland/meta-wayland-types.h"
|
||||
#include "meta/window.h"
|
||||
|
||||
#define META_TYPE_WAYLAND_TEXT_INPUT (meta_wayland_text_input_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaWaylandTextInput,
|
||||
meta_wayland_text_input,
|
||||
META, WAYLAND_TEXT_INPUT,
|
||||
GObject);
|
||||
|
||||
MetaWaylandTextInput * meta_wayland_text_input_new (MetaWaylandSeat *seat);
|
||||
void meta_wayland_text_input_destroy (MetaWaylandTextInput *text_input);
|
||||
|
||||
gboolean meta_wayland_text_input_init (MetaWaylandCompositor *compositor);
|
||||
|
||||
void meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input,
|
||||
MetaWaylandSurface *surface);
|
||||
|
||||
gboolean meta_wayland_text_input_handle_event (MetaWaylandTextInput *text_input,
|
||||
const ClutterEvent *event);
|
||||
|
||||
#endif /* META_WAYLAND_TEXT_INPUT_H */
|
@ -51,5 +51,6 @@
|
||||
#define META_ZWP_KEYBOARD_SHORTCUTS_INHIBIT_V1_VERSION 1
|
||||
#define META_ZXDG_OUTPUT_V1_VERSION 1
|
||||
#define META_ZWP_XWAYLAND_KEYBOARD_GRAB_V1_VERSION 1
|
||||
#define META_GTK_TEXT_INPUT_VERSION 1
|
||||
|
||||
#endif
|
||||
|
@ -474,10 +474,11 @@ create_wl_shell_surface_window (MetaWaylandSurface *surface)
|
||||
MetaWaylandWlShellSurface *wl_shell_surface =
|
||||
META_WAYLAND_WL_SHELL_SURFACE (surface->role);
|
||||
MetaWaylandSurface *parent;
|
||||
MetaWindow *window;
|
||||
GList *l;
|
||||
|
||||
surface->window = meta_window_wayland_new (meta_get_display (), surface);
|
||||
meta_wayland_surface_set_window (surface, surface->window);
|
||||
window = meta_window_wayland_new (meta_get_display (), surface);
|
||||
meta_wayland_surface_set_window (surface, window);
|
||||
|
||||
if (wl_shell_surface->title)
|
||||
meta_window_set_title (surface->window, wl_shell_surface->title);
|
||||
|
@ -347,9 +347,10 @@ xdg_toplevel_set_maximized (struct wl_client *client,
|
||||
struct wl_resource *resource)
|
||||
{
|
||||
MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
|
||||
MetaWindow *window = surface->window;
|
||||
|
||||
meta_window_force_placement (surface->window);
|
||||
meta_window_maximize (surface->window, META_MAXIMIZE_BOTH);
|
||||
meta_window_force_placement (window, TRUE);
|
||||
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -384,6 +384,7 @@ meta_wayland_init (void)
|
||||
meta_wayland_dma_buf_init (compositor);
|
||||
meta_wayland_keyboard_shortcuts_inhibit_init (compositor);
|
||||
meta_wayland_surface_inhibit_shortcuts_dialog_init ();
|
||||
meta_wayland_text_input_init (compositor);
|
||||
|
||||
/* Xwayland specific protocol, needs to be filtered out for all other clients */
|
||||
if (meta_xwayland_grab_keyboard_init (compositor))
|
||||
@ -465,9 +466,6 @@ meta_wayland_compositor_is_shortcuts_inhibited (MetaWaylandCompositor *composito
|
||||
{
|
||||
MetaWaylandKeyboard *keyboard;
|
||||
|
||||
if (clutter_input_device_get_device_type (source) != CLUTTER_KEYBOARD_DEVICE)
|
||||
return FALSE;
|
||||
|
||||
/* Clutter is not multi-seat aware yet, use the default seat instead */
|
||||
keyboard = compositor->seat->keyboard;
|
||||
if (keyboard && keyboard->focus_surface != NULL)
|
||||
|
@ -210,8 +210,17 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
|
||||
* coordinate space so that we can have a scale independent size to pass
|
||||
* to the Wayland surface. */
|
||||
geometry_scale = meta_window_wayland_get_geometry_scale (window);
|
||||
configured_width = constrained_rect.width / geometry_scale;
|
||||
configured_height = constrained_rect.height / geometry_scale;
|
||||
if (flags & META_MOVE_RESIZE_UNMAXIMIZE)
|
||||
{
|
||||
/* On un-maximize, let the client decide on its size */
|
||||
configured_width = 0;
|
||||
configured_height = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
configured_width = constrained_rect.width / geometry_scale;
|
||||
configured_height = constrained_rect.height / geometry_scale;
|
||||
}
|
||||
|
||||
/* For wayland clients, the size is completely determined by the client,
|
||||
* and while this allows to avoid some trickery with frames and the resulting
|
||||
@ -223,7 +232,11 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
|
||||
* it can be for maximized or fullscreen.
|
||||
*/
|
||||
|
||||
if (flags & META_MOVE_RESIZE_WAYLAND_RESIZE)
|
||||
if (flags & META_MOVE_RESIZE_FORCE_MOVE)
|
||||
{
|
||||
can_move_now = TRUE;
|
||||
}
|
||||
else if (flags & META_MOVE_RESIZE_WAYLAND_RESIZE)
|
||||
{
|
||||
/* This is a call to wl_surface_commit(), ignore the constrained_rect and
|
||||
* update the real client size to match the buffer size.
|
||||
@ -543,6 +556,12 @@ meta_window_wayland_shortcuts_inhibited (MetaWindow *window,
|
||||
return meta_wayland_compositor_is_shortcuts_inhibited (compositor, source);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_window_wayland_is_stackable (MetaWindow *window)
|
||||
{
|
||||
return meta_wayland_surface_get_buffer (window->surface) != NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_wayland_class_init (MetaWindowWaylandClass *klass)
|
||||
{
|
||||
@ -562,6 +581,7 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass)
|
||||
window_class->get_client_pid = meta_window_wayland_get_client_pid;
|
||||
window_class->force_restore_shortcuts = meta_window_wayland_force_restore_shortcuts;
|
||||
window_class->shortcuts_inhibited = meta_window_wayland_shortcuts_inhibited;
|
||||
window_class->is_stackable = meta_window_wayland_is_stackable;
|
||||
}
|
||||
|
||||
MetaWindow *
|
||||
@ -746,7 +766,7 @@ meta_window_place_with_placement_rule (MetaWindow *window,
|
||||
|
||||
window->unconstrained_rect.width = placement_rule->width;
|
||||
window->unconstrained_rect.height = placement_rule->height;
|
||||
meta_window_force_placement (window);
|
||||
meta_window_force_placement (window, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -689,9 +689,8 @@ wayland_data_read_cb (GObject *object,
|
||||
GError *error = NULL;
|
||||
gsize bytes_read;
|
||||
|
||||
bytes_read = g_input_stream_read_finish (G_INPUT_STREAM (object),
|
||||
res, &error);
|
||||
if (error)
|
||||
if (!g_input_stream_read_all_finish (G_INPUT_STREAM (object),
|
||||
res, &bytes_read, &error))
|
||||
{
|
||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
{
|
||||
@ -762,10 +761,10 @@ wayland_selection_data_read (MetaSelectionBridge *selection)
|
||||
{
|
||||
WaylandSelectionData *data = selection->wayland_selection;
|
||||
|
||||
g_input_stream_read_async (data->stream, data->buffer,
|
||||
INCR_CHUNK_SIZE, G_PRIORITY_DEFAULT,
|
||||
data->cancellable,
|
||||
wayland_data_read_cb, selection);
|
||||
g_input_stream_read_all_async (data->stream, data->buffer,
|
||||
INCR_CHUNK_SIZE, G_PRIORITY_DEFAULT,
|
||||
data->cancellable,
|
||||
wayland_data_read_cb, selection);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1239,7 +1238,7 @@ handle_incr_chunk (MetaWaylandCompositor *compositor,
|
||||
{
|
||||
if (selection->x11_selection &&
|
||||
selection->x11_selection->incr &&
|
||||
event->window == selection->owner &&
|
||||
event->window == selection->window &&
|
||||
event->state == PropertyNewValue &&
|
||||
event->atom == gdk_x11_get_xatom_by_name ("_META_SELECTION"))
|
||||
{
|
||||
@ -1249,8 +1248,8 @@ handle_incr_chunk (MetaWaylandCompositor *compositor,
|
||||
}
|
||||
else if (selection->wayland_selection &&
|
||||
selection->wayland_selection->incr &&
|
||||
event->window == selection->window &&
|
||||
event->state == PropertyDelete &&
|
||||
event->window == selection->wayland_selection->request_event.requestor &&
|
||||
event->atom == selection->wayland_selection->request_event.property)
|
||||
{
|
||||
/* Wayland to X11 */
|
||||
|
@ -465,7 +465,8 @@ choose_xdisplay (MetaXWaylandManager *manager)
|
||||
{
|
||||
unlink (lock_file);
|
||||
close (manager->abstract_fd);
|
||||
return FALSE;
|
||||
display++;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
|
302
src/wayland/protocol/gtk-text-input.xml
Normal file
302
src/wayland/protocol/gtk-text-input.xml
Normal file
@ -0,0 +1,302 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<protocol name="gtk_text_input">
|
||||
<copyright>
|
||||
Copyright © 2012, 2013 Intel Corporation
|
||||
Copyright © 2015, 2016 Jan Arne Petersen
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this
|
||||
software and its documentation for any purpose is hereby granted
|
||||
without fee, provided that the above copyright notice appear in
|
||||
all copies and that both that copyright notice and this permission
|
||||
notice appear in supporting documentation, and that the name of
|
||||
the copyright holders not be used in advertising or publicity
|
||||
pertaining to distribution of the software without specific,
|
||||
written prior permission. The copyright holders make no
|
||||
representations about the suitability of this software for any
|
||||
purpose. It is provided "as is" without express or implied
|
||||
warranty.
|
||||
|
||||
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
THIS SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="gtk_text_input" version="1">
|
||||
<description summary="text input">
|
||||
The gtk_text_input interface represents text input and input methods
|
||||
associated with a seat. It provides enter/leave events to follow the
|
||||
text input focus for a seat.
|
||||
|
||||
Requests are used to enable/disable the text-input object and set
|
||||
state information like surrounding and selected text or the content type.
|
||||
The information about the entered text is sent to the text-input object
|
||||
via the pre-edit and commit_string events. Using this interface removes
|
||||
the need for applications to directly process hardware key events and
|
||||
compose text out of them.
|
||||
|
||||
Text is valid UTF-8 encoded, indices and lengths are in bytes. Indices
|
||||
have to always point to the first byte of an UTF-8 encoded code point.
|
||||
Lengths are not allowed to contain just a part of an UTF-8 encoded code
|
||||
point.
|
||||
|
||||
Focus moving throughout surfaces will result in the emission of
|
||||
gtk_text_input.enter and gtk_text_input.leave events. The focused
|
||||
surface must perform gtk_text_input.enable and
|
||||
gtk_text_input.disable requests as the keyboard focus moves across
|
||||
editable and non-editable elements of the UI. Those two requests are not
|
||||
expected to be paired with each other, the compositor must be able to
|
||||
handle consecutive series of the same request.
|
||||
|
||||
State is sent by the state requests (set_surrounding_text,
|
||||
set_content_type and set_cursor_rectangle) and a commit request.
|
||||
After an enter event or disable request all state information is
|
||||
invalidated and needs to be resent by the client.
|
||||
|
||||
This protocol defines requests and events necessary for regular clients
|
||||
to communicate with an input method. The gtk_input_method protocol
|
||||
defines the interfaces necessary to implement standalone input methods.
|
||||
If a compositor implements both interfaces, it will be the arbiter of the
|
||||
communication between both.
|
||||
|
||||
Warning! The protocol described in this file is experimental and
|
||||
backward incompatible changes may be made. Backward compatible changes
|
||||
may be added together with the corresponding interface version bump.
|
||||
Backward incompatible changes are done by bumping the version number in
|
||||
the protocol and interface names and resetting the interface version.
|
||||
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||
version number in the protocol and interface names are removed and the
|
||||
interface version number is reset.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="Destroy the wp_text_input">
|
||||
Destroy the wp_text_input object. Also disables all surfaces enabled
|
||||
through this wp_text_input object
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="enable_flags" bitfield="true">
|
||||
<description summary="enable flags">
|
||||
Content hint is a bitmask to allow to modify the behavior of the text
|
||||
input.
|
||||
</description>
|
||||
<entry name="none" value="0x0" summary="no special behaviour"/>
|
||||
<entry name="can_show_preedit" value="0x1" summary="hints that the UI is capable of showing pre-edit text"/>
|
||||
<entry name="toggle_input_panel" value="0x2" summary="requests toggling input panel (eg. on-screen keyboard)"/>
|
||||
</enum>
|
||||
|
||||
<request name="enable">
|
||||
<description summary="Request text input to be enabled">
|
||||
Requests text input on a surface. The serial provided must be the one
|
||||
received on gtk_text_input.enter.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial of enter event"/>
|
||||
<arg name="show_input_panel" type="uint" summary="details of the enable request"/>
|
||||
</request>
|
||||
|
||||
<request name="disable">
|
||||
<description summary="Disable text input on a surface">
|
||||
Explicitly disable text input in a surface (typically when there is no
|
||||
focus on any text entry inside the surface).
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="set_surrounding_text">
|
||||
<description summary="sets the surrounding text">
|
||||
Sets the plain surrounding text around the input position. Text is
|
||||
UTF-8 encoded. Cursor is the byte offset within the surrounding text.
|
||||
Anchor is the byte offset of the selection anchor within the
|
||||
surrounding text. If there is no selected text, anchor is the same as
|
||||
cursor.
|
||||
|
||||
Make sure to always send some text before and after the cursor
|
||||
except when the cursor is at the beginning or end of text.
|
||||
|
||||
When there was a configure_surrounding_text event take the
|
||||
before_cursor and after_cursor arguments into account for picking how
|
||||
much surrounding text to send.
|
||||
|
||||
There is a maximum length of wayland messages so text can not be
|
||||
longer than 4000 bytes.
|
||||
</description>
|
||||
<arg name="text" type="string"/>
|
||||
<arg name="cursor" type="int"/>
|
||||
<arg name="anchor" type="int"/>
|
||||
</request>
|
||||
|
||||
<enum name="content_hint" bitfield="true">
|
||||
<description summary="content hint">
|
||||
Content hint is a bitmask to allow to modify the behavior of the text
|
||||
input.
|
||||
</description>
|
||||
<entry name="none" value="0x0" summary="no special behaviour"/>
|
||||
<entry name="completion" value="0x1" summary="suggest word completions"/>
|
||||
<entry name="spellcheck" value="0x2" summary="suggest word corrections"/>
|
||||
<entry name="auto_capitalization" value="0x4" summary="switch to uppercase letters at the start of a sentence"/>
|
||||
<entry name="lowercase" value="0x8" summary="prefer lowercase letters"/>
|
||||
<entry name="uppercase" value="0x10" summary="prefer uppercase letters"/>
|
||||
<entry name="titlecase" value="0x20" summary="prefer casing for titles and headings (can be language dependent)"/>
|
||||
<entry name="hidden_text" value="0x40" summary="characters should be hidden"/>
|
||||
<entry name="sensitive_data" value="0x80" summary="typed text should not be stored"/>
|
||||
<entry name="latin" value="0x100" summary="just latin characters should be entered"/>
|
||||
<entry name="multiline" value="0x200" summary="the text input is multiline"/>
|
||||
</enum>
|
||||
|
||||
<enum name="content_purpose">
|
||||
<description summary="content purpose">
|
||||
The content purpose allows to specify the primary purpose of a text
|
||||
input.
|
||||
|
||||
This allows an input method to show special purpose input panels with
|
||||
extra characters or to disallow some characters.
|
||||
</description>
|
||||
<entry name="normal" value="0" summary="default input, allowing all characters"/>
|
||||
<entry name="alpha" value="1" summary="allow only alphabetic characters"/>
|
||||
<entry name="digits" value="2" summary="allow only digits"/>
|
||||
<entry name="number" value="3" summary="input a number (including decimal separator and sign)"/>
|
||||
<entry name="phone" value="4" summary="input a phone number"/>
|
||||
<entry name="url" value="5" summary="input an URL"/>
|
||||
<entry name="email" value="6" summary="input an email address"/>
|
||||
<entry name="name" value="7" summary="input a name of a person"/>
|
||||
<entry name="password" value="8" summary="input a password (combine with password or sensitive_data hint)"/>
|
||||
<entry name="pin" value="9" summary="input is a numeric password (combine with password or sensitive_data hint)"/>
|
||||
<entry name="date" value="10" summary="input a date"/>
|
||||
<entry name="time" value="11" summary="input a time"/>
|
||||
<entry name="datetime" value="12" summary="input a date and time"/>
|
||||
<entry name="terminal" value="13" summary="input for a terminal"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_content_type">
|
||||
<description summary="set content purpose and hint">
|
||||
Sets the content purpose and content hint. While the purpose is the
|
||||
basic purpose of an input field, the hint flags allow to modify some
|
||||
of the behavior.
|
||||
|
||||
When no content type is explicitly set, a normal content purpose with
|
||||
none hint should be assumed.
|
||||
</description>
|
||||
<arg name="hint" type="uint" enum="content_hint"/>
|
||||
<arg name="purpose" type="uint" enum="content_purpose"/>
|
||||
</request>
|
||||
|
||||
<request name="set_cursor_rectangle">
|
||||
<description summary="set cursor position">
|
||||
Sets the cursor outline as a x, y, width, height rectangle in surface
|
||||
local coordinates.
|
||||
|
||||
Allows the compositor to put a window with word suggestions near the
|
||||
cursor.
|
||||
</description>
|
||||
<arg name="x" type="int"/>
|
||||
<arg name="y" type="int"/>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
</request>
|
||||
|
||||
<request name="commit">
|
||||
<description summary="commit state">
|
||||
Allows to atomically send state updates from client. The previous
|
||||
set_surrounding_text, set_content_type and set_cursor_rectangle
|
||||
become effective after this call.
|
||||
|
||||
Serial should be set to the serial from the last wp_text_input.enter
|
||||
event.
|
||||
|
||||
To make sure to not receive outdated input method events after a
|
||||
state update, wl_display_sync() should be called after making this
|
||||
request.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="enter">
|
||||
<description summary="enter event">
|
||||
Notification that this seat's text-input focus is on a certain surface.
|
||||
|
||||
When the seat has the keyboard capability the text-input focus follows
|
||||
the keyboard focus.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</event>
|
||||
|
||||
<event name="leave">
|
||||
<description summary="leave event">
|
||||
Notification that this seat's text-input focus is no longer on
|
||||
a certain surface. The client should reset any preedit string previously
|
||||
set.
|
||||
|
||||
The leave notification is sent before the enter notification
|
||||
for the new focus.
|
||||
|
||||
When the seat has the keyboard capability the text-input focus follows
|
||||
the keyboard focus.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</event>
|
||||
|
||||
<event name="preedit_string">
|
||||
<description summary="pre-edit">
|
||||
Notify when a new composing text (pre-edit) should be set around the
|
||||
current cursor position. Any previously set composing text should
|
||||
be removed.
|
||||
</description>
|
||||
<arg name="text" type="string" allow-null="true"/>
|
||||
<arg name="cursor" type="uint"/>
|
||||
</event>
|
||||
|
||||
<event name="commit_string">
|
||||
<description summary="text commit">
|
||||
Notify when text should be inserted into the editor widget. The text to
|
||||
commit could be either just a single character after a key press or the
|
||||
result of some composing (pre-edit).
|
||||
|
||||
The text argument could be also null if some text is removed (see
|
||||
gtk_text_input.delete_surrounding_text).
|
||||
|
||||
Any previously set composing text should be removed.
|
||||
</description>
|
||||
<arg name="text" type="string" allow-null="true"/>
|
||||
</event>
|
||||
|
||||
<event name="delete_surrounding_text">
|
||||
<description summary="delete surrounding text">
|
||||
Notify when the text around the current cursor position should be
|
||||
deleted. Before_length and after_length is the length (in bytes) of text
|
||||
before and after the current cursor position (excluding the selection)
|
||||
to delete.
|
||||
|
||||
This event should be handled as part of a following commit_string or
|
||||
preedit_string event.
|
||||
</description>
|
||||
<arg name="before_length" type="uint" summary="length of text before current cursor position"/>
|
||||
<arg name="after_length" type="uint" summary="length of text after current cursor position"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="gtk_text_input_manager" version="1">
|
||||
<description summary="text input manager">
|
||||
A factory for text-input objects. This object is a global singleton.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="Destroy the wp_text_input_manager">
|
||||
Destroy the wp_text_input_manager object.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="get_text_input">
|
||||
<description summary="create a new text input object">
|
||||
Creates a new text-input object for a given seat.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="gtk_text_input"/>
|
||||
<arg name="seat" type="object" interface="wl_seat"/>
|
||||
</request>
|
||||
</interface>
|
||||
</protocol>
|
@ -950,7 +950,10 @@ save_state (void)
|
||||
fputs (" <sticky/>\n", outfile);
|
||||
} else {
|
||||
int n;
|
||||
n = meta_workspace_index (window->workspace);
|
||||
if (window->workspace)
|
||||
n = meta_workspace_index (window->workspace);
|
||||
else
|
||||
n = window->initial_workspace;
|
||||
fprintf (outfile,
|
||||
" <workspace index=\"%d\"/>\n", n);
|
||||
}
|
||||
|
@ -461,6 +461,7 @@ meta_window_apply_session_info (MetaWindow *window,
|
||||
MetaWorkspace *workspace = spaces->data;
|
||||
|
||||
meta_window_change_workspace (window, workspace);
|
||||
window->initial_workspace_set = TRUE;
|
||||
|
||||
meta_topic (META_DEBUG_SM,
|
||||
"Restoring saved window %s to workspace %d\n",
|
||||
@ -1549,6 +1550,12 @@ meta_window_x11_shortcuts_inhibited (MetaWindow *window,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_window_x11_is_stackable (MetaWindow *window)
|
||||
{
|
||||
return !window->override_redirect;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_x11_class_init (MetaWindowX11Class *klass)
|
||||
{
|
||||
@ -1572,6 +1579,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass)
|
||||
window_class->get_client_pid = meta_window_x11_get_client_pid;
|
||||
window_class->force_restore_shortcuts = meta_window_x11_force_restore_shortcuts;
|
||||
window_class->shortcuts_inhibited = meta_window_x11_shortcuts_inhibited;
|
||||
window_class->is_stackable = meta_window_x11_is_stackable;
|
||||
}
|
||||
|
||||
void
|
||||
@ -2087,30 +2095,33 @@ meta_window_move_resize_request (MetaWindow *window,
|
||||
rect.width = width;
|
||||
rect.height = height;
|
||||
|
||||
meta_screen_get_monitor_geometry (window->screen, window->monitor->number, &monitor_rect);
|
||||
|
||||
/* Workaround braindead legacy apps that don't know how to
|
||||
* fullscreen themselves properly - don't get fooled by
|
||||
* windows which hide their titlebar when maximized or which are
|
||||
* client decorated; that's not the same as fullscreen, even
|
||||
* if there are no struts making the workarea smaller than
|
||||
* the monitor.
|
||||
*/
|
||||
if (meta_prefs_get_force_fullscreen() &&
|
||||
!window->hide_titlebar_when_maximized &&
|
||||
(window->decorated || !meta_window_is_client_decorated (window)) &&
|
||||
meta_rectangle_equal (&rect, &monitor_rect) &&
|
||||
window->has_fullscreen_func &&
|
||||
!window->fullscreen)
|
||||
if (window->monitor)
|
||||
{
|
||||
/*
|
||||
meta_topic (META_DEBUG_GEOMETRY,
|
||||
*/
|
||||
meta_warning (
|
||||
"Treating resize request of legacy application %s as a "
|
||||
"fullscreen request\n",
|
||||
window->desc);
|
||||
meta_window_make_fullscreen_internal (window);
|
||||
meta_screen_get_monitor_geometry (window->screen, window->monitor->number, &monitor_rect);
|
||||
|
||||
/* Workaround braindead legacy apps that don't know how to
|
||||
* fullscreen themselves properly - don't get fooled by
|
||||
* windows which hide their titlebar when maximized or which are
|
||||
* client decorated; that's not the same as fullscreen, even
|
||||
* if there are no struts making the workarea smaller than
|
||||
* the monitor.
|
||||
*/
|
||||
if (meta_prefs_get_force_fullscreen() &&
|
||||
!window->hide_titlebar_when_maximized &&
|
||||
(window->decorated || !meta_window_is_client_decorated (window)) &&
|
||||
meta_rectangle_equal (&rect, &monitor_rect) &&
|
||||
window->has_fullscreen_func &&
|
||||
!window->fullscreen)
|
||||
{
|
||||
/*
|
||||
meta_topic (META_DEBUG_GEOMETRY,
|
||||
*/
|
||||
meta_warning (
|
||||
"Treating resize request of legacy application %s as a "
|
||||
"fullscreen request\n",
|
||||
window->desc);
|
||||
meta_window_make_fullscreen_internal (window);
|
||||
}
|
||||
}
|
||||
|
||||
adjust_for_gravity (window, TRUE, gravity, &rect);
|
||||
|
Reference in New Issue
Block a user