Compare commits
247 Commits
3.26.0
...
wip/carlos
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9a13882a95 | ||
![]() |
4f6a3cd874 | ||
![]() |
59e89f0d63 | ||
![]() |
8ec46e8021 | ||
![]() |
92ce68d257 | ||
![]() |
ff79e651f0 | ||
![]() |
0f9b388526 | ||
![]() |
d7cb3da324 | ||
![]() |
ca654ac544 | ||
![]() |
6e3b0eb430 | ||
![]() |
3483cc8831 | ||
![]() |
798026498d | ||
![]() |
49f029571c | ||
![]() |
290b257288 | ||
![]() |
2b60fb0144 | ||
![]() |
7f5f5eb847 | ||
![]() |
44269e6a1d | ||
![]() |
70dfe8c97d | ||
![]() |
072afa5fa3 | ||
![]() |
519a0fd93d | ||
![]() |
5f132f3975 | ||
![]() |
1546989845 | ||
![]() |
1923db97c1 | ||
![]() |
db32047a5d | ||
![]() |
b505eb261e | ||
![]() |
1a1db9ef8d | ||
![]() |
b1587f0716 | ||
![]() |
93e450f37c | ||
![]() |
fc713ecb70 | ||
![]() |
500c13ab6f | ||
![]() |
050267fe74 | ||
![]() |
ce25a0171c | ||
![]() |
b7518c8651 | ||
![]() |
62dedfbef3 | ||
![]() |
4508978ea5 | ||
![]() |
c533a06e93 | ||
![]() |
5d3b4f0134 | ||
![]() |
4cf340ae9b | ||
![]() |
053ac03f01 | ||
![]() |
28a9439209 | ||
![]() |
cf4b5efdd1 | ||
![]() |
3067dab84c | ||
![]() |
1790320ba3 | ||
![]() |
f45df4265d | ||
![]() |
bcbcd6a68c | ||
![]() |
b1a0bf8916 | ||
![]() |
6c18bae83c | ||
![]() |
d0531966eb | ||
![]() |
989a47ee8c | ||
![]() |
03be6b687b | ||
![]() |
32c22d375a | ||
![]() |
bdf3f49a82 | ||
![]() |
356b4b0dc5 | ||
![]() |
3fc2ea8297 | ||
![]() |
06d976e853 | ||
![]() |
96ebd1c214 | ||
![]() |
fa28481736 | ||
![]() |
76b064cffc | ||
![]() |
333b5d12a0 | ||
![]() |
aa73504d95 | ||
![]() |
32305b453d | ||
![]() |
7d5e08c843 | ||
![]() |
dc0fc65229 | ||
![]() |
428af6d213 | ||
![]() |
2ffe597617 | ||
![]() |
0461eed0cb | ||
![]() |
ca1bacc212 | ||
![]() |
2229365ca8 | ||
![]() |
8c367364b6 | ||
![]() |
58909da425 | ||
![]() |
ff32bf467c | ||
![]() |
c5572d3095 | ||
![]() |
e706bcdf73 | ||
![]() |
d9ebcbd55c | ||
![]() |
240b13aa74 | ||
![]() |
97635d6f84 | ||
![]() |
6c21a22e4d | ||
![]() |
0add6f62b6 | ||
![]() |
049418cd03 | ||
![]() |
3ee1999c70 | ||
![]() |
e4b8920688 | ||
![]() |
eb236649fc | ||
![]() |
0a36a4545f | ||
![]() |
180985018b | ||
![]() |
c86c5d6905 | ||
![]() |
c2fad2dc7c | ||
![]() |
1196b7bde4 | ||
![]() |
19eddfd756 | ||
![]() |
ed280ef4ac | ||
![]() |
b6200ac3ff | ||
![]() |
626621a53a | ||
![]() |
fb3a64491e | ||
![]() |
294f9419f7 | ||
![]() |
a37956c95f | ||
![]() |
89f5ca3301 | ||
![]() |
07745b3082 | ||
![]() |
054c25f693 | ||
![]() |
01de04d8c9 | ||
![]() |
08e4cb54a8 | ||
![]() |
c71faffb71 | ||
![]() |
91e3a0b3a9 | ||
![]() |
5fa8f78434 | ||
![]() |
ab5ac21104 | ||
![]() |
0ebea2be9c | ||
![]() |
6f54bab0a8 | ||
![]() |
5d7deab6da | ||
![]() |
35fcf4a4ae | ||
![]() |
74565380aa | ||
![]() |
fa37496ffb | ||
![]() |
cc772ddd61 | ||
![]() |
4d2647cdbc | ||
![]() |
3caefd8fda | ||
![]() |
12381d57d1 | ||
![]() |
4ad8c4b86b | ||
![]() |
dbd2827ca1 | ||
![]() |
1a78557e0b | ||
![]() |
2e99963087 | ||
![]() |
4d763e1828 | ||
![]() |
a17b343c21 | ||
![]() |
556136dacc | ||
![]() |
a8c80ccece | ||
![]() |
f044511037 | ||
![]() |
b31e545c9d | ||
![]() |
fad5657eda | ||
![]() |
eaf9ccde39 | ||
![]() |
f9c625924e | ||
![]() |
64cb735abf | ||
![]() |
c85f322b20 | ||
![]() |
76096a725b | ||
![]() |
6eb7d13894 | ||
![]() |
7928b25ebf | ||
![]() |
78e6258b44 | ||
![]() |
c9259c2b15 | ||
![]() |
492d2eb573 | ||
![]() |
376dcd3b92 | ||
![]() |
60781bc6c2 | ||
![]() |
2d8827cb0c | ||
![]() |
802f7dcd30 | ||
![]() |
e62cfd9043 | ||
![]() |
cbcf6a4f23 | ||
![]() |
b0e42d3f6e | ||
![]() |
18eb66de06 | ||
![]() |
b32cccddf9 | ||
![]() |
362e26b3e2 | ||
![]() |
5c53284bde | ||
![]() |
e45d7f70e8 | ||
![]() |
70edc7dda4 | ||
![]() |
3244ed37a9 | ||
![]() |
406359bba1 | ||
![]() |
8b23dd915f | ||
![]() |
7e1f65405f | ||
![]() |
c1683073f1 | ||
![]() |
18ec86bd90 | ||
![]() |
315a6f43d7 | ||
![]() |
7603bb5fd5 | ||
![]() |
d53b79f8c3 | ||
![]() |
f534452c6a | ||
![]() |
0f6b83e7df | ||
![]() |
16a6aef5a7 | ||
![]() |
518fb9fb5e | ||
![]() |
547ace3cf8 | ||
![]() |
a4ba38ee78 | ||
![]() |
e32d52b9b8 | ||
![]() |
de40ced8b4 | ||
![]() |
cfee58798e | ||
![]() |
7ea01693a7 | ||
![]() |
e0d839aea2 | ||
![]() |
d3efd73429 | ||
![]() |
2db5505216 | ||
![]() |
f44b6c772a | ||
![]() |
f64fab1d2d | ||
![]() |
39bc2e0333 | ||
![]() |
5bb6f0ad8b | ||
![]() |
903537a2a0 | ||
![]() |
1db937826c | ||
![]() |
c1fe1c5d6b | ||
![]() |
a62e9f99a2 | ||
![]() |
9817a6aa47 | ||
![]() |
8185373bd4 | ||
![]() |
18c41aefc9 | ||
![]() |
32917f1922 | ||
![]() |
7a843e1fd1 | ||
![]() |
0e154ccf76 | ||
![]() |
120db06c60 | ||
![]() |
e76ab05d45 | ||
![]() |
43eeb009ce | ||
![]() |
9000eef49d | ||
![]() |
e198c8452b | ||
![]() |
aea66ddff6 | ||
![]() |
a5f4ffa58c | ||
![]() |
a1c39e142d | ||
![]() |
e76a0f564c | ||
![]() |
8307d9c4de | ||
![]() |
1dbf6b096b | ||
![]() |
6fe71ecc01 | ||
![]() |
57e58eaf2a | ||
![]() |
00a5db71cf | ||
![]() |
c7fa57cd28 | ||
![]() |
8f2c86d79e | ||
![]() |
56f1da5c66 | ||
![]() |
30a205c0e3 | ||
![]() |
98d77d37d0 | ||
![]() |
0853fb940a | ||
![]() |
6dd819a61e | ||
![]() |
39aae19ed7 | ||
![]() |
20749e5dbd | ||
![]() |
99e1cd549d | ||
![]() |
efdbeb7c1b | ||
![]() |
ea4dbd14bc | ||
![]() |
838df4b00b | ||
![]() |
b6110ba8dc | ||
![]() |
fd763ad857 | ||
![]() |
e3d59832c5 | ||
![]() |
2c85bb4178 | ||
![]() |
8493777961 | ||
![]() |
4e7405aca9 | ||
![]() |
34207ba509 | ||
![]() |
6dc499f305 | ||
![]() |
92e2242cf0 | ||
![]() |
ea214fbe0f | ||
![]() |
487b8a0430 | ||
![]() |
8b060342bd | ||
![]() |
27d6c063ad | ||
![]() |
0e62b71959 | ||
![]() |
2c3f79829e | ||
![]() |
5d2b0bc0cc | ||
![]() |
7e3a780dcd | ||
![]() |
1035200f26 | ||
![]() |
8532b10290 | ||
![]() |
f0c6c4eb1f | ||
![]() |
ba194bd19e | ||
![]() |
a35274ddb7 | ||
![]() |
ab541e3e0f | ||
![]() |
67ce04993e | ||
![]() |
22cdc8f414 | ||
![]() |
8b022a5595 | ||
![]() |
7a1393ba26 | ||
![]() |
5ed954e6de | ||
![]() |
96572fbe6a | ||
![]() |
4ab47e72e5 | ||
![]() |
70e0fd0b45 | ||
![]() |
26cd031be8 | ||
![]() |
743e8cc249 | ||
![]() |
2bf7974076 | ||
![]() |
9c16e4e2f3 | ||
![]() |
07f6c85cc7 | ||
![]() |
d4968e10e5 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -88,6 +88,10 @@ src/pointer-constraints-unstable-v*-protocol.c
|
||||
src/pointer-constraints-unstable-v*-server-protocol.h
|
||||
src/xdg-foreign-unstable-v*-protocol.c
|
||||
src/xdg-foreign-unstable-v*-server-protocol.h
|
||||
src/xdg-output-unstable-v1-protocol.c
|
||||
src/xdg-output-unstable-v1-server-protocol.h
|
||||
src/xwayland-keyboard-grab-unstable-v1-protocol.c
|
||||
src/xwayland-keyboard-grab-unstable-v1-server-protocol.h
|
||||
src/meta/meta-version.h
|
||||
src/libmutter-*.pc
|
||||
doc/reference/*.args
|
||||
@@ -115,3 +119,4 @@ ltsugar.m4
|
||||
ltversion.m4
|
||||
lt~obsolete.m4
|
||||
.dirstamp
|
||||
**/tags.*
|
||||
|
44
NEWS
44
NEWS
@@ -1,3 +1,47 @@
|
||||
3.27.1
|
||||
======
|
||||
* Work with clients that require older linux_dmabuf protocol [Daniel; #788558]
|
||||
* Support hybrid GPU systems [Jonas; #785381]
|
||||
* Prevent crash when closing maximized windows [Jonni; #788666]
|
||||
* Use the correct monitor for HiDPI scaling of shell chrome [Jonas; #788820]
|
||||
* Fix unredirection of fullscreen windows [Rui, Jonas; #788493]
|
||||
* Fix list of supported monitor scales on X11 [Jonas; #788901]
|
||||
* Misc. bug fixes [Florian, Jonas, Marco; #788572, #788569, #788607, #788860,
|
||||
#788921]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Daniel Stone,
|
||||
Marco Trevisan, Jonni Westphalen
|
||||
|
||||
Translations:
|
||||
Xavi Ivars [ca@valencia]
|
||||
|
||||
3.26.1
|
||||
======
|
||||
* Fix crash when respawning shortcut inhibitor dialog [Olivier; #787568]
|
||||
* Fix crash during monitor configuration migration [Carlos, Jonas; #787668]
|
||||
* Fix multihead regressions in X11 session [Jonas; #787477]
|
||||
* Fix screen rotation regressions [Hans; #787836]
|
||||
* Fix keybindings not being resolved with non-latin layouts [Jonas; #787016]
|
||||
* Support snap packages for sandboxed app IDs [Marco; #788217]
|
||||
* Fix crash when reconnecting tablet device [Jason; #787649]
|
||||
* Support running headless [Jonas; #730551, #787637]
|
||||
* Support _NET_RESTACK_WINDOW and ConfigureRequest siblings [Vasilis; #786365]
|
||||
* Fix monitor layout not being remembered across sessions [Jonas; #787629]
|
||||
* Make sure to export _NET_NUMBER_OF_DESKTOPS [Florian; #760651]
|
||||
* Allow resizing of tiled windows [Georges, Florian; #645153]
|
||||
* Export tiling information to clients [Georges; #751857]
|
||||
* Misc. bug fixes [Jonas, Florian, Jeremy, Rico; #787570, #787715, #787953,
|
||||
#788049, #788199, #788292, #788197]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Andrea Azzarone, Georges Basile Stavracas Neto, Hans de Goede,
|
||||
Olivier Fourdan, Carlos Garnacho, Jason Gerecke, Vasilis Liaskovitis,
|
||||
Rui Matos, Florian Müllner, Jeremy Soller, Marco Trevisan, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Matej Urbančič [sl], gogo [hr], Cheng-Chia Tseng [zh_TW]
|
||||
|
||||
3.26.0
|
||||
======
|
||||
Contributors:
|
||||
|
@@ -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 \
|
||||
@@ -388,6 +392,7 @@ x11_source_c = \
|
||||
x11/clutter-keymap-x11.c \
|
||||
x11/clutter-stage-x11.c \
|
||||
x11/clutter-x11-texture-pixmap.c \
|
||||
x11/clutter-xkb-a11y-x11.c \
|
||||
$(NULL)
|
||||
|
||||
x11_source_h = \
|
||||
@@ -402,6 +407,7 @@ x11_source_h_priv = \
|
||||
x11/clutter-keymap-x11.h \
|
||||
x11/clutter-settings-x11.h \
|
||||
x11/clutter-stage-x11.h \
|
||||
x11/clutter-xkb-a11y-x11.h \
|
||||
$(NULL)
|
||||
|
||||
x11_source_c_priv = \
|
||||
|
@@ -4828,8 +4828,7 @@ clutter_actor_set_scale_factor (ClutterActor *self,
|
||||
g_assert (pspec != NULL);
|
||||
g_assert (scale_p != NULL);
|
||||
|
||||
if (*scale_p != factor)
|
||||
_clutter_actor_create_transition (self, pspec, *scale_p, factor);
|
||||
_clutter_actor_create_transition (self, pspec, *scale_p, factor);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -10264,10 +10263,9 @@ clutter_actor_set_position (ClutterActor *self,
|
||||
cur_position.x = clutter_actor_get_x (self);
|
||||
cur_position.y = clutter_actor_get_y (self);
|
||||
|
||||
if (!clutter_point_equals (&cur_position, &new_position))
|
||||
_clutter_actor_create_transition (self, obj_props[PROP_POSITION],
|
||||
&cur_position,
|
||||
&new_position);
|
||||
_clutter_actor_create_transition (self, obj_props[PROP_POSITION],
|
||||
&cur_position,
|
||||
&new_position);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -58,6 +58,8 @@ struct _ClutterBackend
|
||||
gint32 units_serial;
|
||||
|
||||
GList *event_translators;
|
||||
|
||||
ClutterInputMethod *input_method;
|
||||
};
|
||||
|
||||
struct _ClutterBackendClass
|
||||
@@ -100,6 +102,8 @@ struct _ClutterBackendClass
|
||||
|
||||
PangoDirection (* get_keymap_direction) (ClutterBackend *backend);
|
||||
|
||||
void (* bell_notify) (ClutterBackend *backend);
|
||||
|
||||
/* signals */
|
||||
void (* resolution_changed) (ClutterBackend *backend);
|
||||
void (* font_changed) (ClutterBackend *backend);
|
||||
|
@@ -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);
|
||||
}
|
||||
@@ -1363,3 +1364,41 @@ clutter_set_allowed_drivers (const char *drivers)
|
||||
|
||||
allowed_drivers = g_strdup (drivers);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_backend_bell_notify (ClutterBackend *backend)
|
||||
{
|
||||
ClutterBackendClass *klass;
|
||||
|
||||
klass = CLUTTER_BACKEND_GET_CLASS (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);
|
||||
}
|
||||
|
@@ -74,6 +74,15 @@ const cairo_font_options_t * clutter_backend_get_font_options (Clutter
|
||||
CLUTTER_AVAILABLE_IN_1_8
|
||||
CoglContext * clutter_backend_get_cogl_context (ClutterBackend *backend);
|
||||
|
||||
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__ */
|
||||
|
@@ -145,6 +145,9 @@ struct _ClutterInputDevice
|
||||
guint is_enabled : 1;
|
||||
};
|
||||
|
||||
typedef void (*ClutterEmitInputDeviceEvent) (ClutterEvent *event,
|
||||
ClutterInputDevice *device);
|
||||
|
||||
struct _ClutterInputDeviceClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
@@ -163,6 +166,11 @@ struct _ClutterInputDeviceClass
|
||||
|
||||
gboolean (* is_grouped) (ClutterInputDevice *device,
|
||||
ClutterInputDevice *other_device);
|
||||
|
||||
/* Keyboard accessbility */
|
||||
void (* process_kbd_a11y_event) (ClutterEvent *event,
|
||||
ClutterInputDevice *device,
|
||||
ClutterEmitInputDeviceEvent emit_event_func);
|
||||
};
|
||||
|
||||
/* Platform-dependent interface */
|
||||
|
@@ -54,6 +54,9 @@ struct _ClutterDeviceManagerPrivate
|
||||
{
|
||||
/* back-pointer to the backend */
|
||||
ClutterBackend *backend;
|
||||
|
||||
/* Keyboard a11y */
|
||||
ClutterKbdA11ySettings kbd_a11y_settings;
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -72,6 +75,8 @@ enum
|
||||
DEVICE_ADDED,
|
||||
DEVICE_REMOVED,
|
||||
TOOL_CHANGED,
|
||||
KBD_A11Y_MASK_CHANGED,
|
||||
KBD_A11Y_FLAGS_CHANGED,
|
||||
|
||||
LAST_SIGNAL
|
||||
};
|
||||
@@ -196,6 +201,46 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
|
||||
G_TYPE_NONE, 2,
|
||||
CLUTTER_TYPE_INPUT_DEVICE,
|
||||
CLUTTER_TYPE_INPUT_DEVICE_TOOL);
|
||||
|
||||
/**
|
||||
* ClutterDeviceManager::kbd-a11y-mods-state-changed:
|
||||
* @manager: the #ClutterDeviceManager that emitted the signal
|
||||
* @latched_mask: the latched modifier mask from stickykeys
|
||||
* @locked_mask: the locked modifier mask from stickykeys
|
||||
*
|
||||
* The ::kbd-a11y-mods-state-changed signal is emitted each time either the
|
||||
* latched modifiers mask or locked modifiers mask are changed as the
|
||||
* result of keyboard accessibilty's sticky keys operations.
|
||||
*/
|
||||
manager_signals[KBD_A11Y_MASK_CHANGED] =
|
||||
g_signal_new (I_("kbd-a11y-mods-state-changed"),
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL,
|
||||
_clutter_marshal_VOID__UINT_UINT,
|
||||
G_TYPE_NONE, 2,
|
||||
G_TYPE_UINT,
|
||||
G_TYPE_UINT);
|
||||
|
||||
/**
|
||||
* ClutterDeviceManager::kbd-a11y-flags-changed:
|
||||
* @manager: the #ClutterDeviceManager that emitted the signal
|
||||
* @settings_flags: the new ClutterKeyboardA11yFlags configuration
|
||||
* @changed_mask: the ClutterKeyboardA11yFlags changed
|
||||
*
|
||||
* The ::kbd-a11y-flags-changed signal is emitted each time the
|
||||
* ClutterKeyboardA11yFlags configuration is changed as the result of
|
||||
* keyboard accessibilty operations.
|
||||
*/
|
||||
manager_signals[KBD_A11Y_FLAGS_CHANGED] =
|
||||
g_signal_new (I_("kbd-a11y-flags-changed"),
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL,
|
||||
_clutter_marshal_VOID__UINT_UINT,
|
||||
G_TYPE_NONE, 2,
|
||||
G_TYPE_UINT,
|
||||
G_TYPE_UINT);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -487,3 +532,43 @@ _clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager,
|
||||
|
||||
manager_class->compress_motion (device_manager, event, to_discard);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
|
||||
ClutterKbdA11ySettings *b)
|
||||
{
|
||||
return (a->controls == b->controls &&
|
||||
a->slowkeys_delay == b->slowkeys_delay &&
|
||||
a->debounce_delay == b->debounce_delay &&
|
||||
a->timeout_delay == b->timeout_delay &&
|
||||
a->mousekeys_init_delay == b->mousekeys_init_delay &&
|
||||
a->mousekeys_max_speed == b->mousekeys_max_speed &&
|
||||
a->mousekeys_accel_time == b->mousekeys_accel_time);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *settings)
|
||||
{
|
||||
ClutterDeviceManagerClass *manager_class;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
|
||||
|
||||
if (are_kbd_a11y_settings_equal (&device_manager->priv->kbd_a11y_settings, settings))
|
||||
return;
|
||||
|
||||
device_manager->priv->kbd_a11y_settings = *settings;
|
||||
|
||||
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
|
||||
if (manager_class->apply_kbd_a11y_settings)
|
||||
manager_class->apply_kbd_a11y_settings (device_manager, settings);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *settings)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
|
||||
|
||||
*settings = device_manager->priv->kbd_a11y_settings;
|
||||
}
|
||||
|
@@ -44,6 +44,25 @@ typedef struct _ClutterDeviceManager ClutterDeviceManager;
|
||||
typedef struct _ClutterDeviceManagerPrivate ClutterDeviceManagerPrivate;
|
||||
typedef struct _ClutterDeviceManagerClass ClutterDeviceManagerClass;
|
||||
|
||||
|
||||
/**
|
||||
* ClutterKbdA11ySettings:
|
||||
*
|
||||
* The #ClutterKbdA11ySettings structure contains keyboard accessibility
|
||||
* settings
|
||||
*
|
||||
*/
|
||||
typedef struct _ClutterKbdA11ySettings
|
||||
{
|
||||
ClutterKeyboardA11yFlags controls;
|
||||
gint slowkeys_delay;
|
||||
gint debounce_delay;
|
||||
gint timeout_delay;
|
||||
gint mousekeys_init_delay;
|
||||
gint mousekeys_max_speed;
|
||||
gint mousekeys_accel_time;
|
||||
} ClutterKbdA11ySettings;
|
||||
|
||||
/**
|
||||
* ClutterDeviceManager:
|
||||
*
|
||||
@@ -88,7 +107,9 @@ struct _ClutterDeviceManagerClass
|
||||
void (* compress_motion) (ClutterDeviceManager *device_manger,
|
||||
ClutterEvent *event,
|
||||
const ClutterEvent *to_discard);
|
||||
|
||||
/* Keyboard accessbility */
|
||||
void (* apply_kbd_a11y_settings) (ClutterDeviceManager *device_manger,
|
||||
ClutterKbdA11ySettings *settings);
|
||||
/* padding */
|
||||
gpointer _padding[6];
|
||||
};
|
||||
@@ -114,6 +135,13 @@ CLUTTER_AVAILABLE_IN_ALL
|
||||
ClutterVirtualInputDevice *clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *settings);
|
||||
CLUTTER_AVAILABLE_IN_ALL
|
||||
void clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *settings);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_DEVICE_MANAGER_H__ */
|
||||
|
@@ -396,6 +396,43 @@ typedef enum {
|
||||
CLUTTER_MODIFIER_MASK = 0x5c001fff
|
||||
} ClutterModifierType;
|
||||
|
||||
/**
|
||||
* ClutterKeyboardA11yFlags:
|
||||
* @CLUTTER_A11Y_KEYBOARD_ENABLED:
|
||||
* @CLUTTER_A11Y_TIMEOUT_ENABLED:
|
||||
* @CLUTTER_A11Y_MOUSE_KEYS_ENABLED:
|
||||
* @CLUTTER_A11Y_SLOW_KEYS_ENABLED:
|
||||
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS:
|
||||
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT:
|
||||
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT:
|
||||
* @CLUTTER_A11Y_BOUNCE_KEYS_ENABLED:
|
||||
* @CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT:
|
||||
* @CLUTTER_A11Y_TOGGLE_KEYS_ENABLED:
|
||||
* @CLUTTER_A11Y_STICKY_KEYS_ENABLED:
|
||||
* @CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF:
|
||||
* @CLUTTER_A11Y_STICKY_KEYS_BEEP:
|
||||
* @CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP:
|
||||
*
|
||||
* Keyboard accessibility features applied to a ClutterInputDevice keyboard.
|
||||
*
|
||||
*/
|
||||
typedef enum {
|
||||
CLUTTER_A11Y_KEYBOARD_ENABLED = 1 << 0,
|
||||
CLUTTER_A11Y_TIMEOUT_ENABLED = 1 << 1,
|
||||
CLUTTER_A11Y_MOUSE_KEYS_ENABLED = 1 << 2,
|
||||
CLUTTER_A11Y_SLOW_KEYS_ENABLED = 1 << 3,
|
||||
CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS = 1 << 4,
|
||||
CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT = 1 << 5,
|
||||
CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT = 1 << 6,
|
||||
CLUTTER_A11Y_BOUNCE_KEYS_ENABLED = 1 << 7,
|
||||
CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT = 1 << 8,
|
||||
CLUTTER_A11Y_TOGGLE_KEYS_ENABLED = 1 << 9,
|
||||
CLUTTER_A11Y_STICKY_KEYS_ENABLED = 1 << 10,
|
||||
CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF = 1 << 11,
|
||||
CLUTTER_A11Y_STICKY_KEYS_BEEP = 1 << 12,
|
||||
CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
|
||||
} ClutterKeyboardA11yFlags;
|
||||
|
||||
/**
|
||||
* ClutterActorFlags:
|
||||
* @CLUTTER_ACTOR_MAPPED: the actor will be painted (is visible, and inside
|
||||
@@ -730,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;
|
||||
|
||||
/**
|
||||
@@ -1536,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__ */
|
||||
|
229
clutter/clutter/clutter-input-focus.c
Normal file
229
clutter/clutter/clutter-input-focus.c
Normal file
@@ -0,0 +1,229 @@
|
||||
/*
|
||||
* 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>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter/clutter-input-focus.h"
|
||||
|
||||
enum {
|
||||
FOCUS_IN,
|
||||
FOCUS_OUT,
|
||||
COMMIT,
|
||||
DELETE_SURROUNDING,
|
||||
REQUEST_SURROUNDING,
|
||||
SET_PREEDIT_TEXT,
|
||||
N_SIGNALS,
|
||||
};
|
||||
|
||||
static guint signals[N_SIGNALS] = { 0 };
|
||||
|
||||
G_DEFINE_INTERFACE (ClutterInputFocus, clutter_input_focus, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
clutter_input_focus_default_init (ClutterInputFocusInterface *iface)
|
||||
{
|
||||
signals[FOCUS_IN] =
|
||||
g_signal_new ("focus-in",
|
||||
CLUTTER_TYPE_INPUT_FOCUS,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (ClutterInputFocusInterface, focus_in),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1, CLUTTER_TYPE_INPUT_METHOD);
|
||||
signals[FOCUS_OUT] =
|
||||
g_signal_new ("focus-out",
|
||||
CLUTTER_TYPE_INPUT_FOCUS,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (ClutterInputFocusInterface, focus_out),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
signals[COMMIT] =
|
||||
g_signal_new ("commit",
|
||||
CLUTTER_TYPE_INPUT_FOCUS,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (ClutterInputFocusInterface, commit_text),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1, G_TYPE_STRING);
|
||||
signals[DELETE_SURROUNDING] =
|
||||
g_signal_new ("delete-surrounding",
|
||||
CLUTTER_TYPE_INPUT_FOCUS,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (ClutterInputFocusInterface, delete_surrounding),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
|
||||
signals[REQUEST_SURROUNDING] =
|
||||
g_signal_new ("request-surrounding",
|
||||
CLUTTER_TYPE_INPUT_FOCUS,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (ClutterInputFocusInterface, request_surrounding),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
signals[SET_PREEDIT_TEXT] =
|
||||
g_signal_new ("set-preedit-text",
|
||||
CLUTTER_TYPE_INPUT_FOCUS,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (ClutterInputFocusInterface, set_preedit_text),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_UINT);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_reset (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
if (clutter_input_method_get_focus (method) != focus)
|
||||
return;
|
||||
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (method)->reset (method);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
|
||||
const ClutterRect *rect)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
if (clutter_input_method_get_focus (method) != focus)
|
||||
return;
|
||||
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (method)->set_cursor_location (method, rect);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
if (clutter_input_method_get_focus (method) != focus)
|
||||
return;
|
||||
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (method)->set_surrounding (method, text, cursor, anchor);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_content_hints (ClutterInputFocus *focus,
|
||||
ClutterInputContentHintFlags hints)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
if (clutter_input_method_get_focus (method) != focus)
|
||||
return;
|
||||
|
||||
g_object_set (G_OBJECT (method), "content-hints", hints, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_content_purpose (ClutterInputFocus *focus,
|
||||
ClutterInputContentPurpose purpose)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
if (clutter_input_method_get_focus (method) != focus)
|
||||
return;
|
||||
|
||||
g_object_set (G_OBJECT (method), "content-purpose", purpose, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_focus_in (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
clutter_input_method_focus_in (method, focus);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_focus_out (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
if (clutter_input_method_get_focus (method) == focus)
|
||||
clutter_input_method_focus_out (method);
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_input_focus_filter_key_event (ClutterInputFocus *focus,
|
||||
const ClutterKeyEvent *key)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_METHOD (method), FALSE);
|
||||
|
||||
if (clutter_event_get_flags ((ClutterEvent *) key) & CLUTTER_EVENT_FLAG_INPUT_METHOD)
|
||||
return FALSE;
|
||||
|
||||
if (clutter_input_method_get_focus (method) == focus)
|
||||
{
|
||||
ClutterInputMethodClass *im_class = CLUTTER_INPUT_METHOD_GET_CLASS (method);
|
||||
|
||||
if (im_class->filter_key_event)
|
||||
return im_class->filter_key_event (method, (const ClutterEvent *) key);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
|
||||
gboolean can_show_preedit)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
if (clutter_input_method_get_focus (method) == focus)
|
||||
g_object_set (G_OBJECT (method), "can-show-preedit", can_show_preedit, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterInputMethod *method = clutter_backend_get_input_method (backend);
|
||||
|
||||
if (clutter_input_method_get_focus (method) == focus)
|
||||
{
|
||||
g_signal_emit_by_name (method, "input-panel-state",
|
||||
CLUTTER_INPUT_PANEL_STATE_TOGGLE);
|
||||
}
|
||||
}
|
86
clutter/clutter/clutter-input-focus.h
Normal file
86
clutter/clutter/clutter-input-focus.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* 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 __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_INTERFACE (ClutterInputFocus, clutter_input_focus,
|
||||
CLUTTER, INPUT_FOCUS, GObject)
|
||||
|
||||
typedef struct _ClutterInputFocusInterface ClutterInputFocusInterface;
|
||||
|
||||
struct _ClutterInputFocusInterface
|
||||
{
|
||||
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
|
||||
void clutter_input_focus_focus_in (ClutterInputFocus *focus);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_focus_focus_out (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__ */
|
359
clutter/clutter/clutter-input-method.c
Normal file
359
clutter/clutter/clutter-input-method.c
Normal file
@@ -0,0 +1,359 @@
|
||||
/*
|
||||
* 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>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter-private.h"
|
||||
#include "clutter/clutter-input-method.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,
|
||||
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 *method,
|
||||
ClutterInputContentHintFlags content_hints)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
priv->content_hints = content_hints;
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (method)->update_content_hints (method,
|
||||
content_hints);
|
||||
}
|
||||
|
||||
static void
|
||||
set_content_purpose (ClutterInputMethod *method,
|
||||
ClutterInputContentPurpose content_purpose)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
priv->content_purpose = content_purpose;
|
||||
CLUTTER_INPUT_METHOD_GET_CLASS (method)->update_content_purpose (method,
|
||||
content_purpose);
|
||||
}
|
||||
|
||||
static void
|
||||
set_can_show_preedit (ClutterInputMethod *method,
|
||||
gboolean can_show_preedit)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
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 *method;
|
||||
|
||||
method = CLUTTER_INPUT_METHOD (object);
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
|
||||
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);
|
||||
|
||||
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 *method)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_focus_in (ClutterInputMethod *method,
|
||||
ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
ClutterInputMethodClass *klass;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
|
||||
if (priv->focus == focus)
|
||||
return;
|
||||
|
||||
if (priv->focus)
|
||||
clutter_input_method_focus_out (method);
|
||||
|
||||
g_set_object (&priv->focus, focus);
|
||||
|
||||
if (focus)
|
||||
{
|
||||
klass = CLUTTER_INPUT_METHOD_GET_CLASS (method);
|
||||
klass->focus_in (method, focus);
|
||||
|
||||
g_signal_emit_by_name (priv->focus, "focus-in", method);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_focus_out (ClutterInputMethod *method)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
ClutterInputMethodClass *klass;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
|
||||
if (!priv->focus)
|
||||
return;
|
||||
|
||||
g_signal_emit_by_name (priv->focus, "focus-out");
|
||||
g_clear_object (&priv->focus);
|
||||
|
||||
klass = CLUTTER_INPUT_METHOD_GET_CLASS (method);
|
||||
klass->focus_out (method);
|
||||
|
||||
g_signal_emit (method, signals[INPUT_PANEL_STATE],
|
||||
0, CLUTTER_INPUT_PANEL_STATE_OFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_input_method_get_focus:
|
||||
* @method: the #ClutterInputMethod
|
||||
*
|
||||
* Retrieves the current focus of the input method, or %NULL
|
||||
* if there is none.
|
||||
*
|
||||
* Returns: (transfer none) (nullable): the current focus
|
||||
**/
|
||||
ClutterInputFocus *
|
||||
clutter_input_method_get_focus (ClutterInputMethod *method)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
return priv->focus;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_commit (ClutterInputMethod *method,
|
||||
const gchar *text)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
if (priv->focus)
|
||||
g_signal_emit_by_name (priv->focus, "commit", text);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_delete_surrounding (ClutterInputMethod *method,
|
||||
guint offset,
|
||||
guint len)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
if (priv->focus)
|
||||
g_signal_emit_by_name (priv->focus, "delete-surrounding", offset, len);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_request_surrounding (ClutterInputMethod *method)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
if (priv->focus)
|
||||
g_signal_emit_by_name (priv->focus, "request-surrounding");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 *method,
|
||||
const gchar *preedit,
|
||||
guint cursor)
|
||||
{
|
||||
ClutterInputMethodPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (method));
|
||||
|
||||
priv = clutter_input_method_get_instance_private (method);
|
||||
if (priv->focus)
|
||||
g_signal_emit_by_name (priv->focus, "set-preedit-text", preedit, cursor);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_input_method_notify_key_event (ClutterInputMethod *method,
|
||||
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);
|
||||
}
|
||||
}
|
89
clutter/clutter/clutter-input-method.h
Normal file
89
clutter/clutter/clutter-input-method.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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 __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 *method,
|
||||
ClutterInputFocus *actor);
|
||||
void (* focus_out) (ClutterInputMethod *method);
|
||||
|
||||
void (* reset) (ClutterInputMethod *method);
|
||||
|
||||
void (* set_cursor_location) (ClutterInputMethod *method,
|
||||
const ClutterRect *rect);
|
||||
void (* set_surrounding) (ClutterInputMethod *method,
|
||||
const gchar *text,
|
||||
guint cursor,
|
||||
guint anchor);
|
||||
void (* update_content_hints) (ClutterInputMethod *method,
|
||||
ClutterInputContentHintFlags hint);
|
||||
void (* update_content_purpose) (ClutterInputMethod *method,
|
||||
ClutterInputContentPurpose purpose);
|
||||
|
||||
gboolean (* filter_key_event) (ClutterInputMethod *method,
|
||||
const ClutterEvent *key);
|
||||
};
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_focus_in (ClutterInputMethod *method,
|
||||
ClutterInputFocus *focus);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_focus_out (ClutterInputMethod *method);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
ClutterInputFocus * clutter_input_method_get_focus (ClutterInputMethod *method);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_commit (ClutterInputMethod *method,
|
||||
const gchar *text);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_delete_surrounding (ClutterInputMethod *method,
|
||||
guint offset,
|
||||
guint len);
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_request_surrounding (ClutterInputMethod *method);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_set_preedit_text (ClutterInputMethod *method,
|
||||
const gchar *preedit,
|
||||
guint cursor);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_input_method_notify_key_event (ClutterInputMethod *method,
|
||||
const ClutterEvent *event,
|
||||
gboolean filtered);
|
||||
|
||||
#endif /* __CLUTTER_INPUT_METHOD_H__ */
|
@@ -2089,6 +2089,21 @@ emit_keyboard_event (ClutterEvent *event,
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
process_key_event (ClutterEvent *event,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
ClutterInputDeviceClass *device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (device_class->process_kbd_a11y_event)
|
||||
{
|
||||
device_class->process_kbd_a11y_event (event, device, emit_keyboard_event);
|
||||
return;
|
||||
}
|
||||
|
||||
emit_keyboard_event (event, device);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_off_stage (ClutterActor *stage,
|
||||
gfloat x,
|
||||
@@ -2176,7 +2191,7 @@ _clutter_process_event_details (ClutterActor *stage,
|
||||
}
|
||||
}
|
||||
|
||||
emit_keyboard_event (event, device);
|
||||
process_key_event (event, device);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@@ -4726,8 +4726,8 @@ capture_view (ClutterStage *stage,
|
||||
|
||||
if (paint)
|
||||
{
|
||||
_clutter_stage_maybe_setup_viewport (stage, view);
|
||||
cogl_push_framebuffer (framebuffer);
|
||||
_clutter_stage_maybe_setup_viewport (stage, view);
|
||||
clutter_stage_do_paint_view (stage, view, rect);
|
||||
}
|
||||
|
||||
@@ -4829,8 +4829,8 @@ capture_view_into (ClutterStage *stage,
|
||||
|
||||
if (paint)
|
||||
{
|
||||
_clutter_stage_maybe_setup_viewport (stage, view);
|
||||
cogl_push_framebuffer (framebuffer);
|
||||
_clutter_stage_maybe_setup_viewport (stage, view);
|
||||
clutter_stage_do_paint_view (stage, view, rect);
|
||||
}
|
||||
|
||||
@@ -4856,11 +4856,9 @@ capture_view_into (ClutterStage *stage,
|
||||
cogl_object_unref (bitmap);
|
||||
}
|
||||
|
||||
void
|
||||
clutter_stage_capture_into (ClutterStage *stage,
|
||||
gboolean paint,
|
||||
cairo_rectangle_int_t *rect,
|
||||
uint8_t *data)
|
||||
static ClutterStageView *
|
||||
get_view_at_rect (ClutterStage *stage,
|
||||
cairo_rectangle_int_t *rect)
|
||||
{
|
||||
ClutterStagePrivate *priv = stage->priv;
|
||||
GList *views = _clutter_stage_window_get_views (priv->impl);
|
||||
@@ -4872,8 +4870,6 @@ clutter_stage_capture_into (ClutterStage *stage,
|
||||
cairo_rectangle_int_t view_layout;
|
||||
cairo_region_t *region;
|
||||
cairo_rectangle_int_t view_capture_rect;
|
||||
int offset;
|
||||
const int bpp = 4;
|
||||
|
||||
clutter_stage_view_get_layout (view, &view_layout);
|
||||
region = cairo_region_create_rectangle (&view_layout);
|
||||
@@ -4884,8 +4880,23 @@ clutter_stage_capture_into (ClutterStage *stage,
|
||||
if (view_capture_rect.width == 0 || view_capture_rect.height == 0)
|
||||
continue;
|
||||
|
||||
offset = bpp * (view_capture_rect.y * rect->width + view_capture_rect.x);
|
||||
capture_view_into (stage, paint, view, &view_capture_rect,
|
||||
data + offset, rect->width * bpp);
|
||||
g_assert (view_capture_rect.width == rect->width &&
|
||||
view_capture_rect.height == rect->height);
|
||||
return view;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_stage_capture_into (ClutterStage *stage,
|
||||
gboolean paint,
|
||||
cairo_rectangle_int_t *rect,
|
||||
uint8_t *data)
|
||||
{
|
||||
ClutterStageView *view;
|
||||
int bpp = 4;
|
||||
|
||||
view = get_view_at_rect (stage, rect);
|
||||
capture_view_into (stage, paint, view, rect, data, rect->width * bpp);
|
||||
}
|
||||
|
@@ -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
|
||||
@@ -176,6 +177,9 @@ struct _ClutterTextPrivate
|
||||
/* Signal handler for when the :text-direction changes */
|
||||
guint direction_changed_id;
|
||||
|
||||
ClutterInputContentHintFlags input_hints;
|
||||
ClutterInputContentPurpose input_purpose;
|
||||
|
||||
/* bitfields */
|
||||
guint alignment : 2;
|
||||
guint wrap : 1;
|
||||
@@ -236,6 +240,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 +275,7 @@ static const ClutterColor default_selected_text_color = { 0, 0, 0, 255 };
|
||||
static ClutterAnimatableIface *parent_animatable_iface = NULL;
|
||||
static ClutterScriptableIface *parent_scriptable_iface = NULL;
|
||||
|
||||
static void clutter_input_focus_iface_init (ClutterInputFocusInterface *iface);
|
||||
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
|
||||
|
||||
@@ -276,11 +283,91 @@ G_DEFINE_TYPE_WITH_CODE (ClutterText,
|
||||
clutter_text,
|
||||
CLUTTER_TYPE_ACTOR,
|
||||
G_ADD_PRIVATE (ClutterText)
|
||||
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_INPUT_FOCUS,
|
||||
clutter_input_focus_iface_init)
|
||||
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE,
|
||||
clutter_scriptable_iface_init)
|
||||
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_ANIMATABLE,
|
||||
clutter_animatable_iface_init));
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_request_surrounding (ClutterInputFocus *focus)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT (focus);
|
||||
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 (focus);
|
||||
|
||||
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 (focus);
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||
const gchar *preedit_text,
|
||||
guint cursor_pos)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT (focus);
|
||||
|
||||
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_input_focus_iface_init (ClutterInputFocusInterface *iface)
|
||||
{
|
||||
iface->request_surrounding = clutter_text_input_focus_request_surrounding;
|
||||
iface->delete_surrounding = clutter_text_input_focus_delete_surrounding;
|
||||
iface->commit_text = clutter_text_input_focus_commit_text;
|
||||
iface->set_preedit_text = clutter_text_input_focus_set_preedit_text;
|
||||
}
|
||||
|
||||
static inline void
|
||||
clutter_text_dirty_paint_volume (ClutterText *text)
|
||||
{
|
||||
@@ -1009,6 +1096,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 (CLUTTER_INPUT_FOCUS (self), &rect);
|
||||
}
|
||||
|
||||
static inline void
|
||||
clutter_text_ensure_cursor_position (ClutterText *self)
|
||||
{
|
||||
@@ -1057,6 +1160,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1859,6 +1964,7 @@ clutter_text_press (ClutterActor *actor,
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
|
||||
clutter_actor_grab_key_focus (actor);
|
||||
clutter_input_focus_request_toggle_input_panel (CLUTTER_INPUT_FOCUS (self));
|
||||
|
||||
/* if the actor is empty we just reset everything and not
|
||||
* set up the dragging of the selection since there's nothing
|
||||
@@ -2085,9 +2191,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 +2213,9 @@ clutter_text_key_press (ClutterActor *actor,
|
||||
{
|
||||
gunichar key_unichar;
|
||||
|
||||
if (clutter_input_focus_filter_key_event (CLUTTER_INPUT_FOCUS (actor), event))
|
||||
return CLUTTER_EVENT_STOP;
|
||||
|
||||
/* Skip keys when control is pressed */
|
||||
key_unichar = clutter_event_get_key_unicode ((ClutterEvent *) event);
|
||||
|
||||
@@ -2141,6 +2252,16 @@ clutter_text_key_press (ClutterActor *actor,
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
clutter_text_key_release (ClutterActor *actor,
|
||||
ClutterKeyEvent *event)
|
||||
{
|
||||
if (clutter_input_focus_filter_key_event (CLUTTER_INPUT_FOCUS (actor), event))
|
||||
return CLUTTER_EVENT_STOP;
|
||||
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_text_compute_layout_offsets (ClutterText *self,
|
||||
PangoLayout *layout,
|
||||
@@ -2664,6 +2785,9 @@ clutter_text_key_focus_in (ClutterActor *actor)
|
||||
{
|
||||
ClutterTextPrivate *priv = CLUTTER_TEXT (actor)->priv;
|
||||
|
||||
if (priv->editable)
|
||||
clutter_input_focus_focus_in (CLUTTER_INPUT_FOCUS (actor));
|
||||
|
||||
priv->has_focus = TRUE;
|
||||
|
||||
clutter_text_queue_redraw (actor);
|
||||
@@ -2676,6 +2800,9 @@ clutter_text_key_focus_out (ClutterActor *actor)
|
||||
|
||||
priv->has_focus = FALSE;
|
||||
|
||||
if (priv->editable)
|
||||
clutter_input_focus_focus_out (CLUTTER_INPUT_FOCUS (actor));
|
||||
|
||||
clutter_text_queue_redraw (actor);
|
||||
}
|
||||
|
||||
@@ -3369,6 +3496,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 +3997,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
|
||||
@@ -4469,6 +4613,11 @@ clutter_text_set_editable (ClutterText *self,
|
||||
{
|
||||
priv->editable = editable;
|
||||
|
||||
if (!priv->editable)
|
||||
clutter_input_focus_focus_out (CLUTTER_INPUT_FOCUS (self));
|
||||
else if (priv->has_focus)
|
||||
clutter_input_focus_focus_in (CLUTTER_INPUT_FOCUS (self));
|
||||
|
||||
clutter_text_queue_redraw (CLUTTER_ACTOR (self));
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_EDITABLE]);
|
||||
@@ -6298,3 +6447,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 (CLUTTER_INPUT_FOCUS (self), 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 (CLUTTER_INPUT_FOCUS (self), 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"
|
||||
|
@@ -48,6 +48,7 @@
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-main.h"
|
||||
#include "clutter-stage-private.h"
|
||||
#include "clutter-settings-private.h"
|
||||
|
||||
#ifdef COGL_HAS_EGL_SUPPORT
|
||||
#include "clutter-egl.h"
|
||||
@@ -60,6 +61,8 @@ clutter_backend_egl_native_dispose (GObject *gobject)
|
||||
{
|
||||
ClutterBackendEglNative *backend_egl_native = CLUTTER_BACKEND_EGL_NATIVE (gobject);
|
||||
|
||||
g_clear_object (&backend_egl_native->xsettings);
|
||||
|
||||
if (backend_egl_native->event_timer != NULL)
|
||||
{
|
||||
g_timer_destroy (backend_egl_native->event_timer);
|
||||
@@ -77,9 +80,181 @@ clutter_backend_egl_native_class_init (ClutterBackendEglNativeClass *klass)
|
||||
gobject_class->dispose = clutter_backend_egl_native_dispose;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
cairo_antialias_t cairo_antialias;
|
||||
gint clutter_font_antialias;
|
||||
|
||||
cairo_hint_style_t cairo_hint_style;
|
||||
const char *clutter_font_hint_style;
|
||||
|
||||
cairo_subpixel_order_t cairo_subpixel_order;
|
||||
const char *clutter_font_subpixel_order;
|
||||
} FontSettings;
|
||||
|
||||
static void
|
||||
get_font_gsettings (GSettings *xsettings,
|
||||
FontSettings *output)
|
||||
{
|
||||
/* org.gnome.settings-daemon.GsdFontAntialiasingMode */
|
||||
static const struct
|
||||
{
|
||||
cairo_antialias_t cairo_antialias;
|
||||
gint clutter_font_antialias;
|
||||
}
|
||||
antialiasings[] =
|
||||
{
|
||||
/* none=0 */ {CAIRO_ANTIALIAS_NONE, 0},
|
||||
/* grayscale=1 */ {CAIRO_ANTIALIAS_GRAY, 1},
|
||||
/* rgba=2 */ {CAIRO_ANTIALIAS_SUBPIXEL, 1},
|
||||
};
|
||||
|
||||
/* org.gnome.settings-daemon.GsdFontHinting */
|
||||
static const struct
|
||||
{
|
||||
cairo_hint_style_t cairo_hint_style;
|
||||
const char *clutter_font_hint_style;
|
||||
}
|
||||
hintings[] =
|
||||
{
|
||||
/* none=0 */ {CAIRO_HINT_STYLE_NONE, "hintnone"},
|
||||
/* slight=1 */ {CAIRO_HINT_STYLE_SLIGHT, "hintslight"},
|
||||
/* medium=2 */ {CAIRO_HINT_STYLE_MEDIUM, "hintmedium"},
|
||||
/* full=3 */ {CAIRO_HINT_STYLE_FULL, "hintfull"},
|
||||
};
|
||||
|
||||
/* org.gnome.settings-daemon.GsdFontRgbaOrder */
|
||||
static const struct
|
||||
{
|
||||
cairo_subpixel_order_t cairo_subpixel_order;
|
||||
const char *clutter_font_subpixel_order;
|
||||
}
|
||||
rgba_orders[] =
|
||||
{
|
||||
/* rgba=0 */ {CAIRO_SUBPIXEL_ORDER_RGB, "rgb"}, /* XXX what is 'rgba'? */
|
||||
/* rgb=1 */ {CAIRO_SUBPIXEL_ORDER_RGB, "rgb"},
|
||||
/* bgr=2 */ {CAIRO_SUBPIXEL_ORDER_BGR, "bgr"},
|
||||
/* vrgb=3 */ {CAIRO_SUBPIXEL_ORDER_VRGB, "vrgb"},
|
||||
/* vbgr=4 */ {CAIRO_SUBPIXEL_ORDER_VBGR, "vbgr"},
|
||||
};
|
||||
guint i;
|
||||
|
||||
i = g_settings_get_enum (xsettings, "hinting");
|
||||
if (i < G_N_ELEMENTS (hintings))
|
||||
{
|
||||
output->cairo_hint_style = hintings[i].cairo_hint_style;
|
||||
output->clutter_font_hint_style = hintings[i].clutter_font_hint_style;
|
||||
}
|
||||
else
|
||||
{
|
||||
output->cairo_hint_style = CAIRO_HINT_STYLE_DEFAULT;
|
||||
output->clutter_font_hint_style = NULL;
|
||||
}
|
||||
|
||||
i = g_settings_get_enum (xsettings, "antialiasing");
|
||||
if (i < G_N_ELEMENTS (antialiasings))
|
||||
{
|
||||
output->cairo_antialias = antialiasings[i].cairo_antialias;
|
||||
output->clutter_font_antialias = antialiasings[i].clutter_font_antialias;
|
||||
}
|
||||
else
|
||||
{
|
||||
output->cairo_antialias = CAIRO_ANTIALIAS_DEFAULT;
|
||||
output->clutter_font_antialias = -1;
|
||||
}
|
||||
|
||||
i = g_settings_get_enum (xsettings, "rgba-order");
|
||||
if (i < G_N_ELEMENTS (rgba_orders))
|
||||
{
|
||||
output->cairo_subpixel_order = rgba_orders[i].cairo_subpixel_order;
|
||||
output->clutter_font_subpixel_order = rgba_orders[i].clutter_font_subpixel_order;
|
||||
}
|
||||
else
|
||||
{
|
||||
output->cairo_subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
|
||||
output->clutter_font_subpixel_order = NULL;
|
||||
}
|
||||
|
||||
if (output->cairo_antialias == CAIRO_ANTIALIAS_GRAY)
|
||||
output->clutter_font_subpixel_order = "none";
|
||||
}
|
||||
|
||||
static void
|
||||
init_font_options (ClutterBackendEglNative *backend_egl_native)
|
||||
{
|
||||
GSettings *xsettings = backend_egl_native->xsettings;
|
||||
cairo_font_options_t *options = cairo_font_options_create ();
|
||||
FontSettings fs;
|
||||
|
||||
get_font_gsettings (xsettings, &fs);
|
||||
|
||||
cairo_font_options_set_hint_style (options, fs.cairo_hint_style);
|
||||
cairo_font_options_set_antialias (options, fs.cairo_antialias);
|
||||
cairo_font_options_set_subpixel_order (options, fs.cairo_subpixel_order);
|
||||
|
||||
clutter_backend_set_font_options (CLUTTER_BACKEND (backend_egl_native),
|
||||
options);
|
||||
|
||||
cairo_font_options_destroy (options);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_xsettings_change_event (GSettings *xsettings,
|
||||
gpointer keys,
|
||||
gint n_keys,
|
||||
gpointer user_data)
|
||||
{
|
||||
/*
|
||||
* A simpler alternative to this function that does not update the screen
|
||||
* immediately (like macOS :P):
|
||||
*
|
||||
* init_font_options (CLUTTER_BACKEND_EGL_NATIVE (user_data));
|
||||
*
|
||||
* which has the added benefit of eliminating the need for all the
|
||||
* FontSettings.clutter_ fields. However the below approach is better for
|
||||
* testing settings and more consistent with the existing x11 backend...
|
||||
*/
|
||||
ClutterSettings *csettings = clutter_settings_get_default ();
|
||||
FontSettings fs;
|
||||
gint hinting;
|
||||
|
||||
get_font_gsettings (xsettings, &fs);
|
||||
hinting = fs.cairo_hint_style == CAIRO_HINT_STYLE_NONE ? 0 : 1;
|
||||
g_object_set (csettings,
|
||||
"font-hinting", hinting,
|
||||
"font-hint-style", fs.clutter_font_hint_style,
|
||||
"font-antialias", fs.clutter_font_antialias,
|
||||
"font-subpixel-order", fs.clutter_font_subpixel_order,
|
||||
NULL);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_backend_egl_native_init (ClutterBackendEglNative *backend_egl_native)
|
||||
{
|
||||
static const gchar xsettings_path[] = "org.gnome.settings-daemon.plugins.xsettings";
|
||||
GSettingsSchemaSource *source = g_settings_schema_source_get_default ();
|
||||
GSettingsSchema *schema = g_settings_schema_source_lookup (source,
|
||||
xsettings_path,
|
||||
FALSE);
|
||||
|
||||
if (!schema)
|
||||
{
|
||||
g_warning ("Failed to find schema: %s", xsettings_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
backend_egl_native->xsettings = g_settings_new_full (schema, NULL, NULL);
|
||||
if (backend_egl_native->xsettings)
|
||||
{
|
||||
init_font_options (backend_egl_native);
|
||||
g_signal_connect (backend_egl_native->xsettings, "change-event",
|
||||
G_CALLBACK (on_xsettings_change_event),
|
||||
backend_egl_native);
|
||||
}
|
||||
}
|
||||
|
||||
backend_egl_native->event_timer = g_timer_new ();
|
||||
}
|
||||
|
||||
|
@@ -61,6 +61,9 @@ struct _ClutterBackendEglNative
|
||||
|
||||
/* event timer */
|
||||
GTimer *event_timer;
|
||||
|
||||
/* "xsettings" is still the defacto place for Xft settings, even in Wayland */
|
||||
GSettings *xsettings;
|
||||
};
|
||||
|
||||
struct _ClutterBackendEglNativeClass
|
||||
|
@@ -1214,8 +1214,7 @@ notify_continuous_axis (ClutterSeatEvdev *seat,
|
||||
|
||||
clutter_seat_evdev_notify_scroll_continuous (seat, device, time_us,
|
||||
dx, dy,
|
||||
scroll_source,
|
||||
CLUTTER_SCROLL_FINISHED_NONE);
|
||||
scroll_source, finish_flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1924,6 +1923,18 @@ clutter_device_manager_evdev_compress_motion (ClutterDeviceManager *device_mange
|
||||
dy_unaccel + dst_dy_unaccel);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_evdev_apply_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *settings)
|
||||
{
|
||||
ClutterInputDevice *device;
|
||||
|
||||
device = clutter_device_manager_evdev_get_core_device (device_manager, CLUTTER_KEYBOARD_DEVICE);
|
||||
if (device)
|
||||
clutter_input_device_evdev_apply_kbd_a11y_settings (CLUTTER_INPUT_DEVICE_EVDEV (device),
|
||||
settings);
|
||||
}
|
||||
|
||||
/*
|
||||
* GObject implementation
|
||||
*/
|
||||
@@ -2066,6 +2077,7 @@ clutter_device_manager_evdev_class_init (ClutterDeviceManagerEvdevClass *klass)
|
||||
manager_class->get_device = clutter_device_manager_evdev_get_device;
|
||||
manager_class->create_virtual_device = clutter_device_manager_evdev_create_virtual_device;
|
||||
manager_class->compress_motion = clutter_device_manager_evdev_compress_motion;
|
||||
manager_class->apply_kbd_a11y_settings = clutter_device_manager_evdev_apply_kbd_a11y_settings;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2186,7 +2198,7 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
|
||||
|
||||
first = g_list_first (priv->free_device_ids);
|
||||
next_id = GPOINTER_TO_INT (first->data);
|
||||
priv->free_device_ids = g_list_remove_link (priv->free_device_ids, first);
|
||||
priv->free_device_ids = g_list_delete_link (priv->free_device_ids, first);
|
||||
|
||||
return next_id;
|
||||
}
|
||||
@@ -2305,7 +2317,7 @@ clutter_evdev_update_xkb_state (ClutterDeviceManagerEvdev *manager_evdev)
|
||||
0, /* depressed */
|
||||
latched_mods,
|
||||
locked_mods,
|
||||
0, 0, 0);
|
||||
0, 0, seat->layout_idx);
|
||||
|
||||
seat->caps_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_CAPS);
|
||||
seat->num_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_NUM);
|
||||
@@ -2453,6 +2465,7 @@ clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
|
||||
xkb_mod_mask_t latched_mods;
|
||||
xkb_mod_mask_t locked_mods;
|
||||
struct xkb_state *state;
|
||||
GSList *l;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
|
||||
|
||||
@@ -2464,6 +2477,12 @@ clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
|
||||
locked_mods = xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED);
|
||||
|
||||
xkb_state_update_mask (state, depressed_mods, latched_mods, locked_mods, 0, 0, idx);
|
||||
for (l = manager_evdev->priv->seats; l; l = l->next)
|
||||
{
|
||||
ClutterSeatEvdev *seat = l->data;
|
||||
|
||||
seat->layout_idx = idx;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2473,12 +2492,9 @@ xkb_layout_index_t
|
||||
clutter_evdev_get_keyboard_layout_index (ClutterDeviceManager *evdev)
|
||||
{
|
||||
ClutterDeviceManagerEvdev *manager_evdev;
|
||||
struct xkb_state *state;
|
||||
|
||||
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
|
||||
state = manager_evdev->priv->main_seat->xkb;
|
||||
|
||||
return xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_LOCKED);
|
||||
return manager_evdev->priv->main_seat->layout_idx;
|
||||
}
|
||||
|
||||
/**
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -70,6 +70,29 @@ struct _ClutterInputDeviceEvdev
|
||||
cairo_matrix_t device_matrix;
|
||||
gdouble device_aspect_ratio; /* w:h */
|
||||
gdouble output_ratio; /* w:h */
|
||||
|
||||
/* Keyboard a11y */
|
||||
ClutterKeyboardA11yFlags a11y_flags;
|
||||
GList *slow_keys_list;
|
||||
guint debounce_timer;
|
||||
guint16 debounce_key;
|
||||
xkb_mod_mask_t stickykeys_depressed_mask;
|
||||
xkb_mod_mask_t stickykeys_latched_mask;
|
||||
xkb_mod_mask_t stickykeys_locked_mask;
|
||||
guint toggle_slowkeys_timer;
|
||||
guint16 shift_count;
|
||||
guint32 last_shift_time;
|
||||
gint mousekeys_btn;
|
||||
gboolean mousekeys_btn_states[3];
|
||||
guint32 mousekeys_first_motion_time; /* ms */
|
||||
guint32 mousekeys_last_motion_time; /* ms */
|
||||
guint mousekeys_init_delay;
|
||||
guint mousekeys_accel_time;
|
||||
guint mousekeys_max_speed;
|
||||
gdouble mousekeys_curve_factor;
|
||||
guint move_mousekeys_timer;
|
||||
guint16 last_mousekeys_key;
|
||||
ClutterVirtualInputDevice *mousekeys_virtual_device;
|
||||
};
|
||||
|
||||
GType _clutter_input_device_evdev_get_type (void) G_GNUC_CONST;
|
||||
@@ -111,6 +134,9 @@ void clutter_input_device_evdev_translate_coordinates (Clut
|
||||
gfloat *x,
|
||||
gfloat *y);
|
||||
|
||||
void clutter_input_device_evdev_apply_kbd_a11y_settings (ClutterInputDeviceEvdev *device,
|
||||
ClutterKbdA11ySettings *settings);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */
|
||||
|
@@ -58,6 +58,7 @@ struct _ClutterSeatEvdev
|
||||
xkb_led_index_t caps_lock_led;
|
||||
xkb_led_index_t num_lock_led;
|
||||
xkb_led_index_t scroll_lock_led;
|
||||
xkb_layout_index_t layout_idx;
|
||||
uint32_t button_state;
|
||||
int button_count[KEY_CNT];
|
||||
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include "clutter-event-translator.h"
|
||||
#include "clutter-stage-private.h"
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-xkb-a11y-x11.h"
|
||||
|
||||
enum
|
||||
{
|
||||
@@ -352,9 +353,11 @@ static void
|
||||
clutter_device_manager_x11_constructed (GObject *gobject)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11;
|
||||
ClutterDeviceManager *manager;
|
||||
ClutterBackendX11 *backend_x11;
|
||||
|
||||
manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (gobject);
|
||||
manager = CLUTTER_DEVICE_MANAGER (gobject);
|
||||
|
||||
g_object_get (gobject, "backend", &backend_x11, NULL);
|
||||
g_assert (backend_x11 != NULL);
|
||||
@@ -389,6 +392,8 @@ clutter_device_manager_x11_constructed (GObject *gobject)
|
||||
_clutter_input_device_set_associated_device (manager_x11->core_keyboard,
|
||||
manager_x11->core_pointer);
|
||||
|
||||
clutter_device_manager_x11_a11y_init (manager);
|
||||
|
||||
if (G_OBJECT_CLASS (clutter_device_manager_x11_parent_class)->constructed)
|
||||
G_OBJECT_CLASS (clutter_device_manager_x11_parent_class)->constructed (gobject);
|
||||
}
|
||||
@@ -532,6 +537,7 @@ clutter_device_manager_x11_class_init (ClutterDeviceManagerX11Class *klass)
|
||||
manager_class->get_core_device = clutter_device_manager_x11_get_core_device;
|
||||
manager_class->get_device = clutter_device_manager_x11_get_device;
|
||||
manager_class->create_virtual_device = clutter_device_manager_x11_create_virtual_device;
|
||||
manager_class->apply_kbd_a11y_settings = clutter_device_manager_x11_apply_kbd_a11y_settings;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -40,6 +40,7 @@
|
||||
#include "clutter-event-translator.h"
|
||||
#include "clutter-stage-private.h"
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-xkb-a11y-x11.h"
|
||||
|
||||
#include <X11/extensions/XInput2.h>
|
||||
|
||||
@@ -1987,6 +1988,8 @@ clutter_device_manager_xi2_constructed (GObject *gobject)
|
||||
|
||||
XSync (backend_x11->xdpy, False);
|
||||
|
||||
clutter_device_manager_x11_a11y_init (manager);
|
||||
|
||||
if (G_OBJECT_CLASS (clutter_device_manager_xi2_parent_class)->constructed)
|
||||
G_OBJECT_CLASS (clutter_device_manager_xi2_parent_class)->constructed (gobject);
|
||||
}
|
||||
@@ -2049,6 +2052,7 @@ clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
|
||||
manager_class->get_device = clutter_device_manager_xi2_get_device;
|
||||
manager_class->select_stage_events = clutter_device_manager_xi2_select_stage_events;
|
||||
manager_class->create_virtual_device = clutter_device_manager_xi2_create_virtual_device;
|
||||
manager_class->apply_kbd_a11y_settings = clutter_device_manager_x11_apply_kbd_a11y_settings;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -14,7 +14,6 @@ static const struct {
|
||||
{ "Xft/HintStyle", "font-hint-style" },
|
||||
{ "Xft/RGBA", "font-subpixel-order" },
|
||||
{ "Fontconfig/Timestamp", "fontconfig-timestamp" },
|
||||
{ "Gdk/UnscaledDPI", "unscaled-font-dpi" },
|
||||
};
|
||||
|
||||
static const gint _n_clutter_settings_map = G_N_ELEMENTS (_clutter_settings_map);
|
||||
|
328
clutter/clutter/x11/clutter-xkb-a11y-x11.c
Normal file
328
clutter/clutter/x11/clutter-xkb-a11y-x11.c
Normal file
@@ -0,0 +1,328 @@
|
||||
/*
|
||||
*
|
||||
* Copyright © 2001 Ximian, Inc.
|
||||
* Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "clutter-device-manager-private.h"
|
||||
#include "clutter-xkb-a11y-x11.h"
|
||||
|
||||
#include <X11/XKBlib.h>
|
||||
#include <X11/extensions/XKBstr.h>
|
||||
|
||||
#define DEFAULT_XKB_SET_CONTROLS_MASK XkbSlowKeysMask | \
|
||||
XkbBounceKeysMask | \
|
||||
XkbStickyKeysMask | \
|
||||
XkbMouseKeysMask | \
|
||||
XkbMouseKeysAccelMask | \
|
||||
XkbAccessXKeysMask | \
|
||||
XkbAccessXTimeoutMask | \
|
||||
XkbAccessXFeedbackMask | \
|
||||
XkbControlsEnabledMask
|
||||
|
||||
static int _xkb_event_base;
|
||||
|
||||
static XkbDescRec *
|
||||
get_xkb_desc_rec (ClutterBackendX11 *backend_x11)
|
||||
{
|
||||
XkbDescRec *desc;
|
||||
Status status = Success;
|
||||
|
||||
clutter_x11_trap_x_errors ();
|
||||
desc = XkbGetMap (backend_x11->xdpy, XkbAllMapComponentsMask, XkbUseCoreKbd);
|
||||
if (desc != NULL)
|
||||
{
|
||||
desc->ctrls = NULL;
|
||||
status = XkbGetControls (backend_x11->xdpy, XkbAllControlsMask, desc);
|
||||
}
|
||||
clutter_x11_untrap_x_errors ();
|
||||
|
||||
g_return_val_if_fail (desc != NULL, NULL);
|
||||
g_return_val_if_fail (desc->ctrls != NULL, NULL);
|
||||
g_return_val_if_fail (status == Success, NULL);
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
static void
|
||||
set_xkb_desc_rec (ClutterBackendX11 *backend_x11,
|
||||
XkbDescRec *desc)
|
||||
{
|
||||
clutter_x11_trap_x_errors ();
|
||||
XkbSetControls (backend_x11->xdpy, DEFAULT_XKB_SET_CONTROLS_MASK, desc);
|
||||
XSync (backend_x11->xdpy, FALSE);
|
||||
clutter_x11_untrap_x_errors ();
|
||||
}
|
||||
|
||||
static void
|
||||
check_settings_changed (ClutterDeviceManager *device_manager)
|
||||
{
|
||||
ClutterBackendX11 *backend_x11;
|
||||
ClutterKbdA11ySettings kbd_a11y_settings;
|
||||
ClutterKeyboardA11yFlags what_changed = 0;
|
||||
XkbDescRec *desc;
|
||||
|
||||
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
||||
desc = get_xkb_desc_rec (backend_x11);
|
||||
if (!desc)
|
||||
return;
|
||||
|
||||
clutter_device_manager_get_kbd_a11y_settings (device_manager, &kbd_a11y_settings);
|
||||
|
||||
if (desc->ctrls->enabled_ctrls & XkbSlowKeysMask &&
|
||||
!(kbd_a11y_settings.controls & CLUTTER_A11Y_SLOW_KEYS_ENABLED))
|
||||
{
|
||||
what_changed |= CLUTTER_A11Y_SLOW_KEYS_ENABLED;
|
||||
kbd_a11y_settings.controls |= CLUTTER_A11Y_SLOW_KEYS_ENABLED;
|
||||
}
|
||||
else if (!(desc->ctrls->enabled_ctrls & XkbSlowKeysMask) &&
|
||||
kbd_a11y_settings.controls & CLUTTER_A11Y_SLOW_KEYS_ENABLED)
|
||||
{
|
||||
what_changed |= CLUTTER_A11Y_SLOW_KEYS_ENABLED;
|
||||
kbd_a11y_settings.controls &= ~CLUTTER_A11Y_SLOW_KEYS_ENABLED;
|
||||
}
|
||||
|
||||
if (desc->ctrls->enabled_ctrls & XkbStickyKeysMask &&
|
||||
!(kbd_a11y_settings.controls & CLUTTER_A11Y_STICKY_KEYS_ENABLED))
|
||||
{
|
||||
what_changed |= CLUTTER_A11Y_STICKY_KEYS_ENABLED;
|
||||
kbd_a11y_settings.controls |= CLUTTER_A11Y_STICKY_KEYS_ENABLED;
|
||||
}
|
||||
else if (!(desc->ctrls->enabled_ctrls & XkbStickyKeysMask) &&
|
||||
kbd_a11y_settings.controls & CLUTTER_A11Y_STICKY_KEYS_ENABLED)
|
||||
{
|
||||
what_changed |= CLUTTER_A11Y_STICKY_KEYS_ENABLED;
|
||||
kbd_a11y_settings.controls &= ~CLUTTER_A11Y_STICKY_KEYS_ENABLED;
|
||||
}
|
||||
|
||||
if (what_changed)
|
||||
g_signal_emit_by_name (device_manager,
|
||||
"kbd-a11y-flags-changed",
|
||||
kbd_a11y_settings.controls,
|
||||
what_changed);
|
||||
|
||||
XkbFreeKeyboard (desc, XkbAllComponentsMask, TRUE);
|
||||
}
|
||||
|
||||
static ClutterX11FilterReturn
|
||||
xkb_a11y_event_filter (XEvent *xevent,
|
||||
ClutterEvent *clutter_event,
|
||||
gpointer data)
|
||||
{
|
||||
ClutterDeviceManager *device_manager = CLUTTER_DEVICE_MANAGER (data);
|
||||
XkbEvent *xkbev = (XkbEvent *) xevent;
|
||||
|
||||
/* 'event_type' is set to zero on notifying us of updates in
|
||||
* response to client requests (including our own) and non-zero
|
||||
* to notify us of key/mouse events causing changes (like
|
||||
* pressing shift 5 times to enable sticky keys).
|
||||
*
|
||||
* We only want to update out settings when it's in response to an
|
||||
* explicit user input event, so require a non-zero event_type.
|
||||
*/
|
||||
if (xevent->xany.type == (_xkb_event_base + XkbEventCode) &&
|
||||
xkbev->any.xkb_type == XkbControlsNotify && xkbev->ctrls.event_type != 0)
|
||||
check_settings_changed (device_manager);
|
||||
|
||||
return CLUTTER_X11_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_xkb_available (ClutterBackendX11 *backend_x11)
|
||||
{
|
||||
gint opcode, error_base, event_base, major, minor;
|
||||
|
||||
if (_xkb_event_base)
|
||||
return TRUE;
|
||||
|
||||
if (!XkbQueryExtension (backend_x11->xdpy,
|
||||
&opcode,
|
||||
&event_base,
|
||||
&error_base,
|
||||
&major,
|
||||
&minor))
|
||||
return FALSE;
|
||||
|
||||
if (!XkbUseExtension (backend_x11->xdpy, &major, &minor))
|
||||
return FALSE;
|
||||
|
||||
_xkb_event_base = event_base;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
set_value_mask (gboolean flag,
|
||||
unsigned long value,
|
||||
unsigned long mask)
|
||||
{
|
||||
if (flag)
|
||||
return value | mask;
|
||||
|
||||
return value & ~mask;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
set_xkb_ctrl (XkbDescRec *desc,
|
||||
ClutterKeyboardA11yFlags settings,
|
||||
ClutterKeyboardA11yFlags flag,
|
||||
unsigned long mask)
|
||||
{
|
||||
gboolean result = (settings & flag) == flag;
|
||||
desc->ctrls->enabled_ctrls = set_value_mask (result, desc->ctrls->enabled_ctrls, mask);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *kbd_a11y_settings)
|
||||
{
|
||||
ClutterBackendX11 *backend_x11;
|
||||
XkbDescRec *desc;
|
||||
gboolean enable_accessX;
|
||||
|
||||
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
||||
desc = get_xkb_desc_rec (backend_x11);
|
||||
if (!desc)
|
||||
return;
|
||||
|
||||
/* general */
|
||||
enable_accessX = kbd_a11y_settings->controls & CLUTTER_A11Y_KEYBOARD_ENABLED;
|
||||
|
||||
desc->ctrls->enabled_ctrls = set_value_mask (enable_accessX,
|
||||
desc->ctrls->enabled_ctrls,
|
||||
XkbAccessXKeysMask);
|
||||
|
||||
if (set_xkb_ctrl (desc, kbd_a11y_settings->controls, CLUTTER_A11Y_TIMEOUT_ENABLED,
|
||||
XkbAccessXTimeoutMask))
|
||||
{
|
||||
desc->ctrls->ax_timeout = kbd_a11y_settings->timeout_delay;
|
||||
/* disable only the master flag via the server we will disable
|
||||
* the rest on the rebound without affecting settings state
|
||||
* don't change the option flags at all.
|
||||
*/
|
||||
desc->ctrls->axt_ctrls_mask = XkbAccessXKeysMask | XkbAccessXFeedbackMask;
|
||||
desc->ctrls->axt_ctrls_values = 0;
|
||||
desc->ctrls->axt_opts_mask = 0;
|
||||
}
|
||||
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP,
|
||||
desc->ctrls->ax_options,
|
||||
XkbAccessXFeedbackMask | XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask);
|
||||
|
||||
/* bounce keys */
|
||||
if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
|
||||
CLUTTER_A11Y_BOUNCE_KEYS_ENABLED, XkbBounceKeysMask))
|
||||
{
|
||||
desc->ctrls->debounce_delay = kbd_a11y_settings->debounce_delay;
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT,
|
||||
desc->ctrls->ax_options,
|
||||
XkbAccessXFeedbackMask | XkbAX_BKRejectFBMask);
|
||||
}
|
||||
|
||||
/* mouse keys */
|
||||
if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
|
||||
CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask))
|
||||
{
|
||||
gint mk_max_speed;
|
||||
gint mk_accel_time;
|
||||
|
||||
desc->ctrls->mk_interval = 100; /* msec between mousekey events */
|
||||
desc->ctrls->mk_curve = 50;
|
||||
|
||||
/* We store pixels / sec, XKB wants pixels / event */
|
||||
mk_max_speed = kbd_a11y_settings->mousekeys_max_speed;
|
||||
desc->ctrls->mk_max_speed = mk_max_speed / (1000 / desc->ctrls->mk_interval);
|
||||
if (desc->ctrls->mk_max_speed <= 0)
|
||||
desc->ctrls->mk_max_speed = 1;
|
||||
|
||||
mk_accel_time = kbd_a11y_settings->mousekeys_accel_time;
|
||||
desc->ctrls->mk_time_to_max = mk_accel_time / desc->ctrls->mk_interval;
|
||||
|
||||
if (desc->ctrls->mk_time_to_max <= 0)
|
||||
desc->ctrls->mk_time_to_max = 1;
|
||||
|
||||
desc->ctrls->mk_delay = kbd_a11y_settings->mousekeys_init_delay;
|
||||
}
|
||||
|
||||
/* slow keys */
|
||||
if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
|
||||
CLUTTER_A11Y_SLOW_KEYS_ENABLED, XkbSlowKeysMask))
|
||||
{
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS,
|
||||
desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_SKPressFBMask);
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT,
|
||||
desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_SKAcceptFBMask);
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT,
|
||||
desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_SKRejectFBMask);
|
||||
desc->ctrls->slow_keys_delay = kbd_a11y_settings->slowkeys_delay;
|
||||
/* anything larger than 500 seems to loose all keyboard input */
|
||||
if (desc->ctrls->slow_keys_delay > 500)
|
||||
desc->ctrls->slow_keys_delay = 500;
|
||||
}
|
||||
|
||||
/* sticky keys */
|
||||
if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
|
||||
CLUTTER_A11Y_STICKY_KEYS_ENABLED, XkbStickyKeysMask))
|
||||
{
|
||||
desc->ctrls->ax_options |= XkbAX_LatchToLockMask;
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF,
|
||||
desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_TwoKeysMask);
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_STICKY_KEYS_BEEP,
|
||||
desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_StickyKeysFBMask);
|
||||
}
|
||||
|
||||
/* toggle keys */
|
||||
desc->ctrls->ax_options =
|
||||
set_value_mask (kbd_a11y_settings->controls & CLUTTER_A11Y_TOGGLE_KEYS_ENABLED,
|
||||
desc->ctrls->ax_options, XkbAccessXFeedbackMask | XkbAX_IndicatorFBMask);
|
||||
|
||||
set_xkb_desc_rec (backend_x11, desc);
|
||||
XkbFreeKeyboard (desc, XkbAllComponentsMask, TRUE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_device_manager_x11_a11y_init (ClutterDeviceManager *device_manager)
|
||||
{
|
||||
ClutterBackendX11 *backend_x11;
|
||||
guint event_mask;
|
||||
|
||||
backend_x11 =
|
||||
CLUTTER_BACKEND_X11 (_clutter_device_manager_get_backend (device_manager));
|
||||
|
||||
if (!is_xkb_available (backend_x11))
|
||||
return FALSE;
|
||||
|
||||
event_mask = XkbControlsNotifyMask | XkbAccessXNotifyMask;
|
||||
|
||||
XkbSelectEvents (backend_x11->xdpy, XkbUseCoreKbd, event_mask, event_mask);
|
||||
|
||||
clutter_x11_add_filter (xkb_a11y_event_filter, device_manager);
|
||||
|
||||
return TRUE;
|
||||
}
|
39
clutter/clutter/x11/clutter-xkb-a11y-x11.h
Normal file
39
clutter/clutter/x11/clutter-xkb-a11y-x11.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
*
|
||||
* Copyright © 2001 Ximian, Inc.
|
||||
* Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CLUTTER_XKB_A11Y_X11_H
|
||||
#define CLUTTER_XKB_A11Y_X11_H
|
||||
|
||||
#include "clutter-device-manager-private.h"
|
||||
#include "clutter-backend-x11.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
void
|
||||
clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *device_manager,
|
||||
ClutterKbdA11ySettings *kbd_a11y_settings);
|
||||
|
||||
gboolean
|
||||
clutter_device_manager_x11_a11y_init (ClutterDeviceManager *device_manager);
|
||||
|
||||
#endif /* CLUTTER_XKB_A11Y_X11_H */
|
@@ -407,7 +407,8 @@ test_scale_center (TestState *state)
|
||||
g_assert (scale_x == 4.0);
|
||||
g_assert (scale_y == 2.0);
|
||||
g_assert (gravity == CLUTTER_GRAVITY_NONE);
|
||||
assert_notifications (NOTIFY_SCALE_CENTER_X | NOTIFY_SCALE_CENTER_Y
|
||||
assert_notifications (NOTIFY_SCALE_X | NOTIFY_SCALE_Y
|
||||
| NOTIFY_SCALE_CENTER_X | NOTIFY_SCALE_CENTER_Y
|
||||
| NOTIFY_SCALE_GRAVITY);
|
||||
assert_coords (state, 100 + 10 - 10 * 4, 200 + 20 - 20 * 2,
|
||||
100 + 10 + (RECT_WIDTH - 10) * 4,
|
||||
|
@@ -43,6 +43,7 @@
|
||||
#include <cogl/winsys/cogl-winsys-private.h>
|
||||
|
||||
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||
CoglCustomWinsysVtableGetter winsys_vtable_getter);
|
||||
CoglCustomWinsysVtableGetter winsys_vtable_getter,
|
||||
void *user_data);
|
||||
|
||||
#endif /* __COGL_MUTTER_H___ */
|
||||
|
@@ -54,6 +54,7 @@ struct _CoglRenderer
|
||||
const CoglDriverVtable *driver_vtable;
|
||||
const CoglTextureDriver *texture_driver;
|
||||
const CoglWinsysVtable *winsys_vtable;
|
||||
void *custom_winsys_user_data;
|
||||
CoglCustomWinsysVtableGetter custom_winsys_vtable_getter;
|
||||
CoglWinsysID winsys_id_override;
|
||||
GList *constraints;
|
||||
|
@@ -566,8 +566,10 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
|
||||
|
||||
void
|
||||
cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||
CoglCustomWinsysVtableGetter winsys_vtable_getter)
|
||||
CoglCustomWinsysVtableGetter winsys_vtable_getter,
|
||||
void *user_data)
|
||||
{
|
||||
renderer->custom_winsys_user_data = user_data;
|
||||
renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
|
||||
}
|
||||
|
||||
|
33
configure.ac
33
configure.ac
@@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.62)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [26])
|
||||
m4_define([mutter_micro_version], [0])
|
||||
m4_define([mutter_minor_version], [27])
|
||||
m4_define([mutter_micro_version], [1])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@@ -80,6 +80,7 @@ CANBERRA_GTK_VERSION=0.26
|
||||
LIBWACOM_VERSION=0.13
|
||||
|
||||
MUTTER_PC_MODULES="
|
||||
gl
|
||||
egl
|
||||
gtk+-3.0 >= 3.19.8
|
||||
gio-unix-2.0 >= 2.35.1
|
||||
@@ -104,6 +105,7 @@ MUTTER_PC_MODULES="
|
||||
xcb-randr
|
||||
xcb-res
|
||||
"
|
||||
XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="gnome-boxes,remote-viewer,virt-viewer,virt-manager,vinagre,vncviewer,Xephyr"
|
||||
|
||||
GLIB_GSETTINGS
|
||||
|
||||
@@ -239,12 +241,15 @@ else
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(remote-desktop,
|
||||
AS_HELP_STRING([--enable-remote-desktop], [enable support for remote desktop and screen cast]),
|
||||
enable_remote_desktop=yes,
|
||||
AS_HELP_STRING([--enable-remote-desktop], [enable support for remote desktop and screen cast]),,
|
||||
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])
|
||||
])
|
||||
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"])
|
||||
@@ -278,8 +283,7 @@ AS_IF([test "$have_native_backend" = "yes"], [
|
||||
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"])
|
||||
|
||||
AC_ARG_ENABLE(egl-device,
|
||||
AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),
|
||||
enable_egl_device=yes,
|
||||
AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),,
|
||||
enable_egl_device=no
|
||||
)
|
||||
AS_IF([test "$enable_egl_device" = "yes"], [
|
||||
@@ -303,12 +307,27 @@ AS_IF([test "$have_wayland" = "yes"], [
|
||||
AC_SUBST([WAYLAND_SCANNER])
|
||||
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
|
||||
|
||||
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.9],
|
||||
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.10],
|
||||
[ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
|
||||
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
|
||||
])
|
||||
AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"])
|
||||
|
||||
AC_ARG_WITH([xwayland-grab-default-access-rules],
|
||||
[AS_HELP_STRING([--with-xwayland-grab-default-access-rules="app-res1,app-res2,..."],
|
||||
[comma delimited list of applications ressources or class allowed to issue X11 grabs in Xwayland"])],
|
||||
[with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="$withval"],
|
||||
[with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="$XWAYLAND_GRAB_DEFAULT_ACCESS_RULES"])
|
||||
|
||||
case "$with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES" in
|
||||
yes) with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES="$XWAYLAND_GRAB_DEFAULT_ACCESS_RULES" ;;
|
||||
no) with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES='' ;;
|
||||
esac
|
||||
AC_DEFINE_UNQUOTED([XWAYLAND_GRAB_DEFAULT_ACCESS_RULES],
|
||||
"$with_XWAYLAND_GRAB_DEFAULT_ACCESS_RULES",
|
||||
[Xwayland applications allowed to issue keyboard grabs])
|
||||
AC_SUBST(XWAYLAND_GRAB_DEFAULT_ACCESS_RULES)
|
||||
|
||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
||||
|
||||
|
10
data/50-mutter-wayland.xml
Normal file
10
data/50-mutter-wayland.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries schema="org.gnome.mutter.wayland.keybindings"
|
||||
group="system"
|
||||
name="System"
|
||||
wm_name="Mutter"
|
||||
package="mutter">
|
||||
|
||||
<KeyListEntry name="restore-shortcuts" description="Restore the keyboard shortcuts"/>
|
||||
|
||||
</KeyListEntries>
|
@@ -12,6 +12,11 @@ xml_DATA = \
|
||||
50-mutter-system.xml \
|
||||
50-mutter-windows.xml
|
||||
|
||||
if HAVE_WAYLAND
|
||||
xml_DATA += \
|
||||
50-mutter-wayland.xml
|
||||
endif
|
||||
|
||||
gschema_in_files = \
|
||||
org.gnome.mutter.gschema.xml.in \
|
||||
org.gnome.mutter.wayland.gschema.xml.in
|
||||
@@ -19,6 +24,7 @@ gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
|
||||
|
||||
%.gschema.xml: %.gschema.xml.in Makefile
|
||||
$(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_PACKAGE)|g' \
|
||||
-e 's|@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES[@]|$(XWAYLAND_GRAB_DEFAULT_ACCESS_RULES)|g' \
|
||||
$< > $@ || rm $@
|
||||
|
||||
@GSETTINGS_RULES@
|
||||
|
@@ -50,8 +50,52 @@
|
||||
<summary>Switch to VT 12</summary>
|
||||
</key>
|
||||
<key name="restore-shortcuts" type="as">
|
||||
<default><![CDATA[['<Shift><Control>Escape']]]></default>
|
||||
<default><![CDATA[['<Super>Escape']]]></default>
|
||||
<summary>Re-enable shortcuts</summary>
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
|
||||
<schema id="org.gnome.mutter.wayland" path="/org/gnome/mutter/wayland/"
|
||||
gettext-domain="@GETTEXT_DOMAIN@">
|
||||
|
||||
<key name="xwayland-allow-grabs" type="b">
|
||||
<default>false</default>
|
||||
<summary>Allow grabs with Xwayland</summary>
|
||||
<description>
|
||||
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”.
|
||||
</description>
|
||||
</key>
|
||||
|
||||
<key name="xwayland-grab-access-rules" type="as">
|
||||
<default>[]</default>
|
||||
<summary>Xwayland applications allowed to issue keyboard grabs</summary>
|
||||
<description>
|
||||
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”.
|
||||
</description>
|
||||
</key>
|
||||
|
||||
</schema>
|
||||
|
||||
</schemalist>
|
||||
|
@@ -2,6 +2,7 @@
|
||||
# Please keep this file sorted alphabetically.
|
||||
data/50-mutter-navigation.xml
|
||||
data/50-mutter-system.xml
|
||||
data/50-mutter-wayland.xml
|
||||
data/50-mutter-windows.xml
|
||||
data/mutter.desktop.in
|
||||
data/org.gnome.mutter.gschema.xml.in
|
||||
|
771
po/ar.po
771
po/ar.po
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: metacity.HEAD\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
|
||||
"keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-06-18 21:26+0200\n"
|
||||
"PO-Revision-Date: 2017-06-18 21:27+0200\n"
|
||||
"POT-Creation-Date: 2017-11-03 10:20+0200\n"
|
||||
"PO-Revision-Date: 2017-11-03 10:22+0200\n"
|
||||
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
|
||||
"Language-Team: Arabic <doc@arabeyes.org>\n"
|
||||
"Language: ar\n"
|
||||
@@ -24,448 +24,10 @@ msgstr ""
|
||||
"X-Generator: Virtaal 1.0.0-beta1\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
msgstr "الإبحار"
|
||||
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى اليسار"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى اليمين"
|
||||
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
|
||||
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
|
||||
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
msgid "Switch applications"
|
||||
msgstr "تنقل بين التطبيقات"
|
||||
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
msgid "Switch to previous application"
|
||||
msgstr "انتقل إلى التطبيق السابق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
msgid "Switch windows"
|
||||
msgstr "تنقل بين النوافذ"
|
||||
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
msgid "Switch to previous window"
|
||||
msgstr "انتقل إلى النافذة السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "تنقل بين نوافذ التطبيق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "انتقل إلى نافذة التطبيق السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
msgid "Switch system controls"
|
||||
msgstr "تنقل بين تحكمات النظام"
|
||||
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "انتقل إلى تحكم النظام السابق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
msgid "Switch windows directly"
|
||||
msgstr "تنقل مباشرة بين النوافذ"
|
||||
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "انتقل مباشرة إلى النافذة السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "تنقل مباشرة بين نوافذ التطبيق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "تنقل مباشرة بين تحكمات النظام"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "انتقل مباشرة إلى تحكم النظام السابق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "أخفِ كل النوافذ العادية"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "انتقل إلى مساحة العمل الأخيرة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "انقل لمساحة العمل على اليسار"
|
||||
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "انقل لمساحة العمل على اليمين"
|
||||
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
msgid "Move to workspace above"
|
||||
msgstr "انقل لمساحة العمل أعلى"
|
||||
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
msgid "Move to workspace below"
|
||||
msgstr "انقل لمساحة العمل أسفل"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
msgid "System"
|
||||
msgstr "النظام"
|
||||
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "أظهر محث تشغيل أمر"
|
||||
|
||||
#: data/50-mutter-system.xml:10
|
||||
msgid "Show the activities overview"
|
||||
msgstr "أظهر نظرة عامة على الأنشطة"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "النوافذ"
|
||||
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "فعّل قائمة النافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "بدّل نمط ملء الشاشة"
|
||||
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "بدّل حالة التكبير"
|
||||
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "كبّر النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "استعد النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "بدّل حالة الإخفاء"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "أغلق النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Hide window"
|
||||
msgstr "أخفِ النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Move window"
|
||||
msgstr "انقل النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:26
|
||||
msgid "Resize window"
|
||||
msgstr "حجّم النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "ارفع النافذة فوق النوافذ الأخرى"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "اخفض النافذة تحت النوافذ الأخرى"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "كبّر النافذة رأسيا"
|
||||
|
||||
#: data/50-mutter-windows.xml:39
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "كبّر النافذة أفقيا"
|
||||
|
||||
#: data/50-mutter-windows.xml:43
|
||||
msgid "View split on left"
|
||||
msgstr "المنظور مقسوم على اليمين"
|
||||
|
||||
#: data/50-mutter-windows.xml:47
|
||||
msgid "View split on right"
|
||||
msgstr "المنظور مقسوم على اليسار"
|
||||
|
||||
#: data/mutter.desktop.in:4
|
||||
msgid "Mutter"
|
||||
msgstr "مَتَر"
|
||||
|
||||
#: 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: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."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: 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:30
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
|
||||
#: 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:40
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there’s a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr ""
|
||||
|
||||
#: 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:59
|
||||
msgid "No tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: 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:68
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:69
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either “sloppy” or “mouse” then the "
|
||||
"focus will not be changed immediately when entering a window, but only after "
|
||||
"the pointer stops moving."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
msgid "Draggable border width"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:80
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme’s visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:89
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr ""
|
||||
|
||||
#: 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:98
|
||||
msgid "Place new windows in the center"
|
||||
msgstr ""
|
||||
|
||||
#: 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: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: • “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."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
msgid "Select window from tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
msgid "Cancel tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "انتقل إلى مساحة العمل 5"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "انتقل إلى مساحة العمل 6"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "انتقل إلى مساحة العمل 7"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "انتقل إلى مساحة العمل 8"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "انتقل إلى مساحة العمل 9"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "انتقل إلى مساحة العمل 10"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "انتقل إلى مساحة العمل 11"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "انتقل إلى مساحة العمل 12"
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1866
|
||||
#: ../src/backends/meta-input-settings.c:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr ""
|
||||
@@ -473,113 +35,113 @@ msgstr ""
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1888
|
||||
#: ../src/backends/meta-input-settings.c:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "غيّر الشاشة"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1890
|
||||
#: ../src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr ""
|
||||
msgstr "اعرض المساعدة على الشاشة"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:879
|
||||
#: ../src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "شاشة مدمجة"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:902
|
||||
#: ../src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "غير معروفة"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:904
|
||||
#: ../src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "شاشة غير معروفة"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:912
|
||||
#: ../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
|
||||
#, fuzzy, c-format
|
||||
#: ../src/compositor/compositor.c:476
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr "يعمل مدير مزج آخر على الشاشة %i والعرض \"%s\"."
|
||||
msgstr "يعمل مدير مزج آخر على الشاشة %i و العرض ”%s“."
|
||||
|
||||
#: src/core/bell.c:194
|
||||
#: ../src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "حدث جرس"
|
||||
|
||||
#: src/core/display.c:608
|
||||
#, fuzzy, c-format
|
||||
#: ../src/core/display.c:608
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "فشل فتح عرض نظام نوافذ إكس '%s'\n"
|
||||
msgstr "فشل فتح عرض نظام نوافذ إكس ”%s“\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
#: ../src/core/main.c:189
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "عطّل الاتصال بمدير الجلسة"
|
||||
|
||||
#: src/core/main.c:195
|
||||
#: ../src/core/main.c:195
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "استبدل بمدير النوافذ الذي يعمل"
|
||||
|
||||
#: src/core/main.c:201
|
||||
#: ../src/core/main.c:201
|
||||
msgid "Specify session management ID"
|
||||
msgstr "حدّد رقم هويّة إدارة الجلسة"
|
||||
|
||||
#: src/core/main.c:206
|
||||
#: ../src/core/main.c:206
|
||||
msgid "X Display to use"
|
||||
msgstr "معراض س الذي سيستعمل"
|
||||
|
||||
#: src/core/main.c:212
|
||||
#: ../src/core/main.c:212
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "ابدأ الجلسة من ملف محفوظ"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: ../src/core/main.c:218
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "اجعل نداءات س متزامنة"
|
||||
|
||||
#: src/core/main.c:225
|
||||
#: ../src/core/main.c:225
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr ""
|
||||
|
||||
#: src/core/main.c:231
|
||||
#: ../src/core/main.c:231
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr ""
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: ../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
|
||||
#: ../src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "”%s“ لا يستجيب."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:149
|
||||
#: ../src/core/meta-close-dialog-default.c:149
|
||||
msgid "Application is not responding."
|
||||
msgstr "لا يستجيب التطبيق"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:154
|
||||
#: ../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 "ربما ترغب في الانتظار قليلا ليُكمِل أو إجبار التطبيق على الإنهاء كُلّية."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
#: ../src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Force Quit"
|
||||
msgstr "أ_جبر الإنهاء"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
#: ../src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Wait"
|
||||
msgstr "ا_نتظر"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#, fuzzy, c-format
|
||||
#: ../src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
@@ -592,56 +154,289 @@ msgstr ""
|
||||
"هذا برنامج حر، راجع المصدر لشروط النسخ.\n"
|
||||
"لا يوجد أي ضمان: و لا حتى ضمان قابلية التسويق أو المناسبة لأي هدف.\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
#: ../src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "اطبع الإصدارة"
|
||||
|
||||
#: src/core/mutter.c:59
|
||||
#: ../src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "ملحق مَتَر الذي سيُستخدم"
|
||||
|
||||
#: src/core/prefs.c:1997
|
||||
#: ../src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "مساحة العمل %d"
|
||||
|
||||
#: src/core/screen.c:580
|
||||
#, fuzzy, c-format
|
||||
#: ../src/core/screen.c:583
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
msgstr ""
|
||||
"الشاشة \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace "
|
||||
"لتحُلّ محلّ مدير النوافذ الحالي."
|
||||
"الشاشة ”%s“ لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace لتحُلّ"
|
||||
" محلّ مدير النوافذ الحالي."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#, fuzzy, c-format
|
||||
#: ../src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "الشاشة %d على العرض '%s' غير صحيحة\n"
|
||||
msgstr "الشاشة %d على العرض ”%s“ غير صحيحة\n"
|
||||
|
||||
#: src/core/util.c:120
|
||||
#: ../src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "جُمِّع مَتَر دون دعم للنمط المطنب\n"
|
||||
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:563
|
||||
#: ../src/wayland/meta-wayland-tablet-pad.c:563
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr ""
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
#, fuzzy
|
||||
#: ../src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
msgstr ""
|
||||
"هذه النوافذ لا تدعم "احفظ الضبط الحالي" يجب إعادة تشغيلها يدويا "
|
||||
"عند الولوج المرة القادمة."
|
||||
"هذه النوافذ لا تدعم ” الضبط الحالي" إعادة تشغيلها يدويا عند الولوج "
|
||||
"المرة القادمة."
|
||||
|
||||
#: src/x11/window-props.c:559
|
||||
#: ../src/x11/window-props.c:559
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (على %s)"
|
||||
|
||||
#~ msgid "Navigation"
|
||||
#~ msgstr "الإبحار"
|
||||
|
||||
#~ msgid "Move window to workspace 1"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 1"
|
||||
|
||||
#~ msgid "Move window to workspace 2"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 2"
|
||||
|
||||
#~ msgid "Move window to workspace 3"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 3"
|
||||
|
||||
#~ msgid "Move window to workspace 4"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 4"
|
||||
|
||||
#~ msgid "Move window to last workspace"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين"
|
||||
|
||||
#~ msgid "Move window one workspace up"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
|
||||
|
||||
#~ msgid "Move window one workspace down"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
|
||||
|
||||
#~ msgid "Move window one monitor to the left"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى اليسار"
|
||||
|
||||
#~ msgid "Move window one monitor to the right"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى اليمين"
|
||||
|
||||
#~ msgid "Move window one monitor up"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
|
||||
|
||||
#~ msgid "Move window one monitor down"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
|
||||
|
||||
#~ msgid "Switch applications"
|
||||
#~ msgstr "تنقل بين التطبيقات"
|
||||
|
||||
#~ msgid "Switch to previous application"
|
||||
#~ msgstr "انتقل إلى التطبيق السابق"
|
||||
|
||||
#~ msgid "Switch windows"
|
||||
#~ msgstr "تنقل بين النوافذ"
|
||||
|
||||
#~ msgid "Switch to previous window"
|
||||
#~ msgstr "انتقل إلى النافذة السابقة"
|
||||
|
||||
#~ msgid "Switch windows of an application"
|
||||
#~ msgstr "تنقل بين نوافذ التطبيق"
|
||||
|
||||
#~ msgid "Switch to previous window of an application"
|
||||
#~ msgstr "انتقل إلى نافذة التطبيق السابقة"
|
||||
|
||||
#~ msgid "Switch system controls"
|
||||
#~ msgstr "تنقل بين تحكمات النظام"
|
||||
|
||||
#~ msgid "Switch to previous system control"
|
||||
#~ msgstr "انتقل إلى تحكم النظام السابق"
|
||||
|
||||
#~ msgid "Switch windows directly"
|
||||
#~ msgstr "تنقل مباشرة بين النوافذ"
|
||||
|
||||
#~ msgid "Switch directly to previous window"
|
||||
#~ msgstr "انتقل مباشرة إلى النافذة السابقة"
|
||||
|
||||
#~ msgid "Switch windows of an app directly"
|
||||
#~ msgstr "تنقل مباشرة بين نوافذ التطبيق"
|
||||
|
||||
#~ msgid "Switch directly to previous window of an app"
|
||||
#~ msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
|
||||
|
||||
#~ msgid "Switch system controls directly"
|
||||
#~ msgstr "تنقل مباشرة بين تحكمات النظام"
|
||||
|
||||
#~ msgid "Switch directly to previous system control"
|
||||
#~ msgstr "انتقل مباشرة إلى تحكم النظام السابق"
|
||||
|
||||
#~ msgid "Hide all normal windows"
|
||||
#~ msgstr "أخفِ كل النوافذ العادية"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#~ msgid "Switch to workspace 2"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#~ msgid "Switch to workspace 3"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#~ msgid "Switch to workspace 4"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#~ msgid "Switch to last workspace"
|
||||
#~ msgstr "انتقل إلى مساحة العمل الأخيرة"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "انقل لمساحة العمل على اليسار"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "انقل لمساحة العمل على اليمين"
|
||||
|
||||
#~ msgid "Move to workspace above"
|
||||
#~ msgstr "انقل لمساحة العمل أعلى"
|
||||
|
||||
#~ msgid "Move to workspace below"
|
||||
#~ msgstr "انقل لمساحة العمل أسفل"
|
||||
|
||||
#~ msgid "System"
|
||||
#~ msgstr "النظام"
|
||||
|
||||
#~ msgid "Show the run command prompt"
|
||||
#~ msgstr "أظهر محث تشغيل أمر"
|
||||
|
||||
#~ msgid "Show the activities overview"
|
||||
#~ msgstr "أظهر نظرة عامة على الأنشطة"
|
||||
|
||||
#~ msgid "Windows"
|
||||
#~ msgstr "النوافذ"
|
||||
|
||||
#~ msgid "Activate the window menu"
|
||||
#~ msgstr "فعّل قائمة النافذة"
|
||||
|
||||
#~ msgid "Toggle fullscreen mode"
|
||||
#~ msgstr "بدّل نمط ملء الشاشة"
|
||||
|
||||
#~ msgid "Toggle maximization state"
|
||||
#~ msgstr "بدّل حالة التكبير"
|
||||
|
||||
#~ msgid "Maximize window"
|
||||
#~ msgstr "كبّر النّافذة"
|
||||
|
||||
#~ msgid "Restore window"
|
||||
#~ msgstr "استعد النّافذة"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "بدّل حالة الإخفاء"
|
||||
|
||||
#~ msgid "Close window"
|
||||
#~ msgstr "أغلق النّافذة"
|
||||
|
||||
#~ msgid "Hide window"
|
||||
#~ msgstr "أخفِ النّافذة"
|
||||
|
||||
#~ msgid "Move window"
|
||||
#~ msgstr "انقل النّافذة"
|
||||
|
||||
#~ msgid "Resize window"
|
||||
#~ msgstr "حجّم النّافذة"
|
||||
|
||||
#~ msgid "Toggle window on all workspaces or one"
|
||||
#~ msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
|
||||
|
||||
#~ msgid "Raise window if covered, otherwise lower it"
|
||||
#~ msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
|
||||
|
||||
#~ msgid "Raise window above other windows"
|
||||
#~ msgstr "ارفع النافذة فوق النوافذ الأخرى"
|
||||
|
||||
#~ msgid "Lower window below other windows"
|
||||
#~ msgstr "اخفض النافذة تحت النوافذ الأخرى"
|
||||
|
||||
#~ msgid "Maximize window vertically"
|
||||
#~ msgstr "كبّر النافذة رأسيا"
|
||||
|
||||
#~ msgid "Maximize window horizontally"
|
||||
#~ msgstr "كبّر النافذة أفقيا"
|
||||
|
||||
#~ msgid "View split on left"
|
||||
#~ msgstr "المنظور مقسوم على اليمين"
|
||||
|
||||
#~ msgid "View split on right"
|
||||
#~ msgstr "المنظور مقسوم على اليسار"
|
||||
|
||||
#~ msgid "Mutter"
|
||||
#~ msgstr "مَتَر"
|
||||
|
||||
#~ msgid "Modifier to use for extended window management operations"
|
||||
#~ msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ "
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 1"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 2"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 3"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 4"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 5"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 5"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 6"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 6"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 7"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 7"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 8"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 8"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 9"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 9"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 10"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 10"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 11"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 11"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 12"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 12"
|
||||
|
||||
#~ msgid "Unknown window information request: %d"
|
||||
#~ msgstr "طلب معلومات نافذة مجهول: %d"
|
||||
|
||||
|
1663
po/ca@valencia.po
1663
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
30
po/cs.po
30
po/cs.po
@@ -13,10 +13,10 @@ 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-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-08-31 00:11+0200\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:16+0000\n"
|
||||
"PO-Revision-Date: 2017-11-15 13:31+0100\n"
|
||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||
"Language-Team: čeština <gnome-cs-list@gnome.org>>\n"
|
||||
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -177,7 +177,7 @@ msgstr "Přesunout na plochu nad"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Přesunout na plochu pod"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Systém"
|
||||
|
||||
@@ -189,6 +189,10 @@ msgstr "Zobrazit řádek ke spuštění příkazu"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Zobrazit přehled činností"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Obnovit klávesové zkratky"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Okna"
|
||||
@@ -502,7 +506,7 @@ msgstr "Znovu povolit klávesové zkratky"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Přepínač režimu (skupina %d)"
|
||||
@@ -510,30 +514,30 @@ msgstr "Přepínač režimu (skupina %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:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Přepnout monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Zobrazit nápovědu na obrazovce"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Vestavěný displej"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Neznámý"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Neznámý displej"
|
||||
|
||||
#. 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"
|
||||
@@ -646,7 +650,7 @@ msgstr "Zásuvný modul Mutter, který se má použít"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Plocha %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 "
|
||||
@@ -655,7 +659,7 @@ msgstr ""
|
||||
"Displej „%s“ již správce oken má; zkuste prosím nahradit aktuálního správce "
|
||||
"oken pomocí přepínače --replace."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Obrazovka %d na displeji „%s“ je neplatná\n"
|
||||
|
32
po/de.po
32
po/de.po
@@ -13,16 +13,16 @@ 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-08-30 17:07+0200\n"
|
||||
"Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-11 17:57+0100\n"
|
||||
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"X-Generator: Poedit 2.0.4\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -176,7 +176,7 @@ msgstr "Auf Arbeitsfläche darüber verschieben"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Auf Arbeitsfläche darunter verschieben"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
@@ -188,6 +188,10 @@ msgstr "Den »Befehl ausführen«-Dialog anzeigen"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Aktivitäten-Übersicht anzeigen"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Die Tastenkombinationen wiederherstellen"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Fenster"
|
||||
@@ -512,7 +516,7 @@ msgstr "Tastenkombinationen erneut aktivieren"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Moduswechsel (Gruppe %d)"
|
||||
@@ -520,30 +524,30 @@ msgstr "Moduswechsel (Gruppe %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:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Bildschirm wechseln"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Bildschirmhilfe anzeigen"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Eingebaute Anzeige"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
msgid "Unknown Display"
|
||||
msgstr "Unbekannte Anzeige"
|
||||
|
||||
#. 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:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -660,7 +664,7 @@ msgstr "Zu benutzendes Mutter-Plugin"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeitsfläche %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 "
|
||||
@@ -669,7 +673,7 @@ msgstr ""
|
||||
"Bildschirm »%s« hat bereits einen Fensterverwalter. Versuchen Sie die Option "
|
||||
"»--replace«, um den aktuellen Fensterverwalter zu ersetzen."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n"
|
||||
|
80
po/es.po
80
po/es.po
@@ -14,8 +14,8 @@ 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-02 10:05+0000\n"
|
||||
"PO-Revision-Date: 2017-08-03 09:59+0200\n"
|
||||
"POT-Creation-Date: 2017-11-17 16:03+0000\n"
|
||||
"PO-Revision-Date: 2017-12-14 13:02+0100\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: es <gnome-es-list@gnome.org>\n"
|
||||
"Language: es\n"
|
||||
@@ -177,7 +177,7 @@ msgstr "Mover al área de trabajo de la arriba"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Mover al área de trabajo de abajo"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
@@ -189,6 +189,10 @@ msgstr "Mostrar el elemento «ejecutar comando»"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Mostrar la vista de actividades"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Restaurar los atajos de teclado"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Ventanas"
|
||||
@@ -414,49 +418,59 @@ msgid "Enable experimental features"
|
||||
msgstr "Activar las características experimentales"
|
||||
|
||||
#: 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 "
|
||||
"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 ""
|
||||
"Para activar las características experimentales, añada la palabra clave de "
|
||||
"la característica a la lista. Depende de la característica que se deba "
|
||||
"reiniciar o no el compositor. Cualquier característica experimental puede no "
|
||||
"estar disponible o ser configurable. No espere que lo que se añada en este "
|
||||
"escenario sirva como prueba futura. Las palabras clave actualmente "
|
||||
"disponibles son: • \"monitor-config-manager\" - utiliza el nuevo sistema de "
|
||||
"configuración del monitor, destinado a sustituir el antiguo. Esto permite "
|
||||
"que las aplicaciones de configuración usen una API de configuración de nivel "
|
||||
"superior, así como la capacidad de configurar el escalado de monitores "
|
||||
"lógicos. • \"scale-monitor-framebuffer\" - convierte a mutter en ña manera "
|
||||
"predeterminada de disponer monitores lógicos en un espacio lógico de "
|
||||
"disponibles son: • \"scale-monitor-framebuffer\" - convierte a mutter en la "
|
||||
"manera predeterminada de disponer monitores lógicos en un espacio lógico de "
|
||||
"coordenadas de píxeles, al escalar framebuffers de monitores framebuffers en "
|
||||
"lugar del contenido de ventana, para administrar monitores HiDPI. No "
|
||||
"requiere un reinicio. También es necesario activar \"monitor-config-manager"
|
||||
"\" para activar esta función."
|
||||
"requiere un reinicio. • \"remote-desktop\" — activa el escritorio remoto. "
|
||||
"Para soportarlo con compartición de pantalla es necesario activar \"screen-"
|
||||
"cast\" • \"screen-cast\" — activa el soporte de compartición de pantalla."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Seleccionar ventana de la pestaña emergente"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Cancelar pestaña emergente"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:161
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Cambiar la configuración del monitor"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:166
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "Rota la configuración del monitor empotrado"
|
||||
|
||||
@@ -515,7 +529,7 @@ msgstr "Volver a activar los atajos"
|
||||
#. 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 "Cambiar modo (grupo %d)"
|
||||
@@ -523,37 +537,37 @@ msgstr "Cambiar modo (grupo %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 "Cambiar monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2143
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostrar la ayuda en pantalla"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:927
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Pantalla integrada"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:950
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:952
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Pantalla desconocida"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:960
|
||||
#: 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:479
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@@ -661,7 +675,7 @@ msgstr "Complemento de mutter que usar"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Área de trabajo %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 "
|
||||
@@ -670,7 +684,7 @@ msgstr ""
|
||||
"La pantalla «%s» ya tiene un gestor de ventanas; pruebe a usar la opción «--"
|
||||
"replace» para reemplazar el gestor de ventanas activo."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "La ventana %d en la pantalla «%s» no es válida\n"
|
||||
|
75
po/fr.po
75
po/fr.po
@@ -13,23 +13,24 @@
|
||||
# Stéphane Raimbault <stephane.raimbault@gmail.com>, 2007.
|
||||
# Claude Paroz <claude@2xlibre.net>, 2008-2017.
|
||||
# Bruno Brouard <annoa.b@gmail.com>, 2011-12.
|
||||
# Charles Monzat <superboa@hotmail.fr>, 2016.
|
||||
# Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>, 2017.
|
||||
# Charles Monzat <superboa@hotmail.fr>, 2016, 2017.
|
||||
#
|
||||
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 10:52+0100\n"
|
||||
"Last-Translator: Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>\n"
|
||||
"Language-Team: French <traduc@traduc.org>\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 23:07+0100\n"
|
||||
"Last-Translator: Charles Monzat <superboa@hotmail.fr>\n"
|
||||
"Language-Team: français <gnomefr@traduc.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Lokalize 2.0\n"
|
||||
"X-Generator: Gtranslator 2.91.7\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -183,7 +184,7 @@ msgstr "Déplacer vers l’espace de travail du dessus"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Déplacer vers l’espace de travail du dessous"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Système"
|
||||
|
||||
@@ -195,6 +196,10 @@ msgstr "Afficher la fenêtre pour lancer une commande"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Afficher l’aperçu des activités"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Restaurer les raccourcis clavier"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Fenêtres"
|
||||
@@ -418,20 +423,6 @@ msgid "Enable experimental features"
|
||||
msgstr "Activer les fonctionnalités expérimentales"
|
||||
|
||||
#: 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 "
|
||||
@@ -448,16 +439,15 @@ msgstr ""
|
||||
"Pour activer les fonctionnalités expérimentales, ajoutez le mot-clé de la "
|
||||
"fonctionnalité dans la liste. Selon la fonctionnalité, il peut être "
|
||||
"nécessaire de redémarrer le compositeur. Chaque fonctionnalité expérimentale "
|
||||
"peut disparaître ou ne plus être configurable. Ne vous attendez pas à ce que"
|
||||
" le "
|
||||
"contenu de ce réglage soit stable dans le temps. Les mots-clés actuellement "
|
||||
"possibles sont : • « scale-monitor-framebuffer » — demande à mutter "
|
||||
"d’utiliser par défaut une disposition par moniteur logique dans un espace de "
|
||||
"coordonnées de pixels logique, tout en mettant à l’échelle les "
|
||||
"peut disparaître ou ne plus être configurable. Ne vous attendez pas à ce que "
|
||||
"le contenu de ce réglage soit stable dans le temps. Les mots-clés "
|
||||
"actuellement possibles sont : • « scale-monitor-framebuffer » — demande à "
|
||||
"mutter d’utiliser par défaut une disposition par moniteur logique dans un "
|
||||
"espace de coordonnées de pixels logique, tout en mettant à l’échelle les "
|
||||
"« framebuffers » de moniteur au lieu des contenus de fenêtre pour pouvoir "
|
||||
"gérer les moniteurs à haute densité. Cela ne nécessite pas de redémarrage. "
|
||||
"• « remote-desktop » — active la prise en charge du bureau à distance. Pour "
|
||||
"la prise en charge du bureau distant avec partage de l’écran, « screen-cast » "
|
||||
"gérer les moniteurs à haute densité. Cela ne nécessite pas de redémarrage. • "
|
||||
"« remote-desktop » — active la prise en charge du bureau à distance. Pour la "
|
||||
"prise en charge du bureau distant avec partage de l’écran, « screen-cast » "
|
||||
"doit aussi être activé. • « screen-cast » — active la diffusion de l’écran. "
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
@@ -533,38 +523,38 @@ msgstr "Réactiver les raccourcis"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Changement de mode (groupe %d)"
|
||||
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets’
|
||||
#. 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:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Changer de moniteur"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Afficher l’aide à l’écran"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Affichage intégré"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Inconnu"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
msgid "Unknown Display"
|
||||
msgstr "Affichage inconnu"
|
||||
|
||||
#. 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:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -679,7 +669,7 @@ msgstr "Greffon de Mutter à utiliser"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espace de travail %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 "
|
||||
@@ -688,7 +678,7 @@ msgstr ""
|
||||
"L’affichage « %s » a déjà un gestionnaire de fenêtres ; essayez d’utiliser "
|
||||
"l’option --replace pour remplacer le gestionnaire de fenêtres actuel."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "L’écran %d sur l’affichage « %s » n’est pas valide\n"
|
||||
@@ -715,4 +705,3 @@ msgstr ""
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (sur %s)"
|
||||
|
||||
|
133
po/he.po
133
po/he.po
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: metacity.HEAD.he\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-03-30 18:41+0300\n"
|
||||
"PO-Revision-Date: 2017-03-30 18:46+0300\n"
|
||||
"POT-Creation-Date: 2017-11-26 17:12+0200\n"
|
||||
"PO-Revision-Date: 2017-11-26 17:14+0200\n"
|
||||
"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
|
||||
"Language-Team: עברית <>\n"
|
||||
"Language: he\n"
|
||||
@@ -174,7 +174,7 @@ msgstr "העברה למרחב העבודה שמלמעלה"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "העברה למרחב העבודה שמלמטה"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "מערכת"
|
||||
|
||||
@@ -186,6 +186,10 @@ msgstr "הצגת החלונית להרצת פקודה"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "הצגת סקירת הפעילויות"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "שחזור צירופי מקשים"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "חלונות"
|
||||
@@ -271,7 +275,6 @@ msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Modifier to use for extended window management operations"
|
||||
|
||||
#: 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 "
|
||||
@@ -316,7 +319,6 @@ msgid "Workspaces are managed dynamically"
|
||||
msgstr "Workspaces are managed dynamically"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
||||
#,
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there’s a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
@@ -355,7 +357,6 @@ msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Delay focus changes until the pointer stops moving"
|
||||
|
||||
#: 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 "
|
||||
@@ -401,14 +402,52 @@ msgstr ""
|
||||
"When true, the new windows will always be put in the center of the active "
|
||||
"screen of the monitor."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
#: data/org.gnome.mutter.gschema.xml.in:107
|
||||
msgid "Enable experimental features"
|
||||
msgstr "Enable experimental features"
|
||||
|
||||
#: 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 ""
|
||||
"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."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Select window from tab popup"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Cancel tab popup"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "החלפה בין תצורות צגים"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "Rotates the built-in monitor configuration"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "מעבר ל־VT 1"
|
||||
@@ -457,10 +496,14 @@ msgstr "מעבר ל־VT 11"
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "מעבר ל־VT 12"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "לאפשר מחדש צירופי מקשים"
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1848
|
||||
#: src/backends/meta-input-settings.c:2260
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "מצב העברה (קבוצה %d)"
|
||||
@@ -468,37 +511,37 @@ msgstr "מצב העברה (קבוצה %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1870
|
||||
#: src/backends/meta-input-settings.c:2283
|
||||
msgid "Switch monitor"
|
||||
msgstr "החלפה בין צגים"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1872
|
||||
#: src/backends/meta-input-settings.c:2285
|
||||
msgid "Show on-screen help"
|
||||
msgstr "הצגת עזרה על המסך"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:630
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "תצוגה מובנית"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:653
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "לא ידוע"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:655
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "תצוגה לא ידועה"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:663
|
||||
#: 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:474
|
||||
#: src/compositor/compositor.c:479
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@@ -508,31 +551,6 @@ msgstr "מנהל תצוגת חלונות אחר כבר פועל במסך %i בת
|
||||
msgid "Bell event"
|
||||
msgstr "אירוע פעמון"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "„%s“ אינו מגיב."
|
||||
|
||||
#: src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "היישום אינו מגיב."
|
||||
|
||||
#: src/core/delete.c:134
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
msgstr ""
|
||||
"באפשרותך להמתין זמן קצר ולתת ליישום להמשיך או להכריח את היישום להסתיים."
|
||||
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_אילוץ סגירה"
|
||||
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "ה_מתנה"
|
||||
|
||||
#: src/core/display.c:608
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
@@ -574,6 +592,31 @@ msgstr "Run as a nested compositor"
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Run as a full display server, rather than nested"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "„%s“ אינו מגיב."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:149
|
||||
msgid "Application is not responding."
|
||||
msgstr "היישום אינו מגיב."
|
||||
|
||||
#: 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 ""
|
||||
"באפשרותך להמתין זמן קצר ולתת ליישום להמשיך או להכריח את היישום להסתיים."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Force Quit"
|
||||
msgstr "_אילוץ סגירה"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Wait"
|
||||
msgstr "ה_מתנה"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -601,7 +644,7 @@ msgstr "תוסף ה־mutter לשימוש"
|
||||
msgid "Workspace %d"
|
||||
msgstr "מרחב עבודה %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 "
|
||||
@@ -610,7 +653,7 @@ msgstr ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Screen %d on display “%s” is invalid\n"
|
||||
@@ -629,8 +672,8 @@ msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
msgstr ""
|
||||
"חלונות אלו אינם תומכים ב„שמירת ההגדרות הנוכחיות”, ויהיה צורך "
|
||||
"באתחול ידני בכניסה הבאה שלך."
|
||||
"חלונות אלו אינם תומכים ב„שמירת ההגדרות הנוכחיות”, ויהיה צורך באתחול ידני "
|
||||
"בכניסה הבאה שלך."
|
||||
|
||||
#: src/x11/window-props.c:559
|
||||
#, c-format
|
||||
|
34
po/hr.po
34
po/hr.po
@@ -6,8 +6,8 @@ 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-21 04:46+0000\n"
|
||||
"PO-Revision-Date: 2017-08-23 17:40+0200\n"
|
||||
"POT-Creation-Date: 2017-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-09-22 20:51+0200\n"
|
||||
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
|
||||
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
|
||||
"Language: hr\n"
|
||||
@@ -193,15 +193,15 @@ msgstr "Aktiviraj izbornik prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Postavi preko cijelog zaslona"
|
||||
msgstr "Uklj/Isklj cjelozaslonski prikaz"
|
||||
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Promijeni stanje maksimizacije"
|
||||
msgstr "Uklj/Isklj uvećanje prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "Maksimiziraj prozor"
|
||||
msgstr "Uvećaj prozor"
|
||||
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
@@ -209,7 +209,7 @@ msgstr "Vrati prozor"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Promijeni stanje zasjenjenosti"
|
||||
msgstr "Uklj/Isklj stanje zasjenjenosti"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
@@ -233,7 +233,7 @@ msgstr "Uklj/Isklj prozor na svim radnim prostorima"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "Podigni prekriven prozor, inače smanji"
|
||||
msgstr "Podigni prekriven prozor, u suprotnome smanji"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Raise window above other windows"
|
||||
@@ -241,7 +241,7 @@ msgstr "Podigni prozor iznad ostalih prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Spustiti prozor ispod ostalih prozora"
|
||||
msgstr "Spusti prozor ispod ostalih prozora"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window vertically"
|
||||
@@ -407,7 +407,10 @@ msgid ""
|
||||
"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."
|
||||
"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 ""
|
||||
"Za omogućavanje eksperimentalnih značajki, dodajte ključnu riječ značajke na "
|
||||
"popis. Zahtijeva li značajka ponovno pokretanje kompozitora ovisi o zadanoj "
|
||||
@@ -417,21 +420,24 @@ msgstr ""
|
||||
"monitor-framebuffer” — čini mutter zadanim izlazu logičkih zaslona u "
|
||||
"logičnom koordinatnom prostoru piksela, dok međuspremnik okvira mijenja "
|
||||
"veličinu zaslona umjesto sadržaja prozora, upravlja kako bi upravljao "
|
||||
"(HiDPI) zaslonima visoke razlučivosti. Ne zahtijeva ponovno pokretanje."
|
||||
"(HiDPI) zaslonima visoke razlučivosti. Ne zahtijeva ponovno pokretanje. • "
|
||||
"“remote-desktop” — omogućava podršku za udaljene radne površine. Za podršku "
|
||||
"udaljene radne površine s dijeljenjem zaslona, “screen-cast” mora isto biti "
|
||||
"omogućen. • “screen-cast” — omogućuje podršku emitiranja zaslona."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:141
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Odaberi prozor iz skočnog prozora"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:146
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Prekini skočni prozor"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Prebacivanje podešavanja zaslona"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "Rotiraj ugrađeno podešavanje zaslona"
|
||||
|
||||
|
30
po/id.po
30
po/id.po
@@ -11,15 +11,15 @@ 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-08-30 10:46+0700\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:16+0000\n"
|
||||
"PO-Revision-Date: 2017-11-16 11:36+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.3\n"
|
||||
"X-Generator: Poedit 2.0.4\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
@@ -174,7 +174,7 @@ msgstr "Pindahkan ke ruang kerja di atas"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Pindahkan ke ruang kerja di bawah"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistem"
|
||||
|
||||
@@ -186,6 +186,10 @@ msgstr "Tampilkan sapaan jalankan perintah"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Tampilkan ringkasan aktivitas"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Pulihkan pintasan papan tik"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Jendela"
|
||||
@@ -500,7 +504,7 @@ msgstr "Aktifkan kembali pintasan"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Tukar Mode: (Grup %d)"
|
||||
@@ -508,30 +512,30 @@ 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:2174
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Berpindah monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Tampilkan bantuan pada layar"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Tampilan bawaan"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Tak Dikenal"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Tampilan Tak Dikenal"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:936
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -644,7 +648,7 @@ msgstr "Pengaya Mutter yang dipakai"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Area kerja %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 "
|
||||
@@ -653,7 +657,7 @@ msgstr ""
|
||||
"Tampilan \"%s\" sudah memiliki manajer jendela; cobalah gunakan pilihan --"
|
||||
"replace untuk mengganti manajer jendela saat ini."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Layar %d pada tampilan \"%s\" tidak valid\n"
|
||||
|
30
po/it.po
30
po/it.po
@@ -12,8 +12,8 @@ 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-08-29 06:41+0000\n"
|
||||
"PO-Revision-Date: 2017-08-29 10:21+0200\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-17 14:30+0100\n"
|
||||
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
"Language: it\n"
|
||||
@@ -21,7 +21,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: Poedit 1.8.12\n"
|
||||
"X-Generator: Poedit 2.0.4\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -175,7 +175,7 @@ msgstr "Sposta su spazio di lavoro in alto"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Sposta su spazio di lavoro in basso"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
@@ -187,6 +187,10 @@ msgstr "Mostra il prompt esegui comando"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Mostra la panoramica delle attività"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Ripristina le scorciatoie da tastiera"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Finestre"
|
||||
@@ -513,7 +517,7 @@ msgstr "Riabilita scorciatoie"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Cambio modalità (gruppo %d)"
|
||||
@@ -521,30 +525,30 @@ msgstr "Cambio modalità (gruppo %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:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Cambia monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostra aiuto sullo schermo"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Display integrato"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Sconosciuto"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
msgid "Unknown Display"
|
||||
msgstr "Display sconosciuto"
|
||||
|
||||
#. 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:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -658,7 +662,7 @@ msgstr "Plugin Mutter da usare"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Spazio di lavoro %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 "
|
||||
@@ -667,7 +671,7 @@ msgstr ""
|
||||
"Il display «%s» ha già un window manager; provare a utilizzare l'opzione --"
|
||||
"replace per sostituirlo."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Lo schermo %d sul display «%s» non è valido\n"
|
||||
|
129
po/nb.po
129
po/nb.po
@@ -4,11 +4,10 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter 3.23.x\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-02-16 21:09+0000\n"
|
||||
"PO-Revision-Date: 2017-02-19 17:44+0100\n"
|
||||
"Project-Id-Version: mutter 3.27.x\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:31+0000\n"
|
||||
"PO-Revision-Date: 2017-11-11 18:19+0100\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
|
||||
"Language: nb\n"
|
||||
@@ -168,7 +167,7 @@ msgstr "Flytt til arbeidsområdet over"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Flytt til arbeidsområdet under"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
@@ -180,6 +179,10 @@ msgstr "Vis kommandolinje"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Vis oversikt over aktiviteter"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Gjenopprett tastatursnarveier"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
@@ -393,14 +396,41 @@ msgstr ""
|
||||
"Når denne er «true» vil mye vinduer alltid plasseres midt på aktivt område "
|
||||
"på skjermen."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
#: data/org.gnome.mutter.gschema.xml.in:107
|
||||
msgid "Enable experimental features"
|
||||
msgstr "Slå på eksperimentelle funksjoner"
|
||||
|
||||
#: 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 "Fjern vindu fra tabulatordialog"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Avbryt tabulatordialog"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Bytt skjermkonfigurasjon"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "Roterer mellom innebyggede skjermkonfigurasjoner"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "Bytt til VT 1"
|
||||
@@ -449,10 +479,14 @@ msgstr "Bytt til VT 11"
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Bytt til VT 12"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr "Slå på snarveier igjen"
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1800
|
||||
#: src/backends/meta-input-settings.c:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Modusbytte: (Gruppe %d)"
|
||||
@@ -460,37 +494,37 @@ msgstr "Modusbytte: (Gruppe %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1822
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Bytt skjerm"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1824
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Vis hjelp på skjermen"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:675
|
||||
#: src/backends/meta-monitor-manager.c:900
|
||||
msgid "Built-in display"
|
||||
msgstr "Innebygget skjerm"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:698
|
||||
#: src/backends/meta-monitor-manager.c:923
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:700
|
||||
#: src/backends/meta-monitor-manager.c:925
|
||||
msgid "Unknown Display"
|
||||
msgstr "Ukjent skjerm"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:708
|
||||
#: 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:471
|
||||
#: src/compositor/compositor.c:476
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@@ -500,32 +534,6 @@ msgstr "En annen compositing manager kjører skjerm %i på display «%s»."
|
||||
msgid "Bell event"
|
||||
msgstr "Klokkehendelse"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "«%s» svarer ikke."
|
||||
|
||||
#: src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "Programmet svarer ikke."
|
||||
|
||||
#: src/core/delete.c:134
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
msgstr ""
|
||||
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
|
||||
"programmet til å avslutte helt."
|
||||
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Tvungen nedstenging"
|
||||
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Vent"
|
||||
|
||||
#: src/core/display.c:608
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
@@ -567,6 +575,32 @@ msgstr "Kjør som en nøstet kompositør"
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Kjør som en full skjermtjener, heller enn nøstet"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:147
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "«%s» svarer ikke."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:149
|
||||
msgid "Application is not responding."
|
||||
msgstr "Programmet svarer ikke."
|
||||
|
||||
#: 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 ""
|
||||
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
|
||||
"programmet til å avslutte helt."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Tvungen nedstenging"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:161
|
||||
msgid "_Wait"
|
||||
msgstr "_Vent"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -579,7 +613,8 @@ msgstr ""
|
||||
"mutter %s\n"
|
||||
"Opphavsrett © 2001-%d Havoc Pennington, Red Hat, Inc, og andre\n"
|
||||
"Dette er fri programvare; se i kildekoden for kopibetingelser.\n"
|
||||
"Det gis INGEN garanti; ikke en gang for SALGBARHET eller PASSENDE FOR ET BESTEMT FORMÅL.\n"
|
||||
"Det gis INGEN garanti; ikke en gang for SALGBARHET eller PASSENDE FOR ET "
|
||||
"BESTEMT FORMÅL.\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
@@ -594,7 +629,7 @@ msgstr "Mutter-tillegg som skal brukes"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeidsområde %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 "
|
||||
@@ -603,7 +638,7 @@ msgstr ""
|
||||
"Skjerm «%s» har allerede en vindushåndterer; prøv å bruke flagget --replace "
|
||||
"for å erstatte aktiv vindushåndterer."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Skjerm %d på display «%s» er ugyldig\n"
|
||||
@@ -621,7 +656,9 @@ msgstr "Modusbytte: Modus %d"
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
msgstr "Disse vinduene støtter ikke «lagre aktiv konfigurasjon», og vil måtte startes på nytt manuelt neste gang du logger inn."
|
||||
msgstr ""
|
||||
"Disse vinduene støtter ikke «lagre aktiv konfigurasjon», og vil måtte "
|
||||
"startes på nytt manuelt neste gang du logger inn."
|
||||
|
||||
#: src/x11/window-props.c:559
|
||||
#, c-format
|
||||
|
32
po/pl.po
32
po/pl.po
@@ -14,8 +14,8 @@ 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-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-08-29 18:14+0200\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-10 18:30+0100\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <community-poland@mozilla.org>\n"
|
||||
"Language: pl\n"
|
||||
@@ -177,7 +177,7 @@ msgstr "Przeniesienie na górny obszar roboczy"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Przeniesienie na dolny obszar roboczy"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
@@ -189,6 +189,10 @@ msgstr "Wyświetlenie okna wykonania polecenia"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Wyświetlenie podglądu aktywności"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Przywrócenie skrótów klawiszowych"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Okna"
|
||||
@@ -436,8 +440,8 @@ msgstr ""
|
||||
"w przestrzeni współrzędnych logicznych pikseli, jednocześnie skalując bufory "
|
||||
"ramki monitorów zamiast zawartości okien. Nie wymaga ponownego uruchomienia. "
|
||||
"• „remote-desktop” — włącza obsługę zdalnego pulpitu. Aby dodać "
|
||||
"udostępnianie ekranu, należy włączyć także opcję „screen-cast”. • "
|
||||
"„screen-cast” — włącza obsługę nagrywania ekranu."
|
||||
"udostępnianie ekranu, należy włączyć także opcję „screen-cast”. • „screen-"
|
||||
"cast” — włącza obsługę nagrywania ekranu."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
@@ -510,7 +514,7 @@ msgstr "Ponowne włączenie skrótów"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Przełącznik trybu (%d. grupa)"
|
||||
@@ -518,30 +522,30 @@ 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:2174
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Przełączenie monitora"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Ekran pomocy"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Wbudowany ekran"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
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:936
|
||||
#: src/backends/meta-monitor-manager.c:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -653,7 +657,7 @@ msgstr "Używana wtyczka menedżera Mutter"
|
||||
msgid "Workspace %d"
|
||||
msgstr "%d. obszar roboczy"
|
||||
|
||||
#: 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 "
|
||||
@@ -662,7 +666,7 @@ msgstr ""
|
||||
"Na ekranie „%s” działa już menedżer okien. Aby zastąpić działającego "
|
||||
"menedżera okien, należy użyć opcji „--replace”."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Podekran %d ekranu „%s” jest nieprawidłowy\n"
|
||||
|
29
po/pt_BR.po
29
po/pt_BR.po
@@ -21,8 +21,8 @@ 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-08-29 16:09+0000\n"
|
||||
"PO-Revision-Date: 2017-09-03 11:06-0200\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-11 16:55-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"
|
||||
@@ -189,7 +189,7 @@ msgstr "Mover para o espaço de trabalho acima"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Mover para o espaço de trabalho abaixo"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
@@ -201,6 +201,10 @@ msgstr "Mostrar o prompt de comando de execução"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Mostrar o panorama de atividades"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Restaurar os atalhos de teclado"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Janelas"
|
||||
@@ -457,7 +461,6 @@ msgid "Cancel tab popup"
|
||||
msgstr "Cancelar aba instantânea"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
#| msgid "Switch monitor"
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Trocar configurações de monitor"
|
||||
|
||||
@@ -520,7 +523,7 @@ msgstr "Reabilita atalhos"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Alternador de modo (Grupo %d)"
|
||||
@@ -528,30 +531,30 @@ 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:2174
|
||||
#: src/backends/meta-input-settings.c:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Trocar monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostrar ajuda na tela"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Tela embutida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Desconhecido"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
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:936
|
||||
#: src/backends/meta-monitor-manager.c:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s de %s"
|
||||
@@ -664,7 +667,7 @@ msgstr "Plug-in do Mutter para usar"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espaço de trabalho %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 +676,7 @@ msgstr ""
|
||||
"A exibição “%s” já possui um gerenciador de janelas; tente usar a opção --"
|
||||
"replace para substituir o gerenciador de janelas atual."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "A tela %d na exibição “%s” é inválida\n"
|
||||
|
37
po/sl.po
37
po/sl.po
@@ -11,8 +11,8 @@ 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-27 22:38+0200\n"
|
||||
"PO-Revision-Date: 2017-08-27 22:38+0200\n"
|
||||
"POT-Creation-Date: 2017-09-08 11:30+0200\n"
|
||||
"PO-Revision-Date: 2017-09-08 11:36+0200\n"
|
||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||
"Language: sl_SI\n"
|
||||
@@ -412,32 +412,35 @@ msgid ""
|
||||
"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."
|
||||
"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 ""
|
||||
"Za omogočanje preizkusnih možnosti, dodajte ključno besedo možnosti na "
|
||||
"seznam. Ali zahteva možnost ponovni zagon sestavljalnika, je odvisno od "
|
||||
"posamezne možnosti. Te možnosti niso zahtevane niti nastavljive. Trenutno so "
|
||||
"na voljo ključne besede: • »monitor-config-manager« – uporablja nov sistem "
|
||||
"nastavitev, ki naj bi zamenjal obstoječega. Omogoča večjo nastavljivost API, "
|
||||
"za uporabo pri prigramih za nastavitve lastnosti zaslona. • »scale-monitor-"
|
||||
"framebuffer« – določi privzeto rabo sistema mutter za logične zaslone v "
|
||||
"logičnem točkovnem koordinatnem prostoru, pri čemer prilagaja predpomnilnik "
|
||||
"in ne vsebine za upravljanje z zasloni HiDPI. Možnost ne zahteva ponovnega "
|
||||
"zagona."
|
||||
"Za omogočanje preizkusnih možnosti, dodajte na seznam ključne besedo "
|
||||
"možnosti. Ali vpisana možnost zahteva ponovni zagon sestavljalnika, je "
|
||||
"odvisno od posamezne možnosti. Te možnosti niso zahtevane niti nastavljive. "
|
||||
"Trenutno so na voljo ključne besede: • »scale-monitor-framebuffer« – določi "
|
||||
"privzeto rabo sistema mutter za logične zaslone v logičnem točkovnem "
|
||||
"koordinatnem prostoru, pri čemer prilagaja predpomnilnik in ne vsebine za "
|
||||
"upravljanje z zasloni HiDPI. Možnost ne zahteva ponovnega zagona. • »remote-"
|
||||
"desktop« – omogoči podporo oddaljenim namizjem. Za souporabo zaslona mora "
|
||||
"biti omogočena tudi možnost »screen-cast«. • »screen-cast« – omogoči podporo "
|
||||
"objavljanja na zaslon."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:141
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Izbor okna iz pojavnega zavihka"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:146
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Prekliči pojavni zavihek"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "Nastavitve nadzornika preklopa"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "Zavrti vgrajene nastavitve zaslona"
|
||||
|
||||
|
30
po/sv.po
30
po/sv.po
@@ -11,15 +11,15 @@ 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-09-04 14:39+0000\n"
|
||||
"PO-Revision-Date: 2017-09-05 00:14+0200\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-14 00:43+0100\n"
|
||||
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
|
||||
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"X-Generator: Poedit 2.0.4\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -173,7 +173,7 @@ msgstr "Flytta till arbetsyta ovanför"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Flytta till arbetsyta nedanför"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
@@ -185,6 +185,10 @@ msgstr "Visa Kör kommando-dialogen"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Visa aktivitetsöversikt"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Återställ tangentbordsgenvägarna"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Fönster"
|
||||
@@ -500,7 +504,7 @@ msgstr "Återaktivera genvägar"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Lägesväxel (grupp %d)"
|
||||
@@ -508,30 +512,30 @@ msgstr "Lägesväxel (grupp %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:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Växla skärm"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Visa hjälp på skärmen"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Inbyggd display"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Okänd"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
msgid "Unknown Display"
|
||||
msgstr "Okänd display"
|
||||
|
||||
#. 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:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -643,7 +647,7 @@ msgstr "Mutter-insticksmodul att använda"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbetsyta %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 +656,7 @@ msgstr ""
|
||||
"Display ”%s” har redan en fönsterhanterare; försök med flaggan --replace för "
|
||||
"att ersätta den aktuella fönsterhanteraren."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Skärm %d på display ”%s” är ogiltig\n"
|
||||
|
46
po/tr.po
46
po/tr.po
@@ -7,17 +7,17 @@
|
||||
# İlker DAĞLI <ilker@ilkerdagli.info>, 2011.
|
||||
# Muhammed EKEN <gnome@m-eken.com>, 2011.
|
||||
# Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017.
|
||||
# Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2014, 2015, 2016, 2017.
|
||||
# Emin Tufan Çetin <etcetin@gmail.com>, 2017.
|
||||
# Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2014, 2015, 2016, 2017.
|
||||
#
|
||||
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-08-29 23:17+0300\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
|
||||
"POT-Creation-Date: 2017-11-10 18:18+0000\n"
|
||||
"PO-Revision-Date: 2017-11-15 23:49+0300\n"
|
||||
"Last-Translator: Muhammet Kara <muhammetk@gmail.com>\n"
|
||||
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -179,7 +179,7 @@ msgstr "Üstteki çalışma alanına taşı"
|
||||
msgid "Move to workspace below"
|
||||
msgstr "Alttaki çalışma alanına taşı"
|
||||
|
||||
#: data/50-mutter-system.xml:6
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "Sistem"
|
||||
|
||||
@@ -191,6 +191,10 @@ msgstr "Komut çalıştırma istemini göster"
|
||||
msgid "Show the activities overview"
|
||||
msgstr "Etkinlik genel görünümünü göster"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "Klavye kısayollarını geri yükle"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "Pencereler"
|
||||
@@ -413,20 +417,6 @@ msgid "Enable experimental features"
|
||||
msgstr "Deneysel özellikleri etkinleştir"
|
||||
|
||||
#: 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 "
|
||||
@@ -529,7 +519,7 @@ msgstr "Kısayolları yeniden etkinleştir"
|
||||
#. 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:2167
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Kip anahtarı (Group %d)"
|
||||
@@ -537,30 +527,30 @@ msgstr "Kip anahtarı (Group %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:2190
|
||||
msgid "Switch monitor"
|
||||
msgstr "Monitör değiştir"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2192
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Ekranda yardımı göster"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:908
|
||||
msgid "Built-in display"
|
||||
msgstr "Yerleşik ekran"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:931
|
||||
msgid "Unknown"
|
||||
msgstr "Bilinmiyor"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:933
|
||||
msgid "Unknown Display"
|
||||
msgstr "Bilinmeyen Ekran"
|
||||
|
||||
#. 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:941
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -674,7 +664,7 @@ msgstr "Kullanılacak Mutter eklentisi"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Çalışma Alanı %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 "
|
||||
@@ -684,7 +674,7 @@ msgstr ""
|
||||
"yöneticisinin yerine bir başkasını koymak için --replace seçeneğini "
|
||||
"kullanmayı deneyin."
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "“%2$s” monitöründeki %1$d ekranı geçersiz\n"
|
||||
|
40
po/zh_TW.po
40
po/zh_TW.po
@@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: metacity 3.3.4\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-21 04:46+0000\n"
|
||||
"PO-Revision-Date: 2017-08-27 12:05+0800\n"
|
||||
"POT-Creation-Date: 2017-09-29 14:36+0000\n"
|
||||
"PO-Revision-Date: 2017-10-01 22:57+0800\n"
|
||||
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
|
||||
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
|
||||
"Language: zh_TW\n"
|
||||
@@ -388,7 +388,6 @@ msgid "Enable experimental features"
|
||||
msgstr "啟用試驗性功能"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:108
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"To enable experimental features, add the feature keyword to the list. "
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
@@ -397,27 +396,32 @@ msgid ""
|
||||
"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."
|
||||
"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 ""
|
||||
"若要啟用實驗性功能,請將功能關鍵字加入列表中。置於該功能是否須要重新啟動混成"
|
||||
"器則視給予的功能而定。任何實驗性功能不一定能用、或是可以調整設定。請不要預期"
|
||||
"在此設定中加入的任何東西未來都能存在。目前可用的關鍵字有: • “scale-monitor-"
|
||||
"framebuffer” — 讓 mutter 預設採用邏輯像素座標空間的配置邏輯螢幕,而縮放螢幕 "
|
||||
"framebuffer 則取代視窗內容以管理 HiDPI 螢幕。不須要重新啟動。"
|
||||
"framebuffer 則取代視窗內容以管理 HiDPI 螢幕。不須要重新啟動。 • “remote-"
|
||||
"desktop” — 啟用遠端桌面支援。若要支援遠端桌面的螢幕分享,則必須也啟用“screen-"
|
||||
"cast”。• “screen-cast” — 啟用螢幕投放支援。"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:141
|
||||
#: data/org.gnome.mutter.gschema.xml.in:145
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "從分頁彈出項選擇視窗"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:146
|
||||
#: data/org.gnome.mutter.gschema.xml.in:150
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "取消分頁彈出項"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
#: data/org.gnome.mutter.gschema.xml.in:155
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "切換螢幕組態"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
#: data/org.gnome.mutter.gschema.xml.in:160
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr "旋轉切換內建螢幕組態"
|
||||
|
||||
@@ -476,7 +480,7 @@ 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:2157
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "模式切換( 群組 %d)"
|
||||
@@ -484,30 +488,30 @@ msgstr "模式切換( 群組 %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:2180
|
||||
msgid "Switch monitor"
|
||||
msgstr "切換螢幕"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2176
|
||||
#: src/backends/meta-input-settings.c:2182
|
||||
msgid "Show on-screen help"
|
||||
msgstr "顯示螢幕求助"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:903
|
||||
#: src/backends/meta-monitor-manager.c:894
|
||||
msgid "Built-in display"
|
||||
msgstr "內建顯示"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:926
|
||||
#: src/backends/meta-monitor-manager.c:917
|
||||
msgid "Unknown"
|
||||
msgstr "不明"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:928
|
||||
#: src/backends/meta-monitor-manager.c:919
|
||||
msgid "Unknown Display"
|
||||
msgstr "不明的顯示器"
|
||||
|
||||
#. 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:927
|
||||
#, c-format
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
@@ -618,7 +622,7 @@ msgstr "要使用的 Mutter 外掛程式"
|
||||
msgid "Workspace %d"
|
||||
msgstr "工作區 %d"
|
||||
|
||||
#: src/core/screen.c:580
|
||||
#: src/core/screen.c:582
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
@@ -627,7 +631,7 @@ msgstr ""
|
||||
"畫面「%s」已經有了視窗管理員;請嘗試使用 --replace 選項來替換目前的視窗管理"
|
||||
"員。"
|
||||
|
||||
#: src/core/screen.c:665
|
||||
#: src/core/screen.c:667
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "畫面「%2$s」中的第 %1$d 個螢幕無效\n"
|
||||
|
@@ -82,6 +82,12 @@ mutter_built_sources += \
|
||||
linux-dmabuf-unstable-v1-server-protocol.h \
|
||||
keyboard-shortcuts-inhibit-unstable-v1-protocol.c \
|
||||
keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h \
|
||||
xdg-output-unstable-v1-protocol.c \
|
||||
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
|
||||
|
||||
@@ -97,6 +103,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||
backends/meta-backend-private.h \
|
||||
backends/meta-barrier.c \
|
||||
backends/meta-barrier-private.h \
|
||||
backends/meta-crtc.c \
|
||||
backends/meta-crtc.h \
|
||||
backends/meta-cursor.c \
|
||||
backends/meta-cursor.h \
|
||||
backends/meta-cursor-tracker.c \
|
||||
@@ -107,6 +115,11 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||
backends/meta-egl.c \
|
||||
backends/meta-egl.h \
|
||||
backends/meta-egl-ext.h \
|
||||
backends/meta-gles3.c \
|
||||
backends/meta-gles3.h \
|
||||
backends/meta-gles3-table.h \
|
||||
backends/meta-gpu.c \
|
||||
backends/meta-gpu.h \
|
||||
backends/meta-display-config-shared.h \
|
||||
backends/meta-idle-monitor.c \
|
||||
backends/meta-idle-monitor-private.h \
|
||||
@@ -131,6 +144,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||
backends/meta-monitor-manager-dummy.h \
|
||||
backends/meta-orientation-manager.c \
|
||||
backends/meta-orientation-manager.h \
|
||||
backends/meta-output.c \
|
||||
backends/meta-output.h \
|
||||
backends/meta-pointer-constraint.c \
|
||||
backends/meta-pointer-constraint.h \
|
||||
backends/meta-settings.c \
|
||||
@@ -149,8 +164,12 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||
backends/x11/meta-barrier-x11.h \
|
||||
backends/x11/meta-clutter-backend-x11.c \
|
||||
backends/x11/meta-clutter-backend-x11.h \
|
||||
backends/x11/meta-crtc-xrandr.c \
|
||||
backends/x11/meta-crtc-xrandr.h \
|
||||
backends/x11/meta-cursor-renderer-x11.c \
|
||||
backends/x11/meta-cursor-renderer-x11.h \
|
||||
backends/x11/meta-gpu-xrandr.c \
|
||||
backends/x11/meta-gpu-xrandr.h \
|
||||
backends/x11/cm/meta-backend-x11-cm.c \
|
||||
backends/x11/cm/meta-backend-x11-cm.h \
|
||||
backends/x11/cm/meta-renderer-x11-cm.c \
|
||||
@@ -167,6 +186,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
||||
backends/x11/meta-input-settings-x11.h \
|
||||
backends/x11/meta-monitor-manager-xrandr.c \
|
||||
backends/x11/meta-monitor-manager-xrandr.h \
|
||||
backends/x11/meta-output-xrandr.c \
|
||||
backends/x11/meta-output-xrandr.h \
|
||||
backends/x11/meta-renderer-x11.c \
|
||||
backends/x11/meta-renderer-x11.h \
|
||||
backends/x11/meta-stage-x11-nested.c \
|
||||
@@ -412,6 +433,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 \
|
||||
@@ -420,6 +443,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
|
||||
wayland/meta-wayland-xdg-foreign.h \
|
||||
wayland/meta-window-wayland.c \
|
||||
wayland/meta-window-wayland.h \
|
||||
wayland/meta-window-xwayland.c \
|
||||
wayland/meta-window-xwayland.h \
|
||||
wayland/meta-wayland-xdg-shell.c \
|
||||
wayland/meta-wayland-xdg-shell.h \
|
||||
wayland/meta-wayland-wl-shell.c \
|
||||
@@ -430,6 +455,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
|
||||
wayland/meta-wayland-inhibit-shortcuts.h \
|
||||
wayland/meta-wayland-inhibit-shortcuts-dialog.c \
|
||||
wayland/meta-wayland-inhibit-shortcuts-dialog.h \
|
||||
wayland/meta-xwayland-grab-keyboard.c \
|
||||
wayland/meta-xwayland-grab-keyboard.h \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
@@ -440,11 +467,15 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
|
||||
backends/native/meta-backend-native-private.h \
|
||||
backends/native/meta-barrier-native.c \
|
||||
backends/native/meta-barrier-native.h \
|
||||
backends/native/meta-crtc-kms.c \
|
||||
backends/native/meta-crtc-kms.h \
|
||||
backends/native/meta-clutter-backend-native.c \
|
||||
backends/native/meta-clutter-backend-native.h \
|
||||
backends/native/meta-cursor-renderer-native.c \
|
||||
backends/native/meta-cursor-renderer-native.h \
|
||||
backends/native/meta-default-modes.h \
|
||||
backends/native/meta-gpu-kms.c \
|
||||
backends/native/meta-gpu-kms.h \
|
||||
backends/native/meta-idle-monitor-native.c \
|
||||
backends/native/meta-idle-monitor-native.h \
|
||||
backends/native/meta-input-settings-native.c \
|
||||
@@ -453,8 +484,12 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
|
||||
backends/native/meta-monitor-manager-kms.h \
|
||||
backends/native/meta-launcher.c \
|
||||
backends/native/meta-launcher.h \
|
||||
backends/native/meta-output-kms.c \
|
||||
backends/native/meta-output-kms.h \
|
||||
backends/native/meta-renderer-native.c \
|
||||
backends/native/meta-renderer-native.h \
|
||||
backends/native/meta-renderer-native-gles3.c \
|
||||
backends/native/meta-renderer-native-gles3.h \
|
||||
backends/native/meta-stage-native.c \
|
||||
backends/native/meta-stage-native.h \
|
||||
backends/native/dbus-utils.c \
|
||||
@@ -719,3 +754,10 @@ keyboard-shortcuts-inhibit-unstable-v1-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)
|
||||
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
||||
keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml
|
||||
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
|
||||
xdg-output-unstable-v1-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xdg-output/xdg-output-unstable-v1.xml
|
||||
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
||||
xdg-output-unstable-v1-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xdg-output/xdg-output-unstable-v1.xml
|
||||
xwayland-keyboard-grab-unstable-v1-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xwayland-keyboard-grab/xwayland-keyboard-grab-unstable-v1.xml
|
||||
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
||||
xwayland-keyboard-grab-unstable-v1-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/xwayland-keyboard-grab/xwayland-keyboard-grab-unstable-v1.xml
|
||||
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
|
||||
|
@@ -61,9 +61,11 @@ struct _MetaBackendClass
|
||||
|
||||
MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend,
|
||||
int device_id);
|
||||
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend);
|
||||
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
|
||||
GError **error);
|
||||
MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
|
||||
MetaRenderer * (* create_renderer) (MetaBackend *backend);
|
||||
MetaRenderer * (* create_renderer) (MetaBackend *backend,
|
||||
GError **error);
|
||||
MetaInputSettings * (* create_input_settings) (MetaBackend *backend);
|
||||
|
||||
gboolean (* grab_device) (MetaBackend *backend,
|
||||
|
@@ -197,7 +197,7 @@ meta_backend_monitors_changed (MetaBackend *backend)
|
||||
}
|
||||
}
|
||||
|
||||
meta_settings_update_ui_scaling_factor (priv->settings);
|
||||
meta_cursor_renderer_force_update (priv->cursor_renderer);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -337,6 +337,8 @@ on_device_removed (ClutterDeviceManager *device_manager,
|
||||
gboolean has_touchscreen, has_pointing_device;
|
||||
ClutterInputDeviceType device_type;
|
||||
|
||||
priv->current_device_id = 0;
|
||||
|
||||
device_type = clutter_input_device_get_device_type (device);
|
||||
has_touchscreen = check_has_slave_touchscreen (device_manager);
|
||||
|
||||
@@ -355,15 +357,6 @@ on_device_removed (ClutterDeviceManager *device_manager,
|
||||
}
|
||||
}
|
||||
|
||||
static MetaMonitorManager *
|
||||
create_monitor_manager (MetaBackend *backend)
|
||||
{
|
||||
if (g_getenv ("META_DUMMY_MONITORS"))
|
||||
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
||||
|
||||
return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
|
||||
}
|
||||
|
||||
static void
|
||||
create_device_monitors (MetaBackend *backend,
|
||||
ClutterDeviceManager *device_manager)
|
||||
@@ -441,7 +434,7 @@ meta_backend_real_post_init (MetaBackend *backend)
|
||||
clutter_actor_realize (priv->stage);
|
||||
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
||||
|
||||
priv->monitor_manager = create_monitor_manager (backend);
|
||||
meta_monitor_manager_setup (priv->monitor_manager);
|
||||
|
||||
meta_backend_sync_screen_size (backend);
|
||||
|
||||
@@ -579,6 +572,24 @@ experimental_features_changed (MetaSettings *settings,
|
||||
#endif /* HAVE_REMOTE_DESKTOP */
|
||||
}
|
||||
|
||||
static MetaMonitorManager *
|
||||
meta_backend_create_monitor_manager (MetaBackend *backend,
|
||||
GError **error)
|
||||
{
|
||||
if (g_getenv ("META_DUMMY_MONITORS"))
|
||||
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
||||
|
||||
return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend,
|
||||
error);
|
||||
}
|
||||
|
||||
static MetaRenderer *
|
||||
meta_backend_create_renderer (MetaBackend *backend,
|
||||
GError **error)
|
||||
{
|
||||
return META_BACKEND_GET_CLASS (backend)->create_renderer (backend, error);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_backend_initable_init (GInitable *initable,
|
||||
GCancellable *cancellable,
|
||||
@@ -594,21 +605,20 @@ meta_backend_initable_init (GInitable *initable,
|
||||
|
||||
priv->egl = g_object_new (META_TYPE_EGL, NULL);
|
||||
|
||||
priv->renderer = META_BACKEND_GET_CLASS (backend)->create_renderer (backend);
|
||||
priv->orientation_manager = g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL);
|
||||
|
||||
priv->monitor_manager = meta_backend_create_monitor_manager (backend, error);
|
||||
if (!priv->monitor_manager)
|
||||
return FALSE;
|
||||
|
||||
priv->renderer = meta_backend_create_renderer (backend, error);
|
||||
if (!priv->renderer)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"Failed to create MetaRenderer");
|
||||
return FALSE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
priv->cursor_tracker = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
|
||||
|
||||
priv->dnd = g_object_new (META_TYPE_DND, NULL);
|
||||
|
||||
priv->orientation_manager = g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
80
src/backends/meta-crtc.c
Normal file
80
src/backends/meta-crtc.c
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "backends/meta-crtc.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaCrtc, meta_crtc, G_TYPE_OBJECT)
|
||||
|
||||
G_DEFINE_TYPE (MetaCrtcMode, meta_crtc_mode, G_TYPE_OBJECT)
|
||||
|
||||
MetaGpu *
|
||||
meta_crtc_get_gpu (MetaCrtc *crtc)
|
||||
{
|
||||
return crtc->gpu;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_finalize (GObject *object)
|
||||
{
|
||||
MetaCrtc *crtc = META_CRTC (object);
|
||||
|
||||
if (crtc->driver_notify)
|
||||
crtc->driver_notify (crtc);
|
||||
|
||||
G_OBJECT_CLASS (meta_crtc_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_init (MetaCrtc *crtc)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_class_init (MetaCrtcClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = meta_crtc_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_mode_finalize (GObject *object)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode = META_CRTC_MODE (object);
|
||||
|
||||
if (crtc_mode->driver_notify)
|
||||
crtc_mode->driver_notify (crtc_mode);
|
||||
|
||||
G_OBJECT_CLASS (meta_crtc_mode_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_mode_init (MetaCrtcMode *crtc_mode)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_mode_class_init (MetaCrtcModeClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = meta_crtc_mode_finalize;
|
||||
}
|
98
src/backends/meta-crtc.h
Normal file
98
src/backends/meta-crtc.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef META_CRTC_H
|
||||
#define META_CRTC_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-gpu.h"
|
||||
|
||||
/* Same as KMS mode flags and X11 randr flags */
|
||||
typedef enum _MetaCrtcModeFlag
|
||||
{
|
||||
META_CRTC_MODE_FLAG_NONE = 0,
|
||||
META_CRTC_MODE_FLAG_PHSYNC = (1 << 0),
|
||||
META_CRTC_MODE_FLAG_NHSYNC = (1 << 1),
|
||||
META_CRTC_MODE_FLAG_PVSYNC = (1 << 2),
|
||||
META_CRTC_MODE_FLAG_NVSYNC = (1 << 3),
|
||||
META_CRTC_MODE_FLAG_INTERLACE = (1 << 4),
|
||||
META_CRTC_MODE_FLAG_DBLSCAN = (1 << 5),
|
||||
META_CRTC_MODE_FLAG_CSYNC = (1 << 6),
|
||||
META_CRTC_MODE_FLAG_PCSYNC = (1 << 7),
|
||||
META_CRTC_MODE_FLAG_NCSYNC = (1 << 8),
|
||||
META_CRTC_MODE_FLAG_HSKEW = (1 << 9),
|
||||
META_CRTC_MODE_FLAG_BCAST = (1 << 10),
|
||||
META_CRTC_MODE_FLAG_PIXMUX = (1 << 11),
|
||||
META_CRTC_MODE_FLAG_DBLCLK = (1 << 12),
|
||||
META_CRTC_MODE_FLAG_CLKDIV2 = (1 << 13),
|
||||
|
||||
META_CRTC_MODE_FLAG_MASK = 0x3fff
|
||||
} MetaCrtcModeFlag;
|
||||
|
||||
struct _MetaCrtc
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
MetaGpu *gpu;
|
||||
|
||||
glong crtc_id;
|
||||
MetaRectangle rect;
|
||||
MetaCrtcMode *current_mode;
|
||||
MetaMonitorTransform transform;
|
||||
unsigned int all_transforms;
|
||||
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
/* Used when changing configuration */
|
||||
gboolean is_dirty;
|
||||
|
||||
/* Used by cursor renderer backend */
|
||||
void *cursor_renderer_private;
|
||||
|
||||
gpointer driver_private;
|
||||
GDestroyNotify driver_notify;
|
||||
};
|
||||
|
||||
struct _MetaCrtcMode
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
/* The low-level ID of this mode, used to apply back configuration */
|
||||
glong mode_id;
|
||||
char *name;
|
||||
|
||||
int width;
|
||||
int height;
|
||||
float refresh_rate;
|
||||
MetaCrtcModeFlag flags;
|
||||
|
||||
gpointer driver_private;
|
||||
GDestroyNotify driver_notify;
|
||||
};
|
||||
|
||||
#define META_TYPE_CRTC (meta_crtc_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaCrtc, meta_crtc, META, CRTC, GObject)
|
||||
|
||||
#define META_TYPE_CRTC_MODE (meta_crtc_mode_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaCrtcMode, meta_crtc_mode, META, CRTC_MODE, GObject)
|
||||
|
||||
MetaGpu * meta_crtc_get_gpu (MetaCrtc *crtc);
|
||||
|
||||
#endif /* META_CRTC_H */
|
@@ -70,7 +70,7 @@ queue_redraw (MetaCursorRenderer *renderer,
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||
CoglTexture *texture;
|
||||
ClutterRect rect = { 0 };
|
||||
ClutterRect rect = CLUTTER_RECT_INIT_ZERO;
|
||||
|
||||
if (cursor_sprite)
|
||||
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
|
||||
@@ -173,7 +173,7 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
|
||||
|
||||
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||
if (!texture)
|
||||
return (ClutterRect) { 0 };
|
||||
return (ClutterRect) CLUTTER_RECT_INIT_ZERO;
|
||||
|
||||
meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y);
|
||||
texture_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
|
||||
|
@@ -32,6 +32,7 @@ struct _MetaCursorTracker {
|
||||
|
||||
gboolean is_showing;
|
||||
|
||||
MetaCursorSprite *effective_cursor; /* May be NULL when hidden */
|
||||
MetaCursorSprite *displayed_cursor;
|
||||
|
||||
/* Wayland clients can set a NULL buffer as their cursor
|
||||
|
@@ -53,47 +53,75 @@ enum {
|
||||
|
||||
static guint signals[LAST_SIGNAL];
|
||||
|
||||
static MetaCursorSprite *
|
||||
get_displayed_cursor (MetaCursorTracker *tracker)
|
||||
static void
|
||||
cursor_texture_updated (MetaCursorSprite *cursor,
|
||||
MetaCursorTracker *tracker)
|
||||
{
|
||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_displayed_cursor (MetaCursorTracker *tracker)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaCursorSprite *cursor = NULL;
|
||||
|
||||
if (!tracker->is_showing)
|
||||
return NULL;
|
||||
if (display && meta_display_windows_are_interactable (display) &&
|
||||
tracker->has_window_cursor)
|
||||
cursor = tracker->window_cursor;
|
||||
else
|
||||
cursor = tracker->root_cursor;
|
||||
|
||||
if (meta_display_windows_are_interactable (display))
|
||||
if (tracker->displayed_cursor == cursor)
|
||||
return FALSE;
|
||||
|
||||
if (tracker->displayed_cursor)
|
||||
{
|
||||
if (tracker->has_window_cursor)
|
||||
return tracker->window_cursor;
|
||||
g_signal_handlers_disconnect_by_func (tracker->displayed_cursor,
|
||||
cursor_texture_updated,
|
||||
tracker);
|
||||
}
|
||||
|
||||
return tracker->root_cursor;
|
||||
g_set_object (&tracker->displayed_cursor, cursor);
|
||||
|
||||
if (cursor)
|
||||
{
|
||||
g_signal_connect (cursor, "texture-changed",
|
||||
G_CALLBACK (cursor_texture_updated), tracker);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_effective_cursor (MetaCursorTracker *tracker)
|
||||
{
|
||||
MetaCursorSprite *cursor = NULL;
|
||||
|
||||
if (tracker->is_showing)
|
||||
cursor = tracker->displayed_cursor;
|
||||
|
||||
return g_set_object (&tracker->effective_cursor, cursor);
|
||||
}
|
||||
|
||||
static void
|
||||
update_displayed_cursor (MetaCursorTracker *tracker)
|
||||
change_cursor_renderer (MetaCursorTracker *tracker)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaCursorRenderer *cursor_renderer =
|
||||
meta_backend_get_cursor_renderer (backend);
|
||||
|
||||
meta_cursor_renderer_set_cursor (cursor_renderer, tracker->displayed_cursor);
|
||||
meta_cursor_renderer_set_cursor (cursor_renderer, tracker->effective_cursor);
|
||||
}
|
||||
|
||||
static void
|
||||
sync_cursor (MetaCursorTracker *tracker)
|
||||
{
|
||||
MetaCursorSprite *displayed_cursor = get_displayed_cursor (tracker);
|
||||
if (update_displayed_cursor (tracker))
|
||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||
|
||||
if (tracker->displayed_cursor == displayed_cursor)
|
||||
return;
|
||||
|
||||
g_clear_object (&tracker->displayed_cursor);
|
||||
if (displayed_cursor)
|
||||
tracker->displayed_cursor = g_object_ref (displayed_cursor);
|
||||
|
||||
update_displayed_cursor (tracker);
|
||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||
if (update_effective_cursor (tracker))
|
||||
change_cursor_renderer (tracker);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -107,6 +135,8 @@ meta_cursor_tracker_finalize (GObject *object)
|
||||
{
|
||||
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
||||
|
||||
if (self->effective_cursor)
|
||||
g_object_unref (self->effective_cursor);
|
||||
if (self->displayed_cursor)
|
||||
g_object_unref (self->displayed_cursor);
|
||||
if (self->root_cursor)
|
||||
@@ -282,9 +312,14 @@ meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
|
||||
}
|
||||
|
||||
if (cursor_sprite)
|
||||
return meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||
{
|
||||
meta_cursor_sprite_realize_texture (cursor_sprite);
|
||||
return meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -37,6 +37,7 @@
|
||||
|
||||
enum {
|
||||
PREPARE_AT,
|
||||
TEXTURE_CHANGED,
|
||||
|
||||
LAST_SIGNAL
|
||||
};
|
||||
@@ -228,6 +229,8 @@ meta_cursor_sprite_load_from_theme (MetaCursorSprite *self)
|
||||
|
||||
g_assert (self->cursor != META_CURSOR_NONE);
|
||||
|
||||
self->theme_dirty = FALSE;
|
||||
|
||||
/* We might be reloading with a different scale. If so clear the old data. */
|
||||
if (self->xcursor_images)
|
||||
{
|
||||
@@ -243,8 +246,6 @@ meta_cursor_sprite_load_from_theme (MetaCursorSprite *self)
|
||||
|
||||
image = meta_cursor_sprite_get_current_frame_image (self);
|
||||
meta_cursor_sprite_load_from_xcursor_image (self, image);
|
||||
|
||||
self->theme_dirty = FALSE;
|
||||
}
|
||||
|
||||
MetaCursorSprite *
|
||||
@@ -266,11 +267,18 @@ meta_cursor_sprite_set_texture (MetaCursorSprite *self,
|
||||
int hot_x,
|
||||
int hot_y)
|
||||
{
|
||||
if (self->texture == COGL_TEXTURE_2D (texture) &&
|
||||
self->hot_x == hot_x &&
|
||||
self->hot_y == hot_y)
|
||||
return;
|
||||
|
||||
g_clear_pointer (&self->texture, cogl_object_unref);
|
||||
if (texture)
|
||||
self->texture = cogl_object_ref (texture);
|
||||
self->hot_x = hot_x;
|
||||
self->hot_y = hot_y;
|
||||
|
||||
g_signal_emit (self, signals[TEXTURE_CHANGED], 0);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -365,4 +373,10 @@ meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass)
|
||||
G_TYPE_NONE, 2,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT);
|
||||
signals[TEXTURE_CHANGED] = g_signal_new ("texture-changed",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
@@ -29,6 +29,7 @@ gboolean meta_dnd_handle_xdnd_event (MetaBackend *backend,
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
void meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor);
|
||||
void meta_dnd_wayland_handle_end_modal (MetaCompositor *compositor);
|
||||
#endif
|
||||
|
||||
#endif /* META_DND_PRIVATE_H */
|
||||
|
@@ -160,11 +160,11 @@ set_egl_error (GError **error)
|
||||
error_str);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
extensions_string_has_extensions_valist (const char *extensions_str,
|
||||
char ***missing_extensions,
|
||||
char *first_extension,
|
||||
va_list var_args)
|
||||
gboolean
|
||||
meta_extensions_string_has_extensions_valist (const char *extensions_str,
|
||||
char ***missing_extensions,
|
||||
char *first_extension,
|
||||
va_list var_args)
|
||||
{
|
||||
char **extensions;
|
||||
char *extension;
|
||||
@@ -222,10 +222,11 @@ meta_egl_has_extensions (MetaEgl *egl,
|
||||
}
|
||||
|
||||
va_start (var_args, first_extension);
|
||||
has_extensions = extensions_string_has_extensions_valist (extensions_str,
|
||||
missing_extensions,
|
||||
first_extension,
|
||||
var_args);
|
||||
has_extensions =
|
||||
meta_extensions_string_has_extensions_valist (extensions_str,
|
||||
missing_extensions,
|
||||
first_extension,
|
||||
var_args);
|
||||
va_end (var_args);
|
||||
|
||||
return has_extensions;
|
||||
@@ -245,6 +246,25 @@ meta_egl_initialize (MetaEgl *egl,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gpointer
|
||||
meta_egl_get_proc_address (MetaEgl *egl,
|
||||
const char *procname,
|
||||
GError **error)
|
||||
{
|
||||
gpointer func;
|
||||
|
||||
func = (gpointer) eglGetProcAddress (procname);
|
||||
if (!func)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Could not load symbol '%s': Not found",
|
||||
procname);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return func;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_choose_config (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
@@ -289,6 +309,27 @@ meta_egl_choose_config (MetaEgl *egl,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
EGLSurface
|
||||
meta_egl_create_window_surface (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLConfig config,
|
||||
EGLNativeWindowType native_window_type,
|
||||
const EGLint *attrib_list,
|
||||
GError **error)
|
||||
{
|
||||
EGLSurface surface;
|
||||
|
||||
surface = eglCreateWindowSurface (display, config,
|
||||
native_window_type, attrib_list);
|
||||
if (surface == EGL_NO_SURFACE)
|
||||
{
|
||||
set_egl_error (error);
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
EGLSurface
|
||||
meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
@@ -308,6 +349,21 @@ meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||
return surface;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_destroy_surface (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLSurface surface,
|
||||
GError **error)
|
||||
{
|
||||
if (!eglDestroySurface (display, surface))
|
||||
{
|
||||
set_egl_error (error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_egl_proc_valid_real (void *proc,
|
||||
const char *proc_name,
|
||||
@@ -352,6 +408,55 @@ meta_egl_get_platform_display (MetaEgl *egl,
|
||||
return display;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_terminate (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
GError **error)
|
||||
{
|
||||
if (!eglTerminate (display))
|
||||
{
|
||||
set_egl_error (error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
EGLContext
|
||||
meta_egl_create_context (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLConfig config,
|
||||
EGLContext share_context,
|
||||
const EGLint *attrib_list,
|
||||
GError **error)
|
||||
{
|
||||
EGLContext context;
|
||||
|
||||
context = eglCreateContext (display, config, share_context, attrib_list);
|
||||
if (context == EGL_NO_CONTEXT)
|
||||
{
|
||||
set_egl_error (error);
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_destroy_context (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLContext context,
|
||||
GError **error)
|
||||
{
|
||||
if (!eglDestroyContext (display, context))
|
||||
{
|
||||
set_egl_error (error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
EGLImageKHR
|
||||
meta_egl_create_image (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
@@ -395,6 +500,38 @@ meta_egl_destroy_image (MetaEgl *egl,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_make_current (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLSurface draw,
|
||||
EGLSurface read,
|
||||
EGLContext context,
|
||||
GError **error)
|
||||
{
|
||||
if (!eglMakeCurrent (display, draw, read, context))
|
||||
{
|
||||
set_egl_error (error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_swap_buffers (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLSurface surface,
|
||||
GError **error)
|
||||
{
|
||||
if (!eglSwapBuffers (display, surface))
|
||||
{
|
||||
set_egl_error (error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_egl_query_wayland_buffer (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
@@ -479,10 +616,11 @@ meta_egl_egl_device_has_extensions (MetaEgl *egl,
|
||||
}
|
||||
|
||||
va_start (var_args, first_extension);
|
||||
has_extensions = extensions_string_has_extensions_valist (extensions_str,
|
||||
missing_extensions,
|
||||
first_extension,
|
||||
var_args);
|
||||
has_extensions =
|
||||
meta_extensions_string_has_extensions_valist (extensions_str,
|
||||
missing_extensions,
|
||||
first_extension,
|
||||
var_args);
|
||||
va_end (var_args);
|
||||
|
||||
return has_extensions;
|
||||
|
@@ -36,6 +36,12 @@ G_DECLARE_FINAL_TYPE (MetaEgl, meta_egl, META, EGL, GObject)
|
||||
|
||||
GQuark meta_egl_error_quark (void);
|
||||
|
||||
gboolean
|
||||
meta_extensions_string_has_extensions_valist (const char *extensions_str,
|
||||
char ***missing_extensions,
|
||||
char *first_extension,
|
||||
va_list var_args);
|
||||
|
||||
gboolean meta_egl_has_extensions (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
char ***missing_extensions,
|
||||
@@ -46,12 +52,28 @@ gboolean meta_egl_initialize (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
GError **error);
|
||||
|
||||
gpointer meta_egl_get_proc_address (MetaEgl *egl,
|
||||
const char *procname,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_choose_config (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
const EGLint *attrib_list,
|
||||
EGLConfig *chosen_config,
|
||||
GError **error);
|
||||
|
||||
EGLContext meta_egl_create_context (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLConfig config,
|
||||
EGLContext share_context,
|
||||
const EGLint *attrib_list,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_destroy_context (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLContext context,
|
||||
GError **error);
|
||||
|
||||
EGLImageKHR meta_egl_create_image (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLContext context,
|
||||
@@ -65,18 +87,46 @@ gboolean meta_egl_destroy_image (MetaEgl *egl,
|
||||
EGLImageKHR image,
|
||||
GError **error);
|
||||
|
||||
EGLSurface meta_egl_create_window_surface (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLConfig config,
|
||||
EGLNativeWindowType native_window_type,
|
||||
const EGLint *attrib_list,
|
||||
GError **error);
|
||||
|
||||
EGLSurface meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLConfig config,
|
||||
const EGLint *attrib_list,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_destroy_surface (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLSurface surface,
|
||||
GError **error);
|
||||
|
||||
EGLDisplay meta_egl_get_platform_display (MetaEgl *egl,
|
||||
EGLenum platform,
|
||||
void *native_display,
|
||||
const EGLint *attrib_list,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_terminate (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_make_current (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLSurface draw,
|
||||
EGLSurface read,
|
||||
EGLContext context,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_swap_buffers (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
EGLSurface surface,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_egl_query_wayland_buffer (MetaEgl *egl,
|
||||
EGLDisplay display,
|
||||
struct wl_resource *buffer,
|
||||
|
36
src/backends/meta-gles3-table.h
Normal file
36
src/backends/meta-gles3-table.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef META_GLES3_TABLE_H
|
||||
#define META_GLES3_TABLE_H
|
||||
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
#include <GLES3/gl3.h>
|
||||
|
||||
typedef struct _MetaGles3Table
|
||||
{
|
||||
void (* glEGLImageTargetTexture2DOES) (GLenum target,
|
||||
GLeglImageOES image);
|
||||
} MetaGles3Table;
|
||||
|
||||
#endif /* META_GLES3_TABLE */
|
163
src/backends/meta-gles3.c
Normal file
163
src/backends/meta-gles3.c
Normal file
@@ -0,0 +1,163 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "backends/meta-gles3.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
#include "backends/meta-gles3-table.h"
|
||||
|
||||
struct _MetaGles3
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
MetaEgl *egl;
|
||||
|
||||
MetaGles3Table table;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaGles3, meta_gles3, G_TYPE_OBJECT)
|
||||
|
||||
MetaGles3Table *
|
||||
meta_gles3_get_table (MetaGles3 *gles3)
|
||||
{
|
||||
return &gles3->table;
|
||||
}
|
||||
|
||||
void
|
||||
meta_gles3_ensure_loaded (MetaGles3 *gles3,
|
||||
gpointer *func,
|
||||
const char *name)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (*func)
|
||||
return;
|
||||
|
||||
*func = meta_egl_get_proc_address (gles3->egl, name, &error);
|
||||
if (!*func)
|
||||
g_error ("Failed to load GLES3 symbol: %s", error->message);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_gl_error_str (GLenum gl_error)
|
||||
{
|
||||
switch (gl_error)
|
||||
{
|
||||
case GL_NO_ERROR:
|
||||
return "No error has been recorded.";
|
||||
case GL_INVALID_ENUM:
|
||||
return "An unacceptable value is specified for an enumerated argument.";
|
||||
case GL_INVALID_VALUE:
|
||||
return "A numeric argument is out of range.";
|
||||
case GL_INVALID_OPERATION:
|
||||
return "The specified operation is not allowed in the current state.";
|
||||
case GL_INVALID_FRAMEBUFFER_OPERATION:
|
||||
return "The framebuffer object is not complete.";
|
||||
case GL_OUT_OF_MEMORY:
|
||||
return "There is not enough memory left to execute the command.";
|
||||
default:
|
||||
return "Unknown error";
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_gles3_clear_error (MetaGles3 *gles3)
|
||||
{
|
||||
while (TRUE)
|
||||
{
|
||||
GLenum gl_error = glGetError ();
|
||||
|
||||
if (gl_error == GL_NO_ERROR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_gles3_validate (MetaGles3 *gles3,
|
||||
GError **error)
|
||||
{
|
||||
GLenum gl_error;
|
||||
|
||||
gl_error = glGetError ();
|
||||
if (gl_error != GL_NO_ERROR)
|
||||
{
|
||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
get_gl_error_str (gl_error));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_gles3_has_extensions (MetaGles3 *gles3,
|
||||
char ***missing_extensions,
|
||||
char *first_extension,
|
||||
...)
|
||||
{
|
||||
va_list var_args;
|
||||
const char *extensions_str;
|
||||
gboolean has_extensions;
|
||||
|
||||
extensions_str = (const char *) glGetString (GL_EXTENSIONS);
|
||||
if (!extensions_str)
|
||||
{
|
||||
g_warning ("Failed to get string: %s", get_gl_error_str (glGetError ()));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
va_start (var_args, first_extension);
|
||||
has_extensions =
|
||||
meta_extensions_string_has_extensions_valist (extensions_str,
|
||||
missing_extensions,
|
||||
first_extension,
|
||||
var_args);
|
||||
va_end (var_args);
|
||||
|
||||
return has_extensions;
|
||||
}
|
||||
|
||||
MetaGles3 *
|
||||
meta_gles3_new (MetaEgl *egl)
|
||||
{
|
||||
MetaGles3 *gles3;
|
||||
|
||||
gles3 = g_object_new (META_TYPE_GLES3, NULL);
|
||||
gles3->egl = egl;
|
||||
|
||||
return gles3;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gles3_init (MetaGles3 *gles3)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gles3_class_init (MetaGles3Class *klass)
|
||||
{
|
||||
}
|
83
src/backends/meta-gles3.h
Normal file
83
src/backends/meta-gles3.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef META_GLES3_H
|
||||
#define META_GLES3_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-egl.h"
|
||||
|
||||
typedef struct _MetaGles3Table MetaGles3Table;
|
||||
|
||||
#define META_TYPE_GLES3 (meta_gles3_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaGles3, meta_gles3, META, GLES3, GObject)
|
||||
|
||||
MetaGles3Table * meta_gles3_get_table (MetaGles3 *gles3);
|
||||
|
||||
void meta_gles3_clear_error (MetaGles3 *gles3);
|
||||
|
||||
gboolean meta_gles3_validate (MetaGles3 *gles3,
|
||||
GError **error);
|
||||
|
||||
void meta_gles3_ensure_loaded (MetaGles3 *gles,
|
||||
gpointer *func,
|
||||
const char *name);
|
||||
|
||||
gboolean meta_gles3_has_extensions (MetaGles3 *gles3,
|
||||
char ***missing_extensions,
|
||||
char *first_extension,
|
||||
...);
|
||||
|
||||
MetaGles3 * meta_gles3_new (MetaEgl *egl);
|
||||
|
||||
#define GLBAS(gles3, func, args) \
|
||||
{ \
|
||||
GError *_error = NULL; \
|
||||
\
|
||||
func args; \
|
||||
\
|
||||
if (!meta_gles3_validate (gles3, &_error)) \
|
||||
{ \
|
||||
g_warning ("%s %s failed: %s", #func, #args, _error->message); \
|
||||
g_error_free (_error); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define GLEXT(gles3, func, args) \
|
||||
{ \
|
||||
GError *_error = NULL; \
|
||||
MetaGles3Table *table; \
|
||||
\
|
||||
table = meta_gles3_get_table (gles3); \
|
||||
meta_gles3_ensure_loaded (gles3, (gpointer *) &table->func, #func); \
|
||||
\
|
||||
table->func args; \
|
||||
\
|
||||
if (!meta_gles3_validate (gles3, &_error)) \
|
||||
{ \
|
||||
g_warning ("%s %s failed: %s", #func, #args, _error->message); \
|
||||
g_error_free (_error); \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif /* META_GLES3_H */
|
224
src/backends/meta-gpu.c
Normal file
224
src/backends/meta-gpu.c
Normal file
@@ -0,0 +1,224 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "backends/meta-gpu.h"
|
||||
|
||||
#include "backends/meta-output.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_MONITOR_MANAGER,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
typedef struct _MetaGpuPrivate
|
||||
{
|
||||
MetaMonitorManager *monitor_manager;
|
||||
|
||||
GList *outputs;
|
||||
GList *crtcs;
|
||||
GList *modes;
|
||||
} MetaGpuPrivate;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaGpu, meta_gpu, G_TYPE_OBJECT)
|
||||
|
||||
gboolean
|
||||
meta_gpu_has_hotplug_mode_update (MetaGpu *gpu)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
GList *l;
|
||||
|
||||
for (l = priv->outputs; l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = l->data;
|
||||
|
||||
if (output->hotplug_mode_update)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_gpu_read_current (MetaGpu *gpu,
|
||||
GError **error)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
gboolean ret;
|
||||
GList *old_outputs;
|
||||
GList *old_crtcs;
|
||||
GList *old_modes;
|
||||
|
||||
/* TODO: Get rid of this when objects incref:s what they need instead */
|
||||
old_outputs = priv->outputs;
|
||||
old_crtcs = priv->crtcs;
|
||||
old_modes = priv->modes;
|
||||
|
||||
ret = META_GPU_GET_CLASS (gpu)->read_current (gpu, error);
|
||||
|
||||
g_list_free_full (old_outputs, g_object_unref);
|
||||
g_list_free_full (old_modes, g_object_unref);
|
||||
g_list_free_full (old_crtcs, g_object_unref);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
MetaMonitorManager *
|
||||
meta_gpu_get_monitor_manager (MetaGpu *gpu)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
return priv->monitor_manager;
|
||||
}
|
||||
|
||||
GList *
|
||||
meta_gpu_get_outputs (MetaGpu *gpu)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
return priv->outputs;
|
||||
}
|
||||
|
||||
GList *
|
||||
meta_gpu_get_crtcs (MetaGpu *gpu)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
return priv->crtcs;
|
||||
}
|
||||
|
||||
GList *
|
||||
meta_gpu_get_modes (MetaGpu *gpu)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
return priv->modes;
|
||||
}
|
||||
|
||||
void
|
||||
meta_gpu_take_outputs (MetaGpu *gpu,
|
||||
GList *outputs)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
priv->outputs = outputs;
|
||||
}
|
||||
|
||||
void
|
||||
meta_gpu_take_crtcs (MetaGpu *gpu,
|
||||
GList *crtcs)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
priv->crtcs = crtcs;
|
||||
}
|
||||
|
||||
void
|
||||
meta_gpu_take_modes (MetaGpu *gpu,
|
||||
GList *modes)
|
||||
{
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
priv->modes = modes;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaGpu *gpu = META_GPU (object);
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MONITOR_MANAGER:
|
||||
priv->monitor_manager = g_value_get_object (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaGpu *gpu = META_GPU (object);
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MONITOR_MANAGER:
|
||||
g_value_set_object (value, priv->monitor_manager);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_finalize (GObject *object)
|
||||
{
|
||||
MetaGpu *gpu = META_GPU (object);
|
||||
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
|
||||
|
||||
g_list_free_full (priv->outputs, g_object_unref);
|
||||
g_list_free_full (priv->modes, g_object_unref);
|
||||
g_list_free_full (priv->crtcs, g_object_unref);
|
||||
|
||||
G_OBJECT_CLASS (meta_gpu_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_init (MetaGpu *gpu)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_class_init (MetaGpuClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->set_property = meta_gpu_set_property;
|
||||
object_class->get_property = meta_gpu_get_property;
|
||||
object_class->finalize = meta_gpu_finalize;
|
||||
|
||||
obj_props[PROP_MONITOR_MANAGER] =
|
||||
g_param_spec_object ("monitor-manager",
|
||||
"monitor-manager",
|
||||
"MetaMonitorManager",
|
||||
META_TYPE_MONITOR_MANAGER,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
}
|
66
src/backends/meta-gpu.h
Normal file
66
src/backends/meta-gpu.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef META_GPU_H
|
||||
#define META_GPU_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-monitor-manager-private.h"
|
||||
|
||||
#define META_TYPE_GPU (meta_gpu_get_type ())
|
||||
G_DECLARE_DERIVABLE_TYPE (MetaGpu, meta_gpu, META, GPU, GObject)
|
||||
|
||||
struct _MetaGpuClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
gboolean (* read_current) (MetaGpu *gpu,
|
||||
GError **error);
|
||||
};
|
||||
|
||||
int meta_gpu_get_kms_fd (MetaGpu *gpu);
|
||||
|
||||
const char * meta_gpu_get_kms_file_path (MetaGpu *gpu);
|
||||
|
||||
gboolean meta_gpu_read_current (MetaGpu *gpu,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_gpu_has_hotplug_mode_update (MetaGpu *gpu);
|
||||
|
||||
MetaMonitorManager * meta_gpu_get_monitor_manager (MetaGpu *gpu);
|
||||
|
||||
GList * meta_gpu_get_outputs (MetaGpu *gpu);
|
||||
|
||||
GList * meta_gpu_get_crtcs (MetaGpu *gpu);
|
||||
|
||||
GList * meta_gpu_get_modes (MetaGpu *gpu);
|
||||
|
||||
void meta_gpu_take_outputs (MetaGpu *gpu,
|
||||
GList *outputs);
|
||||
|
||||
void meta_gpu_take_crtcs (MetaGpu *gpu,
|
||||
GList *crtcs);
|
||||
|
||||
void meta_gpu_take_modes (MetaGpu *gpu,
|
||||
GList *modes);
|
||||
|
||||
#endif /* META_GPU_H */
|
@@ -65,6 +65,7 @@ struct _MetaInputSettingsPrivate
|
||||
GSettings *trackball_settings;
|
||||
GSettings *keyboard_settings;
|
||||
GSettings *gsd_settings;
|
||||
GSettings *a11y_settings;
|
||||
|
||||
GHashTable *mappable_devices;
|
||||
|
||||
@@ -143,6 +144,7 @@ meta_input_settings_dispose (GObject *object)
|
||||
g_clear_object (&priv->trackball_settings);
|
||||
g_clear_object (&priv->keyboard_settings);
|
||||
g_clear_object (&priv->gsd_settings);
|
||||
g_clear_object (&priv->a11y_settings);
|
||||
g_clear_pointer (&priv->mappable_devices, g_hash_table_unref);
|
||||
|
||||
if (priv->monitors_changed_id && priv->monitor_manager)
|
||||
@@ -801,6 +803,7 @@ meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings,
|
||||
{
|
||||
MetaInputSettingsPrivate *priv;
|
||||
MetaMonitorManager *monitor_manager;
|
||||
MetaLogicalMonitor *ret = NULL;
|
||||
guint n_values;
|
||||
GList *logical_monitors;
|
||||
GList *l;
|
||||
@@ -815,11 +818,11 @@ meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings,
|
||||
g_warning ("EDID configuration for device '%s' "
|
||||
"is incorrect, must have 3 values",
|
||||
clutter_input_device_get_device_name (device));
|
||||
return NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!*edid[0] && !*edid[1] && !*edid[2])
|
||||
return NULL;
|
||||
goto out;
|
||||
|
||||
monitor_manager = priv->monitor_manager;
|
||||
logical_monitors =
|
||||
@@ -833,10 +836,15 @@ meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings,
|
||||
edid[0],
|
||||
edid[1],
|
||||
edid[2]))
|
||||
return logical_monitor;
|
||||
{
|
||||
ret = logical_monitor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
out:
|
||||
g_strfreev (edid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1136,6 +1144,90 @@ apply_mappable_device_settings (MetaInputSettings *input_settings,
|
||||
}
|
||||
}
|
||||
|
||||
struct _a11y_settings_flags_pair {
|
||||
const char *name;
|
||||
ClutterKeyboardA11yFlags flag;
|
||||
} settings_flags_pair[] = {
|
||||
{ "enable", CLUTTER_A11Y_KEYBOARD_ENABLED },
|
||||
{ "timeout-enable", CLUTTER_A11Y_TIMEOUT_ENABLED },
|
||||
{ "mousekeys-enable", CLUTTER_A11Y_MOUSE_KEYS_ENABLED },
|
||||
{ "slowkeys-enable", CLUTTER_A11Y_SLOW_KEYS_ENABLED },
|
||||
{ "slowkeys-beep-press", CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS },
|
||||
{ "slowkeys-beep-accept", CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT },
|
||||
{ "slowkeys-beep-reject", CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT },
|
||||
{ "bouncekeys-enable", CLUTTER_A11Y_BOUNCE_KEYS_ENABLED },
|
||||
{ "bouncekeys-beep-reject", CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT },
|
||||
{ "togglekeys-enable", CLUTTER_A11Y_TOGGLE_KEYS_ENABLED },
|
||||
{ "stickykeys-enable", CLUTTER_A11Y_STICKY_KEYS_ENABLED },
|
||||
{ "stickykeys-modifier-beep", CLUTTER_A11Y_STICKY_KEYS_BEEP },
|
||||
{ "stickykeys-two-key-off", CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF },
|
||||
{ "feature-state-change-beep", CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP },
|
||||
};
|
||||
|
||||
static void
|
||||
load_keyboard_a11y_settings (MetaInputSettings *input_settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
|
||||
ClutterKbdA11ySettings kbd_a11y_settings;
|
||||
ClutterInputDevice *core_keyboard;
|
||||
guint i;
|
||||
|
||||
core_keyboard = clutter_device_manager_get_core_device (priv->device_manager, CLUTTER_KEYBOARD_DEVICE);
|
||||
if (device && device != core_keyboard)
|
||||
return;
|
||||
|
||||
kbd_a11y_settings.controls = 0;
|
||||
for (i = 0; i < G_N_ELEMENTS (settings_flags_pair); i++)
|
||||
{
|
||||
if (g_settings_get_boolean (priv->a11y_settings, settings_flags_pair[i].name))
|
||||
kbd_a11y_settings.controls |= settings_flags_pair[i].flag;
|
||||
}
|
||||
|
||||
kbd_a11y_settings.timeout_delay = g_settings_get_int (priv->a11y_settings,
|
||||
"disable-timeout");
|
||||
kbd_a11y_settings.slowkeys_delay = g_settings_get_int (priv->a11y_settings,
|
||||
"slowkeys-delay");
|
||||
kbd_a11y_settings.debounce_delay = g_settings_get_int (priv->a11y_settings,
|
||||
"bouncekeys-delay");
|
||||
kbd_a11y_settings.mousekeys_init_delay = g_settings_get_int (priv->a11y_settings,
|
||||
"mousekeys-init-delay");
|
||||
kbd_a11y_settings.mousekeys_max_speed = g_settings_get_int (priv->a11y_settings,
|
||||
"mousekeys-max-speed");
|
||||
kbd_a11y_settings.mousekeys_accel_time = g_settings_get_int (priv->a11y_settings,
|
||||
"mousekeys-accel-time");
|
||||
|
||||
clutter_device_manager_set_kbd_a11y_settings (priv->device_manager, &kbd_a11y_settings);
|
||||
}
|
||||
|
||||
static void
|
||||
on_keyboard_a11y_settings_changed (ClutterDeviceManager *device_manager,
|
||||
ClutterKeyboardA11yFlags new_flags,
|
||||
ClutterKeyboardA11yFlags what_changed,
|
||||
MetaInputSettings *input_settings)
|
||||
{
|
||||
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (settings_flags_pair); i++)
|
||||
{
|
||||
if (settings_flags_pair[i].flag & what_changed)
|
||||
g_settings_set_boolean (priv->a11y_settings,
|
||||
settings_flags_pair[i].name,
|
||||
(new_flags & settings_flags_pair[i].flag) ? TRUE : FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_a11y_settings_changed (GSettings *settings,
|
||||
const char *key,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data);
|
||||
|
||||
load_keyboard_a11y_settings (input_settings, NULL);
|
||||
}
|
||||
|
||||
static GSettings *
|
||||
lookup_device_settings (ClutterInputDevice *device)
|
||||
{
|
||||
@@ -1302,8 +1394,18 @@ check_add_mappable_device (MetaInputSettings *input_settings,
|
||||
{
|
||||
MetaInputSettingsPrivate *priv;
|
||||
DeviceMappingInfo *info;
|
||||
ClutterInputDeviceType device_type;
|
||||
GSettings *settings;
|
||||
|
||||
device_type = clutter_input_device_get_device_type (device);
|
||||
|
||||
if ((device_type == CLUTTER_TABLET_DEVICE ||
|
||||
device_type == CLUTTER_PEN_DEVICE ||
|
||||
device_type == CLUTTER_ERASER_DEVICE ||
|
||||
device_type == CLUTTER_PAD_DEVICE) &&
|
||||
g_getenv ("MUTTER_DISABLE_WACOM_CONFIGURATION") != NULL)
|
||||
return FALSE;
|
||||
|
||||
settings = lookup_device_settings (device);
|
||||
|
||||
if (!settings)
|
||||
@@ -1317,8 +1419,8 @@ check_add_mappable_device (MetaInputSettings *input_settings,
|
||||
info->settings = settings;
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE ||
|
||||
clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE)
|
||||
if (device_type == CLUTTER_TABLET_DEVICE ||
|
||||
device_type == CLUTTER_PAD_DEVICE)
|
||||
{
|
||||
WacomError *error = libwacom_error_new ();
|
||||
|
||||
@@ -1336,7 +1438,7 @@ check_add_mappable_device (MetaInputSettings *input_settings,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE)
|
||||
if (device_type == CLUTTER_PAD_DEVICE)
|
||||
{
|
||||
info->group_modes =
|
||||
g_new0 (guint, clutter_input_device_get_n_mode_groups (device));
|
||||
@@ -1381,6 +1483,7 @@ apply_device_settings (MetaInputSettings *input_settings,
|
||||
update_pointer_accel_profile (input_settings,
|
||||
priv->trackball_settings,
|
||||
device);
|
||||
load_keyboard_a11y_settings (input_settings, device);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1597,11 +1700,17 @@ meta_input_settings_init (MetaInputSettings *settings)
|
||||
clutter_settings_get_default(), "double-click-time",
|
||||
G_SETTINGS_BIND_GET);
|
||||
|
||||
priv->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.keyboard");
|
||||
g_signal_connect (priv->a11y_settings, "changed",
|
||||
G_CALLBACK (meta_input_a11y_settings_changed), settings);
|
||||
g_signal_connect (priv->device_manager, "kbd-a11y-flags-changed",
|
||||
G_CALLBACK (on_keyboard_a11y_settings_changed), settings);
|
||||
|
||||
priv->mappable_devices =
|
||||
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) device_mapping_info_free);
|
||||
|
||||
priv->monitor_manager = g_object_ref (meta_monitor_manager_get ());
|
||||
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
||||
g_signal_connect (priv->monitor_manager, "monitors-changed-internal",
|
||||
G_CALLBACK (monitors_changed_cb), settings);
|
||||
|
||||
#ifdef HAVE_LIBWACOM
|
||||
|
@@ -21,9 +21,12 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-logical-monitor.h"
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/meta-output.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT)
|
||||
|
||||
static MetaMonitor *
|
||||
@@ -199,14 +202,72 @@ meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor)
|
||||
return logical_monitor->monitors;
|
||||
}
|
||||
|
||||
typedef struct _ForeachCrtcData
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
MetaLogicalMonitorCrtcFunc func;
|
||||
gpointer user_data;
|
||||
} ForeachCrtcData;
|
||||
|
||||
static gboolean
|
||||
foreach_crtc (MetaMonitor *monitor,
|
||||
MetaMonitorMode *mode,
|
||||
MetaMonitorCrtcMode *monitor_crtc_mode,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
ForeachCrtcData *data = user_data;
|
||||
|
||||
data->func (data->logical_monitor,
|
||||
monitor_crtc_mode->output->crtc,
|
||||
data->user_data);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_logical_monitor_foreach_crtc (MetaLogicalMonitor *logical_monitor,
|
||||
MetaLogicalMonitorCrtcFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = logical_monitor->monitors; l; l = l->next)
|
||||
{
|
||||
MetaMonitor *monitor = l->data;
|
||||
MetaMonitorMode *mode;
|
||||
ForeachCrtcData data = {
|
||||
.logical_monitor = logical_monitor,
|
||||
.func = func,
|
||||
.user_data = user_data
|
||||
};
|
||||
|
||||
mode = meta_monitor_get_current_mode (monitor);
|
||||
meta_monitor_mode_foreach_crtc (monitor, mode, foreach_crtc, &data, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_logical_monitor_init (MetaLogicalMonitor *logical_monitor)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_logical_monitor_finalize (GObject *object)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = META_LOGICAL_MONITOR (object);
|
||||
|
||||
g_list_free (logical_monitor->monitors);
|
||||
|
||||
G_OBJECT_CLASS (meta_logical_monitor_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_logical_monitor_class_init (MetaLogicalMonitorClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = meta_logical_monitor_finalize;
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@@ -61,6 +61,10 @@ G_DECLARE_FINAL_TYPE (MetaLogicalMonitor, meta_logical_monitor,
|
||||
META, LOGICAL_MONITOR,
|
||||
GObject)
|
||||
|
||||
typedef void (* MetaLogicalMonitorCrtcFunc) (MetaLogicalMonitor *logical_monitor,
|
||||
MetaCrtc *crtc,
|
||||
gpointer user_data);
|
||||
|
||||
MetaLogicalMonitor * meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
|
||||
MetaLogicalMonitorConfig *logical_monitor_config,
|
||||
int monitor_number);
|
||||
@@ -90,4 +94,8 @@ gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor
|
||||
MetaLogicalMonitor *neighbor,
|
||||
MetaScreenDirection neighbor_dir);
|
||||
|
||||
void meta_logical_monitor_foreach_crtc (MetaLogicalMonitor *logical_monitor,
|
||||
MetaLogicalMonitorCrtcFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
#endif /* META_LOGICAL_MONITOR_H */
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "backends/meta-monitor-config-migration.h"
|
||||
#include "backends/meta-monitor-config-store.h"
|
||||
#include "backends/meta-monitor-manager-private.h"
|
||||
#include "backends/meta-output.h"
|
||||
#include "core/boxes-private.h"
|
||||
|
||||
#define CONFIG_HISTORY_MAX_SIZE 3
|
||||
@@ -326,8 +327,8 @@ meta_monitor_config_manager_assign (MetaMonitorManager *manager,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static MetaMonitorsConfigKey *
|
||||
create_key_for_current_state (MetaMonitorManager *monitor_manager)
|
||||
MetaMonitorsConfigKey *
|
||||
meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager)
|
||||
{
|
||||
MetaMonitorsConfigKey *config_key;
|
||||
GList *l;
|
||||
@@ -369,7 +370,8 @@ meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager
|
||||
MetaMonitorsConfig *config;
|
||||
GError *error = NULL;
|
||||
|
||||
config_key = create_key_for_current_state (monitor_manager);
|
||||
config_key =
|
||||
meta_create_monitors_config_key_for_current_state (monitor_manager);
|
||||
if (!config_key)
|
||||
return NULL;
|
||||
|
||||
@@ -612,7 +614,9 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
|
||||
x += logical_monitor_config->layout.width;
|
||||
}
|
||||
|
||||
return meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
|
||||
@@ -641,7 +645,9 @@ meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_ma
|
||||
logical_monitor_configs = g_list_append (NULL,
|
||||
primary_logical_monitor_config);
|
||||
|
||||
return meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
|
||||
@@ -717,7 +723,9 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
|
||||
if (!logical_monitor_configs)
|
||||
return NULL;
|
||||
|
||||
return meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
|
||||
@@ -726,8 +734,11 @@ create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
|
||||
gboolean rotate,
|
||||
MetaMonitorTransform transform)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
|
||||
MetaLogicalMonitorConfig *logical_monitor_config;
|
||||
MetaLogicalMonitorConfig *current_logical_monitor_config;
|
||||
GList *logical_monitor_configs;
|
||||
MetaLogicalMonitorLayoutMode layout_mode;
|
||||
MetaMonitorConfig *monitor_config;
|
||||
MetaMonitorConfig *current_monitor_config;
|
||||
|
||||
@@ -764,8 +775,19 @@ create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
|
||||
logical_monitor_config->monitor_configs = g_list_append (NULL, monitor_config);
|
||||
logical_monitor_config->transform = transform;
|
||||
|
||||
return meta_monitors_config_new (g_list_append (NULL, logical_monitor_config),
|
||||
config_manager->current_config->layout_mode,
|
||||
if (meta_monitor_transform_is_rotated (current_logical_monitor_config->transform) !=
|
||||
meta_monitor_transform_is_rotated (logical_monitor_config->transform))
|
||||
{
|
||||
int temp = logical_monitor_config->layout.width;
|
||||
logical_monitor_config->layout.width = logical_monitor_config->layout.height;
|
||||
logical_monitor_config->layout.height = temp;
|
||||
}
|
||||
|
||||
logical_monitor_configs = g_list_append (NULL, logical_monitor_config);
|
||||
layout_mode = config_manager->current_config->layout_mode;
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
|
||||
@@ -788,6 +810,7 @@ create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager)
|
||||
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
|
||||
MetaLogicalMonitorLayoutMode layout_mode;
|
||||
MetaLogicalMonitorConfig *logical_monitor_config = NULL;
|
||||
GList *logical_monitor_configs;
|
||||
GList *monitor_configs = NULL;
|
||||
gint common_mode_w = 0, common_mode_h = 0;
|
||||
float best_scale = 1.0;
|
||||
@@ -885,8 +908,10 @@ create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager)
|
||||
.monitor_configs = monitor_configs
|
||||
};
|
||||
|
||||
logical_monitor_configs = g_list_append (NULL, logical_monitor_config);
|
||||
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
|
||||
return meta_monitors_config_new (g_list_append (NULL, logical_monitor_config),
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
@@ -927,7 +952,9 @@ create_for_switch_config_external (MetaMonitorConfigManager *config_manager)
|
||||
x += logical_monitor_config->layout.width;
|
||||
}
|
||||
|
||||
return meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
|
||||
@@ -956,7 +983,9 @@ create_for_switch_config_builtin (MetaMonitorConfigManager *config_manager)
|
||||
logical_monitor_configs = g_list_append (NULL,
|
||||
primary_logical_monitor_config);
|
||||
|
||||
return meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
return meta_monitors_config_new (monitor_manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
}
|
||||
|
||||
@@ -1079,7 +1108,8 @@ meta_logical_monitor_config_free (MetaLogicalMonitorConfig *logical_monitor_conf
|
||||
}
|
||||
|
||||
static MetaMonitorsConfigKey *
|
||||
meta_monitors_config_key_new (GList *logical_monitor_configs)
|
||||
meta_monitors_config_key_new (GList *logical_monitor_configs,
|
||||
GList *disabled_monitor_specs)
|
||||
{
|
||||
MetaMonitorsConfigKey *config_key;
|
||||
GList *monitor_specs;
|
||||
@@ -1101,6 +1131,14 @@ meta_monitors_config_key_new (GList *logical_monitor_configs)
|
||||
}
|
||||
}
|
||||
|
||||
for (l = disabled_monitor_specs; l; l = l->next)
|
||||
{
|
||||
MetaMonitorSpec *monitor_spec = l->data;
|
||||
|
||||
monitor_spec = meta_monitor_spec_clone (monitor_spec);
|
||||
monitor_specs = g_list_prepend (monitor_specs, monitor_spec);
|
||||
}
|
||||
|
||||
monitor_specs = g_list_sort (monitor_specs,
|
||||
(GCompareFunc) meta_monitor_spec_compare);
|
||||
|
||||
@@ -1167,21 +1205,60 @@ meta_monitors_config_key_equal (gconstpointer data_a,
|
||||
}
|
||||
|
||||
MetaMonitorsConfig *
|
||||
meta_monitors_config_new (GList *logical_monitor_configs,
|
||||
MetaLogicalMonitorLayoutMode layout_mode,
|
||||
MetaMonitorsConfigFlag flags)
|
||||
meta_monitors_config_new_full (GList *logical_monitor_configs,
|
||||
GList *disabled_monitor_specs,
|
||||
MetaLogicalMonitorLayoutMode layout_mode,
|
||||
MetaMonitorsConfigFlag flags)
|
||||
{
|
||||
MetaMonitorsConfig *config;
|
||||
|
||||
config = g_object_new (META_TYPE_MONITORS_CONFIG, NULL);
|
||||
config->logical_monitor_configs = logical_monitor_configs;
|
||||
config->key = meta_monitors_config_key_new (logical_monitor_configs);
|
||||
config->disabled_monitor_specs = disabled_monitor_specs;
|
||||
config->key = meta_monitors_config_key_new (logical_monitor_configs,
|
||||
disabled_monitor_specs);
|
||||
config->layout_mode = layout_mode;
|
||||
config->flags = flags;
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
MetaMonitorsConfig *
|
||||
meta_monitors_config_new (MetaMonitorManager *monitor_manager,
|
||||
GList *logical_monitor_configs,
|
||||
MetaLogicalMonitorLayoutMode layout_mode,
|
||||
MetaMonitorsConfigFlag flags)
|
||||
{
|
||||
GList *disabled_monitor_specs = NULL;
|
||||
GList *monitors;
|
||||
GList *l;
|
||||
|
||||
monitors = meta_monitor_manager_get_monitors (monitor_manager);
|
||||
for (l = monitors; l; l = l->next)
|
||||
{
|
||||
MetaMonitor *monitor = l->data;
|
||||
MetaMonitorSpec *monitor_spec;
|
||||
|
||||
if (meta_monitor_manager_is_lid_closed (monitor_manager) &&
|
||||
meta_monitor_is_laptop_panel (monitor))
|
||||
continue;
|
||||
|
||||
monitor_spec = meta_monitor_get_spec (monitor);
|
||||
if (meta_logical_monitor_configs_have_monitor (logical_monitor_configs,
|
||||
monitor_spec))
|
||||
continue;
|
||||
|
||||
disabled_monitor_specs =
|
||||
g_list_prepend (disabled_monitor_specs,
|
||||
meta_monitor_spec_clone (monitor_spec));
|
||||
}
|
||||
|
||||
return meta_monitors_config_new_full (logical_monitor_configs,
|
||||
disabled_monitor_specs,
|
||||
layout_mode,
|
||||
flags);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitors_config_finalize (GObject *object)
|
||||
{
|
||||
@@ -1190,6 +1267,10 @@ meta_monitors_config_finalize (GObject *object)
|
||||
meta_monitors_config_key_free (config->key);
|
||||
g_list_free_full (config->logical_monitor_configs,
|
||||
(GDestroyNotify) meta_logical_monitor_config_free);
|
||||
g_list_free_full (config->disabled_monitor_specs,
|
||||
(GDestroyNotify) meta_monitor_spec_free);
|
||||
|
||||
G_OBJECT_CLASS (meta_monitors_config_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1365,6 +1446,38 @@ has_adjecent_neighbour (MetaMonitorsConfig *config,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs,
|
||||
MetaMonitorSpec *monitor_spec)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = logical_monitor_configs; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
|
||||
GList *k;
|
||||
|
||||
for (k = logical_monitor_config->monitor_configs; k; k = k->next)
|
||||
{
|
||||
MetaMonitorConfig *monitor_config = k->data;
|
||||
|
||||
if (meta_monitor_spec_equals (monitor_spec,
|
||||
monitor_config->monitor_spec))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_monitors_config_is_monitor_enabled (MetaMonitorsConfig *config,
|
||||
MetaMonitorSpec *monitor_spec)
|
||||
{
|
||||
return meta_logical_monitor_configs_have_monitor (config->logical_monitor_configs,
|
||||
monitor_spec);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_verify_monitors_config (MetaMonitorsConfig *config,
|
||||
MetaMonitorManager *monitor_manager,
|
||||
@@ -1446,6 +1559,18 @@ meta_verify_monitors_config (MetaMonitorsConfig *config,
|
||||
|
||||
g_list_free (region);
|
||||
|
||||
for (l = config->disabled_monitor_specs; l; l = l->next)
|
||||
{
|
||||
MetaMonitorSpec *monitor_spec = l->data;
|
||||
|
||||
if (meta_monitors_config_is_monitor_enabled (config, monitor_spec))
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Assigned monitor explicitly disabled");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (min_x != 0 || min_y != 0)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
|
@@ -64,6 +64,8 @@ struct _MetaMonitorsConfig
|
||||
MetaMonitorsConfigKey *key;
|
||||
GList *logical_monitor_configs;
|
||||
|
||||
GList *disabled_monitor_specs;
|
||||
|
||||
MetaMonitorsConfigFlag flags;
|
||||
|
||||
MetaLogicalMonitorLayoutMode layout_mode;
|
||||
@@ -112,9 +114,15 @@ void meta_monitor_config_manager_clear_history (MetaMonitorConfigManager *config
|
||||
|
||||
void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manager);
|
||||
|
||||
MetaMonitorsConfig * meta_monitors_config_new (GList *logical_monitor_configs,
|
||||
MetaLogicalMonitorLayoutMode layout_mode,
|
||||
MetaMonitorsConfigFlag flags);
|
||||
MetaMonitorsConfig * meta_monitors_config_new_full (GList *logical_monitor_configs,
|
||||
GList *disabled_monitors,
|
||||
MetaLogicalMonitorLayoutMode layout_mode,
|
||||
MetaMonitorsConfigFlag flags);
|
||||
|
||||
MetaMonitorsConfig * meta_monitors_config_new (MetaMonitorManager *monitor_manager,
|
||||
GList *logical_monitor_configs,
|
||||
MetaLogicalMonitorLayoutMode layout_mode,
|
||||
MetaMonitorsConfigFlag flags);
|
||||
|
||||
unsigned int meta_monitors_config_key_hash (gconstpointer config_key);
|
||||
|
||||
@@ -127,6 +135,11 @@ void meta_logical_monitor_config_free (MetaLogicalMonitorConfig *logical_monitor
|
||||
|
||||
void meta_monitor_config_free (MetaMonitorConfig *monitor_config);
|
||||
|
||||
MetaMonitorsConfigKey * meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager);
|
||||
|
||||
gboolean meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs,
|
||||
MetaMonitorSpec *monitor_spec);
|
||||
|
||||
gboolean meta_verify_monitor_mode_spec (MetaMonitorModeSpec *monitor_mode_spec,
|
||||
GError **error);
|
||||
|
||||
|
@@ -652,6 +652,7 @@ load_config_file (GFile *file,
|
||||
g_array_free (parser.output_array, TRUE);
|
||||
|
||||
free_output_key (&parser.key);
|
||||
g_free (parser.output_field);
|
||||
g_hash_table_destroy (parser.configs);
|
||||
|
||||
return NULL;
|
||||
@@ -949,7 +950,6 @@ derive_logical_monitor_configs (MetaLegacyMonitorsConfig *config,
|
||||
GError **error)
|
||||
{
|
||||
GList *logical_monitor_configs = NULL;
|
||||
GList *monitor_configs = NULL;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < config->n_outputs; i++)
|
||||
@@ -994,8 +994,8 @@ derive_logical_monitor_configs (MetaLegacyMonitorsConfig *config,
|
||||
}
|
||||
else
|
||||
{
|
||||
g_list_free_full (monitor_configs,
|
||||
(GDestroyNotify) meta_monitor_config_free);
|
||||
g_list_free_full (logical_monitor_configs,
|
||||
(GDestroyNotify) meta_logical_monitor_config_free);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -1008,8 +1008,8 @@ derive_logical_monitor_configs (MetaLegacyMonitorsConfig *config,
|
||||
|
||||
if (!monitor_config)
|
||||
{
|
||||
g_list_free_full (monitor_configs,
|
||||
(GDestroyNotify) meta_monitor_config_free);
|
||||
g_list_free_full (logical_monitor_configs,
|
||||
(GDestroyNotify) meta_logical_monitor_config_free);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1056,6 +1056,35 @@ generate_config_name (MetaLegacyMonitorsConfig *config)
|
||||
return key_name;
|
||||
}
|
||||
|
||||
static GList *
|
||||
find_disabled_monitor_specs (MetaLegacyMonitorsConfig *legacy_config)
|
||||
{
|
||||
GList *disabled_monitors = NULL;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < legacy_config->n_outputs; i++)
|
||||
{
|
||||
MetaOutputKey *output_key = &legacy_config->keys[i];
|
||||
MetaOutputConfig *output_config = &legacy_config->outputs[i];
|
||||
MetaMonitorSpec *monitor_spec;
|
||||
|
||||
if (output_config->enabled)
|
||||
continue;
|
||||
|
||||
monitor_spec = g_new0 (MetaMonitorSpec, 1);
|
||||
*monitor_spec = (MetaMonitorSpec) {
|
||||
.connector = output_key->connector,
|
||||
.vendor = output_key->vendor,
|
||||
.product = output_key->product,
|
||||
.serial = output_key->serial
|
||||
};
|
||||
|
||||
disabled_monitors = g_list_prepend (disabled_monitors, monitor_spec);
|
||||
}
|
||||
|
||||
return disabled_monitors;
|
||||
}
|
||||
|
||||
static void
|
||||
migrate_config (gpointer key,
|
||||
gpointer value,
|
||||
@@ -1068,6 +1097,7 @@ migrate_config (gpointer key,
|
||||
GList *logical_monitor_configs;
|
||||
MetaLogicalMonitorLayoutMode layout_mode;
|
||||
GError *error = NULL;
|
||||
GList *disabled_monitor_specs;
|
||||
MetaMonitorsConfig *config;
|
||||
|
||||
logical_monitor_configs = derive_logical_monitor_configs (legacy_config,
|
||||
@@ -1083,9 +1113,13 @@ migrate_config (gpointer key,
|
||||
return;
|
||||
}
|
||||
|
||||
disabled_monitor_specs = find_disabled_monitor_specs (legacy_config);
|
||||
|
||||
layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
|
||||
config = meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_MIGRATED);
|
||||
config = meta_monitors_config_new_full (logical_monitor_configs,
|
||||
disabled_monitor_specs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_MIGRATED);
|
||||
if (!meta_verify_monitors_config (config, monitor_manager, &error))
|
||||
{
|
||||
g_autofree char *config_name = NULL;
|
||||
@@ -1112,7 +1146,6 @@ meta_migrate_old_monitors_config (MetaMonitorConfigStore *config_store,
|
||||
return FALSE;
|
||||
|
||||
g_hash_table_foreach (configs, migrate_config, config_store);
|
||||
g_hash_table_destroy (configs);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1175,6 +1208,13 @@ meta_finish_monitors_config_migration (MetaMonitorManager *monitor_manager,
|
||||
monitor_mode_spec = monitor_config->mode_spec;
|
||||
monitor_mode = meta_monitor_get_mode_from_spec (monitor,
|
||||
monitor_mode_spec);
|
||||
if (!monitor_mode)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Mode not available on monitor");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
scale = meta_monitor_calculate_mode_scale (monitor, monitor_mode);
|
||||
|
||||
logical_monitor_config->scale = scale;
|
||||
|
@@ -83,6 +83,14 @@
|
||||
* </monitor>
|
||||
* <presentation>yes</presentation>
|
||||
* </logicalmonitor>
|
||||
* <disabled>
|
||||
* <monitorspec>
|
||||
* <connector>LVDS3</connector>
|
||||
* <vendor>Vendor C</vendor>
|
||||
* <product>Product C</product>
|
||||
* <serial>Serial C</serial>
|
||||
* </monitorspec>
|
||||
* </disabled>
|
||||
* </configuration>
|
||||
* </monitors>
|
||||
*
|
||||
@@ -151,7 +159,8 @@ typedef enum
|
||||
STATE_MONITOR_MODE_HEIGHT,
|
||||
STATE_MONITOR_MODE_RATE,
|
||||
STATE_MONITOR_MODE_FLAG,
|
||||
STATE_MONITOR_UNDERSCANNING
|
||||
STATE_MONITOR_UNDERSCANNING,
|
||||
STATE_DISABLED,
|
||||
} ParserState;
|
||||
|
||||
typedef struct
|
||||
@@ -159,6 +168,8 @@ typedef struct
|
||||
ParserState state;
|
||||
MetaMonitorConfigStore *config_store;
|
||||
|
||||
ParserState monitor_spec_parent_state;
|
||||
|
||||
gboolean current_was_migrated;
|
||||
GList *current_logical_monitor_configs;
|
||||
MetaMonitorSpec *current_monitor_spec;
|
||||
@@ -167,6 +178,7 @@ typedef struct
|
||||
MetaMonitorModeSpec *current_monitor_mode_spec;
|
||||
MetaMonitorConfig *current_monitor_config;
|
||||
MetaLogicalMonitorConfig *current_logical_monitor_config;
|
||||
GList *current_disabled_monitor_specs;
|
||||
} ConfigParser;
|
||||
|
||||
G_DEFINE_TYPE (MetaMonitorConfigStore, meta_monitor_config_store,
|
||||
@@ -254,6 +266,10 @@ handle_start_element (GMarkupParseContext *context,
|
||||
|
||||
parser->state = STATE_MIGRATED;
|
||||
}
|
||||
else if (g_str_equal (element_name, "disabled"))
|
||||
{
|
||||
parser->state = STATE_DISABLED;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
||||
@@ -351,7 +367,7 @@ handle_start_element (GMarkupParseContext *context,
|
||||
if (g_str_equal (element_name, "monitorspec"))
|
||||
{
|
||||
parser->current_monitor_spec = g_new0 (MetaMonitorSpec, 1);
|
||||
|
||||
parser->monitor_spec_parent_state = STATE_MONITOR;
|
||||
parser->state = STATE_MONITOR_SPEC;
|
||||
}
|
||||
else if (g_str_equal (element_name, "mode"))
|
||||
@@ -456,6 +472,22 @@ handle_start_element (GMarkupParseContext *context,
|
||||
"Invalid element '%s' under underscanning", element_name);
|
||||
return;
|
||||
}
|
||||
|
||||
case STATE_DISABLED:
|
||||
{
|
||||
if (!g_str_equal (element_name, "monitorspec"))
|
||||
{
|
||||
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
||||
"Invalid element '%s' under disabled", element_name);
|
||||
return;
|
||||
}
|
||||
|
||||
parser->current_monitor_spec = g_new0 (MetaMonitorSpec, 1);
|
||||
parser->monitor_spec_parent_state = STATE_DISABLED;
|
||||
parser->state = STATE_MONITOR_SPEC;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -513,6 +545,34 @@ derive_logical_monitor_layout (MetaLogicalMonitorConfig *logical_monitor_conf
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
finish_monitor_spec (ConfigParser *parser)
|
||||
{
|
||||
switch (parser->monitor_spec_parent_state)
|
||||
{
|
||||
case STATE_MONITOR:
|
||||
{
|
||||
parser->current_monitor_config->monitor_spec =
|
||||
parser->current_monitor_spec;
|
||||
parser->current_monitor_spec = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
case STATE_DISABLED:
|
||||
{
|
||||
parser->current_disabled_monitor_specs =
|
||||
g_list_prepend (parser->current_disabled_monitor_specs,
|
||||
parser->current_monitor_spec);
|
||||
parser->current_monitor_spec = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
handle_end_element (GMarkupParseContext *context,
|
||||
const char *element_name,
|
||||
@@ -575,11 +635,9 @@ handle_end_element (GMarkupParseContext *context,
|
||||
if (!meta_verify_monitor_spec (parser->current_monitor_spec, error))
|
||||
return;
|
||||
|
||||
parser->current_monitor_config->monitor_spec =
|
||||
parser->current_monitor_spec;
|
||||
parser->current_monitor_spec = NULL;
|
||||
finish_monitor_spec (parser);
|
||||
|
||||
parser->state = STATE_MONITOR;
|
||||
parser->state = parser->monitor_spec_parent_state;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -665,6 +723,14 @@ handle_end_element (GMarkupParseContext *context,
|
||||
return;
|
||||
}
|
||||
|
||||
case STATE_DISABLED:
|
||||
{
|
||||
g_assert (g_str_equal (element_name, "disabled"));
|
||||
|
||||
parser->state = STATE_CONFIGURATION;
|
||||
return;
|
||||
}
|
||||
|
||||
case STATE_CONFIGURATION:
|
||||
{
|
||||
MetaMonitorConfigStore *store = parser->config_store;
|
||||
@@ -701,11 +767,13 @@ handle_end_element (GMarkupParseContext *context,
|
||||
config_flags |= META_MONITORS_CONFIG_FLAG_MIGRATED;
|
||||
|
||||
config =
|
||||
meta_monitors_config_new (parser->current_logical_monitor_configs,
|
||||
layout_mode,
|
||||
config_flags);
|
||||
meta_monitors_config_new_full (parser->current_logical_monitor_configs,
|
||||
parser->current_disabled_monitor_specs,
|
||||
layout_mode,
|
||||
config_flags);
|
||||
|
||||
parser->current_logical_monitor_configs = NULL;
|
||||
parser->current_disabled_monitor_specs = NULL;
|
||||
|
||||
if (!meta_verify_monitors_config (config, store->monitor_manager,
|
||||
error))
|
||||
@@ -849,6 +917,7 @@ handle_text (GMarkupParseContext *context,
|
||||
case STATE_MONITOR_SPEC:
|
||||
case STATE_MONITOR_MODE:
|
||||
case STATE_TRANSFORM:
|
||||
case STATE_DISABLED:
|
||||
{
|
||||
if (!is_all_whitespace (text, text_len))
|
||||
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
|
||||
@@ -1058,6 +1127,27 @@ meta_monitor_config_store_lookup (MetaMonitorConfigStore *config_store,
|
||||
key));
|
||||
}
|
||||
|
||||
static void
|
||||
append_monitor_spec (GString *buffer,
|
||||
MetaMonitorSpec *monitor_spec,
|
||||
const char *indentation)
|
||||
{
|
||||
g_string_append_printf (buffer, "%s<monitorspec>\n", indentation);
|
||||
g_string_append_printf (buffer, "%s <connector>%s</connector>\n",
|
||||
indentation,
|
||||
monitor_spec->connector);
|
||||
g_string_append_printf (buffer, "%s <vendor>%s</vendor>\n",
|
||||
indentation,
|
||||
monitor_spec->vendor);
|
||||
g_string_append_printf (buffer, "%s <product>%s</product>\n",
|
||||
indentation,
|
||||
monitor_spec->product);
|
||||
g_string_append_printf (buffer, "%s <serial>%s</serial>\n",
|
||||
indentation,
|
||||
monitor_spec->serial);
|
||||
g_string_append_printf (buffer, "%s</monitorspec>\n", indentation);
|
||||
}
|
||||
|
||||
static void
|
||||
append_monitors (GString *buffer,
|
||||
GList *monitor_configs)
|
||||
@@ -1073,16 +1163,7 @@ append_monitors (GString *buffer,
|
||||
monitor_config->mode_spec->refresh_rate);
|
||||
|
||||
g_string_append (buffer, " <monitor>\n");
|
||||
g_string_append (buffer, " <monitorspec>\n");
|
||||
g_string_append_printf (buffer, " <connector>%s</connector>\n",
|
||||
monitor_config->monitor_spec->connector);
|
||||
g_string_append_printf (buffer, " <vendor>%s</vendor>\n",
|
||||
monitor_config->monitor_spec->vendor);
|
||||
g_string_append_printf (buffer, " <product>%s</product>\n",
|
||||
monitor_config->monitor_spec->product);
|
||||
g_string_append_printf (buffer, " <serial>%s</serial>\n",
|
||||
monitor_config->monitor_spec->serial);
|
||||
g_string_append (buffer, " </monitorspec>\n");
|
||||
append_monitor_spec (buffer, monitor_config->monitor_spec, " ");
|
||||
g_string_append (buffer, " <mode>\n");
|
||||
g_string_append_printf (buffer, " <width>%d</width>\n",
|
||||
monitor_config->mode_spec->width);
|
||||
@@ -1205,6 +1286,18 @@ generate_config_xml (MetaMonitorConfigStore *config_store)
|
||||
append_logical_monitor_xml (buffer, config, logical_monitor_config);
|
||||
}
|
||||
|
||||
if (config->disabled_monitor_specs)
|
||||
{
|
||||
g_string_append (buffer, " <disabled>\n");
|
||||
for (l = config->disabled_monitor_specs; l; l = l->next)
|
||||
{
|
||||
MetaMonitorSpec *monitor_spec = l->data;
|
||||
|
||||
append_monitor_spec (buffer, monitor_spec, " ");
|
||||
}
|
||||
g_string_append (buffer, " </disabled>\n");
|
||||
}
|
||||
|
||||
g_string_append (buffer, " </configuration>\n");
|
||||
}
|
||||
|
||||
@@ -1230,9 +1323,10 @@ saved_cb (GObject *object,
|
||||
if (!g_file_replace_contents_finish (G_FILE (object), result, NULL, &error))
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Saving monitor configuration failed: %s\n", error->message);
|
||||
else
|
||||
g_clear_object (&data->config_store->save_cancellable);
|
||||
{
|
||||
g_warning ("Saving monitor configuration failed: %s\n", error->message);
|
||||
g_clear_object (&data->config_store->save_cancellable);
|
||||
}
|
||||
|
||||
g_error_free (error);
|
||||
}
|
||||
@@ -1246,6 +1340,37 @@ saved_cb (GObject *object,
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_config_store_save_sync (MetaMonitorConfigStore *config_store)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GFile *file;
|
||||
GString *buffer;
|
||||
|
||||
if (config_store->custom_write_file)
|
||||
file = config_store->custom_write_file;
|
||||
else
|
||||
file = config_store->user_file;
|
||||
|
||||
buffer = generate_config_xml (config_store);
|
||||
|
||||
if (!g_file_replace_contents (file,
|
||||
buffer->str, buffer->len,
|
||||
NULL,
|
||||
FALSE,
|
||||
G_FILE_CREATE_REPLACE_DESTINATION,
|
||||
NULL,
|
||||
NULL,
|
||||
&error))
|
||||
{
|
||||
g_warning ("Saving monitor configuration failed: %s\n",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
g_string_free (buffer, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_config_store_save (MetaMonitorConfigStore *config_store)
|
||||
{
|
||||
@@ -1258,6 +1383,17 @@ meta_monitor_config_store_save (MetaMonitorConfigStore *config_store)
|
||||
g_clear_object (&config_store->save_cancellable);
|
||||
}
|
||||
|
||||
/*
|
||||
* Custom write file is only ever used by the test suite, and the test suite
|
||||
* will want to have be able to read back the content immediately, so for
|
||||
* custom write files, do the content replacement synchronously.
|
||||
*/
|
||||
if (config_store->custom_write_file)
|
||||
{
|
||||
meta_monitor_config_store_save_sync (config_store);
|
||||
return;
|
||||
}
|
||||
|
||||
config_store->save_cancellable = g_cancellable_new ();
|
||||
|
||||
buffer = generate_config_xml (config_store);
|
||||
@@ -1268,31 +1404,6 @@ meta_monitor_config_store_save (MetaMonitorConfigStore *config_store)
|
||||
.buffer = buffer
|
||||
};
|
||||
|
||||
/*
|
||||
* Custom write file is only ever used by the test suite, and the test suite
|
||||
* will want to have be able to read back the content immediately, so for
|
||||
* custom write files, do the content replacement synchronously.
|
||||
*/
|
||||
if (config_store->custom_write_file)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (!g_file_replace_contents (config_store->custom_write_file,
|
||||
buffer->str, buffer->len,
|
||||
NULL,
|
||||
FALSE,
|
||||
G_FILE_CREATE_REPLACE_DESTINATION,
|
||||
NULL,
|
||||
NULL,
|
||||
&error))
|
||||
{
|
||||
g_warning ("Saving monitor configuration failed: %s\n",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
g_file_replace_contents_async (config_store->user_file,
|
||||
buffer->str, buffer->len,
|
||||
NULL,
|
||||
@@ -1407,6 +1518,8 @@ meta_monitor_config_store_constructed (GObject *object)
|
||||
}
|
||||
|
||||
g_free (user_file_path);
|
||||
|
||||
G_OBJECT_CLASS (meta_monitor_config_store_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1414,6 +1527,14 @@ meta_monitor_config_store_dispose (GObject *object)
|
||||
{
|
||||
MetaMonitorConfigStore *config_store = META_MONITOR_CONFIG_STORE (object);
|
||||
|
||||
if (config_store->save_cancellable)
|
||||
{
|
||||
g_cancellable_cancel (config_store->save_cancellable);
|
||||
g_clear_object (&config_store->save_cancellable);
|
||||
|
||||
meta_monitor_config_store_save_sync (config_store);
|
||||
}
|
||||
|
||||
g_clear_pointer (&config_store->configs, g_hash_table_destroy);
|
||||
|
||||
g_clear_object (&config_store->user_file);
|
||||
|
@@ -31,8 +31,10 @@
|
||||
|
||||
#include <meta/util.h>
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/meta-monitor.h"
|
||||
#include "backends/meta-monitor-config-manager.h"
|
||||
#include "backends/meta-output.h"
|
||||
|
||||
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||
|
||||
@@ -45,6 +47,8 @@ struct _MetaMonitorManagerDummy
|
||||
{
|
||||
MetaMonitorManager parent_instance;
|
||||
|
||||
MetaGpu *gpu;
|
||||
|
||||
gboolean is_transform_handled;
|
||||
};
|
||||
|
||||
@@ -60,19 +64,49 @@ typedef struct _MetaOutputDummy
|
||||
|
||||
G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER);
|
||||
|
||||
struct _MetaGpuDummy
|
||||
{
|
||||
MetaGpu parent;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaGpuDummy, meta_gpu_dummy, META_TYPE_GPU)
|
||||
|
||||
static void
|
||||
meta_output_dummy_notify_destroy (MetaOutput *output);
|
||||
|
||||
#define array_last(a, t) \
|
||||
g_array_index (a, t, a->len - 1)
|
||||
typedef struct _CrtcModeSpec
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
float refresh_rate;
|
||||
} CrtcModeSpec;
|
||||
|
||||
static MetaCrtcMode *
|
||||
create_mode (CrtcModeSpec *spec,
|
||||
long mode_id)
|
||||
{
|
||||
MetaCrtcMode *mode;
|
||||
|
||||
mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
|
||||
|
||||
mode->mode_id = mode_id;
|
||||
mode->width = spec->width;
|
||||
mode->height = spec->height;
|
||||
mode->refresh_rate = spec->refresh_rate;
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static void
|
||||
append_monitor (GArray *modes,
|
||||
GArray *crtcs,
|
||||
GArray *outputs,
|
||||
float scale)
|
||||
append_monitor (MetaMonitorManager *manager,
|
||||
GList **modes,
|
||||
GList **crtcs,
|
||||
GList **outputs,
|
||||
float scale)
|
||||
{
|
||||
MetaCrtcMode modes_decl[] = {
|
||||
MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager);
|
||||
MetaGpu *gpu = manager_dummy->gpu;
|
||||
CrtcModeSpec mode_specs[] = {
|
||||
{
|
||||
.width = 800,
|
||||
.height = 600,
|
||||
@@ -84,65 +118,84 @@ append_monitor (GArray *modes,
|
||||
.refresh_rate = 60.0
|
||||
}
|
||||
};
|
||||
MetaCrtc crtc;
|
||||
GList *new_modes = NULL;
|
||||
MetaCrtc *crtc;
|
||||
MetaOutputDummy *output_dummy;
|
||||
MetaOutput output;
|
||||
MetaOutput *output;
|
||||
unsigned int i;
|
||||
unsigned int number;
|
||||
GList *l;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
||||
modes_decl[i].mode_id = modes->len + i;
|
||||
g_array_append_vals (modes, modes_decl, G_N_ELEMENTS (modes_decl));
|
||||
for (i = 0; i < G_N_ELEMENTS (mode_specs); i++)
|
||||
{
|
||||
long mode_id;
|
||||
MetaCrtcMode *mode;
|
||||
|
||||
crtc = (MetaCrtc) {
|
||||
.crtc_id = crtcs->len + 1,
|
||||
.all_transforms = ALL_TRANSFORMS,
|
||||
};
|
||||
g_array_append_val (crtcs, crtc);
|
||||
mode_id = g_list_length (*modes) + i + 1;
|
||||
mode = create_mode (&mode_specs[i], mode_id);
|
||||
|
||||
new_modes = g_list_append (new_modes, mode);
|
||||
}
|
||||
*modes = g_list_concat (*modes, new_modes);
|
||||
|
||||
crtc = g_object_new (META_TYPE_CRTC, NULL);
|
||||
crtc->crtc_id = g_list_length (*crtcs) + 1;
|
||||
crtc->all_transforms = ALL_TRANSFORMS;
|
||||
*crtcs = g_list_append (*crtcs, crtc);
|
||||
|
||||
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||
|
||||
output_dummy = g_new0 (MetaOutputDummy, 1);
|
||||
*output_dummy = (MetaOutputDummy) {
|
||||
.scale = scale
|
||||
};
|
||||
|
||||
output = (MetaOutput) {
|
||||
.winsys_id = outputs->len + 1,
|
||||
.name = g_strdup_printf ("LVDS%d", outputs->len + 1),
|
||||
.vendor = g_strdup ("MetaProducts Inc."),
|
||||
.product = g_strdup ("MetaMonitor"),
|
||||
.serial = g_strdup_printf ("0xC0FFEE-%d", outputs->len + 1),
|
||||
.suggested_x = -1,
|
||||
.suggested_y = -1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN,
|
||||
.preferred_mode = &array_last (modes, MetaCrtcMode),
|
||||
.n_possible_clones = 0,
|
||||
.backlight = -1,
|
||||
.connector_type = META_CONNECTOR_TYPE_LVDS,
|
||||
.driver_private = output_dummy,
|
||||
.driver_notify =
|
||||
(GDestroyNotify) meta_output_dummy_notify_destroy
|
||||
};
|
||||
number = g_list_length (*outputs) + 1;
|
||||
|
||||
output.modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl));
|
||||
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
||||
output.modes[i] = &g_array_index (modes, MetaCrtcMode,
|
||||
modes->len - (i + 1));
|
||||
output.n_modes = G_N_ELEMENTS (modes_decl);
|
||||
output.possible_crtcs = g_new0 (MetaCrtc *, 1);
|
||||
output.possible_crtcs[0] = &array_last (crtcs, MetaCrtc);
|
||||
output.n_possible_crtcs = 1;
|
||||
output->gpu = gpu;
|
||||
output->winsys_id = number;
|
||||
output->name = g_strdup_printf ("LVDS%d", number);
|
||||
output->vendor = g_strdup ("MetaProducts Inc.");
|
||||
output->product = g_strdup ("MetaMonitor");
|
||||
output->serial = g_strdup_printf ("0xC0FFEE-%d", number);
|
||||
output->suggested_x = -1;
|
||||
output->suggested_y = -1;
|
||||
output->width_mm = 222;
|
||||
output->height_mm = 125;
|
||||
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||
output->preferred_mode = g_list_last (*modes)->data;
|
||||
output->n_possible_clones = 0;
|
||||
output->backlight = -1;
|
||||
output->connector_type = META_CONNECTOR_TYPE_LVDS;
|
||||
output->driver_private = output_dummy;
|
||||
output->driver_notify =
|
||||
(GDestroyNotify) meta_output_dummy_notify_destroy;
|
||||
|
||||
g_array_append_val (outputs, output);
|
||||
output->modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (mode_specs));
|
||||
for (l = new_modes, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
MetaCrtcMode *mode = l->data;
|
||||
|
||||
output->modes[i] = mode;
|
||||
}
|
||||
output->n_modes = G_N_ELEMENTS (mode_specs);
|
||||
output->possible_crtcs = g_new0 (MetaCrtc *, 1);
|
||||
output->possible_crtcs[0] = g_list_last (*crtcs)->data;
|
||||
output->n_possible_crtcs = 1;
|
||||
|
||||
*outputs = g_list_append (*outputs, output);
|
||||
}
|
||||
|
||||
static void
|
||||
append_tiled_monitor (GArray *modes,
|
||||
GArray *crtcs,
|
||||
GArray *outputs,
|
||||
int scale)
|
||||
append_tiled_monitor (MetaMonitorManager *manager,
|
||||
GList **modes,
|
||||
GList **crtcs,
|
||||
GList **outputs,
|
||||
int scale)
|
||||
{
|
||||
MetaCrtcMode modes_decl[] = {
|
||||
MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager);
|
||||
MetaGpu *gpu = manager_dummy->gpu;
|
||||
CrtcModeSpec mode_specs[] = {
|
||||
{
|
||||
.width = 800,
|
||||
.height = 600,
|
||||
@@ -154,81 +207,105 @@ append_tiled_monitor (GArray *modes,
|
||||
.refresh_rate = 60.0
|
||||
}
|
||||
};
|
||||
MetaCrtc crtcs_decl[] = {
|
||||
{
|
||||
.all_transforms = ALL_TRANSFORMS,
|
||||
},
|
||||
{
|
||||
.all_transforms = ALL_TRANSFORMS,
|
||||
},
|
||||
};
|
||||
MetaOutput output;
|
||||
unsigned int n_tiles = 2;
|
||||
GList *new_modes = NULL;
|
||||
GList *new_crtcs = NULL;
|
||||
MetaOutput *output;
|
||||
unsigned int i;
|
||||
uint32_t tile_group_id;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
||||
modes_decl[i].mode_id = modes->len + i;
|
||||
g_array_append_vals (modes, modes_decl, G_N_ELEMENTS (modes_decl));
|
||||
for (i = 0; i < G_N_ELEMENTS (mode_specs); i++)
|
||||
{
|
||||
long mode_id;
|
||||
MetaCrtcMode *mode;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (crtcs_decl); i++)
|
||||
crtcs_decl[i].crtc_id = crtcs->len + i + 1;
|
||||
g_array_append_vals (crtcs, crtcs_decl, G_N_ELEMENTS (crtcs_decl));
|
||||
mode_id = g_list_length (*modes) + i + 1;
|
||||
mode = create_mode (&mode_specs[i], mode_id);
|
||||
|
||||
tile_group_id = outputs->len + 1;
|
||||
for (i = 0; i < G_N_ELEMENTS (crtcs_decl); i++)
|
||||
new_modes = g_list_append (new_modes, mode);
|
||||
}
|
||||
*modes = g_list_concat (*modes, new_modes);
|
||||
|
||||
for (i = 0; i < n_tiles; i++)
|
||||
{
|
||||
MetaCrtc *crtc;
|
||||
|
||||
crtc = g_object_new (META_TYPE_CRTC, NULL);
|
||||
crtc->gpu = gpu;
|
||||
crtc->crtc_id = g_list_length (*crtcs) + i + 1;
|
||||
crtc->all_transforms = ALL_TRANSFORMS;
|
||||
new_crtcs = g_list_append (new_crtcs, crtc);
|
||||
}
|
||||
*crtcs = g_list_concat (*crtcs, new_crtcs);
|
||||
|
||||
tile_group_id = g_list_length (*outputs) + 1;
|
||||
for (i = 0; i < n_tiles; i++)
|
||||
{
|
||||
MetaOutputDummy *output_dummy;
|
||||
MetaCrtcMode *preferred_mode;
|
||||
unsigned int j;
|
||||
unsigned int number;
|
||||
GList *l;
|
||||
|
||||
output_dummy = g_new0 (MetaOutputDummy, 1);
|
||||
*output_dummy = (MetaOutputDummy) {
|
||||
.scale = scale
|
||||
};
|
||||
|
||||
preferred_mode = &array_last (modes, MetaCrtcMode),
|
||||
output = (MetaOutput) {
|
||||
.winsys_id = outputs->len + 1,
|
||||
.name = g_strdup_printf ("LVDS%d", outputs->len + 1),
|
||||
.vendor = g_strdup ("MetaProducts Inc."),
|
||||
.product = g_strdup ("MetaMonitor"),
|
||||
.serial = g_strdup_printf ("0xC0FFEE-%d", outputs->len + 1),
|
||||
.suggested_x = -1,
|
||||
.suggested_y = -1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN,
|
||||
.preferred_mode = preferred_mode,
|
||||
.n_possible_clones = 0,
|
||||
.backlight = -1,
|
||||
.connector_type = META_CONNECTOR_TYPE_LVDS,
|
||||
.tile_info = (MetaTileInfo) {
|
||||
.group_id = tile_group_id,
|
||||
.max_h_tiles = G_N_ELEMENTS (crtcs_decl),
|
||||
.max_v_tiles = 1,
|
||||
.loc_h_tile = i,
|
||||
.loc_v_tile = 0,
|
||||
.tile_w = preferred_mode->width,
|
||||
.tile_h = preferred_mode->height
|
||||
},
|
||||
.driver_private = output_dummy,
|
||||
.driver_notify =
|
||||
(GDestroyNotify) meta_output_dummy_notify_destroy
|
||||
};
|
||||
/* Arbitrary ID unique for this output */
|
||||
number = g_list_length (*outputs) + 1;
|
||||
|
||||
output.modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl));
|
||||
for (j = 0; j < G_N_ELEMENTS (modes_decl); j++)
|
||||
output.modes[j] = &g_array_index (modes, MetaCrtcMode,
|
||||
modes->len - (j + 1));
|
||||
output.n_modes = G_N_ELEMENTS (modes_decl);
|
||||
preferred_mode = g_list_last (*modes)->data;
|
||||
|
||||
output.possible_crtcs = g_new0 (MetaCrtc *, G_N_ELEMENTS (crtcs_decl));
|
||||
for (j = 0; j < G_N_ELEMENTS (crtcs_decl); j++)
|
||||
output.possible_crtcs[j] = &g_array_index (crtcs, MetaCrtc,
|
||||
crtcs->len - (j + 1));
|
||||
output.n_possible_crtcs = G_N_ELEMENTS (crtcs_decl);
|
||||
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||
|
||||
g_array_append_val (outputs, output);
|
||||
output->gpu = gpu;
|
||||
output->winsys_id = number;
|
||||
output->name = g_strdup_printf ("LVDS%d", number);
|
||||
output->vendor = g_strdup ("MetaProducts Inc.");
|
||||
output->product = g_strdup ("MetaMonitor");
|
||||
output->serial = g_strdup_printf ("0xC0FFEE-%d", number);
|
||||
output->suggested_x = -1;
|
||||
output->suggested_y = -1;
|
||||
output->width_mm = 222;
|
||||
output->height_mm = 125;
|
||||
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||
output->preferred_mode = preferred_mode;
|
||||
output->n_possible_clones = 0;
|
||||
output->backlight = -1;
|
||||
output->connector_type = META_CONNECTOR_TYPE_LVDS;
|
||||
output->tile_info = (MetaTileInfo) {
|
||||
.group_id = tile_group_id,
|
||||
.max_h_tiles = n_tiles,
|
||||
.max_v_tiles = 1,
|
||||
.loc_h_tile = i,
|
||||
.loc_v_tile = 0,
|
||||
.tile_w = preferred_mode->width,
|
||||
.tile_h = preferred_mode->height
|
||||
},
|
||||
output->driver_private = output_dummy;
|
||||
output->driver_notify =
|
||||
(GDestroyNotify) meta_output_dummy_notify_destroy;
|
||||
|
||||
output->modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (mode_specs));
|
||||
for (l = new_modes, j = 0; l; l = l->next, j++)
|
||||
{
|
||||
MetaCrtcMode *mode = l->data;
|
||||
|
||||
output->modes[j] = mode;
|
||||
}
|
||||
output->n_modes = G_N_ELEMENTS (mode_specs);
|
||||
|
||||
output->possible_crtcs = g_new0 (MetaCrtc *, n_tiles);
|
||||
for (l = new_crtcs, j = 0; l; l = l->next, j++)
|
||||
{
|
||||
MetaCrtc *crtc = l->data;
|
||||
|
||||
output->possible_crtcs[j] = crtc;
|
||||
}
|
||||
output->n_possible_crtcs = n_tiles;
|
||||
|
||||
*outputs = g_list_append (*outputs, output);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,6 +318,8 @@ meta_output_dummy_notify_destroy (MetaOutput *output)
|
||||
static void
|
||||
meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager);
|
||||
MetaGpu *gpu = manager_dummy->gpu;
|
||||
unsigned int num_monitors = 1;
|
||||
float *monitor_scales = NULL;
|
||||
const char *num_monitors_str;
|
||||
@@ -248,9 +327,9 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
||||
const char *tiled_monitors_str;
|
||||
gboolean tiled_monitors;
|
||||
unsigned int i;
|
||||
GArray *outputs;
|
||||
GArray *crtcs;
|
||||
GArray *modes;
|
||||
GList *outputs;
|
||||
GList *crtcs;
|
||||
GList *modes;
|
||||
|
||||
/* To control what monitor configuration is generated, there are two available
|
||||
* environmental variables that can be used:
|
||||
@@ -319,28 +398,22 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
||||
tiled_monitors_str = g_getenv ("MUTTER_DEBUG_TILED_DUMMY_MONITORS");
|
||||
tiled_monitors = g_strcmp0 (tiled_monitors_str, "1") == 0;
|
||||
|
||||
modes = g_array_sized_new (FALSE, TRUE, sizeof (MetaCrtcMode), MAX_MODES);
|
||||
crtcs = g_array_sized_new (FALSE, TRUE, sizeof (MetaCrtc), MAX_CRTCS);
|
||||
outputs = g_array_sized_new (FALSE, TRUE, sizeof (MetaOutput), MAX_OUTPUTS);
|
||||
modes = NULL;
|
||||
crtcs = NULL;
|
||||
outputs = NULL;
|
||||
|
||||
for (i = 0; i < num_monitors; i++)
|
||||
{
|
||||
if (tiled_monitors)
|
||||
append_tiled_monitor (modes, crtcs, outputs, monitor_scales[i]);
|
||||
append_tiled_monitor (manager,
|
||||
&modes, &crtcs, &outputs, monitor_scales[i]);
|
||||
else
|
||||
append_monitor (modes, crtcs, outputs, monitor_scales[i]);
|
||||
append_monitor (manager, &modes, &crtcs, &outputs, monitor_scales[i]);
|
||||
}
|
||||
|
||||
manager->modes = (MetaCrtcMode *) modes->data;
|
||||
manager->n_modes = modes->len;
|
||||
manager->crtcs = (MetaCrtc *) crtcs->data;
|
||||
manager->n_crtcs = crtcs->len;
|
||||
manager->outputs = (MetaOutput *) outputs->data;
|
||||
manager->n_outputs = outputs->len;
|
||||
|
||||
g_array_free (modes, FALSE);
|
||||
g_array_free (crtcs, FALSE);
|
||||
g_array_free (outputs, FALSE);
|
||||
meta_gpu_take_modes (gpu, modes);
|
||||
meta_gpu_take_crtcs (gpu, crtcs);
|
||||
meta_gpu_take_outputs (gpu, outputs);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -353,12 +426,7 @@ meta_monitor_manager_dummy_ensure_initial_config (MetaMonitorManager *manager)
|
||||
if (meta_is_stage_views_enabled ())
|
||||
meta_monitor_manager_update_logical_state (manager, config);
|
||||
else
|
||||
{
|
||||
MetaMonitorManagerDeriveFlag flags =
|
||||
META_MONITOR_MANAGER_DERIVE_FLAG_NONE;
|
||||
|
||||
meta_monitor_manager_update_logical_state_derived (manager, flags);
|
||||
}
|
||||
meta_monitor_manager_update_logical_state_derived (manager, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -368,6 +436,8 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
||||
MetaOutputInfo **outputs,
|
||||
unsigned int n_outputs)
|
||||
{
|
||||
MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager);
|
||||
GList *l;
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < n_crtcs; i++)
|
||||
@@ -431,9 +501,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
/* Disable CRTCs not mentioned in the list */
|
||||
for (i = 0; i < manager->n_crtcs; i++)
|
||||
for (l = meta_gpu_get_crtcs (manager_dummy->gpu); l; l = l->next)
|
||||
{
|
||||
MetaCrtc *crtc = &manager->crtcs[i];
|
||||
MetaCrtc *crtc = l->data;
|
||||
|
||||
crtc->logical_monitor = NULL;
|
||||
|
||||
@@ -451,9 +521,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
/* Disable outputs not mentioned in the list */
|
||||
for (i = 0; i < manager->n_outputs; i++)
|
||||
for (l = meta_gpu_get_outputs (manager_dummy->gpu); l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = &manager->outputs[i];
|
||||
MetaOutput *output = l->data;
|
||||
|
||||
if (output->is_dirty)
|
||||
{
|
||||
@@ -648,7 +718,6 @@ meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
|
||||
{
|
||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
|
||||
|
||||
manager_class->read_current = meta_monitor_manager_dummy_read_current;
|
||||
manager_class->ensure_initial_config = meta_monitor_manager_dummy_ensure_initial_config;
|
||||
manager_class->apply_monitors_config = meta_monitor_manager_dummy_apply_monitors_config;
|
||||
manager_class->is_transform_handled = meta_monitor_manager_dummy_is_transform_handled;
|
||||
@@ -660,14 +729,44 @@ meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_dummy_init (MetaMonitorManagerDummy *manager)
|
||||
meta_monitor_manager_dummy_init (MetaMonitorManagerDummy *manager_dummy)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_dummy);
|
||||
const char *nested_offscreen_transform;
|
||||
|
||||
nested_offscreen_transform =
|
||||
g_getenv ("MUTTER_DEBUG_NESTED_OFFSCREEN_TRANSFORM");
|
||||
if (g_strcmp0 (nested_offscreen_transform, "1") == 0)
|
||||
manager->is_transform_handled = FALSE;
|
||||
manager_dummy->is_transform_handled = FALSE;
|
||||
else
|
||||
manager->is_transform_handled = TRUE;
|
||||
manager_dummy->is_transform_handled = TRUE;
|
||||
|
||||
manager_dummy->gpu = g_object_new (META_TYPE_GPU_DUMMY,
|
||||
"monitor-manager", manager,
|
||||
NULL);
|
||||
meta_monitor_manager_add_gpu (manager, manager_dummy->gpu);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_gpu_dummy_read_current (MetaGpu *gpu,
|
||||
GError **error)
|
||||
{
|
||||
MetaMonitorManager *manager = meta_gpu_get_monitor_manager (gpu);
|
||||
|
||||
meta_monitor_manager_dummy_read_current (manager);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_dummy_init (MetaGpuDummy *gpu_dummy)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_gpu_dummy_class_init (MetaGpuDummyClass *klass)
|
||||
{
|
||||
MetaGpuClass *gpu_class = META_GPU_CLASS (klass);
|
||||
|
||||
gpu_class->read_current = meta_gpu_dummy_read_current;
|
||||
}
|
||||
|
@@ -24,17 +24,13 @@
|
||||
#define META_MONITOR_MANAGER_DUMMY_H
|
||||
|
||||
#include "meta-monitor-manager-private.h"
|
||||
#include "backends/meta-gpu.h"
|
||||
|
||||
#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
|
||||
#define META_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy))
|
||||
#define META_MONITOR_MANAGER_DUMMY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummyClass))
|
||||
#define META_IS_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_MONITOR_MANAGER_DUMMY))
|
||||
#define META_IS_MONITOR_MANAGER_DUMMY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_MONITOR_MANAGER_DUMMY))
|
||||
#define META_MONITOR_MANAGER_DUMMY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummyClass))
|
||||
#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy,
|
||||
META, MONITOR_MANAGER_DUMMY, MetaMonitorManager)
|
||||
|
||||
typedef struct _MetaMonitorManagerDummyClass MetaMonitorManagerDummyClass;
|
||||
typedef struct _MetaMonitorManagerDummy MetaMonitorManagerDummy;
|
||||
|
||||
GType meta_monitor_manager_dummy_get_type (void);
|
||||
#define META_TYPE_GPU_DUMMY (meta_gpu_dummy_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaGpuDummy, meta_gpu_dummy, META, GPU_DUMMY, MetaGpu)
|
||||
|
||||
#endif /* META_MONITOR_MANAGER_DUMMY_H */
|
||||
|
@@ -60,6 +60,8 @@ typedef struct _MetaLogicalMonitor MetaLogicalMonitor;
|
||||
|
||||
typedef struct _MetaMonitorMode MetaMonitorMode;
|
||||
|
||||
typedef struct _MetaGpu MetaGpu;
|
||||
|
||||
typedef struct _MetaCrtc MetaCrtc;
|
||||
typedef struct _MetaOutput MetaOutput;
|
||||
typedef struct _MetaCrtcMode MetaCrtcMode;
|
||||
@@ -93,12 +95,6 @@ typedef enum _MetaLogicalMonitorLayoutMode
|
||||
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL = 2
|
||||
} MetaLogicalMonitorLayoutMode;
|
||||
|
||||
typedef enum _MetaMonitorManagerDeriveFlag
|
||||
{
|
||||
META_MONITOR_MANAGER_DERIVE_FLAG_NONE = 0,
|
||||
META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE = (1 << 0)
|
||||
} MetaMonitorManagerDeriveFlag;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_MONITOR_TRANSFORM_NORMAL,
|
||||
@@ -111,156 +107,6 @@ typedef enum
|
||||
META_MONITOR_TRANSFORM_FLIPPED_270,
|
||||
} MetaMonitorTransform;
|
||||
|
||||
/* This matches the values in drm_mode.h */
|
||||
typedef enum
|
||||
{
|
||||
META_CONNECTOR_TYPE_Unknown = 0,
|
||||
META_CONNECTOR_TYPE_VGA = 1,
|
||||
META_CONNECTOR_TYPE_DVII = 2,
|
||||
META_CONNECTOR_TYPE_DVID = 3,
|
||||
META_CONNECTOR_TYPE_DVIA = 4,
|
||||
META_CONNECTOR_TYPE_Composite = 5,
|
||||
META_CONNECTOR_TYPE_SVIDEO = 6,
|
||||
META_CONNECTOR_TYPE_LVDS = 7,
|
||||
META_CONNECTOR_TYPE_Component = 8,
|
||||
META_CONNECTOR_TYPE_9PinDIN = 9,
|
||||
META_CONNECTOR_TYPE_DisplayPort = 10,
|
||||
META_CONNECTOR_TYPE_HDMIA = 11,
|
||||
META_CONNECTOR_TYPE_HDMIB = 12,
|
||||
META_CONNECTOR_TYPE_TV = 13,
|
||||
META_CONNECTOR_TYPE_eDP = 14,
|
||||
META_CONNECTOR_TYPE_VIRTUAL = 15,
|
||||
META_CONNECTOR_TYPE_DSI = 16,
|
||||
} MetaConnectorType;
|
||||
|
||||
/* Same as KMS mode flags and X11 randr flags */
|
||||
typedef enum
|
||||
{
|
||||
META_CRTC_MODE_FLAG_NONE = 0,
|
||||
META_CRTC_MODE_FLAG_PHSYNC = (1 << 0),
|
||||
META_CRTC_MODE_FLAG_NHSYNC = (1 << 1),
|
||||
META_CRTC_MODE_FLAG_PVSYNC = (1 << 2),
|
||||
META_CRTC_MODE_FLAG_NVSYNC = (1 << 3),
|
||||
META_CRTC_MODE_FLAG_INTERLACE = (1 << 4),
|
||||
META_CRTC_MODE_FLAG_DBLSCAN = (1 << 5),
|
||||
META_CRTC_MODE_FLAG_CSYNC = (1 << 6),
|
||||
META_CRTC_MODE_FLAG_PCSYNC = (1 << 7),
|
||||
META_CRTC_MODE_FLAG_NCSYNC = (1 << 8),
|
||||
META_CRTC_MODE_FLAG_HSKEW = (1 << 9),
|
||||
META_CRTC_MODE_FLAG_BCAST = (1 << 10),
|
||||
META_CRTC_MODE_FLAG_PIXMUX = (1 << 11),
|
||||
META_CRTC_MODE_FLAG_DBLCLK = (1 << 12),
|
||||
META_CRTC_MODE_FLAG_CLKDIV2 = (1 << 13),
|
||||
|
||||
META_CRTC_MODE_FLAG_MASK = 0x3fff
|
||||
} MetaCrtcModeFlag;
|
||||
|
||||
struct _MetaTileInfo
|
||||
{
|
||||
guint32 group_id;
|
||||
guint32 flags;
|
||||
guint32 max_h_tiles;
|
||||
guint32 max_v_tiles;
|
||||
guint32 loc_h_tile;
|
||||
guint32 loc_v_tile;
|
||||
guint32 tile_w;
|
||||
guint32 tile_h;
|
||||
};
|
||||
|
||||
struct _MetaOutput
|
||||
{
|
||||
/* The CRTC driving this output, NULL if the output is not enabled */
|
||||
MetaCrtc *crtc;
|
||||
/* The low-level ID of this output, used to apply back configuration */
|
||||
glong winsys_id;
|
||||
char *name;
|
||||
char *vendor;
|
||||
char *product;
|
||||
char *serial;
|
||||
int width_mm;
|
||||
int height_mm;
|
||||
CoglSubpixelOrder subpixel_order;
|
||||
|
||||
MetaConnectorType connector_type;
|
||||
|
||||
MetaCrtcMode *preferred_mode;
|
||||
MetaCrtcMode **modes;
|
||||
unsigned int n_modes;
|
||||
|
||||
MetaCrtc **possible_crtcs;
|
||||
unsigned int n_possible_crtcs;
|
||||
|
||||
MetaOutput **possible_clones;
|
||||
unsigned int n_possible_clones;
|
||||
|
||||
int backlight;
|
||||
int backlight_min;
|
||||
int backlight_max;
|
||||
|
||||
/* Used when changing configuration */
|
||||
gboolean is_dirty;
|
||||
|
||||
/* The low-level bits used to build the high-level info
|
||||
in MetaLogicalMonitor
|
||||
|
||||
XXX: flags maybe?
|
||||
There is a lot of code that uses MonitorInfo->is_primary,
|
||||
but nobody uses MetaOutput yet
|
||||
*/
|
||||
gboolean is_primary;
|
||||
gboolean is_presentation;
|
||||
gboolean is_underscanning;
|
||||
gboolean supports_underscanning;
|
||||
|
||||
gpointer driver_private;
|
||||
GDestroyNotify driver_notify;
|
||||
|
||||
/* get a new preferred mode on hotplug events, to handle dynamic guest resizing */
|
||||
gboolean hotplug_mode_update;
|
||||
gint suggested_x;
|
||||
gint suggested_y;
|
||||
|
||||
MetaTileInfo tile_info;
|
||||
};
|
||||
|
||||
struct _MetaCrtc
|
||||
{
|
||||
glong crtc_id;
|
||||
MetaRectangle rect;
|
||||
MetaCrtcMode *current_mode;
|
||||
MetaMonitorTransform transform;
|
||||
unsigned int all_transforms;
|
||||
|
||||
/* Only used to build the logical configuration
|
||||
from the HW one
|
||||
*/
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
/* Used when changing configuration */
|
||||
gboolean is_dirty;
|
||||
|
||||
/* Used by cursor renderer backend */
|
||||
void *cursor_renderer_private;
|
||||
|
||||
gpointer driver_private;
|
||||
GDestroyNotify driver_notify;
|
||||
};
|
||||
|
||||
struct _MetaCrtcMode
|
||||
{
|
||||
/* The low-level ID of this mode, used to apply back configuration */
|
||||
glong mode_id;
|
||||
char *name;
|
||||
|
||||
int width;
|
||||
int height;
|
||||
float refresh_rate;
|
||||
MetaCrtcModeFlag flags;
|
||||
|
||||
gpointer driver_private;
|
||||
GDestroyNotify driver_notify;
|
||||
};
|
||||
|
||||
/*
|
||||
* MetaCrtcInfo:
|
||||
*
|
||||
@@ -304,6 +150,8 @@ struct _MetaMonitorManager
|
||||
{
|
||||
MetaDBusDisplayConfigSkeleton parent_instance;
|
||||
|
||||
MetaBackend *backend;
|
||||
|
||||
/* XXX: this structure is very badly
|
||||
packed, but I like the logical organization
|
||||
of fields */
|
||||
@@ -318,19 +166,7 @@ struct _MetaMonitorManager
|
||||
int screen_width;
|
||||
int screen_height;
|
||||
|
||||
/* Outputs refer to physical screens,
|
||||
CRTCs refer to stuff that can drive outputs
|
||||
(like encoders, but less tied to the HW),
|
||||
while logical_monitors refer to logical ones.
|
||||
*/
|
||||
MetaOutput *outputs;
|
||||
unsigned int n_outputs;
|
||||
|
||||
MetaCrtcMode *modes;
|
||||
unsigned int n_modes;
|
||||
|
||||
MetaCrtc *crtcs;
|
||||
unsigned int n_crtcs;
|
||||
GList *gpus;
|
||||
|
||||
GList *monitors;
|
||||
|
||||
@@ -355,8 +191,6 @@ struct _MetaMonitorManagerClass
|
||||
{
|
||||
MetaDBusDisplayConfigSkeletonClass parent_class;
|
||||
|
||||
void (*read_current) (MetaMonitorManager *);
|
||||
|
||||
char* (*get_edid_file) (MetaMonitorManager *,
|
||||
MetaOutput *);
|
||||
GBytes* (*read_edid) (MetaMonitorManager *,
|
||||
@@ -420,10 +254,14 @@ struct _MetaMonitorManagerClass
|
||||
MetaLogicalMonitorLayoutMode (*get_default_layout_mode) (MetaMonitorManager *);
|
||||
};
|
||||
|
||||
MetaBackend * meta_monitor_manager_get_backend (MetaMonitorManager *manager);
|
||||
|
||||
void meta_monitor_manager_setup (MetaMonitorManager *manager);
|
||||
|
||||
void meta_monitor_manager_rebuild (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config);
|
||||
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorManagerDeriveFlag flags);
|
||||
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config);
|
||||
|
||||
int meta_monitor_manager_get_num_logical_monitors (MetaMonitorManager *manager);
|
||||
|
||||
@@ -457,16 +295,10 @@ MetaMonitor * meta_monitor_manager_get_monitor_from_connector (MetaMonitor
|
||||
|
||||
GList * meta_monitor_manager_get_monitors (MetaMonitorManager *manager);
|
||||
|
||||
MetaOutput *meta_monitor_manager_get_outputs (MetaMonitorManager *manager,
|
||||
unsigned int *n_outputs);
|
||||
void meta_monitor_manager_add_gpu (MetaMonitorManager *manager,
|
||||
MetaGpu *gpu);
|
||||
|
||||
void meta_monitor_manager_get_resources (MetaMonitorManager *manager,
|
||||
MetaCrtcMode **modes,
|
||||
unsigned int *n_modes,
|
||||
MetaCrtc **crtcs,
|
||||
unsigned int *n_crtcs,
|
||||
MetaOutput **outputs,
|
||||
unsigned int *n_outputs);
|
||||
GList * meta_monitor_manager_get_gpus (MetaMonitorManager *manager);
|
||||
|
||||
void meta_monitor_manager_get_screen_size (MetaMonitorManager *manager,
|
||||
int *width,
|
||||
@@ -500,8 +332,8 @@ MetaMonitorsConfig * meta_monitor_manager_ensure_configured (MetaMonitorManager
|
||||
|
||||
void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config);
|
||||
void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorManagerDeriveFlag flags);
|
||||
void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config);
|
||||
|
||||
gboolean meta_monitor_manager_is_lid_closed (MetaMonitorManager *manager);
|
||||
|
||||
@@ -535,6 +367,9 @@ gboolean meta_monitor_manager_get_max_screen_size (MetaMonitorManager
|
||||
MetaLogicalMonitorLayoutMode
|
||||
meta_monitor_manager_get_default_layout_mode (MetaMonitorManager *manager);
|
||||
|
||||
MetaMonitorConfigManager *
|
||||
meta_monitor_manager_get_config_manager (MetaMonitorManager *manager);
|
||||
|
||||
void meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager);
|
||||
|
||||
void meta_monitor_manager_clear_output (MetaOutput *output);
|
||||
|
@@ -36,16 +36,30 @@
|
||||
#include "util-private.h"
|
||||
#include <meta/errors.h>
|
||||
#include "edid.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/meta-logical-monitor.h"
|
||||
#include "backends/meta-monitor.h"
|
||||
#include "backends/meta-monitor-config-manager.h"
|
||||
#include "backends/meta-orientation-manager.h"
|
||||
#include "backends/meta-output.h"
|
||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||
#include "meta-backend-private.h"
|
||||
|
||||
#define DEFAULT_DISPLAY_CONFIGURATION_TIMEOUT 20
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_BACKEND,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST];
|
||||
|
||||
enum {
|
||||
MONITORS_CHANGED_INTERNAL,
|
||||
CONFIRM_DISPLAY_CHANGE,
|
||||
SIGNALS_LAST
|
||||
};
|
||||
@@ -75,6 +89,12 @@ static gboolean
|
||||
meta_monitor_manager_is_config_complete (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config);
|
||||
|
||||
MetaBackend *
|
||||
meta_monitor_manager_get_backend (MetaMonitorManager *manager)
|
||||
{
|
||||
return manager->backend;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_init (MetaMonitorManager *manager)
|
||||
{
|
||||
@@ -153,15 +173,11 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
static float
|
||||
derive_configured_global_scale (MetaMonitorManager *manager)
|
||||
derive_configured_global_scale (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config)
|
||||
{
|
||||
MetaMonitorsConfig *config;
|
||||
MetaLogicalMonitorConfig *logical_monitor_config;
|
||||
|
||||
config = meta_monitor_config_manager_get_current (manager->config_manager);
|
||||
if (!config)
|
||||
return 1.0;
|
||||
|
||||
logical_monitor_config = config->logical_monitor_configs->data;
|
||||
|
||||
return logical_monitor_config->scale;
|
||||
@@ -193,12 +209,11 @@ derive_calculated_global_scale (MetaMonitorManager *manager)
|
||||
|
||||
static float
|
||||
derive_scale_from_config (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config,
|
||||
MetaRectangle *layout)
|
||||
{
|
||||
MetaMonitorsConfig *config;
|
||||
GList *l;
|
||||
|
||||
config = meta_monitor_config_manager_get_current (manager->config_manager);
|
||||
for (l = config->logical_monitor_configs; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
|
||||
@@ -212,14 +227,13 @@ derive_scale_from_config (MetaMonitorManager *manager,
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorManagerDeriveFlag flags)
|
||||
meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config)
|
||||
{
|
||||
GList *logical_monitors = NULL;
|
||||
GList *l;
|
||||
int monitor_number;
|
||||
MetaLogicalMonitor *primary_logical_monitor = NULL;
|
||||
gboolean use_configured_scale;
|
||||
gboolean use_global_scale;
|
||||
float global_scale = 0.0;
|
||||
MetaMonitorManagerCapability capabilities;
|
||||
@@ -230,13 +244,10 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager
|
||||
use_global_scale =
|
||||
!!(capabilities & META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED);
|
||||
|
||||
use_configured_scale =
|
||||
!!(flags & META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE);
|
||||
|
||||
if (use_global_scale)
|
||||
{
|
||||
if (use_configured_scale)
|
||||
global_scale = derive_configured_global_scale (manager);
|
||||
if (config)
|
||||
global_scale = derive_configured_global_scale (manager, config);
|
||||
else
|
||||
global_scale = derive_calculated_global_scale (manager);
|
||||
}
|
||||
@@ -263,8 +274,8 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager
|
||||
|
||||
if (use_global_scale)
|
||||
scale = global_scale;
|
||||
else if (use_configured_scale)
|
||||
scale = derive_scale_from_config (manager, &layout);
|
||||
else if (config)
|
||||
scale = derive_scale_from_config (manager, config, &layout);
|
||||
else
|
||||
scale = calculate_monitor_scale (manager, monitor);
|
||||
|
||||
@@ -455,13 +466,13 @@ meta_monitor_manager_apply_monitors_config (MetaMonitorManager *manager,
|
||||
gboolean
|
||||
meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager)
|
||||
{
|
||||
unsigned int i;
|
||||
GList *l;
|
||||
|
||||
for (i = 0; i < manager->n_outputs; i++)
|
||||
for (l = manager->gpus; l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = &manager->outputs[i];
|
||||
MetaGpu *gpu = l->data;
|
||||
|
||||
if (output->hotplug_mode_update)
|
||||
if (meta_gpu_has_hotplug_mode_update (gpu))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -683,13 +694,27 @@ experimental_features_changed (MetaSettings *settings,
|
||||
meta_settings_update_ui_scaling_factor (settings);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_setup (MetaMonitorManager *manager)
|
||||
{
|
||||
manager->in_init = TRUE;
|
||||
|
||||
manager->config_manager = meta_monitor_config_manager_new (manager);
|
||||
|
||||
meta_monitor_manager_read_current_state (manager);
|
||||
|
||||
meta_monitor_manager_ensure_initial_config (manager);
|
||||
|
||||
manager->in_init = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_constructed (GObject *object)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||
MetaMonitorManagerClass *manager_class =
|
||||
META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaBackend *backend = manager->backend;
|
||||
MetaSettings *settings = meta_backend_get_settings (backend);
|
||||
|
||||
manager->experimental_features_changed_handler_id =
|
||||
@@ -714,90 +739,8 @@ meta_monitor_manager_constructed (GObject *object)
|
||||
manager, 0);
|
||||
|
||||
manager->current_switch_config = META_MONITOR_SWITCH_CONFIG_UNKNOWN;
|
||||
manager->in_init = TRUE;
|
||||
|
||||
manager->config_manager = meta_monitor_config_manager_new (manager);
|
||||
|
||||
meta_monitor_manager_read_current_state (manager);
|
||||
|
||||
meta_monitor_manager_ensure_initial_config (manager);
|
||||
|
||||
initialize_dbus_interface (manager);
|
||||
|
||||
manager->in_init = FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_clear_output (MetaOutput *output)
|
||||
{
|
||||
g_free (output->name);
|
||||
g_free (output->vendor);
|
||||
g_free (output->product);
|
||||
g_free (output->serial);
|
||||
g_free (output->modes);
|
||||
g_free (output->possible_crtcs);
|
||||
g_free (output->possible_clones);
|
||||
|
||||
if (output->driver_notify)
|
||||
output->driver_notify (output);
|
||||
|
||||
memset (output, 0, sizeof (*output));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
||||
int n_old_outputs)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_old_outputs; i++)
|
||||
meta_monitor_manager_clear_output (&old_outputs[i]);
|
||||
|
||||
g_free (old_outputs);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_clear_mode (MetaCrtcMode *mode)
|
||||
{
|
||||
g_free (mode->name);
|
||||
|
||||
if (mode->driver_notify)
|
||||
mode->driver_notify (mode);
|
||||
|
||||
memset (mode, 0, sizeof (*mode));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_free_mode_array (MetaCrtcMode *old_modes,
|
||||
int n_old_modes)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_old_modes; i++)
|
||||
meta_monitor_manager_clear_mode (&old_modes[i]);
|
||||
|
||||
g_free (old_modes);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_clear_crtc (MetaCrtc *crtc)
|
||||
{
|
||||
if (crtc->driver_notify)
|
||||
crtc->driver_notify (crtc);
|
||||
|
||||
memset (crtc, 0, sizeof (*crtc));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_free_crtc_array (MetaCrtc *old_crtcs,
|
||||
int n_old_crtcs)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_old_crtcs; i++)
|
||||
meta_monitor_manager_clear_crtc (&old_crtcs[i]);
|
||||
|
||||
g_free (old_crtcs);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -805,12 +748,10 @@ meta_monitor_manager_finalize (GObject *object)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||
|
||||
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
||||
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
||||
meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs);
|
||||
g_list_free_full (manager->gpus, g_object_unref);
|
||||
g_list_free_full (manager->logical_monitors, g_object_unref);
|
||||
|
||||
g_signal_handler_disconnect (meta_get_backend (),
|
||||
g_signal_handler_disconnect (manager->backend,
|
||||
manager->experimental_features_changed_handler_id);
|
||||
|
||||
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
||||
@@ -847,6 +788,42 @@ meta_monitor_manager_real_get_edid_file (MetaMonitorManager *manager,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_BACKEND:
|
||||
manager->backend = g_value_get_object (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_BACKEND:
|
||||
g_value_set_object (value, manager->backend);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
||||
{
|
||||
@@ -855,11 +832,21 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
||||
object_class->constructed = meta_monitor_manager_constructed;
|
||||
object_class->dispose = meta_monitor_manager_dispose;
|
||||
object_class->finalize = meta_monitor_manager_finalize;
|
||||
object_class->get_property = meta_monitor_manager_get_property;
|
||||
object_class->set_property = meta_monitor_manager_set_property;
|
||||
|
||||
klass->get_edid_file = meta_monitor_manager_real_get_edid_file;
|
||||
klass->read_edid = meta_monitor_manager_real_read_edid;
|
||||
klass->is_lid_closed = meta_monitor_manager_real_is_lid_closed;
|
||||
|
||||
signals[MONITORS_CHANGED_INTERNAL] =
|
||||
g_signal_new ("monitors-changed-internal",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
signals[CONFIRM_DISPLAY_CHANGE] =
|
||||
g_signal_new ("confirm-display-change",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
@@ -867,6 +854,16 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
||||
0,
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
obj_props[PROP_BACKEND] =
|
||||
g_param_spec_object ("backend",
|
||||
"backend",
|
||||
"MetaBackend",
|
||||
META_TYPE_BACKEND,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
|
||||
}
|
||||
|
||||
static const double known_diagonals[] = {
|
||||
@@ -967,31 +964,61 @@ get_connector_type_name (MetaConnectorType connector_type)
|
||||
}
|
||||
}
|
||||
|
||||
static GList *
|
||||
combine_gpu_lists (MetaMonitorManager *manager,
|
||||
GList * (*list_getter) (MetaGpu *gpu))
|
||||
{
|
||||
GList *list = NULL;
|
||||
GList *l;
|
||||
|
||||
for (l = manager->gpus; l; l = l->next)
|
||||
{
|
||||
MetaGpu *gpu = l->data;
|
||||
|
||||
list = g_list_concat (list, g_list_copy (list_getter (gpu)));
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
||||
GDBusMethodInvocation *invocation)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (skeleton);
|
||||
GList *combined_modes;
|
||||
GList *combined_outputs;
|
||||
GList *combined_crtcs;
|
||||
GVariantBuilder crtc_builder, output_builder, mode_builder;
|
||||
GList *l;
|
||||
unsigned int i, j;
|
||||
int max_screen_width;
|
||||
int max_screen_height;
|
||||
|
||||
combined_modes = combine_gpu_lists (manager, meta_gpu_get_modes);
|
||||
combined_outputs = combine_gpu_lists (manager, meta_gpu_get_outputs);
|
||||
combined_crtcs = combine_gpu_lists (manager, meta_gpu_get_crtcs);
|
||||
|
||||
g_variant_builder_init (&crtc_builder, G_VARIANT_TYPE ("a(uxiiiiiuaua{sv})"));
|
||||
g_variant_builder_init (&output_builder, G_VARIANT_TYPE ("a(uxiausauaua{sv})"));
|
||||
g_variant_builder_init (&mode_builder, G_VARIANT_TYPE ("a(uxuudu)"));
|
||||
|
||||
for (i = 0; i < manager->n_crtcs; i++)
|
||||
for (l = combined_crtcs, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
MetaCrtc *crtc = &manager->crtcs[i];
|
||||
MetaCrtc *crtc = l->data;
|
||||
GVariantBuilder transforms;
|
||||
int current_mode_index;
|
||||
|
||||
g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au"));
|
||||
for (j = 0; j <= META_MONITOR_TRANSFORM_FLIPPED_270; j++)
|
||||
if (crtc->all_transforms & (1 << j))
|
||||
g_variant_builder_add (&transforms, "u", j);
|
||||
|
||||
if (crtc->current_mode)
|
||||
current_mode_index = g_list_index (combined_modes, crtc->current_mode);
|
||||
else
|
||||
current_mode_index = -1;
|
||||
g_variant_builder_add (&crtc_builder, "(uxiiiiiuaua{sv})",
|
||||
i, /* ID */
|
||||
(gint64)crtc->crtc_id,
|
||||
@@ -999,33 +1026,48 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
||||
(int)crtc->rect.y,
|
||||
(int)crtc->rect.width,
|
||||
(int)crtc->rect.height,
|
||||
(int)(crtc->current_mode ? crtc->current_mode - manager->modes : -1),
|
||||
current_mode_index,
|
||||
(guint32)crtc->transform,
|
||||
&transforms,
|
||||
NULL /* properties */);
|
||||
}
|
||||
|
||||
for (i = 0; i < manager->n_outputs; i++)
|
||||
for (l = combined_outputs; l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = &manager->outputs[i];
|
||||
MetaOutput *output = l->data;
|
||||
GVariantBuilder crtcs, modes, clones, properties;
|
||||
GBytes *edid;
|
||||
char *edid_file;
|
||||
int crtc_index;
|
||||
|
||||
g_variant_builder_init (&crtcs, G_VARIANT_TYPE ("au"));
|
||||
for (j = 0; j < output->n_possible_crtcs; j++)
|
||||
g_variant_builder_add (&crtcs, "u",
|
||||
(unsigned)(output->possible_crtcs[j] - manager->crtcs));
|
||||
{
|
||||
MetaCrtc *possible_crtc = output->possible_crtcs[j];
|
||||
unsigned possible_crtc_index;
|
||||
|
||||
possible_crtc_index = g_list_index (combined_crtcs, possible_crtc);
|
||||
g_variant_builder_add (&crtcs, "u", possible_crtc_index);
|
||||
}
|
||||
|
||||
g_variant_builder_init (&modes, G_VARIANT_TYPE ("au"));
|
||||
for (j = 0; j < output->n_modes; j++)
|
||||
g_variant_builder_add (&modes, "u",
|
||||
(unsigned)(output->modes[j] - manager->modes));
|
||||
{
|
||||
unsigned mode_index;
|
||||
|
||||
mode_index = g_list_index (combined_modes, output->modes[j]);
|
||||
g_variant_builder_add (&modes, "u", mode_index);
|
||||
}
|
||||
|
||||
g_variant_builder_init (&clones, G_VARIANT_TYPE ("au"));
|
||||
for (j = 0; j < output->n_possible_clones; j++)
|
||||
g_variant_builder_add (&clones, "u",
|
||||
(unsigned)(output->possible_clones[j] - manager->outputs));
|
||||
{
|
||||
unsigned int possible_clone_index;
|
||||
|
||||
possible_clone_index = g_list_index (combined_outputs,
|
||||
output->possible_clones[j]);
|
||||
g_variant_builder_add (&clones, "u", possible_clone_index);
|
||||
}
|
||||
|
||||
g_variant_builder_init (&properties, G_VARIANT_TYPE ("a{sv}"));
|
||||
g_variant_builder_add (&properties, "{sv}", "vendor",
|
||||
@@ -1089,10 +1131,12 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
||||
output->tile_info.tile_h));
|
||||
}
|
||||
|
||||
crtc_index = output->crtc ? g_list_index (combined_crtcs, output->crtc)
|
||||
: -1;
|
||||
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
||||
i, /* ID */
|
||||
(gint64)output->winsys_id,
|
||||
(int)(output->crtc ? output->crtc - manager->crtcs : -1),
|
||||
crtc_index,
|
||||
&crtcs,
|
||||
output->name,
|
||||
&modes,
|
||||
@@ -1100,9 +1144,9 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
||||
&properties);
|
||||
}
|
||||
|
||||
for (i = 0; i < manager->n_modes; i++)
|
||||
for (l = combined_modes, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
MetaCrtcMode *mode = &manager->modes[i];
|
||||
MetaCrtcMode *mode = l->data;
|
||||
|
||||
g_variant_builder_add (&mode_builder, "(uxuudu)",
|
||||
i, /* ID */
|
||||
@@ -1130,6 +1174,11 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
||||
g_variant_builder_end (&mode_builder),
|
||||
max_screen_width,
|
||||
max_screen_height);
|
||||
|
||||
g_list_free (combined_modes);
|
||||
g_list_free (combined_outputs);
|
||||
g_list_free (combined_crtcs);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -1221,12 +1270,14 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton,
|
||||
GDBusMethodInvocation *invocation)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||
MetaSettings *settings = meta_backend_get_settings (manager->backend);
|
||||
GVariantBuilder monitors_builder;
|
||||
GVariantBuilder logical_monitors_builder;
|
||||
GVariantBuilder properties_builder;
|
||||
GList *l;
|
||||
int i;
|
||||
MetaMonitorManagerCapability capabilities;
|
||||
int ui_scaling_factor;
|
||||
int max_screen_width, max_screen_height;
|
||||
|
||||
g_variant_builder_init (&monitors_builder,
|
||||
@@ -1404,6 +1455,11 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton,
|
||||
g_variant_new_boolean (TRUE));
|
||||
}
|
||||
|
||||
ui_scaling_factor = meta_settings_get_ui_scaling_factor (settings);
|
||||
g_variant_builder_add (&properties_builder, "{sv}",
|
||||
"legacy-ui-scaling-factor",
|
||||
g_variant_new_int32 (ui_scaling_factor));
|
||||
|
||||
if (meta_monitor_manager_get_max_screen_size (manager,
|
||||
&max_screen_width,
|
||||
&max_screen_height))
|
||||
@@ -1517,6 +1573,13 @@ meta_monitor_manager_is_config_applicable (MetaMonitorManager *manager,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (meta_monitor_is_laptop_panel (monitor) &&
|
||||
meta_monitor_manager_is_lid_closed (manager))
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Refusing to activate a closed laptop panel");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1527,35 +1590,19 @@ static gboolean
|
||||
meta_monitor_manager_is_config_complete (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config)
|
||||
{
|
||||
GList *l;
|
||||
unsigned int configured_monitor_count = 0;
|
||||
unsigned int expected_monitor_count = 0;
|
||||
MetaMonitorsConfigKey *current_state_key;
|
||||
gboolean is_config_complete;
|
||||
|
||||
for (l = config->logical_monitor_configs; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
|
||||
GList *k;
|
||||
current_state_key =
|
||||
meta_create_monitors_config_key_for_current_state (manager);
|
||||
if (!current_state_key)
|
||||
return FALSE;
|
||||
|
||||
for (k = logical_monitor_config->monitor_configs; k; k = k->next)
|
||||
configured_monitor_count++;
|
||||
}
|
||||
is_config_complete = meta_monitors_config_key_equal (current_state_key,
|
||||
config->key);
|
||||
meta_monitors_config_key_free (current_state_key);
|
||||
|
||||
for (l = manager->monitors; l; l = l->next)
|
||||
{
|
||||
MetaMonitor *monitor = l->data;
|
||||
|
||||
if (meta_monitor_is_laptop_panel (monitor))
|
||||
{
|
||||
if (!meta_monitor_manager_is_lid_closed (manager))
|
||||
expected_monitor_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
expected_monitor_count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (configured_monitor_count != expected_monitor_count)
|
||||
if (!is_config_complete)
|
||||
return FALSE;
|
||||
|
||||
return meta_monitor_manager_is_config_applicable (manager, config, NULL);
|
||||
@@ -1778,6 +1825,8 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
|
||||
monitor_config =
|
||||
create_monitor_config_from_variant (manager,
|
||||
monitor_config_variant, error);
|
||||
g_variant_unref (monitor_config_variant);
|
||||
|
||||
if (!monitor_config)
|
||||
goto err;
|
||||
|
||||
@@ -1928,6 +1977,8 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
|
||||
logical_monitor_config_variant,
|
||||
layout_mode,
|
||||
&error);
|
||||
g_variant_unref (logical_monitor_config_variant);
|
||||
|
||||
if (!logical_monitor_config)
|
||||
{
|
||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||
@@ -1943,7 +1994,9 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
|
||||
logical_monitor_config);
|
||||
}
|
||||
|
||||
config = meta_monitors_config_new (logical_monitor_configs, layout_mode,
|
||||
config = meta_monitors_config_new (manager,
|
||||
logical_monitor_configs,
|
||||
layout_mode,
|
||||
META_MONITORS_CONFIG_FLAG_NONE);
|
||||
if (!meta_verify_monitors_config (config, manager, &error))
|
||||
{
|
||||
@@ -2027,6 +2080,7 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
|
||||
gint value)
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||
GList *combined_outputs;
|
||||
MetaOutput *output;
|
||||
|
||||
if (serial != manager->serial)
|
||||
@@ -2037,14 +2091,18 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (output_index >= manager->n_outputs)
|
||||
combined_outputs = combine_gpu_lists (manager, meta_gpu_get_outputs);
|
||||
|
||||
if (output_index >= g_list_length (combined_outputs))
|
||||
{
|
||||
g_list_free (combined_outputs);
|
||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||
G_DBUS_ERROR_INVALID_ARGS,
|
||||
"Invalid output id");
|
||||
return TRUE;
|
||||
}
|
||||
output = &manager->outputs[output_index];
|
||||
output = g_list_nth_data (combined_outputs, output_index);
|
||||
g_list_free (combined_outputs);
|
||||
|
||||
if (value < 0 || value > 100)
|
||||
{
|
||||
@@ -2077,6 +2135,7 @@ meta_monitor_manager_handle_get_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||
MetaMonitorManagerClass *klass;
|
||||
GList *combined_crtcs;
|
||||
MetaCrtc *crtc;
|
||||
gsize size;
|
||||
unsigned short *red;
|
||||
@@ -2093,14 +2152,18 @@ meta_monitor_manager_handle_get_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (crtc_id >= manager->n_crtcs)
|
||||
combined_crtcs = combine_gpu_lists (manager, meta_gpu_get_crtcs);
|
||||
if (crtc_id >= g_list_length (combined_crtcs))
|
||||
{
|
||||
g_list_free (combined_crtcs);
|
||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||
G_DBUS_ERROR_INVALID_ARGS,
|
||||
"Invalid crtc id");
|
||||
return TRUE;
|
||||
}
|
||||
crtc = &manager->crtcs[crtc_id];
|
||||
|
||||
crtc = g_list_nth_data (combined_crtcs, crtc_id);
|
||||
g_list_free (combined_crtcs);
|
||||
|
||||
klass = META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||
if (klass->get_crtc_gamma)
|
||||
@@ -2140,6 +2203,7 @@ meta_monitor_manager_handle_set_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||
{
|
||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||
MetaMonitorManagerClass *klass;
|
||||
GList *combined_crtcs;
|
||||
MetaCrtc *crtc;
|
||||
gsize size, dummy;
|
||||
unsigned short *red;
|
||||
@@ -2155,14 +2219,19 @@ meta_monitor_manager_handle_set_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (crtc_id >= manager->n_crtcs)
|
||||
combined_crtcs = combine_gpu_lists (manager, meta_gpu_get_crtcs);
|
||||
|
||||
if (crtc_id >= g_list_length (combined_crtcs))
|
||||
{
|
||||
g_list_free (combined_crtcs);
|
||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||
G_DBUS_ERROR_INVALID_ARGS,
|
||||
"Invalid crtc id");
|
||||
return TRUE;
|
||||
}
|
||||
crtc = &manager->crtcs[crtc_id];
|
||||
|
||||
crtc = g_list_nth_data (combined_crtcs, crtc_id);
|
||||
g_list_free (combined_crtcs);
|
||||
|
||||
red_bytes = g_variant_get_data_as_bytes (red_v);
|
||||
green_bytes = g_variant_get_data_as_bytes (green_v);
|
||||
@@ -2271,7 +2340,7 @@ MetaLogicalMonitor *
|
||||
meta_monitor_manager_get_logical_monitor_from_number (MetaMonitorManager *manager,
|
||||
int number)
|
||||
{
|
||||
g_assert ((unsigned int) number < g_list_length (manager->logical_monitors));
|
||||
g_return_val_if_fail ((unsigned int) number < g_list_length (manager->logical_monitors), NULL);
|
||||
|
||||
return g_list_nth (manager->logical_monitors, number)->data;
|
||||
}
|
||||
@@ -2432,38 +2501,17 @@ meta_monitor_manager_get_monitors (MetaMonitorManager *manager)
|
||||
return manager->monitors;
|
||||
}
|
||||
|
||||
MetaOutput *
|
||||
meta_monitor_manager_get_outputs (MetaMonitorManager *manager,
|
||||
unsigned int *n_outputs)
|
||||
void
|
||||
meta_monitor_manager_add_gpu (MetaMonitorManager *manager,
|
||||
MetaGpu *gpu)
|
||||
{
|
||||
*n_outputs = manager->n_outputs;
|
||||
return manager->outputs;
|
||||
manager->gpus = g_list_append (manager->gpus, gpu);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_get_resources (MetaMonitorManager *manager,
|
||||
MetaCrtcMode **modes,
|
||||
unsigned int *n_modes,
|
||||
MetaCrtc **crtcs,
|
||||
unsigned int *n_crtcs,
|
||||
MetaOutput **outputs,
|
||||
unsigned int *n_outputs)
|
||||
GList *
|
||||
meta_monitor_manager_get_gpus (MetaMonitorManager *manager)
|
||||
{
|
||||
if (modes)
|
||||
{
|
||||
*modes = manager->modes;
|
||||
*n_modes = manager->n_modes;
|
||||
}
|
||||
if (crtcs)
|
||||
{
|
||||
*crtcs = manager->crtcs;
|
||||
*n_crtcs = manager->n_crtcs;
|
||||
}
|
||||
if (outputs)
|
||||
{
|
||||
*outputs = manager->outputs;
|
||||
*n_outputs = manager->n_outputs;
|
||||
}
|
||||
return manager->gpus;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2478,7 +2526,7 @@ meta_monitor_manager_get_screen_size (MetaMonitorManager *manager,
|
||||
static void
|
||||
rebuild_monitors (MetaMonitorManager *manager)
|
||||
{
|
||||
unsigned int i;
|
||||
GList *l;
|
||||
|
||||
if (manager->monitors)
|
||||
{
|
||||
@@ -2486,28 +2534,34 @@ rebuild_monitors (MetaMonitorManager *manager)
|
||||
manager->monitors = NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < manager->n_outputs; i++)
|
||||
for (l = manager->gpus; l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = &manager->outputs[i];
|
||||
MetaGpu *gpu = l->data;
|
||||
GList *k;
|
||||
|
||||
if (output->tile_info.group_id)
|
||||
for (k = meta_gpu_get_outputs (gpu); k; k = k->next)
|
||||
{
|
||||
if (is_main_tiled_monitor_output (output))
|
||||
MetaOutput *output = k->data;
|
||||
|
||||
if (output->tile_info.group_id)
|
||||
{
|
||||
MetaMonitorTiled *monitor_tiled;
|
||||
if (is_main_tiled_monitor_output (output))
|
||||
{
|
||||
MetaMonitorTiled *monitor_tiled;
|
||||
|
||||
monitor_tiled = meta_monitor_tiled_new (manager, output);
|
||||
manager->monitors = g_list_append (manager->monitors,
|
||||
monitor_tiled);
|
||||
monitor_tiled = meta_monitor_tiled_new (gpu, output);
|
||||
manager->monitors = g_list_append (manager->monitors,
|
||||
monitor_tiled);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaMonitorNormal *monitor_normal;
|
||||
else
|
||||
{
|
||||
MetaMonitorNormal *monitor_normal;
|
||||
|
||||
monitor_normal = meta_monitor_normal_new (manager, output);
|
||||
manager->monitors = g_list_append (manager->monitors,
|
||||
monitor_normal);
|
||||
monitor_normal = meta_monitor_normal_new (gpu, output);
|
||||
manager->monitors = g_list_append (manager->monitors,
|
||||
monitor_normal);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2548,39 +2602,33 @@ meta_monitor_manager_is_transform_handled (MetaMonitorManager *manager,
|
||||
void
|
||||
meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaOutput *old_outputs;
|
||||
MetaCrtc *old_crtcs;
|
||||
MetaCrtcMode *old_modes;
|
||||
unsigned int n_old_outputs, n_old_crtcs, n_old_modes;
|
||||
|
||||
/* Some implementations of read_current use the existing information
|
||||
* we have available, so don't free the old configuration until after
|
||||
* read_current finishes. */
|
||||
old_outputs = manager->outputs;
|
||||
n_old_outputs = manager->n_outputs;
|
||||
old_crtcs = manager->crtcs;
|
||||
n_old_crtcs = manager->n_crtcs;
|
||||
old_modes = manager->modes;
|
||||
n_old_modes = manager->n_modes;
|
||||
GList *l;
|
||||
|
||||
manager->serial++;
|
||||
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
||||
|
||||
for (l = manager->gpus; l; l = l->next)
|
||||
{
|
||||
MetaGpu *gpu = l->data;
|
||||
GError *error = NULL;
|
||||
|
||||
if (!meta_gpu_read_current (gpu, &error))
|
||||
{
|
||||
g_warning ("Failed to read current KMS state: %s", error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
}
|
||||
|
||||
rebuild_monitors (manager);
|
||||
|
||||
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
||||
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
||||
meta_monitor_manager_free_crtc_array (old_crtcs, n_old_crtcs);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_notify_monitors_changed (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
|
||||
manager->current_switch_config = META_MONITOR_SWITCH_CONFIG_UNKNOWN;
|
||||
|
||||
meta_backend_monitors_changed (backend);
|
||||
meta_backend_monitors_changed (manager->backend);
|
||||
|
||||
g_signal_emit (manager, signals[MONITORS_CHANGED_INTERNAL], 0);
|
||||
g_signal_emit_by_name (manager, "monitors-changed");
|
||||
}
|
||||
|
||||
@@ -2676,17 +2724,17 @@ meta_monitor_manager_update_monitor_modes_derived (MetaMonitorManager *manager)
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorManagerDeriveFlag flags)
|
||||
meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config)
|
||||
{
|
||||
manager->layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
|
||||
|
||||
meta_monitor_manager_rebuild_logical_monitors_derived (manager, flags);
|
||||
meta_monitor_manager_rebuild_logical_monitors_derived (manager, config);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorManagerDeriveFlag flags)
|
||||
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
|
||||
MetaMonitorsConfig *config)
|
||||
{
|
||||
GList *old_logical_monitors;
|
||||
|
||||
@@ -2697,7 +2745,7 @@ meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
|
||||
|
||||
old_logical_monitors = manager->logical_monitors;
|
||||
|
||||
meta_monitor_manager_update_logical_state_derived (manager, flags);
|
||||
meta_monitor_manager_update_logical_state_derived (manager, config);
|
||||
|
||||
meta_monitor_manager_notify_monitors_changed (manager);
|
||||
|
||||
@@ -2823,40 +2871,6 @@ meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_monitor_manager_get_monitor_for_output:
|
||||
* @manager: A #MetaMonitorManager
|
||||
* @id: A valid #MetaOutput id
|
||||
*
|
||||
* Returns: The monitor index or -1 if @id isn't valid or the output
|
||||
* isn't associated with a logical monitor.
|
||||
*/
|
||||
gint
|
||||
meta_monitor_manager_get_monitor_for_output (MetaMonitorManager *manager,
|
||||
guint id)
|
||||
{
|
||||
MetaOutput *output;
|
||||
GList *l;
|
||||
|
||||
g_return_val_if_fail (META_IS_MONITOR_MANAGER (manager), -1);
|
||||
g_return_val_if_fail (id < manager->n_outputs, -1);
|
||||
|
||||
output = &manager->outputs[id];
|
||||
if (!output || !output->crtc)
|
||||
return -1;
|
||||
|
||||
for (l = manager->logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
|
||||
if (meta_rectangle_contains_rect (&logical_monitor->rect,
|
||||
&output->crtc->rect))
|
||||
return logical_monitor->number;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_monitor_manager_get_monitor_for_connector:
|
||||
* @manager: A #MetaMonitorManager
|
||||
@@ -2966,3 +2980,9 @@ meta_monitor_manager_get_switch_config (MetaMonitorManager *manager)
|
||||
{
|
||||
return manager->current_switch_config;
|
||||
}
|
||||
|
||||
MetaMonitorConfigManager *
|
||||
meta_monitor_manager_get_config_manager (MetaMonitorManager *manager)
|
||||
{
|
||||
return manager->config_manager;
|
||||
}
|
||||
|
@@ -24,16 +24,18 @@
|
||||
#include "backends/meta-monitor.h"
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/meta-gpu.h"
|
||||
#include "backends/meta-monitor-manager-private.h"
|
||||
#include "backends/meta-settings-private.h"
|
||||
#include "backends/meta-output.h"
|
||||
|
||||
#define SCALE_FACTORS_PER_INTEGER 4
|
||||
#define MINIMUM_SCALE_FACTOR 1.0f
|
||||
#define MAXIMUM_SCALE_FACTOR 4.0f
|
||||
#define MINIMUM_LOGICAL_WIDTH 800
|
||||
#define MINIMUM_LOGICAL_HEIGHT 600
|
||||
|
||||
#define HANDLED_CRTC_MODE_FLAGS (META_CRTC_MODE_FLAG_INTERLACE)
|
||||
#define MAXIMUM_REFRESH_RATE_DIFF 0.001
|
||||
|
||||
typedef struct _MetaMonitorMode
|
||||
{
|
||||
@@ -51,7 +53,7 @@ typedef struct _MetaMonitorModeTiled
|
||||
|
||||
typedef struct _MetaMonitorPrivate
|
||||
{
|
||||
MetaMonitorManager *monitor_manager;
|
||||
MetaGpu *gpu;
|
||||
|
||||
GList *outputs;
|
||||
GList *modes;
|
||||
@@ -176,6 +178,14 @@ meta_monitor_generate_spec (MetaMonitor *monitor)
|
||||
priv->spec = monitor_spec;
|
||||
}
|
||||
|
||||
MetaGpu *
|
||||
meta_monitor_get_gpu (MetaMonitor *monitor)
|
||||
{
|
||||
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
|
||||
|
||||
return priv->gpu;
|
||||
}
|
||||
|
||||
GList *
|
||||
meta_monitor_get_outputs (MetaMonitor *monitor)
|
||||
{
|
||||
@@ -354,6 +364,8 @@ meta_monitor_finalize (GObject *object)
|
||||
g_list_free_full (priv->modes, (GDestroyNotify) meta_monitor_mode_free);
|
||||
g_clear_pointer (&priv->outputs, g_list_free);
|
||||
meta_monitor_spec_free (priv->spec);
|
||||
|
||||
G_OBJECT_CLASS (meta_monitor_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -391,16 +403,22 @@ generate_mode_id (MetaMonitorModeSpec *monitor_mode_spec)
|
||||
|
||||
static gboolean
|
||||
meta_monitor_add_mode (MetaMonitor *monitor,
|
||||
MetaMonitorMode *monitor_mode)
|
||||
MetaMonitorMode *monitor_mode,
|
||||
gboolean replace)
|
||||
{
|
||||
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
|
||||
MetaMonitorMode *existing_mode;
|
||||
|
||||
if (g_hash_table_lookup (priv->mode_ids,
|
||||
meta_monitor_mode_get_id (monitor_mode)))
|
||||
existing_mode = g_hash_table_lookup (priv->mode_ids,
|
||||
meta_monitor_mode_get_id (monitor_mode));
|
||||
if (existing_mode && !replace)
|
||||
return FALSE;
|
||||
|
||||
if (existing_mode)
|
||||
priv->modes = g_list_remove (priv->modes, existing_mode);
|
||||
|
||||
priv->modes = g_list_append (priv->modes, monitor_mode);
|
||||
g_hash_table_insert (priv->mode_ids, monitor_mode->id, monitor_mode);
|
||||
g_hash_table_replace (priv->mode_ids, monitor_mode->id, monitor_mode);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -412,13 +430,17 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaOutput *output;
|
||||
MetaCrtcModeFlag preferred_mode_flags;
|
||||
unsigned int i;
|
||||
|
||||
output = meta_monitor_get_main_output (monitor);
|
||||
preferred_mode_flags = output->preferred_mode->flags;
|
||||
|
||||
for (i = 0; i < output->n_modes; i++)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode = output->modes[i];
|
||||
MetaMonitorMode *mode;
|
||||
gboolean replace;
|
||||
|
||||
mode = g_new0 (MetaMonitorMode, 1);
|
||||
mode->spec = (MetaMonitorModeSpec) {
|
||||
@@ -434,19 +456,32 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
|
||||
.crtc_mode = crtc_mode
|
||||
};
|
||||
|
||||
/*
|
||||
* We don't distinguish between all available mode flags, just the ones
|
||||
* that are configurable. We still need to pick some mode though, so
|
||||
* prefer ones that has the same set of flags as the preferred mode;
|
||||
* otherwise take the first one in the list. This guarantees that the
|
||||
* preferred mode is always added.
|
||||
*/
|
||||
replace = crtc_mode->flags == preferred_mode_flags;
|
||||
|
||||
if (!meta_monitor_add_mode (monitor, mode, replace))
|
||||
{
|
||||
g_assert (crtc_mode != output->preferred_mode);
|
||||
meta_monitor_mode_free (mode);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (crtc_mode == output->preferred_mode)
|
||||
monitor_priv->preferred_mode = mode;
|
||||
if (output->crtc && crtc_mode == output->crtc->current_mode)
|
||||
monitor_priv->current_mode = mode;
|
||||
|
||||
if (!meta_monitor_add_mode (monitor, mode))
|
||||
meta_monitor_mode_free (mode);
|
||||
}
|
||||
}
|
||||
|
||||
MetaMonitorNormal *
|
||||
meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *output)
|
||||
meta_monitor_normal_new (MetaGpu *gpu,
|
||||
MetaOutput *output)
|
||||
{
|
||||
MetaMonitorNormal *monitor_normal;
|
||||
MetaMonitor *monitor;
|
||||
@@ -456,7 +491,7 @@ meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
|
||||
monitor = META_MONITOR (monitor_normal);
|
||||
monitor_priv = meta_monitor_get_instance_private (monitor);
|
||||
|
||||
monitor_priv->monitor_manager = monitor_manager;
|
||||
monitor_priv->gpu = gpu;
|
||||
|
||||
monitor_priv->outputs = g_list_append (NULL, output);
|
||||
monitor_priv->winsys_id = output->winsys_id;
|
||||
@@ -552,16 +587,18 @@ meta_monitor_get_suggested_position (MetaMonitor *monitor,
|
||||
}
|
||||
|
||||
static void
|
||||
add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
|
||||
MetaMonitorTiled *monitor_tiled)
|
||||
add_tiled_monitor_outputs (MetaGpu *gpu,
|
||||
MetaMonitorTiled *monitor_tiled)
|
||||
{
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (META_MONITOR (monitor_tiled));
|
||||
unsigned int i;
|
||||
GList *outputs;
|
||||
GList *l;
|
||||
|
||||
for (i = 0; i < monitor_manager->n_outputs; i++)
|
||||
outputs = meta_gpu_get_outputs (gpu);
|
||||
for (l = outputs; l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = &monitor_manager->outputs[i];
|
||||
MetaOutput *output = l->data;
|
||||
|
||||
if (output->tile_info.group_id != monitor_tiled->tile_group_id)
|
||||
continue;
|
||||
@@ -822,7 +859,7 @@ generate_tiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
|
||||
|
||||
tiled_modes = g_list_remove_link (tiled_modes, l);
|
||||
|
||||
if (!meta_monitor_add_mode (monitor, mode))
|
||||
if (!meta_monitor_add_mode (monitor, mode, FALSE))
|
||||
{
|
||||
meta_monitor_mode_free (mode);
|
||||
continue;
|
||||
@@ -964,7 +1001,7 @@ generate_untiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
if (!meta_monitor_add_mode (monitor, mode))
|
||||
if (!meta_monitor_add_mode (monitor, mode, FALSE))
|
||||
{
|
||||
meta_monitor_mode_free (mode);
|
||||
continue;
|
||||
@@ -1077,9 +1114,10 @@ meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
|
||||
}
|
||||
|
||||
MetaMonitorTiled *
|
||||
meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *output)
|
||||
meta_monitor_tiled_new (MetaGpu *gpu,
|
||||
MetaOutput *output)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager;
|
||||
MetaMonitorTiled *monitor_tiled;
|
||||
MetaMonitor *monitor;
|
||||
MetaMonitorPrivate *monitor_priv;
|
||||
@@ -1088,18 +1126,19 @@ meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
|
||||
monitor = META_MONITOR (monitor_tiled);
|
||||
monitor_priv = meta_monitor_get_instance_private (monitor);
|
||||
|
||||
monitor_priv->monitor_manager = monitor_manager;
|
||||
monitor_priv->gpu = gpu;
|
||||
|
||||
monitor_tiled->tile_group_id = output->tile_info.group_id;
|
||||
monitor_priv->winsys_id = output->winsys_id;
|
||||
|
||||
monitor_tiled->origin_output = output;
|
||||
add_tiled_monitor_outputs (monitor_manager, monitor_tiled);
|
||||
add_tiled_monitor_outputs (gpu, monitor_tiled);
|
||||
|
||||
monitor_tiled->main_output = find_untiled_output (monitor_tiled);
|
||||
|
||||
meta_monitor_generate_spec (monitor);
|
||||
|
||||
monitor_manager = meta_gpu_get_monitor_manager (gpu);
|
||||
meta_monitor_manager_tiled_monitor_added (monitor_manager,
|
||||
META_MONITOR (monitor_tiled));
|
||||
|
||||
@@ -1186,9 +1225,13 @@ meta_monitor_tiled_finalize (GObject *object)
|
||||
MetaMonitor *monitor = META_MONITOR (object);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaMonitorManager *monitor_manager;
|
||||
|
||||
meta_monitor_manager_tiled_monitor_removed (monitor_priv->monitor_manager,
|
||||
monitor_manager = meta_gpu_get_monitor_manager (monitor_priv->gpu);
|
||||
meta_monitor_manager_tiled_monitor_removed (monitor_manager,
|
||||
monitor);
|
||||
|
||||
G_OBJECT_CLASS (meta_monitor_tiled_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1252,8 +1295,8 @@ meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec,
|
||||
{
|
||||
return (monitor_mode_spec->width == other_monitor_mode_spec->width &&
|
||||
monitor_mode_spec->height == other_monitor_mode_spec->height &&
|
||||
(monitor_mode_spec->refresh_rate ==
|
||||
other_monitor_mode_spec->refresh_rate) &&
|
||||
ABS (monitor_mode_spec->refresh_rate -
|
||||
other_monitor_mode_spec->refresh_rate) < MAXIMUM_REFRESH_RATE_DIFF &&
|
||||
monitor_mode_spec->flags == other_monitor_mode_spec->flags);
|
||||
}
|
||||
|
||||
@@ -1545,6 +1588,14 @@ meta_monitor_calculate_supported_scales (MetaMonitor *monitor,
|
||||
}
|
||||
}
|
||||
|
||||
if (supported_scales->len == 0)
|
||||
{
|
||||
float fallback_scale;
|
||||
|
||||
fallback_scale = 1.0;
|
||||
g_array_append_val (supported_scales, fallback_scale);
|
||||
}
|
||||
|
||||
*n_supported_scales = supported_scales->len;
|
||||
return (float *) g_array_free (supported_scales, FALSE);
|
||||
}
|
||||
|
@@ -24,7 +24,9 @@
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-crtc.h"
|
||||
#include "backends/meta-monitor-manager-private.h"
|
||||
#include "backends/meta-output.h"
|
||||
|
||||
typedef struct _MetaMonitorSpec
|
||||
{
|
||||
@@ -48,6 +50,8 @@ typedef struct _MetaMonitorCrtcMode
|
||||
MetaCrtcMode *crtc_mode;
|
||||
} MetaMonitorCrtcMode;
|
||||
|
||||
#define HANDLED_CRTC_MODE_FLAGS (META_CRTC_MODE_FLAG_INTERLACE)
|
||||
|
||||
typedef gboolean (* MetaMonitorModeFunc) (MetaMonitor *monitor,
|
||||
MetaMonitorMode *mode,
|
||||
MetaMonitorCrtcMode *monitor_crtc_mode,
|
||||
@@ -91,14 +95,16 @@ G_DECLARE_FINAL_TYPE (MetaMonitorTiled, meta_monitor_tiled,
|
||||
META, MONITOR_TILED,
|
||||
MetaMonitor)
|
||||
|
||||
MetaMonitorTiled * meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *main_output);
|
||||
MetaMonitorTiled * meta_monitor_tiled_new (MetaGpu *gpu,
|
||||
MetaOutput *output);
|
||||
|
||||
MetaMonitorNormal * meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *output);
|
||||
MetaMonitorNormal * meta_monitor_normal_new (MetaGpu *gpu,
|
||||
MetaOutput *output);
|
||||
|
||||
MetaMonitorSpec * meta_monitor_get_spec (MetaMonitor *monitor);
|
||||
|
||||
MetaGpu * meta_monitor_get_gpu (MetaMonitor *monitor);
|
||||
|
||||
gboolean meta_monitor_is_active (MetaMonitor *monitor);
|
||||
|
||||
MetaOutput * meta_monitor_get_main_output (MetaMonitor *monitor);
|
||||
|
62
src/backends/meta-output.c
Normal file
62
src/backends/meta-output.c
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "backends/meta-output.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaOutput, meta_output, G_TYPE_OBJECT)
|
||||
|
||||
MetaGpu *
|
||||
meta_output_get_gpu (MetaOutput *output)
|
||||
{
|
||||
return output->gpu;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_output_finalize (GObject *object)
|
||||
{
|
||||
MetaOutput *output = META_OUTPUT (object);
|
||||
|
||||
g_free (output->name);
|
||||
g_free (output->vendor);
|
||||
g_free (output->product);
|
||||
g_free (output->serial);
|
||||
g_free (output->modes);
|
||||
g_free (output->possible_crtcs);
|
||||
g_free (output->possible_clones);
|
||||
|
||||
if (output->driver_notify)
|
||||
output->driver_notify (output);
|
||||
|
||||
G_OBJECT_CLASS (meta_output_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_output_init (MetaOutput *output)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_output_class_init (MetaOutputClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = meta_output_finalize;
|
||||
}
|
124
src/backends/meta-output.h
Normal file
124
src/backends/meta-output.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef META_OUTPUT_H
|
||||
#define META_OUTPUT_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-gpu.h"
|
||||
|
||||
struct _MetaTileInfo
|
||||
{
|
||||
guint32 group_id;
|
||||
guint32 flags;
|
||||
guint32 max_h_tiles;
|
||||
guint32 max_v_tiles;
|
||||
guint32 loc_h_tile;
|
||||
guint32 loc_v_tile;
|
||||
guint32 tile_w;
|
||||
guint32 tile_h;
|
||||
};
|
||||
|
||||
/* This matches the values in drm_mode.h */
|
||||
typedef enum
|
||||
{
|
||||
META_CONNECTOR_TYPE_Unknown = 0,
|
||||
META_CONNECTOR_TYPE_VGA = 1,
|
||||
META_CONNECTOR_TYPE_DVII = 2,
|
||||
META_CONNECTOR_TYPE_DVID = 3,
|
||||
META_CONNECTOR_TYPE_DVIA = 4,
|
||||
META_CONNECTOR_TYPE_Composite = 5,
|
||||
META_CONNECTOR_TYPE_SVIDEO = 6,
|
||||
META_CONNECTOR_TYPE_LVDS = 7,
|
||||
META_CONNECTOR_TYPE_Component = 8,
|
||||
META_CONNECTOR_TYPE_9PinDIN = 9,
|
||||
META_CONNECTOR_TYPE_DisplayPort = 10,
|
||||
META_CONNECTOR_TYPE_HDMIA = 11,
|
||||
META_CONNECTOR_TYPE_HDMIB = 12,
|
||||
META_CONNECTOR_TYPE_TV = 13,
|
||||
META_CONNECTOR_TYPE_eDP = 14,
|
||||
META_CONNECTOR_TYPE_VIRTUAL = 15,
|
||||
META_CONNECTOR_TYPE_DSI = 16,
|
||||
} MetaConnectorType;
|
||||
|
||||
struct _MetaOutput
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
MetaGpu *gpu;
|
||||
|
||||
/* The CRTC driving this output, NULL if the output is not enabled */
|
||||
MetaCrtc *crtc;
|
||||
|
||||
/* The low-level ID of this output, used to apply back configuration */
|
||||
glong winsys_id;
|
||||
char *name;
|
||||
char *vendor;
|
||||
char *product;
|
||||
char *serial;
|
||||
int width_mm;
|
||||
int height_mm;
|
||||
CoglSubpixelOrder subpixel_order;
|
||||
|
||||
MetaConnectorType connector_type;
|
||||
|
||||
MetaCrtcMode *preferred_mode;
|
||||
MetaCrtcMode **modes;
|
||||
unsigned int n_modes;
|
||||
|
||||
MetaCrtc **possible_crtcs;
|
||||
unsigned int n_possible_crtcs;
|
||||
|
||||
MetaOutput **possible_clones;
|
||||
unsigned int n_possible_clones;
|
||||
|
||||
int backlight;
|
||||
int backlight_min;
|
||||
int backlight_max;
|
||||
|
||||
/* Used when changing configuration */
|
||||
gboolean is_dirty;
|
||||
|
||||
gboolean is_primary;
|
||||
gboolean is_presentation;
|
||||
|
||||
gboolean is_underscanning;
|
||||
gboolean supports_underscanning;
|
||||
|
||||
gpointer driver_private;
|
||||
GDestroyNotify driver_notify;
|
||||
|
||||
/*
|
||||
* Get a new preferred mode on hotplug events, to handle dynamic guest
|
||||
* resizing.
|
||||
*/
|
||||
gboolean hotplug_mode_update;
|
||||
gint suggested_x;
|
||||
gint suggested_y;
|
||||
|
||||
MetaTileInfo tile_info;
|
||||
};
|
||||
|
||||
#define META_TYPE_OUTPUT (meta_output_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaOutput, meta_output, META, OUTPUT, GObject)
|
||||
|
||||
MetaGpu * meta_output_get_gpu (MetaOutput *output);
|
||||
|
||||
#endif /* META_OUTPUT_H */
|
@@ -27,6 +27,13 @@
|
||||
#include "backends/meta-logical-monitor.h"
|
||||
#include "backends/meta-screen-cast-monitor-stream-src.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_MONITOR,
|
||||
};
|
||||
|
||||
struct _MetaScreenCastMonitorStream
|
||||
{
|
||||
MetaScreenCastStream parent;
|
||||
@@ -105,10 +112,8 @@ meta_screen_cast_monitor_stream_new (GDBusConnection *connection,
|
||||
GError **error)
|
||||
{
|
||||
MetaScreenCastMonitorStream *monitor_stream;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
logical_monitor = meta_monitor_get_logical_monitor (monitor);
|
||||
if (!logical_monitor)
|
||||
if (!meta_monitor_is_active (monitor))
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Monitor not active");
|
||||
return NULL;
|
||||
@@ -118,15 +123,14 @@ meta_screen_cast_monitor_stream_new (GDBusConnection *connection,
|
||||
NULL,
|
||||
error,
|
||||
"connection", connection,
|
||||
"monitor", monitor,
|
||||
NULL);
|
||||
if (!monitor_stream)
|
||||
return NULL;
|
||||
|
||||
g_set_object (&monitor_stream->monitor, monitor);
|
||||
g_set_object (&monitor_stream->logical_monitor, logical_monitor);
|
||||
monitor_stream->stage = stage;
|
||||
|
||||
g_signal_connect_object (monitor_manager, "monitors-changed",
|
||||
g_signal_connect_object (monitor_manager, "monitors-changed-internal",
|
||||
G_CALLBACK (on_monitors_changed),
|
||||
monitor_stream, 0);
|
||||
|
||||
@@ -149,6 +153,70 @@ meta_screen_cast_monitor_stream_create_src (MetaScreenCastStream *stream,
|
||||
return META_SCREEN_CAST_STREAM_SRC (monitor_stream_src);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_monitor_stream_set_parameters (MetaScreenCastStream *stream,
|
||||
GVariantBuilder *parameters_builder)
|
||||
{
|
||||
MetaScreenCastMonitorStream *monitor_stream =
|
||||
META_SCREEN_CAST_MONITOR_STREAM (stream);
|
||||
MetaRectangle logical_monitor_layout;
|
||||
|
||||
logical_monitor_layout =
|
||||
meta_logical_monitor_get_layout (monitor_stream->logical_monitor);
|
||||
|
||||
g_variant_builder_add (parameters_builder, "{sv}",
|
||||
"position",
|
||||
g_variant_new ("(ii)",
|
||||
logical_monitor_layout.x,
|
||||
logical_monitor_layout.y));
|
||||
g_variant_builder_add (parameters_builder, "{sv}",
|
||||
"size",
|
||||
g_variant_new ("(ii)",
|
||||
logical_monitor_layout.width,
|
||||
logical_monitor_layout.height));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_monitor_stream_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaScreenCastMonitorStream *monitor_stream =
|
||||
META_SCREEN_CAST_MONITOR_STREAM (object);
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MONITOR:
|
||||
g_set_object (&monitor_stream->monitor, g_value_get_object (value));
|
||||
logical_monitor = meta_monitor_get_logical_monitor (monitor_stream->monitor);
|
||||
g_set_object (&monitor_stream->logical_monitor, logical_monitor);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_monitor_stream_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaScreenCastMonitorStream *monitor_stream =
|
||||
META_SCREEN_CAST_MONITOR_STREAM (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MONITOR:
|
||||
g_value_set_object (value, monitor_stream->monitor);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_monitor_stream_finalize (GObject *object)
|
||||
{
|
||||
@@ -173,7 +241,20 @@ meta_screen_cast_monitor_stream_class_init (MetaScreenCastMonitorStreamClass *kl
|
||||
MetaScreenCastStreamClass *stream_class =
|
||||
META_SCREEN_CAST_STREAM_CLASS (klass);
|
||||
|
||||
object_class->set_property = meta_screen_cast_monitor_stream_set_property;
|
||||
object_class->get_property = meta_screen_cast_monitor_stream_get_property;
|
||||
object_class->finalize = meta_screen_cast_monitor_stream_finalize;
|
||||
|
||||
stream_class->create_src = meta_screen_cast_monitor_stream_create_src;
|
||||
stream_class->set_parameters = meta_screen_cast_monitor_stream_set_parameters;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_MONITOR,
|
||||
g_param_spec_object ("monitor",
|
||||
"monitor",
|
||||
"MetaMonitor",
|
||||
META_TYPE_MONITOR,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY |
|
||||
G_PARAM_STATIC_STRINGS));
|
||||
}
|
||||
|
@@ -535,7 +535,13 @@ 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,
|
||||
@@ -587,8 +593,8 @@ meta_screen_cast_stream_src_finalize (GObject *object)
|
||||
meta_screen_cast_stream_src_disable (src);
|
||||
|
||||
g_clear_pointer (&priv->pipewire_stream, (GDestroyNotify) pw_stream_destroy);
|
||||
pw_remote_destroy (priv->pipewire_remote);
|
||||
pw_core_destroy (priv->pipewire_core);
|
||||
g_clear_pointer (&priv->pipewire_remote, (GDestroyNotify) pw_remote_destroy);
|
||||
g_clear_pointer (&priv->pipewire_core, (GDestroyNotify) pw_core_destroy);
|
||||
g_source_destroy (&priv->pipewire_source->base);
|
||||
|
||||
G_OBJECT_CLASS (meta_screen_cast_stream_src_parent_class)->finalize (object);
|
||||
|
@@ -68,6 +68,14 @@ meta_screen_cast_stream_create_src (MetaScreenCastStream *stream,
|
||||
error);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_stream_set_parameters (MetaScreenCastStream *stream,
|
||||
GVariantBuilder *parameters_builder)
|
||||
{
|
||||
META_SCREEN_CAST_STREAM_GET_CLASS (stream)->set_parameters (stream,
|
||||
parameters_builder);
|
||||
}
|
||||
|
||||
static void
|
||||
on_stream_src_closed (MetaScreenCastStreamSrc *src,
|
||||
MetaScreenCastStream *stream)
|
||||
@@ -189,10 +197,19 @@ meta_screen_cast_stream_initable_init (GInitable *initable,
|
||||
GError **error)
|
||||
{
|
||||
MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (initable);
|
||||
MetaDBusScreenCastStream *skeleton = META_DBUS_SCREEN_CAST_STREAM (stream);
|
||||
MetaScreenCastStreamPrivate *priv =
|
||||
meta_screen_cast_stream_get_instance_private (stream);
|
||||
GVariantBuilder parameters_builder;
|
||||
GVariant *parameters_variant;
|
||||
static unsigned int global_stream_number = 0;
|
||||
|
||||
g_variant_builder_init (¶meters_builder, G_VARIANT_TYPE_VARDICT);
|
||||
meta_screen_cast_stream_set_parameters (stream, ¶meters_builder);
|
||||
|
||||
parameters_variant = g_variant_builder_end (¶meters_builder);
|
||||
meta_dbus_screen_cast_stream_set_parameters (skeleton, parameters_variant);
|
||||
|
||||
priv->object_path =
|
||||
g_strdup_printf (META_SCREEN_CAST_STREAM_DBUS_PATH "/u%u",
|
||||
++global_stream_number);
|
||||
|
@@ -39,6 +39,8 @@ struct _MetaScreenCastStreamClass
|
||||
|
||||
MetaScreenCastStreamSrc * (* create_src) (MetaScreenCastStream *stream,
|
||||
GError **error);
|
||||
void (* set_parameters) (MetaScreenCastStream *stream,
|
||||
GVariantBuilder *parameters_builder);
|
||||
};
|
||||
|
||||
gboolean meta_screen_cast_stream_start (MetaScreenCastStream *stream,
|
||||
|
@@ -58,4 +58,10 @@ void meta_settings_override_experimental_features (MetaSettings *settings);
|
||||
void meta_settings_enable_experimental_feature (MetaSettings *settings,
|
||||
MetaExperimentalFeature feature);
|
||||
|
||||
void meta_settings_get_xwayland_grab_patterns (MetaSettings *settings,
|
||||
GPtrArray **whitelist_patterns,
|
||||
GPtrArray **blacklist_patterns);
|
||||
|
||||
gboolean meta_settings_are_xwayland_grabs_allowed (MetaSettings *settings);
|
||||
|
||||
#endif /* META_SETTINGS_PRIVATE_H */
|
||||
|
@@ -30,6 +30,11 @@
|
||||
#include "backends/meta-monitor-manager-private.h"
|
||||
#include "ui/theme-private.h"
|
||||
|
||||
#ifndef XWAYLAND_GRAB_DEFAULT_ACCESS_RULES
|
||||
# warning "XWAYLAND_GRAB_DEFAULT_ACCESS_RULES is not set"
|
||||
# define XWAYLAND_GRAB_DEFAULT_ACCESS_RULES ""
|
||||
#endif
|
||||
|
||||
enum
|
||||
{
|
||||
UI_SCALING_FACTOR_CHANGED,
|
||||
@@ -50,6 +55,7 @@ struct _MetaSettings
|
||||
|
||||
GSettings *interface_settings;
|
||||
GSettings *mutter_settings;
|
||||
GSettings *wayland_settings;
|
||||
|
||||
int ui_scaling_factor;
|
||||
int global_scaling_factor;
|
||||
@@ -58,6 +64,10 @@ struct _MetaSettings
|
||||
|
||||
MetaExperimentalFeature experimental_features;
|
||||
gboolean experimental_features_overridden;
|
||||
|
||||
gboolean xwayland_allow_grabs;
|
||||
GPtrArray *xwayland_grab_whitelist_patterns;
|
||||
GPtrArray *xwayland_grab_blacklist_patterns;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaSettings, meta_settings, G_TYPE_OBJECT)
|
||||
@@ -67,23 +77,14 @@ calculate_ui_scaling_factor (MetaSettings *settings)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (settings->backend);
|
||||
GList *logical_monitors;
|
||||
GList *l;
|
||||
float max_scale = 1.0;
|
||||
MetaLogicalMonitor *primary_logical_monitor;
|
||||
|
||||
logical_monitors =
|
||||
meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||
for (l = logical_monitors; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitor *logical_monitor = l->data;
|
||||
primary_logical_monitor =
|
||||
meta_monitor_manager_get_primary_logical_monitor (monitor_manager);
|
||||
if (!primary_logical_monitor)
|
||||
return 1;
|
||||
|
||||
max_scale = MAX (meta_logical_monitor_get_scale (logical_monitor),
|
||||
max_scale);
|
||||
}
|
||||
|
||||
g_warn_if_fail (fmodf (max_scale, 1.0) == 0.0);
|
||||
|
||||
return (int) max_scale;
|
||||
return (int) meta_logical_monitor_get_scale (primary_logical_monitor);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -308,6 +309,105 @@ mutter_settings_changed (GSettings *mutter_settings,
|
||||
(unsigned int) old_experimental_features);
|
||||
}
|
||||
|
||||
static void
|
||||
xwayland_grab_list_add_item (MetaSettings *settings,
|
||||
char *item)
|
||||
{
|
||||
/* If first character is '!', it's a blacklisted item */
|
||||
if (item[0] != '!')
|
||||
g_ptr_array_add (settings->xwayland_grab_whitelist_patterns,
|
||||
g_pattern_spec_new (item));
|
||||
else if (item[1] != 0)
|
||||
g_ptr_array_add (settings->xwayland_grab_blacklist_patterns,
|
||||
g_pattern_spec_new (&item[1]));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
xwayland_grab_access_rules_handler (GVariant *variant,
|
||||
gpointer *result,
|
||||
gpointer data)
|
||||
{
|
||||
MetaSettings *settings = data;
|
||||
GVariantIter iter;
|
||||
char *item;
|
||||
|
||||
/* Create a GPatternSpec for each element */
|
||||
g_variant_iter_init (&iter, variant);
|
||||
while (g_variant_iter_loop (&iter, "s", &item))
|
||||
xwayland_grab_list_add_item (settings, item);
|
||||
|
||||
*result = GINT_TO_POINTER (TRUE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
update_xwayland_grab_access_rules (MetaSettings *settings)
|
||||
{
|
||||
gchar **system_defaults;
|
||||
int i;
|
||||
|
||||
/* Free previous patterns and create new arrays */
|
||||
g_ptr_array_free (settings->xwayland_grab_whitelist_patterns, TRUE);
|
||||
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);
|
||||
settings->xwayland_grab_blacklist_patterns =
|
||||
g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free);
|
||||
|
||||
/* Add system defaults values */
|
||||
system_defaults = g_strsplit (XWAYLAND_GRAB_DEFAULT_ACCESS_RULES, ",", -1);
|
||||
for (i = 0; system_defaults[i]; i++)
|
||||
xwayland_grab_list_add_item (settings, system_defaults[i]);
|
||||
g_strfreev (system_defaults);
|
||||
|
||||
/* Then add gsettings values */
|
||||
g_settings_get_mapped (settings->wayland_settings,
|
||||
"xwayland-grab-access-rules",
|
||||
xwayland_grab_access_rules_handler,
|
||||
settings);
|
||||
}
|
||||
|
||||
static void
|
||||
update_xwayland_allow_grabs (MetaSettings *settings)
|
||||
{
|
||||
settings->xwayland_allow_grabs =
|
||||
g_settings_get_boolean (settings->wayland_settings,
|
||||
"xwayland-allow-grabs");
|
||||
}
|
||||
|
||||
static void
|
||||
wayland_settings_changed (GSettings *wayland_settings,
|
||||
gchar *key,
|
||||
MetaSettings *settings)
|
||||
{
|
||||
|
||||
if (g_str_equal (key, "xwayland-allow-grabs"))
|
||||
{
|
||||
update_xwayland_allow_grabs (settings);
|
||||
}
|
||||
else if (g_str_equal (key, "xwayland-grab-access-rules"))
|
||||
{
|
||||
update_xwayland_grab_access_rules (settings);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_settings_get_xwayland_grab_patterns (MetaSettings *settings,
|
||||
GPtrArray **whitelist_patterns,
|
||||
GPtrArray **blacklist_patterns)
|
||||
{
|
||||
*whitelist_patterns = settings->xwayland_grab_whitelist_patterns;
|
||||
*blacklist_patterns = settings->xwayland_grab_blacklist_patterns;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_settings_are_xwayland_grabs_allowed (MetaSettings *settings)
|
||||
{
|
||||
return (settings->xwayland_allow_grabs);
|
||||
}
|
||||
|
||||
MetaSettings *
|
||||
meta_settings_new (MetaBackend *backend)
|
||||
{
|
||||
@@ -326,6 +426,11 @@ meta_settings_dispose (GObject *object)
|
||||
|
||||
g_clear_object (&settings->mutter_settings);
|
||||
g_clear_object (&settings->interface_settings);
|
||||
g_clear_object (&settings->wayland_settings);
|
||||
g_clear_pointer (&settings->xwayland_grab_whitelist_patterns,
|
||||
g_ptr_array_unref);
|
||||
g_clear_pointer (&settings->xwayland_grab_blacklist_patterns,
|
||||
g_ptr_array_unref);
|
||||
|
||||
G_OBJECT_CLASS (meta_settings_parent_class)->dispose (object);
|
||||
}
|
||||
@@ -341,6 +446,10 @@ meta_settings_init (MetaSettings *settings)
|
||||
g_signal_connect (settings->mutter_settings, "changed",
|
||||
G_CALLBACK (mutter_settings_changed),
|
||||
settings);
|
||||
settings->wayland_settings = g_settings_new ("org.gnome.mutter.wayland");
|
||||
g_signal_connect (settings->wayland_settings, "changed",
|
||||
G_CALLBACK (wayland_settings_changed),
|
||||
settings);
|
||||
|
||||
/* Chain up inter-dependent settings. */
|
||||
g_signal_connect (settings, "global-scaling-factor-changed",
|
||||
@@ -350,13 +459,29 @@ meta_settings_init (MetaSettings *settings)
|
||||
|
||||
update_global_scaling_factor (settings);
|
||||
update_experimental_features (settings);
|
||||
update_xwayland_grab_access_rules (settings);
|
||||
update_xwayland_allow_grabs (settings);
|
||||
}
|
||||
|
||||
static void
|
||||
on_monitors_changed (MetaMonitorManager *monitor_manager,
|
||||
MetaSettings *settings)
|
||||
{
|
||||
meta_settings_update_ui_scaling_factor (settings);
|
||||
}
|
||||
|
||||
void
|
||||
meta_settings_post_init (MetaSettings *settings)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (settings->backend);
|
||||
|
||||
update_ui_scaling_factor (settings);
|
||||
update_font_dpi (settings);
|
||||
|
||||
g_signal_connect_object (monitor_manager, "monitors-changed-internal",
|
||||
G_CALLBACK (on_monitors_changed),
|
||||
settings, G_CONNECT_AFTER);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -51,7 +51,7 @@ common_resolutions = [
|
||||
|
||||
output_lines = [
|
||||
"/* Generated by gen-default-modes.py */\n",
|
||||
"const drmModeModeInfo meta_default_drm_mode_infos[] = {",
|
||||
"static const drmModeModeInfo meta_default_drm_mode_infos[] = {",
|
||||
]
|
||||
|
||||
def sync_flags(hsync, vsync):
|
||||
|
@@ -67,7 +67,15 @@ struct _MetaBackendNativePrivate
|
||||
};
|
||||
typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND);
|
||||
static GInitableIface *initable_parent_iface;
|
||||
|
||||
static void
|
||||
initable_iface_init (GInitableIface *initable_iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND,
|
||||
G_ADD_PRIVATE (MetaBackendNative)
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
|
||||
initable_iface_init))
|
||||
|
||||
static void
|
||||
meta_backend_native_finalize (GObject *object)
|
||||
@@ -400,37 +408,33 @@ meta_backend_native_create_idle_monitor (MetaBackend *backend,
|
||||
}
|
||||
|
||||
static MetaMonitorManager *
|
||||
meta_backend_native_create_monitor_manager (MetaBackend *backend)
|
||||
meta_backend_native_create_monitor_manager (MetaBackend *backend,
|
||||
GError **error)
|
||||
{
|
||||
return g_object_new (META_TYPE_MONITOR_MANAGER_KMS, NULL);
|
||||
return g_initable_new (META_TYPE_MONITOR_MANAGER_KMS, NULL, error,
|
||||
"backend", backend,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static MetaCursorRenderer *
|
||||
meta_backend_native_create_cursor_renderer (MetaBackend *backend)
|
||||
{
|
||||
return g_object_new (META_TYPE_CURSOR_RENDERER_NATIVE, NULL);
|
||||
return META_CURSOR_RENDERER (meta_cursor_renderer_native_new (backend));
|
||||
}
|
||||
|
||||
static MetaRenderer *
|
||||
meta_backend_native_create_renderer (MetaBackend *backend)
|
||||
meta_backend_native_create_renderer (MetaBackend *backend,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
|
||||
MetaBackendNativePrivate *priv =
|
||||
meta_backend_native_get_instance_private (native);
|
||||
int kms_fd;
|
||||
const char *kms_file_path;
|
||||
GError *error = NULL;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerKms *monitor_manager_kms =
|
||||
META_MONITOR_MANAGER_KMS (monitor_manager);
|
||||
MetaRendererNative *renderer_native;
|
||||
|
||||
kms_fd = meta_launcher_get_kms_fd (priv->launcher);
|
||||
kms_file_path = meta_launcher_get_kms_file_path (priv->launcher);
|
||||
renderer_native = meta_renderer_native_new (kms_fd, kms_file_path, &error);
|
||||
renderer_native = meta_renderer_native_new (monitor_manager_kms, error);
|
||||
if (!renderer_native)
|
||||
{
|
||||
meta_warning ("Failed to create renderer: %s\n", error->message);
|
||||
g_error_free (error);
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
return META_RENDERER (renderer_native);
|
||||
}
|
||||
@@ -560,14 +564,34 @@ meta_backend_native_update_screen_size (MetaBackend *backend,
|
||||
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||
|
||||
stage_native = meta_clutter_backend_native_get_stage_native (clutter_backend);
|
||||
if (meta_is_stage_views_enabled ())
|
||||
meta_stage_native_rebuild_views (stage_native);
|
||||
else
|
||||
meta_stage_native_legacy_set_size (stage_native, width, height);
|
||||
meta_stage_native_rebuild_views (stage_native);
|
||||
|
||||
clutter_actor_set_size (stage, width, height);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_backend_native_initable_init (GInitable *initable,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
if (!meta_is_stage_views_enabled ())
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"The native backend requires stage views");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return initable_parent_iface->init (initable, cancellable, error);
|
||||
}
|
||||
|
||||
static void
|
||||
initable_iface_init (GInitableIface *initable_iface)
|
||||
{
|
||||
initable_parent_iface = g_type_interface_peek_parent (initable_iface);
|
||||
|
||||
initable_iface->init = meta_backend_native_initable_init;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
||||
{
|
||||
@@ -625,14 +649,23 @@ meta_backend_native_init (MetaBackendNative *native)
|
||||
native);
|
||||
}
|
||||
|
||||
MetaLauncher *
|
||||
meta_backend_native_get_launcher (MetaBackendNative *native)
|
||||
{
|
||||
MetaBackendNativePrivate *priv =
|
||||
meta_backend_native_get_instance_private (native);
|
||||
|
||||
return priv->launcher;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_activate_vt (int vt, GError **error)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
|
||||
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
||||
MetaLauncher *launcher = meta_backend_native_get_launcher (native);
|
||||
|
||||
return meta_launcher_activate_vt (priv->launcher, vt, error);
|
||||
return meta_launcher_activate_vt (launcher, vt, error);
|
||||
}
|
||||
|
||||
MetaBarrierManagerNative *
|
||||
|
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/native/meta-clutter-backend-native.h"
|
||||
#include "backends/native/meta-launcher.h"
|
||||
|
||||
#define META_TYPE_BACKEND_NATIVE (meta_backend_native_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaBackendNative, meta_backend_native,
|
||||
@@ -38,4 +39,6 @@ void meta_backend_native_pause (MetaBackendNative *backend_native);
|
||||
|
||||
void meta_backend_native_resume (MetaBackendNative *backend_native);
|
||||
|
||||
MetaLauncher * meta_backend_native_get_launcher (MetaBackendNative *native);
|
||||
|
||||
#endif /* META_BACKEND_NATIVE_H */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user