Compare commits
123 Commits
3.1.92
...
wip/multit
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bdfb8609a3 | ||
![]() |
141a353a52 | ||
![]() |
15186016c2 | ||
![]() |
bd77a67ea4 | ||
![]() |
2a9a499841 | ||
![]() |
50aa509ee1 | ||
![]() |
0eefb6b306 | ||
![]() |
d115c90ed1 | ||
![]() |
83096642f0 | ||
![]() |
a65c4e993e | ||
![]() |
e73a566eeb | ||
![]() |
46ef055da5 | ||
![]() |
45450c2fa3 | ||
![]() |
afa4c643a8 | ||
![]() |
5d1c302b18 | ||
![]() |
53b289ce25 | ||
![]() |
776628fde2 | ||
![]() |
b9f5185c90 | ||
![]() |
7555b092eb | ||
![]() |
f46ef5f6e0 | ||
![]() |
0e182c7c3d | ||
![]() |
84b9d5c9f9 | ||
![]() |
8e3b9be79c | ||
![]() |
74520ab20b | ||
![]() |
40c2b0c5bb | ||
![]() |
40ec37eed0 | ||
![]() |
4e6e40de87 | ||
![]() |
319208f859 | ||
![]() |
f670a4f348 | ||
![]() |
57dff10ab5 | ||
![]() |
53bd0c70c9 | ||
![]() |
2507d20bb7 | ||
![]() |
7d5e7ec3e6 | ||
![]() |
0b8848057b | ||
![]() |
0b841f8940 | ||
![]() |
61b120d08c | ||
![]() |
2aa39eb4fd | ||
![]() |
dc5b813608 | ||
![]() |
df044a0035 | ||
![]() |
154730a3d9 | ||
![]() |
557ed7ac0b | ||
![]() |
bce2bc0568 | ||
![]() |
7c86cb85ba | ||
![]() |
ab58d87142 | ||
![]() |
e62076f055 | ||
![]() |
1e8f10826a | ||
![]() |
cca79a77da | ||
![]() |
67018d2d04 | ||
![]() |
199395a395 | ||
![]() |
ad911d6cce | ||
![]() |
daeaf44e02 | ||
![]() |
ec587190e8 | ||
![]() |
22a44bf007 | ||
![]() |
e1679cb35b | ||
![]() |
5da2ff0f4e | ||
![]() |
a547596be4 | ||
![]() |
bb7d549136 | ||
![]() |
e800da2bca | ||
![]() |
3def650a93 | ||
![]() |
48f59d88fa | ||
![]() |
01e77bae9d | ||
![]() |
66e9720cb7 | ||
![]() |
3a8837f8ab | ||
![]() |
cc4f66bc8a | ||
![]() |
90287cb3f6 | ||
![]() |
0c317e8ced | ||
![]() |
33c829ee39 | ||
![]() |
e92757ac8b | ||
![]() |
08f06ba012 | ||
![]() |
e49cbb3614 | ||
![]() |
98e95ed5e8 | ||
![]() |
5338134b49 | ||
![]() |
f5aab9398b | ||
![]() |
3beb33bb44 | ||
![]() |
1b04a40dce | ||
![]() |
8087872130 | ||
![]() |
3ad25a62cd | ||
![]() |
7ecd673d23 | ||
![]() |
331c9aaee4 | ||
![]() |
ec1979f9f5 | ||
![]() |
4b411ea241 | ||
![]() |
70db187c36 | ||
![]() |
4de3f1d147 | ||
![]() |
821d4458ea | ||
![]() |
7f9472a58f | ||
![]() |
3599917123 | ||
![]() |
d624e85bc1 | ||
![]() |
6aa4bfd060 | ||
![]() |
a26e72c452 | ||
![]() |
acc4e03482 | ||
![]() |
e176a9e891 | ||
![]() |
0b36663ff1 | ||
![]() |
bb035fe6e0 | ||
![]() |
6d0c1f08d2 | ||
![]() |
f700a7be07 | ||
![]() |
138eb1e3b4 | ||
![]() |
c39129b6e8 | ||
![]() |
bf175e72ad | ||
![]() |
ba31ba4615 | ||
![]() |
f94f008ed6 | ||
![]() |
9d4f3c5842 | ||
![]() |
0b2a9d58e0 | ||
![]() |
28deea44d4 | ||
![]() |
f82966adb5 | ||
![]() |
9f54f1d75d | ||
![]() |
be9f7d7729 | ||
![]() |
1b4dce6f84 | ||
![]() |
3bb17f0671 | ||
![]() |
19d111a27b | ||
![]() |
289561ddf3 | ||
![]() |
d2ca160ea3 | ||
![]() |
cd19f9239c | ||
![]() |
16157ad522 | ||
![]() |
d37a692392 | ||
![]() |
f78f33d848 | ||
![]() |
c4692b8d51 | ||
![]() |
764569eb7a | ||
![]() |
aab0d2f54e | ||
![]() |
24678de261 | ||
![]() |
1b71eeb02a | ||
![]() |
bfc6a2b078 | ||
![]() |
9c9da8f575 | ||
![]() |
d1a87288a4 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -40,6 +40,7 @@ stamp-h1
|
||||
stamp-it
|
||||
.intltool-merge-cache
|
||||
POTFILES
|
||||
po/*.pot
|
||||
50-metacity-desktop-key.xml
|
||||
50-metacity-key.xml
|
||||
inlinepixbufs.h
|
||||
|
37
NEWS
37
NEWS
@@ -1,3 +1,40 @@
|
||||
3.2.1
|
||||
=====
|
||||
* Allow keyboard window switching (alt-Tab) during drag-and-drop
|
||||
[Matthias, #660457]
|
||||
* Don't add invisible resize borders to fullscreen windows
|
||||
[Jasper, Owen; #659854]
|
||||
* Fix crash when toplevel windows were set to unexpected window types
|
||||
[Owen; #599988]
|
||||
* Correct problems with windows moving when restarting or switching
|
||||
window managers [Jasper; #660848]
|
||||
* Fix interaction of tiled windows with multiple monitors
|
||||
[Rui; #642580, #657519]
|
||||
* Make meta_display_unmanage_screen() public [Jasper; #660848]
|
||||
* Fix problem with turning off window decorations on the fly [Rui; #660773]
|
||||
* Fix spurious assertion failures with themes such as Nodoka [Sandro; #661286]
|
||||
* Misc bug fixes [Adel, Jasper, Rui; #660464, #660854, #662053]
|
||||
|
||||
Contributors:
|
||||
Matthias Clasen, Sandro Mani, Rui Matos, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Tommi Vainikainen [fi], Miroslav Nikolić [sr, sr@latin], Muhammet Kara [tr]
|
||||
|
||||
3.2.0
|
||||
=====
|
||||
* Fix _NET_WM_FRAME_EXTENTS not to include invisible borders [Jasper; #659848]
|
||||
* Fix application-specified window placement (-geometry) for
|
||||
invisible borders [Jasper; #659848]
|
||||
|
||||
Contributors:
|
||||
Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Nilamdyuti Goswami [as], Carles Ferrando [ca@valencia], Petr Kovar [cz],
|
||||
Mario Blättermann [de], Inaki Larranaga [eu], Gabor Kelemen [hu],
|
||||
Takayoshi Okano [ja], Changwoo Ryu [ko], Djavan Fagundes [pt_BR]
|
||||
|
||||
3.1.92
|
||||
======
|
||||
* Fix bug with unredirecting full-screen windows on multi-monitor -
|
||||
|
52
configure.in
52
configure.in
@@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [1])
|
||||
m4_define([mutter_micro_version], [92])
|
||||
m4_define([mutter_minor_version], [2])
|
||||
m4_define([mutter_micro_version], [1])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@@ -15,7 +15,7 @@ AC_INIT([mutter], [mutter_version],
|
||||
AC_CONFIG_SRCDIR(src/core/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip])
|
||||
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar])
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
||||
AM_MAINTAINER_MODE([enable])
|
||||
|
||||
@@ -225,6 +225,50 @@ if test x$have_xcursor = xyes; then
|
||||
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
||||
fi
|
||||
|
||||
XINPUT2_VERSION=1.4.0
|
||||
|
||||
AC_ARG_ENABLE(xinput2,
|
||||
AC_HELP_STRING([--disable-xinput2],
|
||||
[disable XInput2 usage]),,
|
||||
enable_xinput2=yes)
|
||||
|
||||
if test x$enable_xinput2 = xyes; then
|
||||
AC_MSG_CHECKING([XInput2])
|
||||
if $PKG_CONFIG --atleast-version $XINPUT2_VERSION xi; then
|
||||
have_xinput2=yes
|
||||
else
|
||||
have_xinput2=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xinput2)
|
||||
else
|
||||
have_xinput2=no
|
||||
fi
|
||||
|
||||
if test x$have_xinput2 = xyes; then
|
||||
echo "Building with XInput2"
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xi"
|
||||
AC_DEFINE(HAVE_XINPUT2, , [Building with XInput2 support])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(HAVE_XINPUT2, test "$have_xinput2" = "yes")
|
||||
|
||||
if test x$have_xinput2 = xyes; then
|
||||
mutter_save_libs="$LIBS"
|
||||
LIBS="-lXi $LIBS"
|
||||
|
||||
AC_CHECK_FUNC(XIAllowTouchEvents,
|
||||
have_xtouch=yes,
|
||||
have_xtouch=no)
|
||||
|
||||
LIBS="$mutter_save_libs"
|
||||
else
|
||||
have_xtouch=no
|
||||
fi
|
||||
|
||||
if test x$have_xtouch = xyes; then
|
||||
AC_DEFINE(HAVE_XTOUCH, , [Building with X touch events])
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
AC_PATH_XTRA
|
||||
@@ -544,6 +588,8 @@ mutter-$VERSION
|
||||
Shape extension: ${found_shape}
|
||||
Xsync: ${found_xsync}
|
||||
Xcursor: ${have_xcursor}
|
||||
XInput2: ${have_xinput2}
|
||||
Touch events: ${have_xtouch}
|
||||
"
|
||||
|
||||
|
||||
|
@@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity 2.24\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-05-29 18:56+0200\n"
|
||||
"PO-Revision-Date: 2011-04-03 23:45+0200\n"
|
||||
"POT-Creation-Date: 2011-09-26 14:18+0200\n"
|
||||
"PO-Revision-Date: 2011-09-16 23:15+0200\n"
|
||||
"Last-Translator: David Planella <david.planella@gmail.com>\n"
|
||||
"Language-Team: Softcatalà <tradgnome@softcatala.org>\n"
|
||||
"Language: \n"
|
||||
@@ -19,6 +19,17 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. 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:492
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr ""
|
||||
"Ja s'està executant un altre gestor de composició a la pantalla %i a la "
|
||||
"visualització «%s»."
|
||||
|
||||
#: ../src/core/all-keybindings.h:88
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Canvia a l'espai de treball 1"
|
||||
@@ -146,7 +157,7 @@ msgstr "Mostra el diàleg d'execució d'aplicacions del quadre"
|
||||
|
||||
#: ../src/core/all-keybindings.h:211
|
||||
msgid "Start or stop recording the session"
|
||||
msgstr "Inicia o para l'enregistrament de la sessió"
|
||||
msgstr "Inicia o atura l'enregistrament de la sessió"
|
||||
|
||||
#: ../src/core/all-keybindings.h:252
|
||||
msgid "Take a screenshot"
|
||||
@@ -336,7 +347,7 @@ msgstr "Mou la finestra al centre de la pantalla"
|
||||
msgid "Bell event"
|
||||
msgstr "Esdeveniment de campana"
|
||||
|
||||
#: ../src/core/core.c:160
|
||||
#: ../src/core/core.c:157
|
||||
#, c-format
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Es desconeix la informació demanada sobre la finestra: %d"
|
||||
@@ -347,9 +358,8 @@ msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> no està responent."
|
||||
|
||||
#: ../src/core/delete.c:114
|
||||
#, fuzzy
|
||||
msgid "Application is not responding."
|
||||
msgstr "<tt>%s</tt> no està responent."
|
||||
msgstr "L'aplicació no està responent."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
msgid ""
|
||||
@@ -389,7 +399,7 @@ msgstr ""
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#: ../src/core/keybindings.c:2468
|
||||
#: ../src/core/keybindings.c:2523
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
@@ -400,12 +410,12 @@ msgstr ""
|
||||
"\n"
|
||||
"%s."
|
||||
|
||||
#: ../src/core/keybindings.c:2558
|
||||
#: ../src/core/keybindings.c:2613
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "No s'ha definit cap orde %d.\n"
|
||||
|
||||
#: ../src/core/keybindings.c:3570
|
||||
#: ../src/core/keybindings.c:3625
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "No s'ha definit cap orde de terminal.\n"
|
||||
@@ -482,37 +492,37 @@ msgstr "Llista separada per comes de connectors de composició"
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
|
||||
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "La clau «%s» del GConf està establerta a un valor no vàlid\n"
|
||||
|
||||
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
|
||||
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr ""
|
||||
"%d, emmagatzemat a la clau %s del GConf, està fora de l'interval de %d a %d\n"
|
||||
|
||||
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
|
||||
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
|
||||
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
|
||||
#: ../src/core/prefs.c:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
|
||||
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
|
||||
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "La clau «%s» del GConf està establerta a un tipus no vàlid\n"
|
||||
|
||||
#: ../src/core/prefs.c:1203
|
||||
#: ../src/core/prefs.c:1210
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"La clau %s del GConf ja s'està utilitzant i no es pot fer servir per "
|
||||
"sobreescriure %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1262
|
||||
#: ../src/core/prefs.c:1269
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "No es pot sobreescriure la clau del GConf; no s'ha trobat %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1447
|
||||
#: ../src/core/prefs.c:1454
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -520,14 +530,14 @@ msgstr ""
|
||||
"Les solucions temporals per a aplicacions amb errors estan inhabilitades. "
|
||||
"Pot ser que certes aplicacions no funcionen correctament.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1524
|
||||
#: ../src/core/prefs.c:1531
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr ""
|
||||
"No s'ha pogut analitzar la descripció de tipus de lletra «%s» de la clau %s "
|
||||
"del GConf\n"
|
||||
|
||||
#: ../src/core/prefs.c:1586
|
||||
#: ../src/core/prefs.c:1593
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -536,18 +546,18 @@ msgstr ""
|
||||
"«%s», trobat a la base de dades de la configuració, no és un valor vàlid per "
|
||||
"al modificador del botó del ratolí\n"
|
||||
|
||||
#: ../src/core/prefs.c:2016
|
||||
#: ../src/core/prefs.c:2028
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr ""
|
||||
"S'ha produït un error en establir el nombre d'espais de treball a %d: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
|
||||
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espai de treball %d"
|
||||
|
||||
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
|
||||
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -556,33 +566,33 @@ msgstr ""
|
||||
"«%s» trobat a la base de dades de la configuració no és un valor vàlid per a "
|
||||
"la vinculació de tecla «%s»\n"
|
||||
|
||||
#: ../src/core/prefs.c:2783
|
||||
#: ../src/core/prefs.c:2795
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr ""
|
||||
"S'ha produït un error en establir el nom de l'espai de treball %d a «%s»: "
|
||||
"%s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2997
|
||||
#: ../src/core/prefs.c:3009
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr ""
|
||||
"S'ha produït un error en establir l'estat de les finestres ocultes en viu: "
|
||||
"%s\n"
|
||||
|
||||
#: ../src/core/prefs.c:3032
|
||||
#: ../src/core/prefs.c:3044
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr ""
|
||||
"S'ha produït un error en establir l'estat de les pestanyes sense finestra "
|
||||
"emergent: %s\n"
|
||||
|
||||
#: ../src/core/screen.c:663
|
||||
#: ../src/core/screen.c:741
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "La pantalla %d en la visualització '%s' no és vàlida\n"
|
||||
|
||||
#: ../src/core/screen.c:679
|
||||
#: ../src/core/screen.c:757
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -591,7 +601,7 @@ msgstr ""
|
||||
"La pantalla %d en la visualització «%s» ja té un gestor de finestres; proveu "
|
||||
"l'opció --replace per reemplaçar el gestor de finestres actual.\n"
|
||||
|
||||
#: ../src/core/screen.c:706
|
||||
#: ../src/core/screen.c:784
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
@@ -599,12 +609,12 @@ msgstr ""
|
||||
"No s'ha pogut adquirir la selecció del gestor de finestres en la pantalla %d "
|
||||
"visualització «%s»\n"
|
||||
|
||||
#: ../src/core/screen.c:761
|
||||
#: ../src/core/screen.c:839
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "La pantalla %d en la visualització «%s» ja té un gestor de finestres\n"
|
||||
|
||||
#: ../src/core/screen.c:946
|
||||
#: ../src/core/screen.c:1024
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "No s'ha pogut alliberar la pantalla %d en la visualització «%s»\n"
|
||||
@@ -686,30 +696,24 @@ msgstr "S'ha obert el fitxer de registre %s\n"
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter es va compilar sense compatibilitat per al mode detallat\n"
|
||||
|
||||
#: ../src/core/util.c:286
|
||||
#: ../src/core/util.c:290
|
||||
msgid "Window manager: "
|
||||
msgstr "Gestor de finestres: "
|
||||
|
||||
#: ../src/core/util.c:434
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Error en el gestor de finestres: "
|
||||
|
||||
#: ../src/core/util.c:467
|
||||
#: ../src/core/util.c:471
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Avís del gestor de finestres: "
|
||||
|
||||
#: ../src/core/util.c:495
|
||||
#: ../src/core/util.c:499
|
||||
msgid "Window manager error: "
|
||||
msgstr "Error del gestor de finestres: "
|
||||
|
||||
#. Translators: This is the title used on dialog boxes
|
||||
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
|
||||
#: ../src/mutter-wm.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:6873
|
||||
#: ../src/core/window.c:7069
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -725,7 +729,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7536
|
||||
#: ../src/core/window.c:7732
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -745,12 +749,17 @@ msgstr "L'aplicació ha definit un _NET_WM_PID %lu fals\n"
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (a %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1484
|
||||
#: ../src/core/window-props.c:1481
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr ""
|
||||
"WM_TRANSIENT_FOR no vàlid per a la finestra 0x%lx especificat per a %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR per a la finestra 0x%lx per a %s crearia un bucle.\n"
|
||||
|
||||
#: ../src/core/xprops.c:155
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -781,6 +790,10 @@ msgstr ""
|
||||
"La propietat %s en la finestra 0x%lx contenia caràcters UTF-8 no vàlids per "
|
||||
"a l'element %d en la llista\n"
|
||||
|
||||
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:1
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Adjunta els diàlegs modals"
|
||||
@@ -802,16 +815,29 @@ msgstr ""
|
||||
"tots els monitors o només en les finestres del monitor primari."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:4
|
||||
msgid "Draggable border width"
|
||||
msgstr "Amplada del contorn arrossegable"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Finestres ocultes en viu"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr ""
|
||||
"Modificador que s'utilitzarà per les operacions ampliades de gestió de "
|
||||
"finestres"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
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 ""
|
||||
"La quantitat total de contorn arrossegable. Si els contorns visibles del "
|
||||
"tema no són suficients, s'afegiran contorns invisibles per aconseguir este "
|
||||
"valor."
|
||||
|
||||
#: ../src/mutter.schemas.in.h: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 "
|
||||
@@ -823,7 +849,7 @@ msgstr ""
|
||||
"predeterminat és la «tecla Windows» en maquinari basat en ordinadors PC. El "
|
||||
"valor d'esta vinculació s'espera que siga el predeterminat o text en blanc."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
#: ../src/mutter.schemas.in.h:9
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -833,7 +859,7 @@ msgstr ""
|
||||
"diàlegs modals apareixeran adjuntats a la barra de títol de la finestra mare "
|
||||
"i es mouran juntament amb esta."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
#: ../src/mutter.schemas.in.h:10
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Espais de treball només en el primari"
|
||||
|
||||
@@ -842,47 +868,47 @@ msgstr "Espais de treball només en el primari"
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Forma d'ús: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1280
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Tanca la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1283
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Menú de la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1286
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Minimitza la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1289
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Maximitza la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1292
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Restaura la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1295
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Enrotlla la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1298
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Desenrotlla la finestra"
|
||||
|
||||
#: ../src/ui/frames.c:1301
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Mantén la finestra per damunt"
|
||||
|
||||
#: ../src/ui/frames.c:1304
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Trau la finestra de damunt"
|
||||
msgstr "Treu la finestra de damunt"
|
||||
|
||||
#: ../src/ui/frames.c:1307
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Sempre a l'espai de treball visible"
|
||||
|
||||
#: ../src/ui/frames.c:1310
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Posa la finestra només a un espai de treball"
|
||||
|
||||
@@ -1085,49 +1111,77 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:253
|
||||
msgid "top"
|
||||
msgstr "superior"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:255
|
||||
msgid "bottom"
|
||||
msgstr "inferior"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:257
|
||||
msgid "left"
|
||||
msgstr "esquerra"
|
||||
|
||||
#: ../src/ui/theme.c:261
|
||||
#: ../src/ui/theme.c:259
|
||||
msgid "right"
|
||||
msgstr "dreta"
|
||||
|
||||
#: ../src/ui/theme.c:288
|
||||
#: ../src/ui/theme.c:286
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "la geometria del marc no especifica la dimensió «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:307
|
||||
#: ../src/ui/theme.c:305
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr ""
|
||||
"la geometria del marc no especifica la dimensió «%s» per al contorn «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:344
|
||||
#: ../src/ui/theme.c:342
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "El ràtio d'aspecte dels botons %g no és raonable"
|
||||
|
||||
#: ../src/ui/theme.c:356
|
||||
#: ../src/ui/theme.c:354
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "La geometria del marc no especifica la mida dels botons"
|
||||
|
||||
#: ../src/ui/theme.c:1064
|
||||
#: ../src/ui/theme.c:1065
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Els degradats han de tindre almenys dos colors"
|
||||
|
||||
#: ../src/ui/theme.c:1202
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"L'especificació personalitzada de color de GTK ha de tindre un nom de color "
|
||||
"i un alternatiu en parèntesis, p.e. gtk:personalitzat(foo,bar); no s'ha "
|
||||
"pogut analitzar «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1233
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"El caràcter «%c» no és vàlid en el paràmetre color_name de gtk:"
|
||||
"personalitzat, només són vàlids A-Za-z0-9-_"
|
||||
|
||||
#: ../src/ui/theme.c:1247
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"El format de Gtk:personalitzat és «gtk:personalitzat(color_name,"
|
||||
"alternatiu)», «%s» no s'ajusta al format"
|
||||
|
||||
#: ../src/ui/theme.c:1292
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -1136,7 +1190,7 @@ msgstr ""
|
||||
"L'especificació de color GTK ha de tindre l'estat entre claudàtors, p.e. gtk:"
|
||||
"fg[NORMAL] on NORMAL és l'estat; no s'ha pogut analitzar \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1216
|
||||
#: ../src/ui/theme.c:1306
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -1146,17 +1200,17 @@ msgstr ""
|
||||
"de l'estat, p.e. gtk:fg[NORMAL] on NORMAL és l'estat; no s'ha pogut "
|
||||
"analitzar «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1227
|
||||
#: ../src/ui/theme.c:1317
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "No s'entén l'estat «%s» en l'especificació del color"
|
||||
|
||||
#: ../src/ui/theme.c:1240
|
||||
#: ../src/ui/theme.c:1330
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "No s'entén l'element de color «%s» en l'especificació del color"
|
||||
|
||||
#: ../src/ui/theme.c:1270
|
||||
#: ../src/ui/theme.c:1360
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1165,49 +1219,44 @@ msgstr ""
|
||||
"El format de barreja és «blend/bg_color/fg_color/alpha», «%s» no s'ajusta al "
|
||||
"format"
|
||||
|
||||
#: ../src/ui/theme.c:1281
|
||||
#: ../src/ui/theme.c:1371
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "No s'ha pogut analitzar el valor d'opacitat «%s» en el color barrejat"
|
||||
|
||||
#: ../src/ui/theme.c:1291
|
||||
#: ../src/ui/theme.c:1381
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "El valor alfa «%s» en el color barrejat no està entre 0,0 i 1,0"
|
||||
|
||||
#: ../src/ui/theme.c:1338
|
||||
#: ../src/ui/theme.c:1428
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
msgstr ""
|
||||
"El format d'ombrejat és «shade/base_color/factor», «%s» no s'ajusta al format"
|
||||
|
||||
#: ../src/ui/theme.c:1349
|
||||
#: ../src/ui/theme.c:1439
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "No s'ha pogut analitzar el factor d'ombrejat «%s» en el color ombrejat"
|
||||
|
||||
#: ../src/ui/theme.c:1359
|
||||
#: ../src/ui/theme.c:1449
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "El factor d'ombrejat «%s» en el color ombrejat és negatiu"
|
||||
|
||||
#: ../src/ui/theme.c:1388
|
||||
#: ../src/ui/theme.c:1478
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "No s'ha pogut analitzar el color «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1481
|
||||
#, c-format
|
||||
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/ui/theme.c:1713
|
||||
#: ../src/ui/theme.c:1789
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "L'expressió coordinada conté el caràcter '%s', el qual no és permés"
|
||||
|
||||
#: ../src/ui/theme.c:1740
|
||||
#: ../src/ui/theme.c:1816
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -1216,12 +1265,12 @@ msgstr ""
|
||||
"L'expressió coordinada conté el número '%s' de punt flotant el qual no es "
|
||||
"pot analitzar"
|
||||
|
||||
#: ../src/ui/theme.c:1754
|
||||
#: ../src/ui/theme.c:1830
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "L'expressió coordinada conté l'enter '%s' el qual no es pot analitzar"
|
||||
|
||||
#: ../src/ui/theme.c:1876
|
||||
#: ../src/ui/theme.c:1952
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -1230,17 +1279,17 @@ msgstr ""
|
||||
"L'expressió coordinada conté un operador desconegut a l'inici d'este text: "
|
||||
"«%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1933
|
||||
#: ../src/ui/theme.c:2009
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "L'expressió coordinada estava buida o no s'ha entés"
|
||||
|
||||
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
|
||||
#: ../src/ui/theme.c:2120 ../src/ui/theme.c:2130 ../src/ui/theme.c:2164
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "L'expressió coordinada dóna una divisió per zero"
|
||||
|
||||
#: ../src/ui/theme.c:2096
|
||||
#: ../src/ui/theme.c:2172
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -1248,25 +1297,25 @@ msgstr ""
|
||||
"L'expressió coordinada intenta utilitzar l'operador de mode en un número de "
|
||||
"punt flotant"
|
||||
|
||||
#: ../src/ui/theme.c:2152
|
||||
#: ../src/ui/theme.c:2228
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr ""
|
||||
"L'expressió coordinada té un operador «%s» on hi hauria d'anar un operand"
|
||||
|
||||
#: ../src/ui/theme.c:2161
|
||||
#: ../src/ui/theme.c:2237
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "L'expressió coordinada té un operand on hi hauria d'anar un operador"
|
||||
|
||||
#: ../src/ui/theme.c:2169
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr ""
|
||||
"L'expressió coordinada ha finalitzat amb un operador en lloc d'un operand"
|
||||
|
||||
#: ../src/ui/theme.c:2179
|
||||
#: ../src/ui/theme.c:2255
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1275,39 +1324,39 @@ msgstr ""
|
||||
"L'expressió coordinada té un operador «%c» seguit de l'operador «%c» sense "
|
||||
"cap operand enmig"
|
||||
|
||||
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
|
||||
#: ../src/ui/theme.c:2406 ../src/ui/theme.c:2451
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "L'expressió coordinada té una variable o constant desconeguda «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:2429
|
||||
#: ../src/ui/theme.c:2505
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr ""
|
||||
"L'analitzador d'expressions de coordinades ha desbordat la seua memòria "
|
||||
"intermèdia."
|
||||
|
||||
#: ../src/ui/theme.c:2458
|
||||
#: ../src/ui/theme.c:2534
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "L'expressió coordinada té un parèntesi de tancament i cap d'obertura"
|
||||
|
||||
#: ../src/ui/theme.c:2522
|
||||
#: ../src/ui/theme.c:2598
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "L'expressió coordinada té un parèntesi d'obertura i cap de tancament"
|
||||
|
||||
#: ../src/ui/theme.c:2533
|
||||
#: ../src/ui/theme.c:2609
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "L'expressió coordinada no pareix tindre cap operador o operand"
|
||||
|
||||
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
|
||||
#: ../src/ui/theme.c:2821 ../src/ui/theme.c:2841 ../src/ui/theme.c:2861
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "El tema conté una expressió que ha provocat un error: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4482
|
||||
#: ../src/ui/theme.c:4532
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1316,7 +1365,7 @@ msgstr ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"qualsevol\"/> s'ha "
|
||||
"d'especificar per a este estil de marc"
|
||||
|
||||
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
|
||||
#: ../src/ui/theme.c:5065 ../src/ui/theme.c:5090
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
@@ -1324,18 +1373,18 @@ msgstr ""
|
||||
"No s'ha trobat <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style="
|
||||
"\"qualsevol\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5085
|
||||
#: ../src/ui/theme.c:5138
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "No s'ha pogut carregar el tema \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5221 ../src/ui/theme.c:5228 ../src/ui/theme.c:5235
|
||||
#: ../src/ui/theme.c:5242 ../src/ui/theme.c:5249
|
||||
#: ../src/ui/theme.c:5274 ../src/ui/theme.c:5281 ../src/ui/theme.c:5288
|
||||
#: ../src/ui/theme.c:5295 ../src/ui/theme.c:5302
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "No s'ha definit <%s> per al tema «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:5257
|
||||
#: ../src/ui/theme.c:5310
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1344,7 +1393,7 @@ msgstr ""
|
||||
"No s'ha definit cap estil de marc per al tipus de finestra \"%s\" en el tema "
|
||||
"\"%s\", afegiu un element <window type=\"%s\" style_set=\"qualsevol\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
|
||||
#: ../src/ui/theme.c:5708 ../src/ui/theme.c:5770 ../src/ui/theme.c:5833
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -1352,7 +1401,7 @@ msgstr ""
|
||||
"Les constants de la definició d'usuari han de començar per una majúscula; "
|
||||
"«%s» no ho és"
|
||||
|
||||
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
|
||||
#: ../src/ui/theme.c:5716 ../src/ui/theme.c:5778 ../src/ui/theme.c:5841
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "La constant «%s» ja s'ha definit"
|
||||
@@ -1373,7 +1422,7 @@ msgstr "Línia %d caràcter %d: %s"
|
||||
#: ../src/ui/theme-parser.c:479
|
||||
#, c-format
|
||||
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
||||
msgstr "S'ha repetit l'atribut «%s» dos vegades en el mateix element <%s>"
|
||||
msgstr "S'ha repetit l'atribut «%s» dues vegades en el mateix element <%s>"
|
||||
|
||||
#: ../src/ui/theme-parser.c:503 ../src/ui/theme-parser.c:552
|
||||
#, c-format
|
||||
@@ -1435,7 +1484,7 @@ msgstr ""
|
||||
#: ../src/ui/theme-parser.c:1116 ../src/ui/theme-parser.c:1219
|
||||
#, c-format
|
||||
msgid "<%s> name \"%s\" used a second time"
|
||||
msgstr "<%s> amb nom «%s» s'ha utilitzat dos vegades"
|
||||
msgstr "<%s> amb nom «%s» s'ha utilitzat dues vegades"
|
||||
|
||||
#: ../src/ui/theme-parser.c:1031 ../src/ui/theme-parser.c:1128
|
||||
#: ../src/ui/theme-parser.c:1231
|
||||
@@ -1737,7 +1786,7 @@ msgstr "No es permet cap text dins de l'element <%s>"
|
||||
#: ../src/ui/theme-parser.c:4074
|
||||
#, c-format
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "S'ha especificat <%s> dos vegades per a este tema"
|
||||
msgstr "S'ha especificat <%s> dues vegades per a este tema"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4348
|
||||
#, c-format
|
||||
@@ -1809,88 +1858,88 @@ msgstr "Este és un exemple de missatge en un diàleg d'exemple"
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "Element fals de menú %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:370
|
||||
#: ../src/ui/theme-viewer.c:371
|
||||
msgid "Border-only window"
|
||||
msgstr "Finestra amb només contorn"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:372
|
||||
#: ../src/ui/theme-viewer.c:373
|
||||
msgid "Bar"
|
||||
msgstr "Barra"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:389
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Normal Application Window"
|
||||
msgstr "Finestra d'aplicació normal"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:393
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Dialog Box"
|
||||
msgstr "Caixa de diàleg"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:397
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "Caixa de diàleg modal"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:401
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Utility Palette"
|
||||
msgstr "Paleta d'utilitat"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:405
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "Menú arrossegable"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:409
|
||||
#: ../src/ui/theme-viewer.c:410
|
||||
msgid "Border"
|
||||
msgstr "Contorn"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:413
|
||||
#: ../src/ui/theme-viewer.c:414
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "Diàleg modal adjuntat"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:744
|
||||
#: ../src/ui/theme-viewer.c:747
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "Prova de disposició de botons %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:773
|
||||
#: ../src/ui/theme-viewer.c:776
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g mil·lisegons per dibuixar un marc de finestra"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#: ../src/ui/theme-viewer.c:821
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "Forma d'ús: metacity-theme-viewer [NOMDELTEMA]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:825
|
||||
#: ../src/ui/theme-viewer.c:828
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "S'ha produït un error en carregar el tema: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:831
|
||||
#: ../src/ui/theme-viewer.c:834
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "S'ha carregat el tema «%s» en %g segons\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
#: ../src/ui/theme-viewer.c:878
|
||||
msgid "Normal Title Font"
|
||||
msgstr "Tipus de lletra per a títol normal"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
#: ../src/ui/theme-viewer.c:884
|
||||
msgid "Small Title Font"
|
||||
msgstr "Tipus de lletra per a títol petit"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:890
|
||||
msgid "Large Title Font"
|
||||
msgstr "Tipus de lletra per a títol gran"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:895
|
||||
msgid "Button Layouts"
|
||||
msgstr "Disposicions de botons"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:897
|
||||
#: ../src/ui/theme-viewer.c:900
|
||||
msgid "Benchmark"
|
||||
msgstr "Test de referència"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:952
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "El títol de la finestra va ací"
|
||||
|
||||
|
332
po/cs.po
332
po/cs.po
@@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-04-03 17:11+0200\n"
|
||||
"PO-Revision-Date: 2011-04-03 17:09+0200\n"
|
||||
"POT-Creation-Date: 2011-09-26 00:45+0200\n"
|
||||
"PO-Revision-Date: 2011-09-26 00:45+0200\n"
|
||||
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
|
||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||
"Language: cs\n"
|
||||
@@ -19,7 +19,16 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Lokalize 1.1\n"
|
||||
"X-Generator: Lokalize 1.2\n"
|
||||
|
||||
#. 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:492
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "Jiný kompozitní správce již běží na obrazovce %i displeje \"%s\"."
|
||||
|
||||
#: ../src/core/all-keybindings.h:88
|
||||
msgid "Switch to workspace 1"
|
||||
@@ -341,13 +350,16 @@ msgstr "Událost zvonku"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Neznámý informační požadavek okna: %d"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: ../src/core/delete.c:94
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> neodpovídá."
|
||||
|
||||
#: ../src/core/delete.c:99
|
||||
#: ../src/core/delete.c:114
|
||||
msgid "Application is not responding."
|
||||
msgstr "Aplikace neodpovídá."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -355,11 +367,11 @@ msgstr ""
|
||||
"Je možné chvíli počkat, aby aplikace mohla pokračovat, nebo si vynutit úplné "
|
||||
"ukončení aplikace."
|
||||
|
||||
#: ../src/core/delete.c:108
|
||||
#: ../src/core/delete.c:126
|
||||
msgid "_Wait"
|
||||
msgstr "_Počkat"
|
||||
|
||||
#: ../src/core/delete.c:108
|
||||
#: ../src/core/delete.c:126
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Vynutit ukončení"
|
||||
|
||||
@@ -384,7 +396,7 @@ msgstr ""
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#: ../src/core/keybindings.c:2468
|
||||
#: ../src/core/keybindings.c:2523
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
@@ -395,12 +407,12 @@ msgstr ""
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/core/keybindings.c:2558
|
||||
#: ../src/core/keybindings.c:2613
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "Nebyl definován příkaz %d.\n"
|
||||
|
||||
#: ../src/core/keybindings.c:3570
|
||||
#: ../src/core/keybindings.c:3625
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "Nebyl definován příkaz terminálu.\n"
|
||||
@@ -429,12 +441,12 @@ msgstr "Spustí sezení z uloženého souboru"
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Provede volání X synchronně"
|
||||
|
||||
#: ../src/core/main.c:506
|
||||
#: ../src/core/main.c:504
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Nelze prohledat adresář motivů: %s\n"
|
||||
|
||||
#: ../src/core/main.c:522
|
||||
#: ../src/core/main.c:520
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -477,34 +489,34 @@ msgstr "Čárkou oddělený seznam zásuvných modulů kompozitoru"
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
|
||||
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "Klíč GConf \"%s\" je nastaven na neplatnou hodnotu\n"
|
||||
|
||||
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
|
||||
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr "%d uloženo v klíči GConf %s je mimo rozsah %d až %d\n"
|
||||
|
||||
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
|
||||
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
|
||||
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
|
||||
#: ../src/core/prefs.c:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
|
||||
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
|
||||
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "Klíč GConf \"%s\" je nastaven na neplatný typ\n"
|
||||
|
||||
#: ../src/core/prefs.c:1203
|
||||
#: ../src/core/prefs.c:1210
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr "Klíč GConf %s se již používá a nemůže být použit k přepsání %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1262
|
||||
#: ../src/core/prefs.c:1269
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "Nelze přepsat klíč GConf, %s nenalezeno\n"
|
||||
|
||||
#: ../src/core/prefs.c:1447
|
||||
#: ../src/core/prefs.c:1454
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -512,12 +524,12 @@ msgstr ""
|
||||
"Bylo zakázáno obcházení chyb aplikací. Některé aplikace se možná nebudou "
|
||||
"chovat správně.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1524
|
||||
#: ../src/core/prefs.c:1531
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr "Nelze analyzovat popis písma \"%s\" v klíči GConf %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1586
|
||||
#: ../src/core/prefs.c:1593
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -526,17 +538,17 @@ msgstr ""
|
||||
"\"%s\" nalezené v databázi nastavení není platnou hodnotou modifikátoru "
|
||||
"tlačítka myši\n"
|
||||
|
||||
#: ../src/core/prefs.c:2016
|
||||
#: ../src/core/prefs.c:2028
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "Chyba při nastavování počtu ploch na %d: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
|
||||
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Plocha %d"
|
||||
|
||||
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
|
||||
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -545,29 +557,29 @@ msgstr ""
|
||||
"\"%s\" nalezené v databázi nastavení není platnou hodnotou klávesové zkratky "
|
||||
"\"%s\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:2783
|
||||
#: ../src/core/prefs.c:2795
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "Chyba při nastavování názvu plochy %d na \"%s\": %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2997
|
||||
#: ../src/core/prefs.c:3009
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr "Chyba při nastavování stavu aktivních oken, která jsou skrytá: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:3032
|
||||
#: ../src/core/prefs.c:3044
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr ""
|
||||
"Chyba při nastavování stavu bez automaticky otevíraného okna tabulátorem: "
|
||||
"%s\n"
|
||||
|
||||
#: ../src/core/screen.c:624
|
||||
#: ../src/core/screen.c:741
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Obrazovka %d na displeji \"%s\" je neplatná\n"
|
||||
|
||||
#: ../src/core/screen.c:640
|
||||
#: ../src/core/screen.c:757
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -576,70 +588,70 @@ msgstr ""
|
||||
"Obrazovka %d na displeji \"%s\" již správce oken má; zkuste prosím nahradit "
|
||||
"aktuálního správce oken pomocí přepínače --replace.\n"
|
||||
|
||||
#: ../src/core/screen.c:667
|
||||
#: ../src/core/screen.c:784
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr "Nelze získat výběr správce oken na obrazovce %d displeje \"%s\"\n"
|
||||
|
||||
#: ../src/core/screen.c:722
|
||||
#: ../src/core/screen.c:839
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "Obrazovka %d na displeji \"%s\" již má správce oken\n"
|
||||
|
||||
#: ../src/core/screen.c:907
|
||||
#: ../src/core/screen.c:1024
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Nelze uvolnit obrazovku %d na displeji \"%s\"\n"
|
||||
|
||||
#: ../src/core/session.c:837 ../src/core/session.c:844
|
||||
#: ../src/core/session.c:843 ../src/core/session.c:850
|
||||
#, c-format
|
||||
msgid "Could not create directory '%s': %s\n"
|
||||
msgstr "Nelze vytvořit adresář \"%s\": %s\n"
|
||||
|
||||
#: ../src/core/session.c:854
|
||||
#: ../src/core/session.c:860
|
||||
#, c-format
|
||||
msgid "Could not open session file '%s' for writing: %s\n"
|
||||
msgstr "Nelze otevřít soubor sezení \"%s\" k zápisu: %s\n"
|
||||
|
||||
#: ../src/core/session.c:995
|
||||
#: ../src/core/session.c:1001
|
||||
#, c-format
|
||||
msgid "Error writing session file '%s': %s\n"
|
||||
msgstr "Chyba při zápisu souboru sezení \"%s\": %s\n"
|
||||
|
||||
#: ../src/core/session.c:1000
|
||||
#: ../src/core/session.c:1006
|
||||
#, c-format
|
||||
msgid "Error closing session file '%s': %s\n"
|
||||
msgstr "Chyba při zavírání souboru sezení \"%s\": %s\n"
|
||||
|
||||
#: ../src/core/session.c:1130
|
||||
#: ../src/core/session.c:1136
|
||||
#, c-format
|
||||
msgid "Failed to parse saved session file: %s\n"
|
||||
msgstr "Chyba při analyzování uloženého souboru sezení: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1179
|
||||
#: ../src/core/session.c:1185
|
||||
#, c-format
|
||||
msgid "<mutter_session> attribute seen but we already have the session ID"
|
||||
msgstr "nalezen atribut <mutter_session>, ale ID sezení už k dispozici je"
|
||||
|
||||
#: ../src/core/session.c:1192 ../src/core/session.c:1267
|
||||
#: ../src/core/session.c:1299 ../src/core/session.c:1371
|
||||
#: ../src/core/session.c:1431
|
||||
#: ../src/core/session.c:1198 ../src/core/session.c:1273
|
||||
#: ../src/core/session.c:1305 ../src/core/session.c:1377
|
||||
#: ../src/core/session.c:1437
|
||||
#, c-format
|
||||
msgid "Unknown attribute %s on <%s> element"
|
||||
msgstr "Neznámý atribut %s prvku <%s>"
|
||||
|
||||
#: ../src/core/session.c:1209
|
||||
#: ../src/core/session.c:1215
|
||||
#, c-format
|
||||
msgid "nested <window> tag"
|
||||
msgstr "vnořená značka <window>"
|
||||
|
||||
#: ../src/core/session.c:1451
|
||||
#: ../src/core/session.c:1457
|
||||
#, c-format
|
||||
msgid "Unknown element %s"
|
||||
msgstr "Neznámý prvek %s"
|
||||
|
||||
#: ../src/core/session.c:1803
|
||||
#: ../src/core/session.c:1809
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
"be restarted manually next time you log in."
|
||||
@@ -667,30 +679,24 @@ msgstr "Otevřen soubor záznamu %s\n"
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n"
|
||||
|
||||
#: ../src/core/util.c:286
|
||||
#: ../src/core/util.c:290
|
||||
msgid "Window manager: "
|
||||
msgstr "Správce oken: "
|
||||
|
||||
#: ../src/core/util.c:434
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Chyba ve správci oken: "
|
||||
|
||||
#: ../src/core/util.c:467
|
||||
#: ../src/core/util.c:471
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Varování správce oken: "
|
||||
|
||||
#: ../src/core/util.c:495
|
||||
#: ../src/core/util.c:499
|
||||
msgid "Window manager error: "
|
||||
msgstr "Chyba správce oken: "
|
||||
|
||||
#. Translators: This is the title used on dialog boxes
|
||||
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
|
||||
#: ../src/mutter-wm.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:6849
|
||||
#: ../src/core/window.c:7069
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -706,7 +712,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7512
|
||||
#: ../src/core/window.c:7732
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -726,11 +732,16 @@ msgstr "Aplikace nastavila neplatný _NET_WM_PID %lu\n"
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (na %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1482
|
||||
#: ../src/core/window-props.c:1481
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Neplatné okno WM_TRANSIENT_FOR 0x%lx specifikováno pro %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "Okno WM_TRANSIENT_FOR 0x%lx by vytvořilo smyčku pro %s.\n"
|
||||
|
||||
#: ../src/core/xprops.c:155
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -758,6 +769,10 @@ msgid ""
|
||||
msgstr ""
|
||||
"Vlastnost %s okna 0x%lx obsahovala neplatné UTF-8 u položky %d seznamu\n"
|
||||
|
||||
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:1
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Připojit modální dialogová okna"
|
||||
@@ -779,14 +794,26 @@ msgstr ""
|
||||
"monitorech, nebo pouze u oken na primárním monitoru."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:4
|
||||
msgid "Draggable border width"
|
||||
msgstr "Šířka přetažitelného okraje"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Aktivní skrytá okna"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Modifikátor, který se má použít u operací rozšířené správy oken"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
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 ""
|
||||
"Počet všech přetažitelných okrajů. Nestačí-li viditelné okraje motivu, budou "
|
||||
"přidány neviditelné okraje, aby bylo docíleno zadané hodnoty."
|
||||
|
||||
#: ../src/mutter.schemas.in.h: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 "
|
||||
@@ -798,7 +825,7 @@ msgstr ""
|
||||
"Windows\". Předpokládá se, že tato zkratka bude výchozí, nebo nastavena na "
|
||||
"prázdný řetězec."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
#: ../src/mutter.schemas.in.h:9
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -808,7 +835,7 @@ msgstr ""
|
||||
"zobrazují jako připojené k záhlaví okna rodiče a jsou přesunovány společně s "
|
||||
"oknem rodiče."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
#: ../src/mutter.schemas.in.h:10
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Pracovní plochy pouze na primárním"
|
||||
|
||||
@@ -817,47 +844,47 @@ msgstr "Pracovní plochy pouze na primárním"
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Použití: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1099
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Zavřít okno"
|
||||
|
||||
#: ../src/ui/frames.c:1102
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Nabídka okna"
|
||||
|
||||
#: ../src/ui/frames.c:1105
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Minimalizovat okno"
|
||||
|
||||
#: ../src/ui/frames.c:1108
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Maximalizovat okno"
|
||||
|
||||
#: ../src/ui/frames.c:1111
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Obnovit okno"
|
||||
|
||||
#: ../src/ui/frames.c:1114
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Svinout okno"
|
||||
|
||||
#: ../src/ui/frames.c:1117
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Rozvinout okno"
|
||||
|
||||
#: ../src/ui/frames.c:1120
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Držet okno navrchu"
|
||||
|
||||
#: ../src/ui/frames.c:1123
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Odstranit okno svrchu"
|
||||
|
||||
#: ../src/ui/frames.c:1126
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Vždy na viditelné ploše"
|
||||
|
||||
#: ../src/ui/frames.c:1129
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Umístit okno jen na jednu plochu"
|
||||
|
||||
@@ -1060,48 +1087,75 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d × %d"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:253
|
||||
msgid "top"
|
||||
msgstr "nahoře"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:255
|
||||
msgid "bottom"
|
||||
msgstr "dole"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:257
|
||||
msgid "left"
|
||||
msgstr "vlevo"
|
||||
|
||||
#: ../src/ui/theme.c:261
|
||||
#: ../src/ui/theme.c:259
|
||||
msgid "right"
|
||||
msgstr "vpravo"
|
||||
|
||||
#: ../src/ui/theme.c:288
|
||||
#: ../src/ui/theme.c:286
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "geometrie rámu nedefinuje rozměr \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:307
|
||||
#: ../src/ui/theme.c:305
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "geometrie rámu nedefinuje rozměr \"%s\" okraje \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:344
|
||||
#: ../src/ui/theme.c:342
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "Poměr stran tlačítka %g není přiměřený"
|
||||
|
||||
#: ../src/ui/theme.c:356
|
||||
#: ../src/ui/theme.c:354
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Geometrie rámu nedefinuje velikost tlačítek"
|
||||
|
||||
#: ../src/ui/theme.c:1064
|
||||
#: ../src/ui/theme.c:1065
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Přechody by měly mít alespoň dvě barvy"
|
||||
|
||||
#: ../src/ui/theme.c:1202
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"Určení vlastní barvy GTK musí mít název barvy a záložní možnost v závorce, "
|
||||
"např. gtk:custom(x,y); nelze analyzovat \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1233
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"Neplatný znak \"%c\" v parametru color_name v gtk:custom, platné jsou pouze "
|
||||
"A-Za-z0-9-_"
|
||||
|
||||
#: ../src/ui/theme.c:1247
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Formát Gtk:custom má podobu \"gtk:custom(název_barvy,záloha)\", \"%s\" "
|
||||
"tomuto formátu neodpovídá"
|
||||
|
||||
#: ../src/ui/theme.c:1292
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -1110,7 +1164,7 @@ msgstr ""
|
||||
"Specifikace GTK barvy musí mít stav v hranatých závorkách, např. gtk:fg"
|
||||
"[NORMAL], kde NORMAL je stav; nelze analyzovat \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1216
|
||||
#: ../src/ui/theme.c:1306
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -1119,17 +1173,17 @@ msgstr ""
|
||||
"Specifikace GTK barvy musí mít za stavem hranatou závorku, např. gtk:fg"
|
||||
"[NORMAL], kde NORMAL je stav; nelze analyzovat \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1227
|
||||
#: ../src/ui/theme.c:1317
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Nerozuměno stavu \"%s\" ve specifikaci barvy"
|
||||
|
||||
#: ../src/ui/theme.c:1240
|
||||
#: ../src/ui/theme.c:1330
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Nerozuměno barevné složce \"%s\" ve specifikaci barvy"
|
||||
|
||||
#: ../src/ui/theme.c:1270
|
||||
#: ../src/ui/theme.c:1360
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1138,17 +1192,17 @@ msgstr ""
|
||||
"Formát prolínání má podobu \"prolínání/barva_pozadí/barva_popředí/alfa\", "
|
||||
"\"%s\" tomuto formátu neodpovídá"
|
||||
|
||||
#: ../src/ui/theme.c:1281
|
||||
#: ../src/ui/theme.c:1371
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Nelze analyzovat hodnotu alfa \"%s\" v prolínající barvě"
|
||||
|
||||
#: ../src/ui/theme.c:1291
|
||||
#: ../src/ui/theme.c:1381
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "Hodnota alfa \"%s\" v prolínající barvě není mezi 0.0 a 1.0"
|
||||
|
||||
#: ../src/ui/theme.c:1338
|
||||
#: ../src/ui/theme.c:1428
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -1156,27 +1210,27 @@ msgstr ""
|
||||
"Formát stínu má podobu \"stín/základní_barva/faktor\", \"%s\" tomuto formátu "
|
||||
"neodpovídá"
|
||||
|
||||
#: ../src/ui/theme.c:1349
|
||||
#: ../src/ui/theme.c:1439
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Nelze analyzovat faktor stínu \"%s\" ve stínované barvě"
|
||||
|
||||
#: ../src/ui/theme.c:1359
|
||||
#: ../src/ui/theme.c:1449
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Faktor stínu \"%s\" ve stínované barvě je záporný"
|
||||
|
||||
#: ../src/ui/theme.c:1388
|
||||
#: ../src/ui/theme.c:1478
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Nelze analyzovat barvu \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1646
|
||||
#: ../src/ui/theme.c:1789
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Souřadnicový výraz obsahuje nepovolený znak \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1673
|
||||
#: ../src/ui/theme.c:1816
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -1185,29 +1239,29 @@ msgstr ""
|
||||
"Souřadnicový výraz obsahuje číslo s pohyblivou řádovou čárkou \"%s\", které "
|
||||
"nelze analyzovat"
|
||||
|
||||
#: ../src/ui/theme.c:1687
|
||||
#: ../src/ui/theme.c:1830
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "Souřadnicový výraz obsahuje celé číslo \"%s\", které nelze analyzovat"
|
||||
|
||||
#: ../src/ui/theme.c:1809
|
||||
#: ../src/ui/theme.c:1952
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
"\"%s\""
|
||||
msgstr "Souřadnicový výraz obsahuje na začátku textu neznámý operátor: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1866
|
||||
#: ../src/ui/theme.c:2009
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Souřadnicový výraz byl prázdný nebo mu nebylo rozuměno"
|
||||
|
||||
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
|
||||
#: ../src/ui/theme.c:2120 ../src/ui/theme.c:2130 ../src/ui/theme.c:2164
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Souřadnicový výraz způsobil dělení nulou"
|
||||
|
||||
#: ../src/ui/theme.c:2029
|
||||
#: ../src/ui/theme.c:2172
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -1215,24 +1269,24 @@ msgstr ""
|
||||
"Souřadnicový výraz chce použít operátor mod na číslo s pohyblivou řádovou "
|
||||
"čárkou"
|
||||
|
||||
#: ../src/ui/theme.c:2085
|
||||
#: ../src/ui/theme.c:2228
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr ""
|
||||
"Souřadnicový výraz má na místě, kde byl očekáván operand, operátor \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2094
|
||||
#: ../src/ui/theme.c:2237
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "Souřadnicový výraz má operand tam, kde byl očekáván operátor"
|
||||
|
||||
#: ../src/ui/theme.c:2102
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Souřadnicový výraz končí operátorem místo operandu"
|
||||
|
||||
#: ../src/ui/theme.c:2112
|
||||
#: ../src/ui/theme.c:2255
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1241,37 +1295,37 @@ msgstr ""
|
||||
"Souřadnicový výraz má operátor \"%c\" za operátorem \"%c\" bez operandu "
|
||||
"umístěného mezi nimi"
|
||||
|
||||
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
|
||||
#: ../src/ui/theme.c:2406 ../src/ui/theme.c:2451
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "Souřadnicový výraz má neznámou proměnnou nebo konstantu \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2362
|
||||
#: ../src/ui/theme.c:2505
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Analyzátor souřadnicových výrazů přeplnil svou vyrovnávací paměť."
|
||||
|
||||
#: ../src/ui/theme.c:2391
|
||||
#: ../src/ui/theme.c:2534
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "Souřadnicový výraz má pravou závorku bez levé závorky"
|
||||
|
||||
#: ../src/ui/theme.c:2455
|
||||
#: ../src/ui/theme.c:2598
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "Souřadnicový výraz má levou závorku bez pravé závorky"
|
||||
|
||||
#: ../src/ui/theme.c:2466
|
||||
#: ../src/ui/theme.c:2609
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "Souřadnicový výraz zřejmě nemá žádné operátory nebo operandy"
|
||||
|
||||
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
|
||||
#: ../src/ui/theme.c:2821 ../src/ui/theme.c:2841 ../src/ui/theme.c:2861
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Motiv obsahoval výraz, který způsobil chybu: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4410
|
||||
#: ../src/ui/theme.c:4532
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1280,25 +1334,25 @@ msgstr ""
|
||||
"U tohoto stylu rámu musí být zadáno <button function=\"%s\" state=\"%s\" "
|
||||
"draw_ops=\"cokoliv\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
|
||||
#: ../src/ui/theme.c:5065 ../src/ui/theme.c:5090
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"Chybí <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"cokoliv\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5013
|
||||
#: ../src/ui/theme.c:5138
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Nelze načíst motiv \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
|
||||
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
|
||||
#: ../src/ui/theme.c:5274 ../src/ui/theme.c:5281 ../src/ui/theme.c:5288
|
||||
#: ../src/ui/theme.c:5295 ../src/ui/theme.c:5302
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "Není nastaveno <%s> motivu \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:5185
|
||||
#: ../src/ui/theme.c:5310
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1307,7 +1361,7 @@ msgstr ""
|
||||
"U typu okna \"%s\" motivu \"%s\" není nastaven typ rámu, přidejte prosím "
|
||||
"prvek <window type=\"%s\" style_set=\"cokoliv\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
|
||||
#: ../src/ui/theme.c:5708 ../src/ui/theme.c:5770 ../src/ui/theme.c:5833
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -1315,7 +1369,7 @@ msgstr ""
|
||||
"Uživatelem definované konstanty musí začínat velkým písmenem; \"%s\" toto "
|
||||
"nesplňuje"
|
||||
|
||||
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
|
||||
#: ../src/ui/theme.c:5716 ../src/ui/theme.c:5778 ../src/ui/theme.c:5841
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "Konstanta \"%s\" již byla definována"
|
||||
@@ -1762,88 +1816,88 @@ msgstr "Toto je ukázková zpráva v ukázkovém dialogu"
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "Falešná položka nabídky %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:370
|
||||
#: ../src/ui/theme-viewer.c:371
|
||||
msgid "Border-only window"
|
||||
msgstr "Okno jen s okrajem"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:372
|
||||
#: ../src/ui/theme-viewer.c:373
|
||||
msgid "Bar"
|
||||
msgstr "Lišta"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:389
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Normal Application Window"
|
||||
msgstr "Normální okno aplikace"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:393
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Dialog Box"
|
||||
msgstr "Dialogové okno"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:397
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "Modální dialogové okno"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:401
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Utility Palette"
|
||||
msgstr "Paleta nástrojů"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:405
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "Odtržení nabídky"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:409
|
||||
#: ../src/ui/theme-viewer.c:410
|
||||
msgid "Border"
|
||||
msgstr "Okraj"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:413
|
||||
#: ../src/ui/theme-viewer.c:414
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "Připojené modální dialogové okno"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:744
|
||||
#: ../src/ui/theme-viewer.c:747
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "Test rozložení tlačítek %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:773
|
||||
#: ../src/ui/theme-viewer.c:776
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g milisekund na nakreslení jednoho rámu okna"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#: ../src/ui/theme-viewer.c:821
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "Použití: metacity-theme-viewer [NÁZEVMOTIVU]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:825
|
||||
#: ../src/ui/theme-viewer.c:828
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "Chyba při načítání motivu: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:831
|
||||
#: ../src/ui/theme-viewer.c:834
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "Načten motiv \"%s\" za %g sekund\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
#: ../src/ui/theme-viewer.c:878
|
||||
msgid "Normal Title Font"
|
||||
msgstr "Normální písmo nadpisu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
#: ../src/ui/theme-viewer.c:884
|
||||
msgid "Small Title Font"
|
||||
msgstr "Malé písmo nadpisu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:890
|
||||
msgid "Large Title Font"
|
||||
msgstr "Velké písmo nadpisu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:895
|
||||
msgid "Button Layouts"
|
||||
msgstr "Rozložení tlačítek"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:897
|
||||
#: ../src/ui/theme-viewer.c:900
|
||||
msgid "Benchmark"
|
||||
msgstr "Test výkonnosti"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:952
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "Sem patří nadpis okna"
|
||||
|
||||
|
16
po/ja.po
16
po/ja.po
@@ -11,9 +11,9 @@ msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-09-15 00:03+0000\n"
|
||||
"PO-Revision-Date: 2011-09-11 08:23+0900\n"
|
||||
"Last-Translator: Jiro Matsuzawa <jmatsuzawa@src.gnome.org>\n"
|
||||
"POT-Creation-Date: 2011-09-25 11:31+0000\n"
|
||||
"PO-Revision-Date: 2011-09-25 23:38+0900\n"
|
||||
"Last-Translator: OKANO Takayoshi <kano@na.rim.or.jp>\n"
|
||||
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -707,7 +707,7 @@ msgid "Window manager error: "
|
||||
msgstr "ウィンドウ・マネージャーのエラー: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7066
|
||||
#: ../src/core/window.c:7069
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -723,7 +723,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7729
|
||||
#: ../src/core/window.c:7732
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
@@ -1169,8 +1169,8 @@ msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Gtk:custom の書式は \"gtk:custom(color_name,fallback) です (\"%s\" はこの書式"
|
||||
"に合っていません)"
|
||||
"Gtk:custom の書式は \"gtk:custom(color_name,fallback)\" です (\"%s\" はこの書"
|
||||
"式に合っていません)"
|
||||
|
||||
#: ../src/ui/theme.c:1292
|
||||
#, c-format
|
||||
@@ -1558,7 +1558,7 @@ msgstr "階調度のタイプの値 \"%s\" は解釈されませんでした"
|
||||
#: ../src/ui/theme-parser.c:2193 ../src/ui/theme-parser.c:2568
|
||||
#, c-format
|
||||
msgid "Did not understand fill type \"%s\" for <%s> element"
|
||||
msgstr "<%2$s>エレメント用のフィルターイプ \"%1$s\"は解釈されませんでした"
|
||||
msgstr "<%2$s>エレメント用のフィルタイプ \"%1$s\"は解釈されませんでした"
|
||||
|
||||
#: ../src/ui/theme-parser.c:2360 ../src/ui/theme-parser.c:2443
|
||||
#: ../src/ui/theme-parser.c:2506
|
||||
|
325
po/ko.po
325
po/ko.po
@@ -18,8 +18,8 @@ msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-03-21 19:31+0000\n"
|
||||
"PO-Revision-Date: 2011-04-02 20:10+0900\n"
|
||||
"POT-Creation-Date: 2011-08-10 12:42+0000\n"
|
||||
"PO-Revision-Date: 2011-09-24 08:21+0900\n"
|
||||
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
|
||||
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -28,6 +28,15 @@ msgstr ""
|
||||
"Language: Korean\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. 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:487
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "다른 창 구성 관리 프로그램이 이미 디스플레이 \"%2$s\" 화면 %1$i번에서 실행 중입니다."
|
||||
|
||||
#: ../src/core/all-keybindings.h:88
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "1번째 작업 공간으로 이동"
|
||||
@@ -345,23 +354,26 @@ msgstr "삑소리 이벤트"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "알 수 없는 창 정보 요청: %d"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: ../src/core/delete.c:94
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> 창이 반응하지 않습니다."
|
||||
|
||||
#: ../src/core/delete.c:99
|
||||
#: ../src/core/delete.c:114
|
||||
msgid "Application is not responding."
|
||||
msgstr "프로그램이 반응하지 않습니다."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
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:108
|
||||
#: ../src/core/delete.c:126
|
||||
msgid "_Wait"
|
||||
msgstr "기다리기(_W)"
|
||||
|
||||
#: ../src/core/delete.c:108
|
||||
#: ../src/core/delete.c:126
|
||||
msgid "_Force Quit"
|
||||
msgstr "강제로 끝내기(_F)"
|
||||
|
||||
@@ -387,7 +399,7 @@ msgstr ""
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#: ../src/core/keybindings.c:2468
|
||||
#: ../src/core/keybindings.c:2523
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
@@ -397,12 +409,12 @@ msgstr ""
|
||||
"<tt>%s</tt> 명령을 실행하는 중 오류가 발생했습니다:\n"
|
||||
"%s."
|
||||
|
||||
#: ../src/core/keybindings.c:2558
|
||||
#: ../src/core/keybindings.c:2613
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "명령 %d이(가) 정의되지 않았습니다.\n"
|
||||
|
||||
#: ../src/core/keybindings.c:3570
|
||||
#: ../src/core/keybindings.c:3625
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "터미널 명령을 정의하지 않았습니다.\n"
|
||||
@@ -431,12 +443,12 @@ msgstr "저장 파일에서 세션을 초기화 합니다"
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "동기 X 호출을 합니다"
|
||||
|
||||
#: ../src/core/main.c:506
|
||||
#: ../src/core/main.c:504
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "테마 디렉터리를 읽는 데 실패했습니다: %s\n"
|
||||
|
||||
#: ../src/core/main.c:522
|
||||
#: ../src/core/main.c:520
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -478,36 +490,36 @@ msgstr "컴포짓 플러그인의 목록, 쉼표로 구분"
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
|
||||
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "GConf 키 '%s'이(가) 잘못된 값으로 설정되어 있습니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
|
||||
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr ""
|
||||
"GConf 키 %2$s에 저장된 %1$d은(는) %3$d에서 %4$d 사이의 범위를 벗어납니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
|
||||
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
|
||||
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
|
||||
#: ../src/core/prefs.c:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
|
||||
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
|
||||
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "\"%s\" GConf 키가 잘못된 형식으로 설정되어 있습니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:1203
|
||||
#: ../src/core/prefs.c:1210
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"\"%s\" GConf 키가 이미 사용 중이므로 %s 키를 대신하는데 사용될 수 없습니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:1262
|
||||
#: ../src/core/prefs.c:1269
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "GConf 키를 대신할 수 없습니다. %s 키가 있습니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:1447
|
||||
#: ../src/core/prefs.c:1454
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -515,12 +527,12 @@ msgstr ""
|
||||
"응용 프로그램에 대한 임시 방편을 막았습니다. 몇몇 응용프로그램들이 제대로 동"
|
||||
"작하지 않을것입니다.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1524
|
||||
#: ../src/core/prefs.c:1531
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr "GConf 키 %2$s에서 글꼴 지정 \"%1$s\"을(를) 분석할 수 없습니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:1586
|
||||
#: ../src/core/prefs.c:1593
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -529,17 +541,17 @@ msgstr ""
|
||||
"설정 데이터베이스에서 찾은 \"%s\"이(가) 마우스 단추 변경 키의 올바른 값이 아"
|
||||
"닙니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:2016
|
||||
#: ../src/core/prefs.c:2028
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "작업 공간의 수를 %d(으)로 설정하는 중 오류: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
|
||||
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "작업 공간 %d"
|
||||
|
||||
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
|
||||
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -548,100 +560,98 @@ msgstr ""
|
||||
"설정 데이터베이스에서 찾은 \"%s\"이(가) 단축키 \"%s\"에 대한 올바른 값이 아닙"
|
||||
"니다\n"
|
||||
|
||||
#: ../src/core/prefs.c:2783
|
||||
#: ../src/core/prefs.c:2795
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "작업 공간 %d의 이름을 \"%s\"(으)로 설정하는 중 오류: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2997
|
||||
#: ../src/core/prefs.c:3009
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr "실행 중인 숨긴 창 상태를 설정하는 중 오류: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:3032
|
||||
#: ../src/core/prefs.c:3044
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr "탭 없음 팝업 상태를 설정하는 중 오류: %s\n"
|
||||
|
||||
#: ../src/core/screen.c:623
|
||||
#: ../src/core/screen.c:663
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "디스플레이 '%2$s'의 화면 %1$d은(는) 잘못되었습니다\n"
|
||||
|
||||
#: ../src/core/screen.c:639
|
||||
#: ../src/core/screen.c:679
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
"replace option to replace the current window manager.\n"
|
||||
msgstr ""
|
||||
"디스플레이 \"%2$s\"의 화면 %1$d에 이미 창 관리자가 실행되고 있습니다; 현재 "
|
||||
"창 관리자를 무시하는 --replace 옵션을 써보십시오.\n"
|
||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d에 이미 창 관리자가 실행되고 있습니다. 현재 창 관리자를 무시하는 --replace 옵션을 써보십시오.\n"
|
||||
|
||||
#: ../src/core/screen.c:666
|
||||
#: ../src/core/screen.c:706
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d에 창 관리 선택을 가질 수 없습니다\n"
|
||||
|
||||
#: ../src/core/screen.c:721
|
||||
#: ../src/core/screen.c:761
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr ""
|
||||
"디스플레이 \"%2$s\"의 화면 %1$d은(는) 이미 창 관리자가 실행되고 있습니다\n"
|
||||
|
||||
#: ../src/core/screen.c:906
|
||||
#: ../src/core/screen.c:946
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d을(를) 떼어 놓을수 없습니다\n"
|
||||
|
||||
#: ../src/core/session.c:837 ../src/core/session.c:844
|
||||
#: ../src/core/session.c:843 ../src/core/session.c:850
|
||||
#, c-format
|
||||
msgid "Could not create directory '%s': %s\n"
|
||||
msgstr "디렉터리 '%s'을(를) 만들 수 없습니다: %s\n"
|
||||
|
||||
#: ../src/core/session.c:854
|
||||
#: ../src/core/session.c:860
|
||||
#, c-format
|
||||
msgid "Could not open session file '%s' for writing: %s\n"
|
||||
msgstr "세션 파일 '%s'을(를) 쓰기위해 열 수 없습니다: %s\n"
|
||||
|
||||
#: ../src/core/session.c:995
|
||||
#: ../src/core/session.c:1001
|
||||
#, c-format
|
||||
msgid "Error writing session file '%s': %s\n"
|
||||
msgstr "세션 파일 '%s'을(를) 쓰는 중 오류: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1000
|
||||
#: ../src/core/session.c:1006
|
||||
#, c-format
|
||||
msgid "Error closing session file '%s': %s\n"
|
||||
msgstr "세션 파일 '%s'을(를) 닫는 중 오류: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1130
|
||||
#: ../src/core/session.c:1136
|
||||
#, c-format
|
||||
msgid "Failed to parse saved session file: %s\n"
|
||||
msgstr "저장된 세션파일을 분석하기 실패: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1179
|
||||
#: ../src/core/session.c:1185
|
||||
#, c-format
|
||||
msgid "<mutter_session> attribute seen but we already have the session ID"
|
||||
msgstr "이미 세션 ID를 가지고 있는데 <mutter_session> 속성이 나왔습니다."
|
||||
|
||||
#: ../src/core/session.c:1192 ../src/core/session.c:1267
|
||||
#: ../src/core/session.c:1299 ../src/core/session.c:1371
|
||||
#: ../src/core/session.c:1431
|
||||
#: ../src/core/session.c:1198 ../src/core/session.c:1273
|
||||
#: ../src/core/session.c:1305 ../src/core/session.c:1377
|
||||
#: ../src/core/session.c:1437
|
||||
#, c-format
|
||||
msgid "Unknown attribute %s on <%s> element"
|
||||
msgstr "<%2$s> 엘리먼트에 알 수 없는 속성 %1$s"
|
||||
|
||||
#: ../src/core/session.c:1209
|
||||
#: ../src/core/session.c:1215
|
||||
#, c-format
|
||||
msgid "nested <window> tag"
|
||||
msgstr "포함된 <window> 태그"
|
||||
|
||||
#: ../src/core/session.c:1451
|
||||
#: ../src/core/session.c:1457
|
||||
#, c-format
|
||||
msgid "Unknown element %s"
|
||||
msgstr "알 수 없는 속성 %s"
|
||||
|
||||
#: ../src/core/session.c:1803
|
||||
#: ../src/core/session.c:1809
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
"be restarted manually next time you log in."
|
||||
@@ -686,13 +696,13 @@ msgid "Window manager error: "
|
||||
msgstr "장 관리자 오류: "
|
||||
|
||||
#. Translators: This is the title used on dialog boxes
|
||||
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
|
||||
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
|
||||
#: ../src/mutter-wm.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "머터"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:6752
|
||||
#: ../src/core/window.c:6959
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -708,14 +718,12 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7415
|
||||
#: ../src/core/window.c:7622
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
"d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
msgstr ""
|
||||
"%s 창에서 크기 변경이 불가능하다는 MWM 힌트를 설정했지만, 최소 크기 %d x %d "
|
||||
"및 최대 크기 %d x %d(으)로 설정했습니다; 앞뒤가 맞지 않습니다.\n"
|
||||
msgstr "%s 창에서 크기 변경이 불가능하다는 MWM 힌트를 설정했지만, 최소 크기 %d x %d 및 최대 크기 %d x %d(으)로 설정했습니다. 앞뒤가 맞지 않습니다.\n"
|
||||
|
||||
#: ../src/core/window-props.c:309
|
||||
#, c-format
|
||||
@@ -728,11 +736,16 @@ msgstr "응용 프로그램이 가짜 _NET_WM_PID %lu을(를) 설정하였습니
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (%s에서)"
|
||||
|
||||
#: ../src/core/window-props.c:1479
|
||||
#: ../src/core/window-props.c:1488
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창이 잘못되었습니다.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1500
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창은 무한 반복입니다.\n"
|
||||
|
||||
#: ../src/core/xprops.c:155
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -782,14 +795,24 @@ msgstr ""
|
||||
"결정합니다."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:4
|
||||
msgid "Draggable border width"
|
||||
msgstr "마우스로 끌 수 있는 가장자리의 너비"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "실행 중인 숨긴 창"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "창 관리 작업을 할 때 사용할 변경 키"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
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 "마우스로 끌 수 있는 가장자리의 너비. 테마의 가장자리가 이보다 작은 경우, 투명한 가장자리가 부족한 양만큼 추가됩니다."
|
||||
|
||||
#: ../src/mutter.schemas.in.h: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 "
|
||||
@@ -801,7 +824,7 @@ msgstr ""
|
||||
"기본값은 \"윈도우 키\"입니다. 보통 이 키 바인딩은 기본값이거나 빈 문자열입니"
|
||||
"다."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
#: ../src/mutter.schemas.in.h:9
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -810,7 +833,7 @@ msgstr ""
|
||||
"참이면 모달 대화 상자에서 별도의 제목 표시줄을 표시하지 않고 상위 창의 제목 "
|
||||
"표시줄에 붙어서 상위 창과 함께 움직입니다."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
#: ../src/mutter.schemas.in.h:10
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "주 모니터에서만 작업 공간"
|
||||
|
||||
@@ -819,47 +842,47 @@ msgstr "주 모니터에서만 작업 공간"
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "사용법: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1099
|
||||
#: ../src/ui/frames.c:1123
|
||||
msgid "Close Window"
|
||||
msgstr "창 닫기"
|
||||
|
||||
#: ../src/ui/frames.c:1102
|
||||
#: ../src/ui/frames.c:1126
|
||||
msgid "Window Menu"
|
||||
msgstr "창 메뉴"
|
||||
|
||||
#: ../src/ui/frames.c:1105
|
||||
#: ../src/ui/frames.c:1129
|
||||
msgid "Minimize Window"
|
||||
msgstr "창 최소화"
|
||||
|
||||
#: ../src/ui/frames.c:1108
|
||||
#: ../src/ui/frames.c:1132
|
||||
msgid "Maximize Window"
|
||||
msgstr "창 최대화"
|
||||
|
||||
#: ../src/ui/frames.c:1111
|
||||
#: ../src/ui/frames.c:1135
|
||||
msgid "Restore Window"
|
||||
msgstr "창 복귀"
|
||||
|
||||
#: ../src/ui/frames.c:1114
|
||||
#: ../src/ui/frames.c:1138
|
||||
msgid "Roll Up Window"
|
||||
msgstr "창 말아올리기"
|
||||
|
||||
#: ../src/ui/frames.c:1117
|
||||
#: ../src/ui/frames.c:1141
|
||||
msgid "Unroll Window"
|
||||
msgstr "창 펼치기"
|
||||
|
||||
#: ../src/ui/frames.c:1120
|
||||
#: ../src/ui/frames.c:1144
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "창을 맨 위에 두기"
|
||||
|
||||
#: ../src/ui/frames.c:1123
|
||||
#: ../src/ui/frames.c:1147
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "창을 맨 위에서 빼기"
|
||||
|
||||
#: ../src/ui/frames.c:1126
|
||||
#: ../src/ui/frames.c:1150
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "항상 현재 작업 공간에 놓기"
|
||||
|
||||
#: ../src/ui/frames.c:1129
|
||||
#: ../src/ui/frames.c:1153
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "창을 한 개 작업 공간에만 두기"
|
||||
|
||||
@@ -1062,78 +1085,95 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:253
|
||||
msgid "top"
|
||||
msgstr "맨 위"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:255
|
||||
msgid "bottom"
|
||||
msgstr "맨 아래"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:257
|
||||
msgid "left"
|
||||
msgstr "왼쪽"
|
||||
|
||||
#: ../src/ui/theme.c:261
|
||||
#: ../src/ui/theme.c:259
|
||||
msgid "right"
|
||||
msgstr "오른쪽"
|
||||
|
||||
#: ../src/ui/theme.c:288
|
||||
#: ../src/ui/theme.c:286
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "프레임 위치가 \"%s\"차원으로 지정되지 않았습니다"
|
||||
|
||||
#: ../src/ui/theme.c:307
|
||||
#: ../src/ui/theme.c:305
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr ""
|
||||
"프레임 위치가 가장자리 \"%2$s\" 가장자리의 \"%1$s\"차원으로 지정되지 않았습니"
|
||||
"다."
|
||||
|
||||
#: ../src/ui/theme.c:344
|
||||
#: ../src/ui/theme.c:342
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "단추의 가로세로 비 %g이(가) 적당하지 않습니다"
|
||||
|
||||
#: ../src/ui/theme.c:356
|
||||
#: ../src/ui/theme.c:354
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "프레임 위치가 단추의 크기로 지정되지 않았습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1064
|
||||
#: ../src/ui/theme.c:1060
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "서서히 변하는 색으로 지정하려면 최소 2색이 필요합니다"
|
||||
|
||||
#: ../src/ui/theme.c:1202
|
||||
#: ../src/ui/theme.c:1205
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr "GTK 사용자 지정 색상 지정은 색 이름과 대체할 색을 괄호 안에 써야 합니다. 예를 들어: gtk:custom(foo,bar). \"%s\"을(를) 분석할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1221
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr "gtk:custom의 color_name 파라미터 안에 잘못된 문자 '%c'. A-Za-z0-9-_ 문자만 허용합니다."
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr "gtk:custom 형식은 \"gtk:custom(색이름,대체색)\"입니다, \"%s\"(은)는 형식에 맞지 않습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1271
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
"where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr ""
|
||||
"GTK 색상 지정은 중괄호안에 있어야 합니다, 예: gtk:fg[NORMAL] NORMAL은 값; \"%"
|
||||
"s\"을(를) 분석할 수 없습니다"
|
||||
msgstr "GTK 색상 지정은 중괄호안에 있어야 합니다. 예를 들어: gtk:fg[NORMAL], 여기서 NORMAL이 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
||||
|
||||
#: ../src/ui/theme.c:1216
|
||||
#: ../src/ui/theme.c:1285
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr ""
|
||||
"GTK 색상 지정은 값 뒤에 중괄호로 닫혀 있어야 합니다, 예: gtk:fg[NORMAL]NORMAL"
|
||||
"은 값; \"%s\"을(를) 분석할 수 없습니다"
|
||||
msgstr "GTK 색상 지정은 값 뒤에 중괄호로 닫혀 있어야 합니다. 예를 들어: gtk:fg[NORMAL], 여기서 NORMAL은 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
||||
|
||||
#: ../src/ui/theme.c:1227
|
||||
#: ../src/ui/theme.c:1296
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "색상 지정의 \"%s\" 값을 이해할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1240
|
||||
#: ../src/ui/theme.c:1309
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "색상 지정의 색상 구성요소 \"%s\"을(를) 이해할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1270
|
||||
#: ../src/ui/theme.c:1339
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1142,17 +1182,17 @@ msgstr ""
|
||||
"섞기 형식은 \"blend/bg_color/fg_color/alpha\"입니다, \"%s\"은(는) 형식에 맞"
|
||||
"지 않습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1281
|
||||
#: ../src/ui/theme.c:1350
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "색상 섞기에서 알파 값 \"%s\"을(를) 분석할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1291
|
||||
#: ../src/ui/theme.c:1360
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "색상 섞기에서 알파 값 \"%s\"은(는) 0.0 과 1.0사이의 값이 아닙니다"
|
||||
|
||||
#: ../src/ui/theme.c:1338
|
||||
#: ../src/ui/theme.c:1407
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -1160,39 +1200,39 @@ msgstr ""
|
||||
"그림자 형식은 \"shade/base_color/format\"입니다, \"%s\"(은)는 형식에 맞지 않"
|
||||
"습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1349
|
||||
#: ../src/ui/theme.c:1418
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "그림자색에서 그림자 인자 \"%s\"(을)를 해석할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1359
|
||||
#: ../src/ui/theme.c:1428
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "그림자색에서 그림자 인자 \"%s\"(은)는 음수입니다"
|
||||
|
||||
#: ../src/ui/theme.c:1388
|
||||
#: ../src/ui/theme.c:1457
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "색상 \"%s\"을(를) 해석할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1646
|
||||
#: ../src/ui/theme.c:1768
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "좌표식에 허용되지 않는 문자 '%s'(이)가 포함되어 있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1673
|
||||
#: ../src/ui/theme.c:1795
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
"parsed"
|
||||
msgstr "좌표식에 분석할 수 없는 부동소수점 숫자 '%s'이(가) 포함되어 있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1687
|
||||
#: ../src/ui/theme.c:1809
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "좌표식에 분석할 수 없는 정수 '%s'이(가) 포함되어 있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1809
|
||||
#: ../src/ui/theme.c:1931
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -1200,39 +1240,39 @@ msgid ""
|
||||
msgstr ""
|
||||
"좌표식에 이 글자 시작부분에 알 수 없는 연산자가 포함되어 있습니다: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1866
|
||||
#: ../src/ui/theme.c:1988
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "좌표식이 비어있거나 이해할 수 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
|
||||
#: ../src/ui/theme.c:2099 ../src/ui/theme.c:2109 ../src/ui/theme.c:2143
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "좌표식의 결과 값이 0로 나누었습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2029
|
||||
#: ../src/ui/theme.c:2151
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "좌표식에서 부동소수점 수에 나머지 연산을 하려 합니다"
|
||||
|
||||
#: ../src/ui/theme.c:2085
|
||||
#: ../src/ui/theme.c:2207
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "좌표식에서 피연산자가 들어갈 곳에 연산자 \"%s\"이(가) 있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2094
|
||||
#: ../src/ui/theme.c:2216
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "좌표식에서 연산자가 들어갈 곳에 피연산자가 있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2102
|
||||
#: ../src/ui/theme.c:2224
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "좌표식에서 피연산자 대신에 연산자로 끝나있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2112
|
||||
#: ../src/ui/theme.c:2234
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1241,37 +1281,37 @@ msgstr ""
|
||||
"좌표식에서 피연산자가 없는 연산자 \"%2$c\"다음에 연산자 \"%1$c\"이(가) 있습니"
|
||||
"다"
|
||||
|
||||
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
|
||||
#: ../src/ui/theme.c:2385 ../src/ui/theme.c:2430
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "좌표식에 알 수 없는 변수나 상수 \"%s\"이(가) 있습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2362
|
||||
#: ../src/ui/theme.c:2484
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "좌표 계산 파서의 버퍼가 크기를 넘어갔습니다."
|
||||
|
||||
#: ../src/ui/theme.c:2391
|
||||
#: ../src/ui/theme.c:2513
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "좌표식에 닫는 괄호는 있지만 여는 괄호가 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2455
|
||||
#: ../src/ui/theme.c:2577
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "좌표식에 여는 괄호는 있지만 닫는 괄호가 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2466
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "좌표식에 어떠한 연산자나 피연산자가 없습니다"
|
||||
|
||||
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
|
||||
#: ../src/ui/theme.c:2800 ../src/ui/theme.c:2820 ../src/ui/theme.c:2840
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "테마가 오류 값을 내는 표현식이 들어 있습니다: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4410
|
||||
#: ../src/ui/theme.c:4511
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1280,7 +1320,7 @@ msgstr ""
|
||||
"이 프레임 스타일에는 <button function=\"%s\" style=\"%s\" draw_ops=\"whatever"
|
||||
"\"/>가 지정되어야 합니다"
|
||||
|
||||
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
|
||||
#: ../src/ui/theme.c:5044 ../src/ui/theme.c:5069
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
@@ -1288,18 +1328,18 @@ msgstr ""
|
||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" state=\"whatever\"/> 가 없습니"
|
||||
"다"
|
||||
|
||||
#: ../src/ui/theme.c:5013
|
||||
#: ../src/ui/theme.c:5117
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "테마 \"%s\"을(를) 읽을 수 없습니다: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
|
||||
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
|
||||
#: ../src/ui/theme.c:5253 ../src/ui/theme.c:5260 ../src/ui/theme.c:5267
|
||||
#: ../src/ui/theme.c:5274 ../src/ui/theme.c:5281
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "테마 \"%2$s\"의 <%1$s>(이)가 설정되지 않았습니다"
|
||||
|
||||
#: ../src/ui/theme.c:5185
|
||||
#: ../src/ui/theme.c:5289
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1308,14 +1348,13 @@ msgstr ""
|
||||
"테마 \"%2$s\"의 창 형식 \"%1$s\"에 대한 프레임 스타일이 없습니다,<window "
|
||||
"type=\"%3$s\" style_set=\"whatever\"/> 엘리먼트를 추가하십시오"
|
||||
|
||||
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
|
||||
#: ../src/ui/theme.c:5728 ../src/ui/theme.c:5790 ../src/ui/theme.c:5853
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr ""
|
||||
"사용자 정의 상수는 대문자로 시작되어야 합니다; \"%s\"은(는) 그렇지 않습니다"
|
||||
msgstr "사용자 정의 상수는 대문자로 시작되어야 합니다. \"%s\"은(는) 그렇지 않습니다."
|
||||
|
||||
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
|
||||
#: ../src/ui/theme.c:5736 ../src/ui/theme.c:5798 ../src/ui/theme.c:5861
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "상수 \"%s\"은(는) 이미 지정되어 있습니다"
|
||||
@@ -1765,88 +1804,88 @@ msgstr "예제 대화 상자의 예제 메시지입니다"
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "가짜 메뉴 항목 %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:370
|
||||
#: ../src/ui/theme-viewer.c:371
|
||||
msgid "Border-only window"
|
||||
msgstr "테두리만 있는 창"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:372
|
||||
#: ../src/ui/theme-viewer.c:373
|
||||
msgid "Bar"
|
||||
msgstr "모음"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:389
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Normal Application Window"
|
||||
msgstr "보통 프로그램 창"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:393
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Dialog Box"
|
||||
msgstr "대화 상자"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:397
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "모달 대화 상자"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:401
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Utility Palette"
|
||||
msgstr "도구 팔레트"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:405
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "떼어내기 메뉴"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:409
|
||||
#: ../src/ui/theme-viewer.c:410
|
||||
msgid "Border"
|
||||
msgstr "테두리"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:413
|
||||
#: ../src/ui/theme-viewer.c:414
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "부착한 모달 대화 상자"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:744
|
||||
#: ../src/ui/theme-viewer.c:747
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "단추 배치 테스트 %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:773
|
||||
#: ../src/ui/theme-viewer.c:776
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "창 프레임 하나를 그리는 데 %g ms"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#: ../src/ui/theme-viewer.c:821
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "사용법: metacity-theme-viewer [테마이름]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:825
|
||||
#: ../src/ui/theme-viewer.c:828
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "테마를 읽어들이는 데 오류가 발생했습니다: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:831
|
||||
#: ../src/ui/theme-viewer.c:834
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "\"%s\" 테마를 읽어들이는 데 %g초\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
#: ../src/ui/theme-viewer.c:878
|
||||
msgid "Normal Title Font"
|
||||
msgstr "보통 제목 글꼴"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
#: ../src/ui/theme-viewer.c:884
|
||||
msgid "Small Title Font"
|
||||
msgstr "작은 제목 글꼴"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:890
|
||||
msgid "Large Title Font"
|
||||
msgstr "큰 제목 글꼴"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:895
|
||||
msgid "Button Layouts"
|
||||
msgstr "단추 배치"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:897
|
||||
#: ../src/ui/theme-viewer.c:900
|
||||
msgid "Benchmark"
|
||||
msgstr "벤치마크"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:952
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "창 제목이 여기에 들어갑니다"
|
||||
|
||||
|
339
po/pt_BR.po
339
po/pt_BR.po
@@ -8,26 +8,40 @@
|
||||
# Raul Pereira <contato@raulpereira.com>, 2007.
|
||||
# Og Maciel <ogmaciel@gnome.org>, 2007-2008.
|
||||
# Rodrigo Flores <rodrigomarquesflores@gmail.com>, 2007.
|
||||
# Djavan Fagundes <dnoway@gmail.com>, 2008, 2009.
|
||||
# Djavan Fagundes <djavanf@gnome.org>, 2008, 2009, 2011.
|
||||
# Vladimir Melo <vmelo@gnome.org>, 2009.
|
||||
# Antonio Fernandes C. Neto <fernandes@pelivre.org>, 2010.
|
||||
# Rodrigo Padula de Oliveira <contato@rodrigopadula.com>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-04-01 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-03-31 20:34-0300\n"
|
||||
"Last-Translator: Rodrigo Padula de Oliveira <contato@rodrigopadula.com>\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||
"&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-08-10 12:42+0000\n"
|
||||
"PO-Revision-Date: 2011-09-20 18:35-0200\n"
|
||||
"Last-Translator: Djavan Fagundes <djavanf@gnome.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language: pt_BR\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: Virtaal 0.6.1\n"
|
||||
"X-Poedit-Language: Portuguese\n"
|
||||
"X-Poedit-Country: BRAZIL\n"
|
||||
|
||||
#. 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:487
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "Outro compositor de janelas está em execução na tela %i na área \"%s"
|
||||
"\"."
|
||||
|
||||
#: ../src/core/all-keybindings.h:88
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Trocar para o espaço de trabalho 1"
|
||||
@@ -352,13 +366,17 @@ msgstr "Evento de som"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Informação solicitada de janela desconhecida: %d"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: ../src/core/delete.c:94
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> não está respondendo."
|
||||
|
||||
#: ../src/core/delete.c:99
|
||||
#: ../src/core/delete.c:114
|
||||
#| msgid "<tt>%s</tt> is not responding."
|
||||
msgid "Application is not responding."
|
||||
msgstr "O aplicativo não está respondendo."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -366,11 +384,11 @@ msgstr ""
|
||||
"Você pode escolher aguardar um pouco e continuar ou forçar o aplicativo a "
|
||||
"sair completamente."
|
||||
|
||||
#: ../src/core/delete.c:108
|
||||
#: ../src/core/delete.c:126
|
||||
msgid "_Wait"
|
||||
msgstr "_Esperar"
|
||||
|
||||
#: ../src/core/delete.c:108
|
||||
#: ../src/core/delete.c:126
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Forçar sair"
|
||||
|
||||
@@ -396,7 +414,7 @@ msgstr ""
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#: ../src/core/keybindings.c:2468
|
||||
#: ../src/core/keybindings.c:2523
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
@@ -407,12 +425,12 @@ msgstr ""
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/core/keybindings.c:2558
|
||||
#: ../src/core/keybindings.c:2613
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "Nenhum comando %d foi definido.\n"
|
||||
|
||||
#: ../src/core/keybindings.c:3570
|
||||
#: ../src/core/keybindings.c:3625
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "Nenhum comando de terminal foi definido.\n"
|
||||
@@ -441,12 +459,12 @@ msgstr "Inicializar a sessão a partir do arquivo salvo"
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Fazer X chamadas síncronas"
|
||||
|
||||
#: ../src/core/main.c:506
|
||||
#: ../src/core/main.c:504
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Falha ao varrer a pasta de temas: %s\n"
|
||||
|
||||
#: ../src/core/main.c:522
|
||||
#: ../src/core/main.c:520
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -489,35 +507,35 @@ msgstr "Lista de plugins de composição separados por vírgula"
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
|
||||
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "A chave GConf \"%s\" está definida com um valor inválido\n"
|
||||
|
||||
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
|
||||
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr "%d armazenado na chave GConf %s está fora do intervalo de %d a %d\n"
|
||||
|
||||
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
|
||||
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
|
||||
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
|
||||
#: ../src/core/prefs.c:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
|
||||
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
|
||||
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "A chave GConf \"%s\" está definida como um tipo inválido\n"
|
||||
|
||||
#: ../src/core/prefs.c:1203
|
||||
#: ../src/core/prefs.c:1210
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"Chave %s do GConf já está em uso e não pode ser usada para sobrescrever %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1262
|
||||
#: ../src/core/prefs.c:1269
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "Não é possível sobrescrever a chave do GConf, %s não encontrada\n"
|
||||
|
||||
#: ../src/core/prefs.c:1447
|
||||
#: ../src/core/prefs.c:1454
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -525,14 +543,14 @@ msgstr ""
|
||||
"As alternativas para aplicativos quebrados estão desabilitadas. É possível "
|
||||
"que alguns aplicativos não funcionem de maneira adequada.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1524
|
||||
#: ../src/core/prefs.c:1531
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr ""
|
||||
"Não foi possível analisar a descrição da fonte \"%s\" a partir da chave "
|
||||
"GConf %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1586
|
||||
#: ../src/core/prefs.c:1593
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -541,17 +559,17 @@ msgstr ""
|
||||
"\"%s\" localizado no banco de dados de configurações não é um valor válido "
|
||||
"para o modificador de botão do mouse\n"
|
||||
|
||||
#: ../src/core/prefs.c:2016
|
||||
#: ../src/core/prefs.c:2028
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "Erro ao definir o número de espaços de trabalho como %d: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
|
||||
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espaço de trabalho %d"
|
||||
|
||||
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
|
||||
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -560,28 +578,28 @@ msgstr ""
|
||||
"\"%s\" localizado no banco de dados de configurações não é um valor válido "
|
||||
"para a tecla de atalho \"%s\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:2783
|
||||
#: ../src/core/prefs.c:2795
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr ""
|
||||
"Erro ao definir o nome para o espaço de trabalho %d para \"%s\": \"%s\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:2997
|
||||
#: ../src/core/prefs.c:3009
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr "Erro ao definir o status das janelas ocultas ativas: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:3032
|
||||
#: ../src/core/prefs.c:3044
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr "Erro ao definir nenhuma janela de notificação de status: %s\n"
|
||||
|
||||
#: ../src/core/screen.c:624
|
||||
#: ../src/core/screen.c:663
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "A tela %d na exibição \"%s\" é inválida\n"
|
||||
|
||||
#: ../src/core/screen.c:640
|
||||
#: ../src/core/screen.c:679
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -590,7 +608,7 @@ msgstr ""
|
||||
"A tela %d na exibição \"%s\" já possui um gerenciador de janelas; tente usar "
|
||||
"a opção --replace para substituir o gerenciador de janelas atual.\n"
|
||||
|
||||
#: ../src/core/screen.c:667
|
||||
#: ../src/core/screen.c:706
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
@@ -598,64 +616,64 @@ msgstr ""
|
||||
"Não foi possível obter a seleção do gerenciador de janelas na exibição \"%2$s"
|
||||
"\" da tela %1$d\n"
|
||||
|
||||
#: ../src/core/screen.c:722
|
||||
#: ../src/core/screen.c:761
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "A tela %d na exibição \"%s\" já possui um gerenciador de janelas\n"
|
||||
|
||||
#: ../src/core/screen.c:907
|
||||
#: ../src/core/screen.c:946
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Não foi possível liberar a tela %d na exibição \"%s\"\n"
|
||||
|
||||
#: ../src/core/session.c:837 ../src/core/session.c:844
|
||||
#: ../src/core/session.c:843 ../src/core/session.c:850
|
||||
#, c-format
|
||||
msgid "Could not create directory '%s': %s\n"
|
||||
msgstr "Não foi possível criar o diretório \"%s\": %s\n"
|
||||
|
||||
#: ../src/core/session.c:854
|
||||
#: ../src/core/session.c:860
|
||||
#, c-format
|
||||
msgid "Could not open session file '%s' for writing: %s\n"
|
||||
msgstr "Não foi possível abrir o arquivo de sessão \"%s\" para gravação: %s\n"
|
||||
|
||||
#: ../src/core/session.c:995
|
||||
#: ../src/core/session.c:1001
|
||||
#, c-format
|
||||
msgid "Error writing session file '%s': %s\n"
|
||||
msgstr "Erro ao gravar o arquivo de sessão\"%s\": %s\n"
|
||||
|
||||
#: ../src/core/session.c:1000
|
||||
#: ../src/core/session.c:1006
|
||||
#, c-format
|
||||
msgid "Error closing session file '%s': %s\n"
|
||||
msgstr "Erro ao fechar o arquivo de sessão \"%s\": %s\n"
|
||||
|
||||
#: ../src/core/session.c:1130
|
||||
#: ../src/core/session.c:1136
|
||||
#, c-format
|
||||
msgid "Failed to parse saved session file: %s\n"
|
||||
msgstr "Falha ao analisar o arquivo de sessão salvo: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1179
|
||||
#: ../src/core/session.c:1185
|
||||
#, c-format
|
||||
msgid "<mutter_session> attribute seen but we already have the session ID"
|
||||
msgstr "O atributo <mutter_session> foi visto, mas já temos o ID da sessão"
|
||||
|
||||
#: ../src/core/session.c:1192 ../src/core/session.c:1267
|
||||
#: ../src/core/session.c:1299 ../src/core/session.c:1371
|
||||
#: ../src/core/session.c:1431
|
||||
#: ../src/core/session.c:1198 ../src/core/session.c:1273
|
||||
#: ../src/core/session.c:1305 ../src/core/session.c:1377
|
||||
#: ../src/core/session.c:1437
|
||||
#, c-format
|
||||
msgid "Unknown attribute %s on <%s> element"
|
||||
msgstr "Atributo %s desconhecido no elemento <%s>"
|
||||
|
||||
#: ../src/core/session.c:1209
|
||||
#: ../src/core/session.c:1215
|
||||
#, c-format
|
||||
msgid "nested <window> tag"
|
||||
msgstr "marca de <window> aninhada"
|
||||
|
||||
#: ../src/core/session.c:1451
|
||||
#: ../src/core/session.c:1457
|
||||
#, c-format
|
||||
msgid "Unknown element %s"
|
||||
msgstr "Elemento %s desconhecido"
|
||||
|
||||
#: ../src/core/session.c:1803
|
||||
#: ../src/core/session.c:1809
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
"be restarted manually next time you log in."
|
||||
@@ -701,13 +719,13 @@ msgid "Window manager error: "
|
||||
msgstr "Erro do gerenciador de janelas: "
|
||||
|
||||
#. Translators: This is the title used on dialog boxes
|
||||
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
|
||||
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
|
||||
#: ../src/mutter-wm.desktop.in.h:1
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:6847
|
||||
#: ../src/core/window.c:6959
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -723,7 +741,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7510
|
||||
#: ../src/core/window.c:7622
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
@@ -743,11 +761,17 @@ msgstr "O aplicativo definiu um _NET_WM_PID %lu inválido\n"
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (em %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1482
|
||||
#: ../src/core/window-props.c:1488
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Janela WM_TRANSIENT_FOR inválida 0x%lx especificada para %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1500
|
||||
#, c-format
|
||||
#| msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "Janela WM_TRANSIENT_FOR 0x%lx especificada para %s iriar criar loop.\n"
|
||||
|
||||
#: ../src/core/xprops.c:155
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -798,15 +822,28 @@ msgstr ""
|
||||
"os monitores ou apenas para janelas no monitor principal."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:4
|
||||
msgid "Draggable border width"
|
||||
msgstr "Largura da borda arrastável"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Janelas ocultas ativas"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr ""
|
||||
"Modificador a ser usado para operações de gerenciamento de janelas extendido."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
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 ""
|
||||
"A quantidade do total de bordas arrastáveis. Se as bordas dos temas visíveis "
|
||||
"não são suficientes, as bordas invisíveis serão adicionadas para encontrar "
|
||||
"este valor."
|
||||
|
||||
#: ../src/mutter.schemas.in.h: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 "
|
||||
@@ -818,7 +855,7 @@ msgstr ""
|
||||
"\"tecla Windows\" no hardware do computador. É esperada para esta associação "
|
||||
"tanto o padrão quanto a definição de uma string vazia. "
|
||||
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
#: ../src/mutter.schemas.in.h:9
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -828,7 +865,7 @@ msgstr ""
|
||||
"diálogos modais surgem anexados à barra de título da janela pai e são "
|
||||
"movidos juntamente com a janela pai."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
#: ../src/mutter.schemas.in.h:10
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Áreas de trabalho apenas para a principal"
|
||||
|
||||
@@ -837,47 +874,47 @@ msgstr "Áreas de trabalho apenas para a principal"
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Uso: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1099
|
||||
#: ../src/ui/frames.c:1123
|
||||
msgid "Close Window"
|
||||
msgstr "Fechar janela"
|
||||
|
||||
#: ../src/ui/frames.c:1102
|
||||
#: ../src/ui/frames.c:1126
|
||||
msgid "Window Menu"
|
||||
msgstr "Menu de janela"
|
||||
|
||||
#: ../src/ui/frames.c:1105
|
||||
#: ../src/ui/frames.c:1129
|
||||
msgid "Minimize Window"
|
||||
msgstr "Minimizar janela"
|
||||
|
||||
#: ../src/ui/frames.c:1108
|
||||
#: ../src/ui/frames.c:1132
|
||||
msgid "Maximize Window"
|
||||
msgstr "Maximizar janela"
|
||||
|
||||
#: ../src/ui/frames.c:1111
|
||||
#: ../src/ui/frames.c:1135
|
||||
msgid "Restore Window"
|
||||
msgstr "Restaurar janela"
|
||||
|
||||
#: ../src/ui/frames.c:1114
|
||||
#: ../src/ui/frames.c:1138
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Enrolar janela"
|
||||
|
||||
#: ../src/ui/frames.c:1117
|
||||
#: ../src/ui/frames.c:1141
|
||||
msgid "Unroll Window"
|
||||
msgstr "Desenrolar janela"
|
||||
|
||||
#: ../src/ui/frames.c:1120
|
||||
#: ../src/ui/frames.c:1144
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Manter no topo"
|
||||
|
||||
#: ../src/ui/frames.c:1123
|
||||
#: ../src/ui/frames.c:1147
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Remover do topo"
|
||||
|
||||
#: ../src/ui/frames.c:1126
|
||||
#: ../src/ui/frames.c:1150
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Sempre no espaço de trabalho visível"
|
||||
|
||||
#: ../src/ui/frames.c:1129
|
||||
#: ../src/ui/frames.c:1153
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Colocar em apenas um espaço de trabalho"
|
||||
|
||||
@@ -1080,48 +1117,82 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:253
|
||||
msgid "top"
|
||||
msgstr "superior"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:255
|
||||
msgid "bottom"
|
||||
msgstr "inferior"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:257
|
||||
msgid "left"
|
||||
msgstr "esquerda"
|
||||
|
||||
#: ../src/ui/theme.c:261
|
||||
#: ../src/ui/theme.c:259
|
||||
msgid "right"
|
||||
msgstr "direita"
|
||||
|
||||
#: ../src/ui/theme.c:288
|
||||
#: ../src/ui/theme.c:286
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "a geometria do quadro não especifica a dimensão \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:307
|
||||
#: ../src/ui/theme.c:305
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "a geometria do quadro não especifica a dimensão \"%s\" da borda \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:344
|
||||
#: ../src/ui/theme.c:342
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "A taxa de proporção %g do botão não é razoável"
|
||||
|
||||
#: ../src/ui/theme.c:356
|
||||
#: ../src/ui/theme.c:354
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "A geometria do quadro não especifica o tamanho dos botões"
|
||||
|
||||
#: ../src/ui/theme.c:1064
|
||||
#: ../src/ui/theme.c:1060
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Os gradientes devem ter pelo menos duas cores"
|
||||
|
||||
#: ../src/ui/theme.c:1202
|
||||
#: ../src/ui/theme.c:1205
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "GTK color specification must have a close bracket after the state, e.g. "
|
||||
#| "gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"A especificação de cor personalizada do GTK deve ter um nome de cor e "
|
||||
"fallback em parênteses, por exemplo, gtk:custom[foo,bar]; não foi possível "
|
||||
"analisar \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1221
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"Caractere inválido \"%c\" no parâmetro color_name do gtk:custom, somente "
|
||||
"A-Za-z0-9-_ são válidos"
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the "
|
||||
#| "format"
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Formato gtk:custom é \"gtk:custom(color_name,fallback)\", \"%s\" não é adequado "
|
||||
"ao formato"
|
||||
|
||||
#: ../src/ui/theme.c:1271
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -1131,7 +1202,7 @@ msgstr ""
|
||||
"exemplo, gtk:fg[NORMAL], onde NORMAL é o estado; não foi possível analisar "
|
||||
"\"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1216
|
||||
#: ../src/ui/theme.c:1285
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -1141,18 +1212,18 @@ msgstr ""
|
||||
"GTK, por exemplo, gtk:fg[NORMAL], onde NORMAL é o estado; não foi possível "
|
||||
"analisar \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1227
|
||||
#: ../src/ui/theme.c:1296
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "O estado \"%s\" não foi compreendido na especificação de cor"
|
||||
|
||||
#: ../src/ui/theme.c:1240
|
||||
#: ../src/ui/theme.c:1309
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr ""
|
||||
"O componente de cor \"%s\" não foi compreendido na especificação de cor"
|
||||
|
||||
#: ../src/ui/theme.c:1270
|
||||
#: ../src/ui/theme.c:1339
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1161,17 +1232,17 @@ msgstr ""
|
||||
"O formato de mistura é \"blend/bg_color/fg_color/alpha\"; \"%s\" não é "
|
||||
"adequado ao formato"
|
||||
|
||||
#: ../src/ui/theme.c:1281
|
||||
#: ../src/ui/theme.c:1350
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Não foi possível analisar o valor de alfa \"%s\" na cor misturada"
|
||||
|
||||
#: ../src/ui/theme.c:1291
|
||||
#: ../src/ui/theme.c:1360
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "O valor de alfa \"%s\" na cor misturada não está entre 0,0 e 1,0"
|
||||
|
||||
#: ../src/ui/theme.c:1338
|
||||
#: ../src/ui/theme.c:1407
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -1179,27 +1250,27 @@ msgstr ""
|
||||
"O formato de sombra é \"shade/base_color/factor\", \"%s\" não é adequado ao "
|
||||
"formato"
|
||||
|
||||
#: ../src/ui/theme.c:1349
|
||||
#: ../src/ui/theme.c:1418
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Não foi possível analisar o fator de sombra \"%s\" na cor sombreada"
|
||||
|
||||
#: ../src/ui/theme.c:1359
|
||||
#: ../src/ui/theme.c:1428
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "O fator de sombra \"%s\" na cor sombreada é negativo"
|
||||
|
||||
#: ../src/ui/theme.c:1388
|
||||
#: ../src/ui/theme.c:1457
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Não foi possível analisar a cor \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1646
|
||||
#: ../src/ui/theme.c:1768
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "A expressão coordenada contém o caractere \"%s\" que não é permitido"
|
||||
|
||||
#: ../src/ui/theme.c:1673
|
||||
#: ../src/ui/theme.c:1795
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -1208,13 +1279,13 @@ msgstr ""
|
||||
"A expressão coordenada contém o número de ponto flutuante \"%s\" que não "
|
||||
"pôde ser analisado"
|
||||
|
||||
#: ../src/ui/theme.c:1687
|
||||
#: ../src/ui/theme.c:1809
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr ""
|
||||
"A expressão coordenada contém o inteiro \"%s\" que não pôde ser analisado"
|
||||
|
||||
#: ../src/ui/theme.c:1809
|
||||
#: ../src/ui/theme.c:1931
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -1223,17 +1294,17 @@ msgstr ""
|
||||
"A expressão coordenada continha um operador desconhecido no início deste "
|
||||
"texto: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1866
|
||||
#: ../src/ui/theme.c:1988
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "A expressão coordenada estava vazia ou não foi compreendida"
|
||||
|
||||
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
|
||||
#: ../src/ui/theme.c:2099 ../src/ui/theme.c:2109 ../src/ui/theme.c:2143
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "A expressão coordenada resulta na divisão por zero"
|
||||
|
||||
#: ../src/ui/theme.c:2029
|
||||
#: ../src/ui/theme.c:2151
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -1241,25 +1312,25 @@ msgstr ""
|
||||
"A expressão coordenada tenta usar o operador mod em um número de ponto "
|
||||
"flutuante"
|
||||
|
||||
#: ../src/ui/theme.c:2085
|
||||
#: ../src/ui/theme.c:2207
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr ""
|
||||
"A expressão coordenada tem o operador \"%s\" onde era esperado um operando"
|
||||
|
||||
#: ../src/ui/theme.c:2094
|
||||
#: ../src/ui/theme.c:2216
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "A expressão coordenada tinha um operando onde era esperado um operador"
|
||||
|
||||
#: ../src/ui/theme.c:2102
|
||||
#: ../src/ui/theme.c:2224
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr ""
|
||||
"A expressão coordenada terminou com um operador, em vez de com um operando"
|
||||
|
||||
#: ../src/ui/theme.c:2112
|
||||
#: ../src/ui/theme.c:2234
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1268,43 +1339,43 @@ msgstr ""
|
||||
"A expressão coordenada tem o operador \"%c\" após o operador \"%c\" sem "
|
||||
"nenhum operando entre eles"
|
||||
|
||||
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
|
||||
#: ../src/ui/theme.c:2385 ../src/ui/theme.c:2430
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"A expressão coordenada tinha uma variável ou uma constante desconhecida \"%s"
|
||||
"\""
|
||||
|
||||
#: ../src/ui/theme.c:2362
|
||||
#: ../src/ui/theme.c:2484
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "O analisador de expressão coordenada estourou o buffer."
|
||||
|
||||
#: ../src/ui/theme.c:2391
|
||||
#: ../src/ui/theme.c:2513
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr ""
|
||||
"A expressão coordenada tinha um parêntese de fechamento sem um parêntese de "
|
||||
"abertura"
|
||||
|
||||
#: ../src/ui/theme.c:2455
|
||||
#: ../src/ui/theme.c:2577
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr ""
|
||||
"A expressão coordenada tinha um parêntese de abertura sem um parêntese de "
|
||||
"fechamento"
|
||||
|
||||
#: ../src/ui/theme.c:2466
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "Aparentemente não há operadores nem operandos na expressão coordenada"
|
||||
|
||||
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
|
||||
#: ../src/ui/theme.c:2800 ../src/ui/theme.c:2820 ../src/ui/theme.c:2840
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "O tema continha uma expressão que resultou em um erro: %s \n"
|
||||
|
||||
#: ../src/ui/theme.c:4410
|
||||
#: ../src/ui/theme.c:4511
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1313,25 +1384,25 @@ msgstr ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> deve ser "
|
||||
"especificado para este estilo de quadro"
|
||||
|
||||
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
|
||||
#: ../src/ui/theme.c:5044 ../src/ui/theme.c:5069
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> ausente"
|
||||
|
||||
#: ../src/ui/theme.c:5013
|
||||
#: ../src/ui/theme.c:5117
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Falha ao carregar o tema \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
|
||||
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
|
||||
#: ../src/ui/theme.c:5253 ../src/ui/theme.c:5260 ../src/ui/theme.c:5267
|
||||
#: ../src/ui/theme.c:5274 ../src/ui/theme.c:5281
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "Nenhum <%s> definido para o tema \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:5185
|
||||
#: ../src/ui/theme.c:5289
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1340,7 +1411,7 @@ msgstr ""
|
||||
"Nenhum estilo de quadro definido para o tipo de janela \"%s\" no tema \"%s"
|
||||
"\", adicione um elemento <window type=\"%s\" style_set=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
|
||||
#: ../src/ui/theme.c:5728 ../src/ui/theme.c:5790 ../src/ui/theme.c:5853
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -1348,7 +1419,7 @@ msgstr ""
|
||||
"As constantes definidas pelo usuário devem iniciar com letra maiúscula; \"%s"
|
||||
"\" não inicia"
|
||||
|
||||
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
|
||||
#: ../src/ui/theme.c:5736 ../src/ui/theme.c:5798 ../src/ui/theme.c:5861
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "A constante \"%s\" já foi definida"
|
||||
@@ -1806,88 +1877,88 @@ msgstr "Esta é uma mensagem de exemplo em um diálogo de exemplo"
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "Item falso de menu %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:370
|
||||
#: ../src/ui/theme-viewer.c:371
|
||||
msgid "Border-only window"
|
||||
msgstr "Janela com bordas somente"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:372
|
||||
#: ../src/ui/theme-viewer.c:373
|
||||
msgid "Bar"
|
||||
msgstr "Barra"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:389
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Normal Application Window"
|
||||
msgstr "Janela normal de aplicativos"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:393
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Dialog Box"
|
||||
msgstr "Caixa de diálogo"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:397
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "Caixa de diálogo modal"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:401
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Utility Palette"
|
||||
msgstr "Paleta utilitária"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:405
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "Menu destacável"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:409
|
||||
#: ../src/ui/theme-viewer.c:410
|
||||
msgid "Border"
|
||||
msgstr "Borda"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:413
|
||||
#: ../src/ui/theme-viewer.c:414
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "Diálogo modal anexado"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:744
|
||||
#: ../src/ui/theme-viewer.c:747
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "Teste de disposição dos botões %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:773
|
||||
#: ../src/ui/theme-viewer.c:776
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "%g milissegundos para desenhar um quadro de janela"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#: ../src/ui/theme-viewer.c:821
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "Uso: metacity-theme-viewer [NOMEDOTEMA]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:825
|
||||
#: ../src/ui/theme-viewer.c:828
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "Erro ao carregar tema: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:831
|
||||
#: ../src/ui/theme-viewer.c:834
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "Tema \"%s\" carregado em %g segundos\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
#: ../src/ui/theme-viewer.c:878
|
||||
msgid "Normal Title Font"
|
||||
msgstr "Fonte de título normal"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
#: ../src/ui/theme-viewer.c:884
|
||||
msgid "Small Title Font"
|
||||
msgstr "Fonte de título pequeno"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:890
|
||||
msgid "Large Title Font"
|
||||
msgstr "Fonte de título grande"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:895
|
||||
msgid "Button Layouts"
|
||||
msgstr "Disposições de botões"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:897
|
||||
#: ../src/ui/theme-viewer.c:900
|
||||
msgid "Benchmark"
|
||||
msgstr "Benchmark"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:952
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "O título da janela vem aqui"
|
||||
|
||||
|
568
po/sr@latin.po
568
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
283
po/tr.po
283
po/tr.po
@@ -1,33 +1,32 @@
|
||||
# Turkish translation of mutter.
|
||||
# Copyright (C) 2003, 2004, 2005, 2008, 2009, 2011 Free Software Foundation.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
#
|
||||
# Sinan İmamoğlu <sinan@myrealbox.com>, 2003.
|
||||
# Baris Cicek <baris@teamforce.name.tr>, 2004, 2005, 2008, 2009.
|
||||
# İlker DAĞLI <ilker@ilkerdagli.info>, 2011.
|
||||
# Muhammed EKEN <gnome@m-eken.com>, 2011.
|
||||
# Muhammet Kara <muhammet.k@gmail.com>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-06-30 21:06+0000\n"
|
||||
"PO-Revision-Date: 2011-07-01 01:50+0300\n"
|
||||
"POT-Creation-Date: 2011-08-29 11:52+0000\n"
|
||||
"PO-Revision-Date: 2011-10-10 10:40+0300\n"
|
||||
"Last-Translator: Muhammet Kara <muhammet.k@gmail.com>\n"
|
||||
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Lokalize 1.1\n"
|
||||
"X-Generator: Lokalize 1.2\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Language: tr\n"
|
||||
|
||||
#. 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:509
|
||||
#: ../src/compositor/compositor.c:486
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
@@ -406,7 +405,7 @@ msgstr ""
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#: ../src/core/keybindings.c:2468
|
||||
#: ../src/core/keybindings.c:2523
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
@@ -417,12 +416,12 @@ msgstr ""
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/core/keybindings.c:2558
|
||||
#: ../src/core/keybindings.c:2613
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "%d komutu tanımlanmamış.\n"
|
||||
|
||||
#: ../src/core/keybindings.c:3570
|
||||
#: ../src/core/keybindings.c:3625
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "Hiçbir termina komutu tanımlanmamış.\n"
|
||||
@@ -497,36 +496,36 @@ msgstr "Kompozisyon eklentilerinin listesi (virgül ile ayrılmış)"
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
|
||||
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "'%s' GConf anahtarına geçersiz bir değer atanmış\n"
|
||||
|
||||
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
|
||||
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr "%d saklanıldığı GConf anahtarı %s aralık %d - %d içinde değil\n"
|
||||
|
||||
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
|
||||
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
|
||||
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
|
||||
#: ../src/core/prefs.c:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
|
||||
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
|
||||
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "\"%s\" GConf anahtarına geçersiz bir tür atanmış\n"
|
||||
|
||||
#: ../src/core/prefs.c:1203
|
||||
#: ../src/core/prefs.c:1210
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"%s GConf anahtarı zaten kullanılıyor ve %s'i geçersiz kılmak için "
|
||||
"kullanılamaz\n"
|
||||
|
||||
#: ../src/core/prefs.c:1262
|
||||
#: ../src/core/prefs.c:1269
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "GConf anahtarı geçersiz kılınamıyor: %s bulunamadı\n"
|
||||
|
||||
#: ../src/core/prefs.c:1447
|
||||
#: ../src/core/prefs.c:1454
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -534,12 +533,12 @@ msgstr ""
|
||||
"Hatalı uygulamalara yönelik çözümler devre dışı. Bazı uygulamalar düzgün "
|
||||
"işlemeyebilir.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1524
|
||||
#: ../src/core/prefs.c:1531
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr "\"%s\" yazıtipi tanımlaması %s GConf anahtarından ayrıştırılamadı\n"
|
||||
|
||||
#: ../src/core/prefs.c:1586
|
||||
#: ../src/core/prefs.c:1593
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -548,17 +547,17 @@ msgstr ""
|
||||
"Yapılandırma veritabanında bulunan \"%s\", fare düğme düzenleyicisi olarak "
|
||||
"geçerli bir değer değil\n"
|
||||
|
||||
#: ../src/core/prefs.c:2016
|
||||
#: ../src/core/prefs.c:2028
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "Çalışma alanı sayısının %d yapılmasında hata: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
|
||||
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Çalışma Alanı %d"
|
||||
|
||||
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
|
||||
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -567,17 +566,17 @@ msgstr ""
|
||||
"Yapılandırma veritabanında bulunan \"%s\", \"%s\" tuş bağı olarak geçerli "
|
||||
"bir değer değil\n"
|
||||
|
||||
#: ../src/core/prefs.c:2783
|
||||
#: ../src/core/prefs.c:2795
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "%d çalışma alanının adının \"%s\" yapılmasında hata: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:2997
|
||||
#: ../src/core/prefs.c:3009
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr "Aktif gizli pencere durumu ayarlanırken oluşan hata: %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:3032
|
||||
#: ../src/core/prefs.c:3044
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr "Sekmesiz açılır pencere durumu ayarlanırken hata: %s\n"
|
||||
@@ -716,7 +715,7 @@ msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:6886
|
||||
#: ../src/core/window.c:7019
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -732,11 +731,11 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7549
|
||||
#: ../src/core/window.c:7682
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
"%d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
"d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
msgstr ""
|
||||
"%s penceresi bir yandan yeniden boyutlandırılamaz olduğunu gösteren bir MWM "
|
||||
"ipucu verirken anlamsız bir biçimde en küçük (%d x %d) ve en büyük (%d x %d) "
|
||||
@@ -752,11 +751,17 @@ msgstr "Uygulama geçersiz _NET_WM_PID %lu atadı\n"
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (%s üzerinde)"
|
||||
|
||||
#: ../src/core/window-props.c:1484
|
||||
#: ../src/core/window-props.c:1481
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Geçersiz WM_TRANSIENT_FOR pencere 0x%lx belirtilen %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#, c-format
|
||||
#| msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR penceresi 0x%lx (%s için) döngü oluşturacak.\n"
|
||||
|
||||
#: ../src/core/xprops.c:155
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -806,14 +811,27 @@ msgstr ""
|
||||
"sadece birincil monitördekilerde mi gerçekleşeceğini belirler."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:4
|
||||
msgid "Draggable border width"
|
||||
msgstr "Sürüklenebilir kenarlık genişliği"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Çalışır Durumdaki Gizli Pencereler"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:5
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Genişletilmiş pencere yönetimi işlemleri için kullanılacak değiştirici"
|
||||
|
||||
#: ../src/mutter.schemas.in.h:6
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
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 ""
|
||||
"Sürüklenebilir kenarlıkların toplam miktarı. Eğer temanın görünür "
|
||||
"kenarlıkları "
|
||||
"yetersiz gelirse, bu değere ulaşmak için görünmez kenarlıklar eklenir."
|
||||
|
||||
#: ../src/mutter.schemas.in.h: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 "
|
||||
@@ -825,7 +843,7 @@ msgstr ""
|
||||
"donanımındaki \"windows tuşu\" olması tasarlanmıştır. Bağlayıcı varsayılan "
|
||||
"olarak veya boş dize olarak ayarlanması beklenir."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:7
|
||||
#: ../src/mutter.schemas.in.h:9
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -835,7 +853,7 @@ msgstr ""
|
||||
"diyalogları üst pencerenin başlık çubuğunda ekli gözükür ve üst pencere ile "
|
||||
"birlikte hareket eder."
|
||||
|
||||
#: ../src/mutter.schemas.in.h:8
|
||||
#: ../src/mutter.schemas.in.h:10
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Sadece birincil monitördeki çalışma alanları"
|
||||
|
||||
@@ -844,47 +862,47 @@ msgstr "Sadece birincil monitördeki çalışma alanları"
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Kullanım: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1280
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Pencereyi Kapat"
|
||||
|
||||
#: ../src/ui/frames.c:1283
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Pencere Menüsü"
|
||||
|
||||
#: ../src/ui/frames.c:1286
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Pencereyi Küçült"
|
||||
|
||||
#: ../src/ui/frames.c:1289
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Pencereyi Büyült"
|
||||
|
||||
#: ../src/ui/frames.c:1292
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Pencere Geri Getir"
|
||||
|
||||
#: ../src/ui/frames.c:1295
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Pencereyi Yukarı Sar"
|
||||
|
||||
#: ../src/ui/frames.c:1298
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Pencereyi Geri Sar"
|
||||
|
||||
#: ../src/ui/frames.c:1301
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Pencereyi Üstte Tut"
|
||||
|
||||
#: ../src/ui/frames.c:1304
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Pencereyi Üstten Kaldır"
|
||||
|
||||
#: ../src/ui/frames.c:1307
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Her Zaman Görünen Çalışma Alanında"
|
||||
|
||||
#: ../src/ui/frames.c:1310
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Pencereyi Sadece Bir Çalışma Alanına Yerleştir"
|
||||
|
||||
@@ -1087,49 +1105,84 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:253
|
||||
msgid "top"
|
||||
msgstr "üst"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:255
|
||||
msgid "bottom"
|
||||
msgstr "alt"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:257
|
||||
msgid "left"
|
||||
msgstr "sol"
|
||||
|
||||
#: ../src/ui/theme.c:261
|
||||
#: ../src/ui/theme.c:259
|
||||
msgid "right"
|
||||
msgstr "sağ"
|
||||
|
||||
#: ../src/ui/theme.c:288
|
||||
#: ../src/ui/theme.c:286
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "çerçeve geometrisi \"%s\" boyutunu tanımlamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:307
|
||||
#: ../src/ui/theme.c:305
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr ""
|
||||
"çerçeve geometrisi \"%s\" boyutunu \"%s\" pencere kenarı için tanımlamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:344
|
||||
#: ../src/ui/theme.c:342
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "%g kabul edilebilir bir düğme en-boy oranı değil"
|
||||
|
||||
#: ../src/ui/theme.c:356
|
||||
#: ../src/ui/theme.c:354
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Çerçeve geometrisi düğmelerin boyutunu tanımlamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:1064
|
||||
#: ../src/ui/theme.c:1060
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Renk geçişlerinde en az iki renk olmalı"
|
||||
|
||||
#: ../src/ui/theme.c:1202
|
||||
#: ../src/ui/theme.c:1212
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "GTK color specification must have a close bracket after the state, e.g. "
|
||||
#| "gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"GTK özel renk belirtiminde parantez içinde renk adı ve fallback kelimesi yer "
|
||||
"almalıdır; "
|
||||
"örneğin, gtk:custom[foo,bar]; \"%s\" ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1228
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"gtk:custom color_name parametresinin adında geçersiz karakter '%c'; sadece "
|
||||
"A-Za-z0-9-"
|
||||
"_ karakterleri geçerlidir"
|
||||
|
||||
#: ../src/ui/theme.c:1242
|
||||
#, c-format
|
||||
#| msgid ""
|
||||
#| "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the "
|
||||
#| "format"
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Gtk:custom biçimi \"gtk:custom(color_name,fallback)\" şeklindedir; \"%s\" "
|
||||
"biçime uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:1287
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -1139,7 +1192,7 @@ msgstr ""
|
||||
"örneğin, gtk:fg[NORMAL] belirtiminde NORMAL, durumu gösterir; \"%s\" "
|
||||
"ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1216
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -1149,17 +1202,17 @@ msgstr ""
|
||||
"örneğin, gtk:fg[NORMAL] belirtiminde NORMAL, durumu gösterir; \"%s\" "
|
||||
"ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1227
|
||||
#: ../src/ui/theme.c:1312
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Renk belirtimindeki \"%s\" durumu anlaşılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1240
|
||||
#: ../src/ui/theme.c:1325
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Renk belirtimindeki \"%s\" renk bileşeni anlaşılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1270
|
||||
#: ../src/ui/theme.c:1355
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -1168,17 +1221,17 @@ msgstr ""
|
||||
"Renk karışımının doğru biçimi \"blend/bg_color/fg_color/alpha\"dır; \"%s\" "
|
||||
"bu biçime uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:1281
|
||||
#: ../src/ui/theme.c:1366
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Renk karışımındaki \"%s\" alfa değeri ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1291
|
||||
#: ../src/ui/theme.c:1376
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "Renk karışımının alfa değeri \"%s\", 0.0 ile 1.0 arasında değil"
|
||||
|
||||
#: ../src/ui/theme.c:1338
|
||||
#: ../src/ui/theme.c:1423
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -1186,32 +1239,27 @@ msgstr ""
|
||||
"Gölgelendirmenin doğru biçimi \"shade/bas_color/factor\"dır; \"%s\" bu "
|
||||
"biçime uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:1349
|
||||
#: ../src/ui/theme.c:1434
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Gölgeli rengin gölge katsayısı olan \"%s\" ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1359
|
||||
#: ../src/ui/theme.c:1444
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Gölgeli rengin gölge katsayısı olan \"%s\", negatif"
|
||||
|
||||
#: ../src/ui/theme.c:1388
|
||||
#: ../src/ui/theme.c:1473
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "\"%s\" rengi ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1481
|
||||
#, c-format
|
||||
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
|
||||
msgstr "GTK+ temasından %s[%s] renginin alınması başarısız oldu.\n"
|
||||
|
||||
#: ../src/ui/theme.c:1713
|
||||
#: ../src/ui/theme.c:1784
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Kordinat ifadesi izin verilmeyen '%s' karakterini içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:1740
|
||||
#: ../src/ui/theme.c:1811
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -1219,12 +1267,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Kordinat ifadesi '%s' gerçel sayısını içeriyor ve bu sayı ayrıştırılamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:1754
|
||||
#: ../src/ui/theme.c:1825
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "Kordinat ifadesi ayrıştırılamayan '%s' tamsayısını içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:1876
|
||||
#: ../src/ui/theme.c:1947
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -1232,17 +1280,17 @@ msgid ""
|
||||
msgstr ""
|
||||
"Kordinat ifadesi bu metnin başında bilinmeyen bir işleç içeriyor: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1933
|
||||
#: ../src/ui/theme.c:2004
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Kordinat ifadesi boş ya da anlaşılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
|
||||
#: ../src/ui/theme.c:2115 ../src/ui/theme.c:2125 ../src/ui/theme.c:2159
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Kordinat ifadesi sıfıra bölümle sonuçlanıyor"
|
||||
|
||||
#: ../src/ui/theme.c:2096
|
||||
#: ../src/ui/theme.c:2167
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -1250,23 +1298,23 @@ msgstr ""
|
||||
"Kordinat ifadesi bir gerçel sayı üzerinde mod (kalan bulma) işlecini "
|
||||
"kullanmaya çalıştı"
|
||||
|
||||
#: ../src/ui/theme.c:2152
|
||||
#: ../src/ui/theme.c:2223
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "Kordinat ifadesi işleneni beklenen \"%s\", işlecini içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2161
|
||||
#: ../src/ui/theme.c:2232
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "Kordinat ifadesi işleci beklenen bir işlenen içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2169
|
||||
#: ../src/ui/theme.c:2240
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Kordinat ifadesi bir işlenen yerine işleçle bitiyor"
|
||||
|
||||
#: ../src/ui/theme.c:2179
|
||||
#: ../src/ui/theme.c:2250
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -1275,38 +1323,38 @@ msgstr ""
|
||||
"Kordinat ifadesi birbirlerinin izleyen ve aralarında işlenen olmayan \"%2$c"
|
||||
"\" ve \"%1$c\" işleçlerini içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
|
||||
#: ../src/ui/theme.c:2401 ../src/ui/theme.c:2446
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"Kordinat ifadesi bilinmeyen bir değişken ya da sabit olan \"%s\" içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2429
|
||||
#: ../src/ui/theme.c:2500
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Kordinat belirtim ayrıştırıcısı tamponundan taştı."
|
||||
|
||||
#: ../src/ui/theme.c:2458
|
||||
#: ../src/ui/theme.c:2529
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "Kordinat ifadesi sol parantezi olmayan bir sağ parantez içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2522
|
||||
#: ../src/ui/theme.c:2593
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "Kordinat ifadesi sağ parantezi olmayan bir sol parantez içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2533
|
||||
#: ../src/ui/theme.c:2604
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "Kordinat ifadesi göründüğü kadarıyla ne işleç ne de işlenen içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
|
||||
#: ../src/ui/theme.c:2816 ../src/ui/theme.c:2836 ../src/ui/theme.c:2856
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Tema bir hata ile sonuçlanan ifadeye sahip: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4482
|
||||
#: ../src/ui/theme.c:4527
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1315,25 +1363,25 @@ msgstr ""
|
||||
"Bu çerçeve biçeminde <button function=\"%s\" state=\"%s\" draw_ops=\"her "
|
||||
"neyse\"/> belirtilmek zorunda"
|
||||
|
||||
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
|
||||
#: ../src/ui/theme.c:5060 ../src/ui/theme.c:5085
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"Eksik <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"her neyse\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5085
|
||||
#: ../src/ui/theme.c:5133
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "\"%s\" teması yüklenemedi: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5221 ../src/ui/theme.c:5228 ../src/ui/theme.c:5235
|
||||
#: ../src/ui/theme.c:5242 ../src/ui/theme.c:5249
|
||||
#: ../src/ui/theme.c:5269 ../src/ui/theme.c:5276 ../src/ui/theme.c:5283
|
||||
#: ../src/ui/theme.c:5290 ../src/ui/theme.c:5297
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "\"%2$s\" temasında hiç <%1$s> atanmamış"
|
||||
|
||||
#: ../src/ui/theme.c:5257
|
||||
#: ../src/ui/theme.c:5305
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1342,14 +1390,14 @@ msgstr ""
|
||||
"\"%2$s\" temasında \"%1$s\" pencere türüne çerçeve biçemi atanmamış, bir "
|
||||
"<window type=\"%3$s\" style_set=\"her neyse\"/> öğesi ekleyin"
|
||||
|
||||
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
|
||||
#: ../src/ui/theme.c:5744 ../src/ui/theme.c:5806 ../src/ui/theme.c:5869
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr ""
|
||||
"Kullanıcı tanımlı sabitler büyük harfle başlamalıdır; \"%s\" buna uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
|
||||
#: ../src/ui/theme.c:5752 ../src/ui/theme.c:5814 ../src/ui/theme.c:5877
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "\"%s\" sabit değeri zaten tanımlanmış"
|
||||
@@ -1802,88 +1850,88 @@ msgstr "Bu örnek iletişim penceresi için örnek bir iletidir"
|
||||
msgid "Fake menu item %d\n"
|
||||
msgstr "Sahte menü öğesi %d\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:370
|
||||
#: ../src/ui/theme-viewer.c:371
|
||||
msgid "Border-only window"
|
||||
msgstr "Sadece kenarı olan pencere"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:372
|
||||
#: ../src/ui/theme-viewer.c:373
|
||||
msgid "Bar"
|
||||
msgstr "Çubuk"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:389
|
||||
#: ../src/ui/theme-viewer.c:390
|
||||
msgid "Normal Application Window"
|
||||
msgstr "Normal Uygulama Penceresi"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:393
|
||||
#: ../src/ui/theme-viewer.c:394
|
||||
msgid "Dialog Box"
|
||||
msgstr "İletişim Kutusu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:397
|
||||
#: ../src/ui/theme-viewer.c:398
|
||||
msgid "Modal Dialog Box"
|
||||
msgstr "Yardımcı İletişim Kutusu"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:401
|
||||
#: ../src/ui/theme-viewer.c:402
|
||||
msgid "Utility Palette"
|
||||
msgstr "Araç Paleti"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:405
|
||||
#: ../src/ui/theme-viewer.c:406
|
||||
msgid "Torn-off Menu"
|
||||
msgstr "Kesilebilir Menü"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:409
|
||||
#: ../src/ui/theme-viewer.c:410
|
||||
msgid "Border"
|
||||
msgstr "Kenarlık"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:413
|
||||
#: ../src/ui/theme-viewer.c:414
|
||||
msgid "Attached Modal Dialog"
|
||||
msgstr "İlişik Yardımcı İletişim Penceresi"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:744
|
||||
#: ../src/ui/theme-viewer.c:747
|
||||
#, c-format
|
||||
msgid "Button layout test %d"
|
||||
msgstr "Düğme düzeni testi %d"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:773
|
||||
#: ../src/ui/theme-viewer.c:776
|
||||
#, c-format
|
||||
msgid "%g milliseconds to draw one window frame"
|
||||
msgstr "bir pencere çerçevesi çizmek için %g milisaniye"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:818
|
||||
#: ../src/ui/theme-viewer.c:821
|
||||
#, c-format
|
||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||
msgstr "Kullanım: metacity-theme-viewer [TEMAİSMİ]\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:825
|
||||
#: ../src/ui/theme-viewer.c:828
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "Tema yüklenirken hata: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:831
|
||||
#: ../src/ui/theme-viewer.c:834
|
||||
#, c-format
|
||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||
msgstr "\"%s\" teması %g saniye içerisinde yüklendi\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:875
|
||||
#: ../src/ui/theme-viewer.c:878
|
||||
msgid "Normal Title Font"
|
||||
msgstr "Normal Başlık Yazıtipi"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:881
|
||||
#: ../src/ui/theme-viewer.c:884
|
||||
msgid "Small Title Font"
|
||||
msgstr "Küçük Başlık Yazıtipi"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:887
|
||||
#: ../src/ui/theme-viewer.c:890
|
||||
msgid "Large Title Font"
|
||||
msgstr "Büyük Başlık Yazıtipi"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:892
|
||||
#: ../src/ui/theme-viewer.c:895
|
||||
msgid "Button Layouts"
|
||||
msgstr "Düğme Düzenleri"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:897
|
||||
#: ../src/ui/theme-viewer.c:900
|
||||
msgid "Benchmark"
|
||||
msgstr "Karşılaştırma"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:949
|
||||
#: ../src/ui/theme-viewer.c:952
|
||||
msgid "Window Title Goes Here"
|
||||
msgstr "Pencere Başlığı Buraya Gelir"
|
||||
|
||||
@@ -1936,6 +1984,9 @@ msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr ""
|
||||
"%d kordinat ifadesi %g saniye içinde ayrıştırıldı (%g saniye ortalama ile)\n"
|
||||
|
||||
#~ msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
|
||||
#~ msgstr "GTK+ temasından %s[%s] renginin alınması başarısız oldu.\n"
|
||||
|
||||
#~ msgid "Window Management"
|
||||
#~ msgstr "Pencere Yönetimi"
|
||||
|
||||
|
@@ -78,6 +78,20 @@ libmutter_la_SOURCES = \
|
||||
core/constraints.h \
|
||||
core/core.c \
|
||||
core/delete.c \
|
||||
core/device.c \
|
||||
meta/device.h \
|
||||
core/device-keyboard.c \
|
||||
core/device-keyboard.h \
|
||||
core/device-pointer.c \
|
||||
core/device-pointer.h \
|
||||
core/device-private.h \
|
||||
core/device-map.c \
|
||||
meta/device-map.h \
|
||||
core/device-map-private.h \
|
||||
core/device-map-core.c \
|
||||
core/device-map-core.h \
|
||||
core/devices-core.c \
|
||||
core/devices-core.h \
|
||||
core/display.c \
|
||||
core/display-private.h \
|
||||
meta/display.h \
|
||||
@@ -100,6 +114,8 @@ libmutter_la_SOURCES = \
|
||||
meta/group.h \
|
||||
core/iconcache.c \
|
||||
core/iconcache.h \
|
||||
core/input-events.c \
|
||||
core/input-events.h \
|
||||
core/keybindings.c \
|
||||
core/keybindings-private.h \
|
||||
core/main.c \
|
||||
@@ -157,6 +173,14 @@ libmutter_la_SOURCES = \
|
||||
ui/preview-widget.c \
|
||||
$(mutter_built_sources)
|
||||
|
||||
if HAVE_XINPUT2
|
||||
libmutter_la_SOURCES += \
|
||||
core/device-map-xi2.c \
|
||||
core/device-map-xi2.h \
|
||||
core/devices-xi2.c \
|
||||
core/devices-xi2.h
|
||||
endif
|
||||
|
||||
libmutter_la_LDFLAGS = -no-undefined
|
||||
libmutter_la_LIBADD = $(MUTTER_LIBS)
|
||||
|
||||
@@ -167,6 +191,8 @@ libmutterinclude_base_headers = \
|
||||
meta/common.h \
|
||||
meta/compositor-mutter.h \
|
||||
meta/compositor.h \
|
||||
meta/device.h \
|
||||
meta/device-map.h \
|
||||
meta/display.h \
|
||||
meta/errors.h \
|
||||
meta/gradient.h \
|
||||
|
@@ -18,6 +18,8 @@
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "window-private.h" /* to check window->hidden */
|
||||
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
||||
#include "core.h" /* for meta_core_select_events() */
|
||||
#include "input-events.h"
|
||||
#include <X11/extensions/shape.h>
|
||||
#include <X11/extensions/Xcomposite.h>
|
||||
|
||||
@@ -155,7 +157,6 @@ get_output_window (MetaScreen *screen)
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
Window output, xroot;
|
||||
XWindowAttributes attr;
|
||||
long event_mask;
|
||||
|
||||
xroot = meta_screen_get_xroot (screen);
|
||||
@@ -169,13 +170,7 @@ get_output_window (MetaScreen *screen)
|
||||
KeyPressMask | KeyReleaseMask;
|
||||
|
||||
output = XCompositeGetOverlayWindow (xdisplay, xroot);
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, output, &attr))
|
||||
{
|
||||
event_mask |= attr.your_event_mask;
|
||||
}
|
||||
|
||||
XSelectInput (xdisplay, output, event_mask);
|
||||
meta_core_select_events (xdisplay, output, event_mask, TRUE);
|
||||
|
||||
return output;
|
||||
}
|
||||
@@ -347,26 +342,34 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
* merge the two.
|
||||
*/
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
gboolean pointer_grabbed = FALSE;
|
||||
gboolean keyboard_grabbed = FALSE;
|
||||
int result;
|
||||
gboolean result;
|
||||
MetaDevice *device;
|
||||
MetaGrabInfo *grab_info;
|
||||
|
||||
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
||||
/* FIXME: need a real device here, and probably
|
||||
* some exclusion mode for other devices */
|
||||
device = meta_device_map_lookup (display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
|
||||
grab_info = meta_display_get_grab_info (display, device);
|
||||
|
||||
if (compositor->modal_plugin != NULL || grab_info != NULL)
|
||||
return FALSE;
|
||||
|
||||
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
||||
{
|
||||
result = XGrabPointer (xdpy, grab_window,
|
||||
False, /* owner_events */
|
||||
(ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
|
||||
GrabModeAsync, GrabModeAsync,
|
||||
None, /* confine to */
|
||||
cursor,
|
||||
timestamp);
|
||||
if (result != Success)
|
||||
result = meta_device_grab (device,
|
||||
grab_window,
|
||||
(ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
|
||||
cursor,
|
||||
FALSE,
|
||||
FALSE,
|
||||
timestamp);
|
||||
if (!result)
|
||||
goto fail;
|
||||
|
||||
pointer_grabbed = TRUE;
|
||||
@@ -374,22 +377,25 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
|
||||
{
|
||||
result = XGrabKeyboard (xdpy, grab_window,
|
||||
False, /* owner_events */
|
||||
GrabModeAsync, GrabModeAsync,
|
||||
timestamp);
|
||||
|
||||
if (result != Success)
|
||||
result = meta_device_grab (meta_device_get_paired_device (device),
|
||||
grab_window,
|
||||
(KeyPressMask | KeyReleaseMask),
|
||||
META_CURSOR_DEFAULT,
|
||||
FALSE, FALSE,
|
||||
timestamp);
|
||||
if (!result)
|
||||
goto fail;
|
||||
|
||||
keyboard_grabbed = TRUE;
|
||||
}
|
||||
|
||||
display->grab_op = META_GRAB_OP_COMPOSITOR;
|
||||
display->grab_window = NULL;
|
||||
display->grab_screen = screen;
|
||||
display->grab_have_pointer = TRUE;
|
||||
display->grab_have_keyboard = TRUE;
|
||||
grab_info = meta_display_create_grab_info (display, device);
|
||||
|
||||
grab_info->grab_op = META_GRAB_OP_COMPOSITOR;
|
||||
grab_info->grab_window = NULL;
|
||||
grab_info->grab_screen = screen;
|
||||
grab_info->grab_have_pointer = TRUE;
|
||||
grab_info->grab_have_keyboard = TRUE;
|
||||
|
||||
compositor->modal_plugin = plugin;
|
||||
|
||||
@@ -397,9 +403,9 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
fail:
|
||||
if (pointer_grabbed)
|
||||
XUngrabPointer (xdpy, timestamp);
|
||||
meta_device_ungrab (device, timestamp);
|
||||
if (keyboard_grabbed)
|
||||
XUngrabKeyboard (xdpy, timestamp);
|
||||
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -410,20 +416,19 @@ meta_end_modal_for_plugin (MetaScreen *screen,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
MetaDevice *device;
|
||||
|
||||
g_return_if_fail (compositor->modal_plugin == plugin);
|
||||
|
||||
XUngrabPointer (xdpy, timestamp);
|
||||
XUngrabKeyboard (xdpy, timestamp);
|
||||
/* FIXME: need a real device here */
|
||||
device = meta_device_map_lookup (display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
|
||||
display->grab_op = META_GRAB_OP_NONE;
|
||||
display->grab_window = NULL;
|
||||
display->grab_screen = NULL;
|
||||
display->grab_have_pointer = FALSE;
|
||||
display->grab_have_keyboard = FALSE;
|
||||
meta_device_ungrab (device, timestamp);
|
||||
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
|
||||
|
||||
meta_display_remove_grab_info (display, device);
|
||||
compositor->modal_plugin = NULL;
|
||||
}
|
||||
|
||||
@@ -456,7 +461,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
Window xwin;
|
||||
gint width, height;
|
||||
XWindowAttributes attr;
|
||||
long event_mask;
|
||||
guint n_retries;
|
||||
guint max_retries;
|
||||
@@ -531,12 +535,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
StructureNotifyMask;
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, xwin, &attr))
|
||||
{
|
||||
event_mask |= attr.your_event_mask;
|
||||
}
|
||||
|
||||
XSelectInput (xdisplay, xwin, event_mask);
|
||||
meta_core_select_events (xdisplay, xwin, event_mask, TRUE);
|
||||
|
||||
info->window_group = meta_window_group_new (screen);
|
||||
info->background_actor = meta_background_actor_new_for_screen (screen);
|
||||
@@ -695,9 +694,15 @@ meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_grabbed_event (XEvent *event)
|
||||
is_grabbed_event (MetaDisplay *display,
|
||||
XEvent *event)
|
||||
{
|
||||
switch (event->xany.type)
|
||||
guint evtype;
|
||||
|
||||
if (!meta_input_event_get_type (display, event, &evtype))
|
||||
return FALSE;
|
||||
|
||||
switch (evtype)
|
||||
{
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
@@ -730,7 +735,8 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
XEvent *event,
|
||||
MetaWindow *window)
|
||||
{
|
||||
if (compositor->modal_plugin && is_grabbed_event (event))
|
||||
if (compositor->modal_plugin &&
|
||||
is_grabbed_event (compositor->display, event))
|
||||
{
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
|
||||
|
||||
|
@@ -360,7 +360,7 @@ meta_shadow_paint (MetaShadow *shadow,
|
||||
* @window_height: actual height of the region to paint a shadow for
|
||||
*
|
||||
* Computes the bounds of the pixels that will be affected by
|
||||
* meta_shadow_paints()
|
||||
* meta_shadow_paint()
|
||||
*/
|
||||
void
|
||||
meta_shadow_get_bounds (MetaShadow *shadow,
|
||||
|
@@ -772,7 +772,7 @@ meta_shaped_texture_set_overlay_path (MetaShapedTexture *stex,
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_clip_region:
|
||||
* @frame: a #TidyTextureframe
|
||||
* @frame: a #MetaShapedTexture
|
||||
* @clip_region: (transfer full): the region of the texture that
|
||||
* is visible and should be painted. OWNERSHIP IS ASSUMED BY
|
||||
* THE FUNCTION (for efficiency to avoid a copy.)
|
||||
|
@@ -111,8 +111,8 @@ texture_is_rectangle (CoglHandle texture)
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
/**
|
||||
* meta_texture_tower_update_area:
|
||||
* @tower: a MetaTextureTower
|
||||
* meta_texture_tower_set_base_texture:
|
||||
* @tower: a #MetaTextureTower
|
||||
* @texture: the new texture used as a base for scaled down versions
|
||||
*
|
||||
* Sets the base texture that is the scaled texture that the
|
||||
@@ -175,7 +175,7 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
||||
|
||||
/**
|
||||
* meta_texture_tower_update_area:
|
||||
* @tower: a MetaTextureTower
|
||||
* @tower: a #MetaTextureTower
|
||||
* @x: X coordinate of upper left of rectangle that changed
|
||||
* @y: Y coordinate of upper left of rectangle that changed
|
||||
* @width: width of rectangle that changed
|
||||
@@ -579,7 +579,7 @@ texture_tower_revalidate (MetaTextureTower *tower,
|
||||
|
||||
/**
|
||||
* meta_texture_tower_get_paint_texture:
|
||||
* @tower: a MetaTextureTower
|
||||
* @tower: a #MetaTextureTower
|
||||
*
|
||||
* Gets the texture from the tower that best matches the current
|
||||
* rendering scale. (On the assumption here the texture is going to
|
||||
|
@@ -828,9 +828,9 @@ meta_window_actor_get_x_window (MetaWindowActor *self)
|
||||
/**
|
||||
* meta_window_actor_get_meta_window:
|
||||
*
|
||||
* Gets the MetaWindow object that the the MetaWindowActor is displaying
|
||||
* Gets the #MetaWindow object that the the #MetaWindowActor is displaying
|
||||
*
|
||||
* Return value: (transfer none): the displayed MetaWindow
|
||||
* Return value: (transfer none): the displayed #MetaWindow
|
||||
*/
|
||||
MetaWindow *
|
||||
meta_window_actor_get_meta_window (MetaWindowActor *self)
|
||||
@@ -843,7 +843,7 @@ meta_window_actor_get_meta_window (MetaWindowActor *self)
|
||||
*
|
||||
* Gets the ClutterActor that is used to display the contents of the window
|
||||
*
|
||||
* Return value: (transfer none): the ClutterActor for the contents
|
||||
* Return value: (transfer none): the #ClutterActor for the contents
|
||||
*/
|
||||
ClutterActor *
|
||||
meta_window_actor_get_texture (MetaWindowActor *self)
|
||||
@@ -1217,8 +1217,9 @@ meta_window_actor_should_unredirect (MetaWindowActor *self)
|
||||
{
|
||||
MetaWindow *metaWindow = meta_window_actor_get_meta_window (self);
|
||||
MetaScreen *screen = meta_window_get_screen (metaWindow);
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
|
||||
if (meta_window_is_override_redirect (metaWindow) && self->priv->opacity == 0xff)
|
||||
if (meta_window_is_override_redirect (metaWindow) && priv->opacity == 0xff && !priv->argb32)
|
||||
{
|
||||
int screen_width, screen_height;
|
||||
MetaRectangle window_rect;
|
||||
@@ -1804,7 +1805,7 @@ meta_window_actor_set_visible_region_beneath (MetaWindowActor *self,
|
||||
* @self: a #MetaWindowActor
|
||||
*
|
||||
* Unsets the regions set by meta_window_actor_reset_visible_region() and
|
||||
*meta_window_actor_reset_visible_region_beneath()
|
||||
* meta_window_actor_reset_visible_region_beneath()
|
||||
*/
|
||||
void
|
||||
meta_window_actor_reset_visible_regions (MetaWindowActor *self)
|
||||
|
@@ -101,6 +101,25 @@ actor_is_untransformed (ClutterActor *actor,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if CLUTTER_CHECK_VERSION(1, 9, 0)
|
||||
#define has_effects clutter_actor_has_effects
|
||||
#else
|
||||
|
||||
static gboolean
|
||||
has_effects(ClutterActor *actor)
|
||||
{
|
||||
GList *list;
|
||||
gboolean ret;
|
||||
|
||||
list = clutter_actor_get_effects (actor);
|
||||
ret = list != NULL;
|
||||
g_list_free (list);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void
|
||||
meta_window_group_paint (ClutterActor *actor)
|
||||
{
|
||||
@@ -161,7 +180,7 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* as well for the same reason, but omitted for simplicity in the
|
||||
* hopes that no-one will do that.
|
||||
*/
|
||||
if (clutter_actor_get_effects (l->data) != NULL)
|
||||
if (has_effects (l->data))
|
||||
continue;
|
||||
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
|
@@ -230,6 +230,35 @@ bell_flash_window_frame (MetaWindow *window)
|
||||
bell_unflash_frame, window->frame, NULL);
|
||||
}
|
||||
|
||||
static MetaWindow *
|
||||
get_flash_window (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
XkbBellNotifyEvent *xkb_bell_event;
|
||||
MetaWindow *window;
|
||||
|
||||
g_assert (xkb_ev->xkb_type == XkbBellNotify);
|
||||
|
||||
xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
|
||||
if (!window &&
|
||||
g_hash_table_size (display->focus_info) == 1)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
MetaFocusInfo *info;
|
||||
|
||||
/* If there is only one focused window, use it */
|
||||
g_hash_table_iter_init (&iter, display->focus_info);
|
||||
|
||||
if (g_hash_table_iter_next (&iter, NULL, (gpointer *) &info) &&
|
||||
info->focus_window && info->focus_window->frame)
|
||||
window = info->focus_window;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
/**
|
||||
* Flashes the frame of the focussed window. If there is no focussed window,
|
||||
* flashes the screen.
|
||||
@@ -241,15 +270,11 @@ static void
|
||||
bell_flash_frame (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
||||
MetaWindow *window;
|
||||
|
||||
g_assert (xkb_ev->xkb_type == XkbBellNotify);
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
if (!window && (display->focus_window))
|
||||
{
|
||||
window = display->focus_window;
|
||||
}
|
||||
window = get_flash_window (display, xkb_ev);
|
||||
|
||||
if (window && window->frame)
|
||||
{
|
||||
bell_flash_window_frame (window);
|
||||
@@ -310,9 +335,7 @@ meta_bell_notify (MetaDisplay *display,
|
||||
ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Bell event"));
|
||||
ca_proplist_sets (p, CA_PROP_CANBERRA_CACHE_CONTROL, "permanent");
|
||||
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
if (!window && (display->focus_window) && (display->focus_window->frame))
|
||||
window = display->focus_window;
|
||||
window = get_flash_window (display, xkb_ev);
|
||||
|
||||
if (window)
|
||||
{
|
||||
|
@@ -805,8 +805,14 @@ constrain_maximization (MetaWindow *window,
|
||||
return TRUE;
|
||||
|
||||
/* Calculate target_size = maximized size of (window + frame) */
|
||||
if (window->maximized_horizontally && window->maximized_vertically)
|
||||
target_size = info->work_area_monitor;
|
||||
if (META_WINDOW_TILED_MAXIMIZED (window))
|
||||
{
|
||||
meta_window_get_current_tile_area (window, &target_size);
|
||||
}
|
||||
else if (META_WINDOW_MAXIMIZED (window))
|
||||
{
|
||||
target_size = info->work_area_monitor;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Amount of maximization possible in a single direction depends
|
||||
@@ -1357,15 +1363,18 @@ constrain_titlebar_visible (MetaWindow *window,
|
||||
int bottom_amount;
|
||||
int horiz_amount_offscreen, vert_amount_offscreen;
|
||||
int horiz_amount_onscreen, vert_amount_onscreen;
|
||||
MetaGrabInfo *grab_info;
|
||||
|
||||
if (priority > PRIORITY_TITLEBAR_VISIBLE)
|
||||
return TRUE;
|
||||
|
||||
grab_info = window->cur_grab;
|
||||
|
||||
/* Allow the titlebar beyond the top of the screen only if the user wasn't
|
||||
* clicking on the frame to start the move.
|
||||
*/
|
||||
unconstrained_user_action =
|
||||
info->is_user_action && !window->display->grab_frame_action;
|
||||
info->is_user_action && (!grab_info || !grab_info->grab_frame_action);
|
||||
|
||||
/* Exit early if we know the constraint won't apply--note that this constraint
|
||||
* is only meant for normal windows (e.g. we don't want docks to be shoved
|
||||
|
202
src/core/core.c
202
src/core/core.c
@@ -27,9 +27,15 @@
|
||||
#include "core.h"
|
||||
#include "frame.h"
|
||||
#include "workspace-private.h"
|
||||
#include "input-events.h"
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/errors.h>
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include "devices-xi2.h"
|
||||
#endif
|
||||
|
||||
/* Looks up the MetaWindow representing the frame of the given X window.
|
||||
* Used as a helper function by a bunch of the functions below.
|
||||
*
|
||||
@@ -245,9 +251,19 @@ lower_window_and_transients (MetaWindow *window,
|
||||
void
|
||||
meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||
MetaDevice *pointer;
|
||||
|
||||
pointer = meta_device_map_lookup (window->display->device_map, device_id);
|
||||
|
||||
if (pointer == NULL)
|
||||
return;
|
||||
|
||||
if (!META_IS_DEVICE_POINTER (pointer))
|
||||
pointer = meta_device_get_paired_device (pointer);
|
||||
|
||||
lower_window_and_transients (window, NULL);
|
||||
|
||||
@@ -256,6 +272,7 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
* this will be invoked via keyboard action or by a mouse action;
|
||||
* in either case the window or a modal child will have been focused.) */
|
||||
meta_workspace_focus_default_window (window->screen->active_workspace,
|
||||
pointer,
|
||||
NULL,
|
||||
timestamp);
|
||||
}
|
||||
@@ -263,16 +280,21 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
void
|
||||
meta_core_lower_beneath_grab_window (Display *xdisplay,
|
||||
Window xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp)
|
||||
{
|
||||
XWindowChanges changes;
|
||||
MetaDisplay *display;
|
||||
MetaScreen *screen;
|
||||
MetaWindow *grab_window;
|
||||
MetaDevice *pointer;
|
||||
MetaGrabInfo *grab_info;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
screen = meta_display_screen_for_xwindow (display, xwindow);
|
||||
grab_window = display->grab_window;
|
||||
pointer = meta_device_map_lookup (display->device_map, device_id);
|
||||
grab_info = meta_display_get_grab_info (display, pointer);
|
||||
grab_window = grab_info->grab_window;
|
||||
|
||||
if (grab_window == NULL)
|
||||
return;
|
||||
@@ -491,18 +513,27 @@ meta_core_get_active_workspace (Screen *xscreen)
|
||||
void
|
||||
meta_core_show_window_menu (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||
|
||||
MetaDevice *device;
|
||||
|
||||
/* There is already a menu popped up,
|
||||
* most likely from another device
|
||||
*/
|
||||
if (window->menu)
|
||||
return;
|
||||
|
||||
if (meta_prefs_get_raise_on_click ())
|
||||
meta_window_raise (window);
|
||||
meta_window_focus (window, timestamp);
|
||||
|
||||
meta_window_show_menu (window, root_x, root_y, button, timestamp);
|
||||
device = meta_device_map_lookup (window->display->device_map, device_id);
|
||||
meta_window_show_menu (window, device, root_x, root_y, button, timestamp);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -638,6 +669,7 @@ meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
gboolean
|
||||
meta_core_begin_grab_op (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
gboolean frame_action,
|
||||
@@ -650,13 +682,16 @@ meta_core_begin_grab_op (Display *xdisplay,
|
||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||
MetaDisplay *display;
|
||||
MetaScreen *screen;
|
||||
|
||||
MetaDevice *device;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
screen = meta_display_screen_for_xwindow (display, frame_xwindow);
|
||||
|
||||
g_assert (screen != NULL);
|
||||
|
||||
return meta_display_begin_grab_op (display, screen, window,
|
||||
|
||||
device = meta_device_map_lookup (display->device_map, device_id);
|
||||
|
||||
return meta_display_begin_grab_op (display, screen, window, device,
|
||||
op, pointer_already_grabbed,
|
||||
frame_action,
|
||||
button, modmask,
|
||||
@@ -665,57 +700,58 @@ meta_core_begin_grab_op (Display *xdisplay,
|
||||
|
||||
void
|
||||
meta_core_end_grab_op (Display *xdisplay,
|
||||
int device_id,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
MetaDevice *device;
|
||||
|
||||
meta_display_end_grab_op (display, timestamp);
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
device = meta_device_map_lookup (display->device_map, device_id);
|
||||
|
||||
meta_display_end_grab_op (display, device, timestamp);
|
||||
}
|
||||
|
||||
MetaGrabOp
|
||||
meta_core_get_grab_op (Display *xdisplay)
|
||||
meta_core_frame_has_grab (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
gint *device_id,
|
||||
gint *button_ret)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
MetaWindow *window;
|
||||
|
||||
return display->grab_op;
|
||||
window = get_window (xdisplay, frame_xwindow);
|
||||
|
||||
if (window != NULL &&
|
||||
window->cur_grab != NULL)
|
||||
{
|
||||
if (button_ret)
|
||||
*button_ret = window->cur_grab->grab_button;
|
||||
|
||||
if (device_id)
|
||||
*device_id = meta_device_get_id (window->cur_grab->grab_pointer);
|
||||
|
||||
return window->cur_grab->grab_op;
|
||||
}
|
||||
|
||||
return META_GRAB_OP_NONE;
|
||||
}
|
||||
|
||||
Window
|
||||
meta_core_get_grab_frame (Display *xdisplay)
|
||||
meta_core_get_frame (Display *xdisplay,
|
||||
Window client_xwindow)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
MetaWindow *window;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
window = meta_display_lookup_x_window (display, client_xwindow);
|
||||
|
||||
g_assert (display != NULL);
|
||||
g_assert (display->grab_op == META_GRAB_OP_NONE ||
|
||||
display->grab_screen != NULL);
|
||||
g_assert (display->grab_op == META_GRAB_OP_NONE ||
|
||||
display->grab_screen->display->xdisplay == xdisplay);
|
||||
|
||||
if (display->grab_op != META_GRAB_OP_NONE &&
|
||||
display->grab_window &&
|
||||
display->grab_window->frame)
|
||||
return display->grab_window->frame->xwindow;
|
||||
else
|
||||
return None;
|
||||
}
|
||||
if (window &&
|
||||
window->frame)
|
||||
return window->frame->xwindow;
|
||||
|
||||
int
|
||||
meta_core_get_grab_button (Display *xdisplay)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
|
||||
if (display->grab_op == META_GRAB_OP_NONE)
|
||||
return -1;
|
||||
|
||||
return display->grab_button;
|
||||
return None;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -731,13 +767,24 @@ meta_core_grab_buttons (Display *xdisplay,
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
MetaCursor cursor)
|
||||
meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
gint device_id,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaWindow *window = get_window (xdisplay, frame_on_screen);
|
||||
MetaDevice *pointer;
|
||||
|
||||
meta_frame_set_screen_cursor (window->frame, cursor);
|
||||
pointer = meta_device_map_lookup (window->display->device_map,
|
||||
device_id);
|
||||
|
||||
if (pointer == NULL)
|
||||
return;
|
||||
|
||||
if (!META_IS_DEVICE_POINTER (pointer))
|
||||
pointer = meta_device_get_paired_device (pointer);
|
||||
|
||||
meta_frame_set_screen_cursor (window->frame, pointer, cursor);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -775,3 +822,70 @@ meta_invalidate_default_icons (void)
|
||||
g_slist_free (windows);
|
||||
}
|
||||
|
||||
/* Selects events on an xwindow, using XInput2 if available/in use,
|
||||
* this function doesn't require the xwindow to have a backing
|
||||
* MetaWindow.
|
||||
*/
|
||||
void
|
||||
meta_core_select_events (Display *xdisplay,
|
||||
Window xwindow,
|
||||
gint evmask,
|
||||
gboolean preserve_old_mask)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (display->have_xinput2)
|
||||
{
|
||||
XIEventMask mask;
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (evmask,
|
||||
&mask.mask_len);
|
||||
|
||||
if (preserve_old_mask)
|
||||
{
|
||||
XIEventMask *prev;
|
||||
gint n_masks, i, j;
|
||||
|
||||
prev = XIGetSelectedEvents (xdisplay, xwindow, &n_masks);
|
||||
|
||||
for (i = 0; i < n_masks; i++)
|
||||
{
|
||||
if (prev[i].deviceid != XIAllMasterDevices)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < MIN (mask.mask_len, prev[i].mask_len); j++)
|
||||
mask.mask[j] |= prev[i].mask[j];
|
||||
}
|
||||
|
||||
XFree (prev);
|
||||
}
|
||||
|
||||
XISelectEvents (xdisplay, xwindow, &mask, 1);
|
||||
|
||||
/* Unset any input event so they are only handled via XInput2 */
|
||||
evmask &= ~(META_INPUT_TOUCH_EVENTS_MASK |
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask |
|
||||
PointerMotionMask | PointerMotionHintMask |
|
||||
Button1MotionMask | Button2MotionMask |
|
||||
Button3MotionMask | Button4MotionMask |
|
||||
Button5MotionMask | ButtonMotionMask |
|
||||
FocusChangeMask);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (preserve_old_mask)
|
||||
{
|
||||
XWindowAttributes attr;
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, xwindow, &attr))
|
||||
evmask |= attr.your_event_mask;
|
||||
}
|
||||
|
||||
XSelectInput (xdisplay, xwindow, evmask);
|
||||
}
|
||||
|
@@ -110,6 +110,7 @@ void meta_core_user_raise (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_core_user_focus (Display *xdisplay,
|
||||
@@ -118,6 +119,7 @@ void meta_core_user_focus (Display *xdisplay,
|
||||
|
||||
void meta_core_lower_beneath_grab_window (Display *xdisplay,
|
||||
Window xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_core_minimize (Display *xdisplay,
|
||||
@@ -163,6 +165,7 @@ const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
|
||||
void meta_core_show_window_menu (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
@@ -175,6 +178,7 @@ void meta_core_get_menu_accelerator (MetaMenuOp menu_op,
|
||||
|
||||
gboolean meta_core_begin_grab_op (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
gboolean frame_action,
|
||||
@@ -184,18 +188,29 @@ gboolean meta_core_begin_grab_op (Display *xdisplay,
|
||||
int root_x,
|
||||
int root_y);
|
||||
void meta_core_end_grab_op (Display *xdisplay,
|
||||
int device_id,
|
||||
guint32 timestamp);
|
||||
MetaGrabOp meta_core_get_grab_op (Display *xdisplay);
|
||||
Window meta_core_get_grab_frame (Display *xdisplay);
|
||||
int meta_core_get_grab_button (Display *xdisplay);
|
||||
|
||||
MetaGrabOp meta_core_frame_has_grab (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
gint *device_id,
|
||||
gint *button_ret);
|
||||
Window meta_core_get_frame (Display *xdisplay,
|
||||
Window client_xwindow);
|
||||
|
||||
void meta_core_grab_buttons (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
|
||||
void meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
MetaCursor cursor);
|
||||
void meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
int device_id,
|
||||
MetaCursor cursor);
|
||||
|
||||
void meta_core_select_events (Display *xdisplay,
|
||||
Window xwindow,
|
||||
gint evmask,
|
||||
gboolean preserve_old_mask);
|
||||
|
||||
|
||||
/* Used because we ignore EnterNotify when a window is unmapped that
|
||||
* really shouldn't cause focus changes, by comparing the event serial
|
||||
|
69
src/core/device-keyboard.c
Normal file
69
src/core/device-keyboard.c
Normal file
@@ -0,0 +1,69 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Keyboard device abstraction */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "device-keyboard.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaDeviceKeyboard,
|
||||
meta_device_keyboard,
|
||||
META_TYPE_DEVICE)
|
||||
|
||||
static void
|
||||
meta_device_keyboard_class_init (MetaDeviceKeyboardClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_init (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
}
|
||||
|
||||
Window
|
||||
meta_device_keyboard_get_focus_window (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
MetaDeviceKeyboardClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_KEYBOARD (keyboard), None);
|
||||
|
||||
klass = META_DEVICE_KEYBOARD_GET_CLASS (keyboard);
|
||||
|
||||
if (!klass->get_focus_window)
|
||||
return None;
|
||||
|
||||
return (klass->get_focus_window) (keyboard);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_keyboard_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDeviceKeyboardClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_KEYBOARD (keyboard));
|
||||
|
||||
klass = META_DEVICE_KEYBOARD_GET_CLASS (keyboard);
|
||||
|
||||
if (klass->set_focus_window)
|
||||
(klass->set_focus_window) (keyboard, xwindow, timestamp);
|
||||
}
|
69
src/core/device-keyboard.h
Normal file
69
src/core/device-keyboard.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-keyboard.h Keyboard device abstraction
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the internal abstraction of keyboard devices so
|
||||
* XInput2/core events can be handled similarly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_KEYBOARD_H
|
||||
#define META_DEVICE_KEYBOARD_H
|
||||
|
||||
#include "display-private.h"
|
||||
#include "device-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_KEYBOARD (meta_device_keyboard_get_type ())
|
||||
#define META_DEVICE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboard))
|
||||
#define META_DEVICE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboardClass))
|
||||
#define META_IS_DEVICE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD))
|
||||
#define META_IS_DEVICE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD))
|
||||
#define META_DEVICE_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboardClass))
|
||||
|
||||
typedef struct _MetaDeviceKeyboard MetaDeviceKeyboard;
|
||||
typedef struct _MetaDeviceKeyboardClass MetaDeviceKeyboardClass;
|
||||
|
||||
struct _MetaDeviceKeyboard
|
||||
{
|
||||
MetaDevice parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceKeyboardClass
|
||||
{
|
||||
MetaDeviceClass parent_instance;
|
||||
|
||||
Window (* get_focus_window) (MetaDeviceKeyboard *keyboard);
|
||||
void (* set_focus_window) (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp);
|
||||
};
|
||||
|
||||
GType meta_device_keyboard_get_type (void) G_GNUC_CONST;
|
||||
|
||||
Window meta_device_keyboard_get_focus_window (MetaDeviceKeyboard *keyboard);
|
||||
void meta_device_keyboard_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp);
|
||||
|
||||
|
||||
#endif /* META_DEVICE_KEYBOARD_H */
|
134
src/core/device-map-core.c
Normal file
134
src/core/device-map-core.c
Normal file
@@ -0,0 +1,134 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device map, core protocol implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "device-map-core.h"
|
||||
#include "devices-core.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceMapCore, meta_device_map_core, META_TYPE_DEVICE_MAP)
|
||||
|
||||
static gboolean
|
||||
meta_device_map_core_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
retval = XGrabKey (display->xdisplay, keycode, modifiers,
|
||||
xwindow, True,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
(sync) ? GrabModeSync : GrabModeAsync);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XUngrabKey (display->xdisplay, keycode, modifiers, xwindow);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_map_core_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
retval = XGrabButton (display->xdisplay, n_button,
|
||||
modifiers, xwindow, False,
|
||||
evmask,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
None, None);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XUngrabButton (display->xdisplay, n_button, modifiers, xwindow);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_constructed (GObject *object)
|
||||
{
|
||||
MetaDeviceMap *device_map = META_DEVICE_MAP (object);
|
||||
MetaDevice *pointer, *keyboard;
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
/* Insert core devices */
|
||||
pointer = meta_device_pointer_core_new (display);
|
||||
meta_device_map_add_device (device_map, pointer);
|
||||
|
||||
keyboard = meta_device_keyboard_core_new (display);
|
||||
meta_device_map_add_device (device_map, keyboard);
|
||||
|
||||
meta_device_pair_devices (pointer, keyboard);
|
||||
|
||||
g_object_unref (pointer);
|
||||
g_object_unref (keyboard);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_class_init (MetaDeviceMapCoreClass *klass)
|
||||
{
|
||||
MetaDeviceMapClass *device_map_class = META_DEVICE_MAP_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_device_map_core_constructed;
|
||||
|
||||
device_map_class->grab_key = meta_device_map_core_grab_key;
|
||||
device_map_class->ungrab_key = meta_device_map_core_ungrab_key;
|
||||
device_map_class->grab_button = meta_device_map_core_grab_button;
|
||||
device_map_class->ungrab_button = meta_device_map_core_ungrab_button;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_init (MetaDeviceMapCore *device_map)
|
||||
{
|
||||
}
|
56
src/core/device-map-core.h
Normal file
56
src/core/device-map-core.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-map-core.h device map for core devices
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the core protocol implementation of the device map
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_MAP_CORE_H
|
||||
#define META_DEVICE_MAP_CORE_H
|
||||
|
||||
typedef struct _MetaDeviceMapCore MetaDeviceMapCore;
|
||||
typedef struct _MetaDeviceMapCoreClass MetaDeviceMapCoreClass;
|
||||
|
||||
#include "device-map-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_MAP_CORE (meta_device_map_core_get_type ())
|
||||
#define META_DEVICE_MAP_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCore))
|
||||
#define META_DEVICE_MAP_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCoreClass))
|
||||
#define META_IS_DEVICE_MAP_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP_CORE))
|
||||
#define META_IS_DEVICE_MAP_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP_CORE))
|
||||
#define META_DEVICE_MAP_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCoreClass))
|
||||
|
||||
struct _MetaDeviceMapCore
|
||||
{
|
||||
MetaDeviceMap parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceMapCoreClass
|
||||
{
|
||||
MetaDeviceMapClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_map_core_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#endif /* META_DEVICE_MAP_CORE_H */
|
120
src/core/device-map-private.h
Normal file
120
src/core/device-map-private.h
Normal file
@@ -0,0 +1,120 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-map.h object containing input devices
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the device map, used to find out the device behind
|
||||
* XInput2/core events.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_MAP_PRIVATE_H
|
||||
#define META_DEVICE_MAP_PRIVATE_H
|
||||
|
||||
#include <meta/device-map.h>
|
||||
#include <meta/device.h>
|
||||
#include "display-private.h"
|
||||
#include "device-private.h"
|
||||
|
||||
/* Device IDs for Virtual Core Pointer/Keyboard,
|
||||
* use only in case of emergency.
|
||||
*/
|
||||
#define META_CORE_POINTER_ID 2
|
||||
#define META_CORE_KEYBOARD_ID 3
|
||||
|
||||
struct _MetaDeviceMap
|
||||
{
|
||||
GObject parent_instance;
|
||||
gpointer priv;
|
||||
};
|
||||
|
||||
struct _MetaDeviceMapClass
|
||||
{
|
||||
GObjectClass parent_instance;
|
||||
|
||||
void (* device_added) (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
void (* device_removed) (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
|
||||
gboolean (* grab_key) (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync);
|
||||
void (* ungrab_key) (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers);
|
||||
|
||||
gboolean (* grab_button) (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync);
|
||||
void (* ungrab_button) (MetaDeviceMap *pointer,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers);
|
||||
void (* grab_touch) (MetaDeviceMap *pointer,
|
||||
Window xwindow);
|
||||
void (* ungrab_touch) (MetaDeviceMap *pointer,
|
||||
Window xwindow);
|
||||
};
|
||||
|
||||
GType meta_device_map_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDeviceMap * meta_device_map_new (MetaDisplay *display,
|
||||
gboolean force_core);
|
||||
|
||||
void meta_device_map_add_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
void meta_device_map_remove_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
|
||||
gboolean meta_device_map_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync);
|
||||
void meta_device_map_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers);
|
||||
gboolean meta_device_map_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync);
|
||||
void meta_device_map_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers);
|
||||
|
||||
void meta_device_map_grab_touch (MetaDeviceMap *device_map,
|
||||
Window xwindow);
|
||||
void meta_device_map_ungrab_touch (MetaDeviceMap *device_map,
|
||||
Window xwindow);
|
||||
|
||||
#endif /* META_DEVICE_MAP_PRIVATE_H */
|
323
src/core/device-map-xi2.c
Normal file
323
src/core/device-map-xi2.c
Normal file
@@ -0,0 +1,323 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device map, XInput2 implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "device-map-xi2.h"
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include "devices-xi2.h"
|
||||
#include "input-events.h"
|
||||
|
||||
#define XINPUT2_VERSION_MAJOR 2
|
||||
#define XINPUT2_VERSION_MINOR 0
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceMapXI2, meta_device_map_xi2, META_TYPE_DEVICE_MAP)
|
||||
|
||||
static gboolean
|
||||
meta_device_map_xi2_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
MetaDisplay *display;
|
||||
XIEventMask mask;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (KeyPressMask |
|
||||
KeyReleaseMask,
|
||||
&mask.mask_len);
|
||||
|
||||
retval = XIGrabKeycode (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
keycode, xwindow,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
True, &mask, 1, &mods);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XIUngrabKeycode (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
keycode, xwindow,
|
||||
1, &mods);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_map_xi2_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
XIEventMask mask;
|
||||
MetaDisplay *display;
|
||||
int retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (evmask, &mask.mask_len);
|
||||
|
||||
retval = XIGrabButton (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
n_button, xwindow, None,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
False, &mask, 1, &mods);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XIUngrabButton (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
n_button, xwindow, 1, &mods);
|
||||
}
|
||||
|
||||
static MetaDevice *
|
||||
create_device_from_info (MetaDeviceMap *device_map,
|
||||
gint use,
|
||||
gint device_id)
|
||||
{
|
||||
MetaDevice *device = NULL;
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
if (use == XIMasterPointer ||
|
||||
use == XISlavePointer)
|
||||
device = meta_device_pointer_xi2_new (display, device_id);
|
||||
else if (use == XIMasterKeyboard)
|
||||
device = meta_device_keyboard_xi2_new (display, device_id);
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
static void
|
||||
pair_devices (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaDevice *device1, *device2;
|
||||
MetaDeviceMap *device_map;
|
||||
|
||||
device_map = user_data;
|
||||
device1 = meta_device_map_lookup (device_map, GPOINTER_TO_INT (key));
|
||||
device2 = meta_device_map_lookup (device_map, GPOINTER_TO_INT (value));
|
||||
|
||||
meta_device_pair_devices (device1, device2);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_constructed (GObject *object)
|
||||
{
|
||||
MetaDeviceMap *device_map = META_DEVICE_MAP (object);
|
||||
MetaDisplay *display;
|
||||
XIDeviceInfo *info;
|
||||
GHashTable *pairs;
|
||||
int n_devices, i;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
/* We're only interested in master devices,
|
||||
* detached slave devices are left for applications
|
||||
* to handle.
|
||||
*/
|
||||
info = XIQueryDevice (display->xdisplay, XIAllDevices, &n_devices);
|
||||
pairs = g_hash_table_new (NULL, NULL);
|
||||
|
||||
for (i = 0; i < n_devices; i++)
|
||||
{
|
||||
MetaDevice *device;
|
||||
|
||||
device = create_device_from_info (device_map, info[i].use,
|
||||
info[i].deviceid);
|
||||
if (device)
|
||||
{
|
||||
meta_device_map_add_device (device_map, device);
|
||||
|
||||
if (info[i].use == XIMasterPointer ||
|
||||
info[i].use == XIMasterKeyboard)
|
||||
g_hash_table_insert (pairs,
|
||||
GINT_TO_POINTER (info[i].deviceid),
|
||||
GINT_TO_POINTER (info[i].attachment));
|
||||
|
||||
g_object_unref (device);
|
||||
}
|
||||
}
|
||||
|
||||
g_hash_table_foreach (pairs, pair_devices, device_map);
|
||||
g_hash_table_destroy (pairs);
|
||||
|
||||
XIFreeDeviceInfo (info);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_grab_touch (MetaDeviceMap *device_map,
|
||||
Window xwindow)
|
||||
{
|
||||
XIGrabModifiers unused = { 0 };
|
||||
MetaDisplay *display;
|
||||
XIEventMask mask;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
g_message ("Grabbing passively on touch begin\n");
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (META_INPUT_TOUCH_EVENTS_MASK |
|
||||
ButtonPressMask |
|
||||
ButtonReleaseMask |
|
||||
PointerMotionMask |
|
||||
KeyPressMask |
|
||||
KeyReleaseMask,
|
||||
&mask.mask_len);
|
||||
XIGrabTouchBegin (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
xwindow, True,
|
||||
&mask, 1, &unused);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_ungrab_touch (MetaDeviceMap *device_map,
|
||||
Window xwindow)
|
||||
{
|
||||
XIGrabModifiers unused = { 0 };
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XIUngrabTouchBegin (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
xwindow, 0, &unused);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_class_init (MetaDeviceMapXI2Class *klass)
|
||||
{
|
||||
MetaDeviceMapClass *device_map_class = META_DEVICE_MAP_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_device_map_xi2_constructed;
|
||||
|
||||
device_map_class->grab_key = meta_device_map_xi2_grab_key;
|
||||
device_map_class->ungrab_key = meta_device_map_xi2_ungrab_key;
|
||||
device_map_class->grab_button = meta_device_map_xi2_grab_button;
|
||||
device_map_class->ungrab_button = meta_device_map_xi2_ungrab_button;
|
||||
device_map_class->grab_touch = meta_device_map_xi2_grab_touch;
|
||||
device_map_class->ungrab_touch = meta_device_map_xi2_ungrab_touch;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_init (MetaDeviceMapXI2 *device_map)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_map_xi2_handle_hierarchy_event (MetaDeviceMapXI2 *device_map,
|
||||
XEvent *ev)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (META_DEVICE_MAP (device_map));
|
||||
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIHierarchyEvent *xev;
|
||||
GHashTable *pairs;
|
||||
gint i;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIHierarchyEvent *) ev->xcookie.data;
|
||||
|
||||
if (xev->evtype != XI_HierarchyChanged)
|
||||
return FALSE;
|
||||
|
||||
pairs = g_hash_table_new (NULL, NULL);
|
||||
|
||||
for (i = 0; i < xev->num_info; i++)
|
||||
{
|
||||
if (xev->info[i].flags & XIMasterAdded ||
|
||||
xev->info[i].flags & XISlaveAdded)
|
||||
{
|
||||
MetaDevice *device;
|
||||
|
||||
device = create_device_from_info (META_DEVICE_MAP (device_map),
|
||||
xev->info[i].use,
|
||||
xev->info[i].deviceid);
|
||||
|
||||
if (device &&
|
||||
xev->info[i].flags & XIMasterAdded)
|
||||
g_hash_table_insert (pairs,
|
||||
GINT_TO_POINTER (xev->info[i].deviceid),
|
||||
GINT_TO_POINTER (xev->info[i].attachment));
|
||||
}
|
||||
else if (xev->info[i].flags & XIMasterRemoved ||
|
||||
xev->info[i].flags & XISlaveRemoved)
|
||||
{
|
||||
MetaDevice *device;
|
||||
|
||||
device = meta_device_map_lookup (META_DEVICE_MAP (device_map),
|
||||
xev->info[i].deviceid);
|
||||
|
||||
if (device)
|
||||
meta_device_map_remove_device (META_DEVICE_MAP (device_map),
|
||||
device);
|
||||
}
|
||||
}
|
||||
|
||||
g_hash_table_foreach (pairs, pair_devices, device_map);
|
||||
g_hash_table_destroy (pairs);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
59
src/core/device-map-xi2.h
Normal file
59
src/core/device-map-xi2.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-map-xi2.h device map for XInput2 devices
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the XInput2 implementation of the device map
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_MAP_XI2_H
|
||||
#define META_DEVICE_MAP_XI2_H
|
||||
|
||||
typedef struct _MetaDeviceMapXI2 MetaDeviceMapXI2;
|
||||
typedef struct _MetaDeviceMapXI2Class MetaDeviceMapXI2Class;
|
||||
|
||||
#include "device-map-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_MAP_XI2 (meta_device_map_xi2_get_type ())
|
||||
#define META_DEVICE_MAP_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2))
|
||||
#define META_DEVICE_MAP_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2Class))
|
||||
#define META_IS_DEVICE_MAP_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP_XI2))
|
||||
#define META_IS_DEVICE_MAP_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP_XI2))
|
||||
#define META_DEVICE_MAP_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2Class))
|
||||
|
||||
struct _MetaDeviceMapXI2
|
||||
{
|
||||
MetaDeviceMap parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceMapXI2Class
|
||||
{
|
||||
MetaDeviceMapClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_map_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
gboolean meta_device_map_xi2_handle_hierarchy_event (MetaDeviceMapXI2 *device_map,
|
||||
XEvent *ev);
|
||||
|
||||
#endif /* META_DEVICE_MAP_XI2_H */
|
429
src/core/device-map.c
Normal file
429
src/core/device-map.c
Normal file
@@ -0,0 +1,429 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device map */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "device-map-private.h"
|
||||
#include "device-map-core.h"
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include "device-map-xi2.h"
|
||||
|
||||
#define XINPUT2_VERSION_MAJOR 2
|
||||
#define XINPUT2_VERSION_MINOR 0
|
||||
#endif
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceMap, meta_device_map, G_TYPE_OBJECT)
|
||||
|
||||
typedef struct MetaDeviceMapPrivate MetaDeviceMapPrivate;
|
||||
|
||||
struct MetaDeviceMapPrivate
|
||||
{
|
||||
MetaDisplay *display;
|
||||
GHashTable *devices;
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_DISPLAY
|
||||
};
|
||||
|
||||
enum {
|
||||
DEVICE_ADDED,
|
||||
DEVICE_REMOVED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static void
|
||||
meta_device_map_get_property (GObject *object,
|
||||
guint param_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = META_DEVICE_MAP (object)->priv;
|
||||
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value, priv->display);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_set_property (GObject *object,
|
||||
guint param_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = META_DEVICE_MAP (object)->priv;
|
||||
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
priv->display = g_value_get_object (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_finalize (GObject *object)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
GHashTableIter iter;
|
||||
MetaDevice *device;
|
||||
|
||||
priv = META_DEVICE_MAP (object)->priv;
|
||||
g_hash_table_iter_init (&iter, priv->devices);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &device))
|
||||
{
|
||||
/* Detach the device */
|
||||
g_hash_table_iter_steal (&iter);
|
||||
|
||||
g_signal_emit (object, signals[DEVICE_REMOVED], 0, device);
|
||||
g_object_unref (device);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (priv->devices);
|
||||
G_OBJECT_CLASS (meta_device_map_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_class_init (MetaDeviceMapClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = meta_device_map_get_property;
|
||||
object_class->set_property = meta_device_map_set_property;
|
||||
object_class->finalize = meta_device_map_finalize;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DISPLAY,
|
||||
g_param_spec_object ("display",
|
||||
"Display",
|
||||
"Display",
|
||||
META_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
signals[DEVICE_ADDED] =
|
||||
g_signal_new ("device-added",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1, META_TYPE_DEVICE);
|
||||
signals[DEVICE_REMOVED] =
|
||||
g_signal_new ("device-removed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1, META_TYPE_DEVICE);
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaDeviceMapPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_init (MetaDeviceMap *device_map)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = device_map->priv = G_TYPE_INSTANCE_GET_PRIVATE (device_map,
|
||||
META_TYPE_DEVICE_MAP,
|
||||
MetaDeviceMapPrivate);
|
||||
priv->devices = g_hash_table_new_full (NULL, NULL, NULL,
|
||||
(GDestroyNotify) g_object_unref);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_add_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = device_map->priv;
|
||||
g_hash_table_insert (priv->devices,
|
||||
GINT_TO_POINTER (meta_device_get_id (device)),
|
||||
g_object_ref (device));
|
||||
|
||||
g_signal_emit (device_map, signals[DEVICE_ADDED], 0, device);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_remove_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = device_map->priv;
|
||||
|
||||
if (g_hash_table_steal (priv->devices,
|
||||
GINT_TO_POINTER (meta_device_get_id (device))))
|
||||
{
|
||||
g_signal_emit (device_map, signals[DEVICE_REMOVED], 0, device);
|
||||
g_object_unref (device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
|
||||
static gboolean
|
||||
initialize_xinput (MetaDisplay *display)
|
||||
{
|
||||
int major, minor, opcode;
|
||||
int unused;
|
||||
|
||||
if (!XQueryExtension (display->xdisplay,
|
||||
"XInputExtension",
|
||||
&opcode, &unused, &unused))
|
||||
return FALSE;
|
||||
|
||||
major = XI_2_Major;
|
||||
#ifdef HAVE_XTOUCH
|
||||
minor = XI_2_1_Minor;
|
||||
#else
|
||||
minor = XI_2_Minor;
|
||||
#endif /* HAVE_XTOUCH */
|
||||
|
||||
XIQueryVersion (display->xdisplay, &major, &minor);
|
||||
|
||||
if (major == XI_2_Major &&
|
||||
(
|
||||
#ifdef HAVE_XTOUCH
|
||||
minor == XI_2_1_Minor ||
|
||||
#endif /* HAVE_XTOUCH */
|
||||
minor == XI_2_Minor))
|
||||
{
|
||||
display->have_xinput2 = TRUE;
|
||||
display->have_xtouch = (minor >= XI_2_1_Minor);
|
||||
display->xinput2_opcode = opcode;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
|
||||
MetaDeviceMap *
|
||||
meta_device_map_new (MetaDisplay *display,
|
||||
gboolean force_core)
|
||||
{
|
||||
GType type = META_TYPE_DEVICE_MAP_CORE;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (!force_core &&
|
||||
initialize_xinput (display))
|
||||
type = META_TYPE_DEVICE_MAP_XI2;
|
||||
#endif
|
||||
|
||||
return g_object_new (type,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_map_lookup:
|
||||
* @device_map: a #MetaDeviceMap
|
||||
* @device_id: ID for a device
|
||||
*
|
||||
* returns the device corresponding to @device_id
|
||||
*
|
||||
* Returns: (transfer none): (allow-none): The matching device, or %NULL.
|
||||
**/
|
||||
MetaDevice *
|
||||
meta_device_map_lookup (MetaDeviceMap *device_map,
|
||||
gint device_id)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
|
||||
|
||||
priv = device_map->priv;
|
||||
return g_hash_table_lookup (priv->devices,
|
||||
GINT_TO_POINTER (device_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_map_get_display:
|
||||
* @device_map: a #MetaDeviceMap
|
||||
*
|
||||
* Returns the #MetaDisplay to which @device_map belongs to.
|
||||
*
|
||||
* Returns: (transfer none): The #MetaDisplay.
|
||||
**/
|
||||
MetaDisplay *
|
||||
meta_device_map_get_display (MetaDeviceMap *device_map)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
|
||||
|
||||
priv = device_map->priv;
|
||||
return priv->display;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_map_list_devices:
|
||||
* @device_map: a #MetaDeviceMap
|
||||
*
|
||||
* Returns the list of devices that @device_map holds.
|
||||
*
|
||||
* Returns: (element-type Meta.Device) (transfer container): the list
|
||||
* of devices, the contained objects are owned by @device_map
|
||||
* and should not be unref'ed. The list must be freed with
|
||||
* g_list_free().
|
||||
**/
|
||||
GList *
|
||||
meta_device_map_list_devices (MetaDeviceMap *device_map)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
|
||||
|
||||
priv = device_map->priv;
|
||||
return g_hash_table_get_values (priv->devices);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_map_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (!klass->grab_key)
|
||||
return FALSE;
|
||||
|
||||
return (klass->grab_key) (device_map, xwindow, keycode, modifiers, sync);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (klass->ungrab_key)
|
||||
(klass->ungrab_key) (device_map, xwindow, keycode, modifiers);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_map_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (!klass->grab_button)
|
||||
return FALSE;
|
||||
|
||||
return (klass->grab_button) (device_map, xwindow, n_button,
|
||||
modifiers, evmask, sync);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (klass->ungrab_button)
|
||||
(klass->ungrab_button) (device_map, xwindow, n_button, modifiers);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_grab_touch (MetaDeviceMap *device_map,
|
||||
Window xwindow)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (klass->grab_touch)
|
||||
(klass->grab_touch) (device_map, xwindow);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_ungrab_touch (MetaDeviceMap *device_map,
|
||||
Window xwindow)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (klass->ungrab_touch)
|
||||
(klass->ungrab_touch) (device_map, xwindow);
|
||||
}
|
124
src/core/device-pointer.c
Normal file
124
src/core/device-pointer.c
Normal file
@@ -0,0 +1,124 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Pointer device abstraction */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "device-pointer.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaDevicePointer,
|
||||
meta_device_pointer,
|
||||
META_TYPE_DEVICE)
|
||||
|
||||
static void
|
||||
meta_device_pointer_class_init (MetaDevicePointerClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_init (MetaDevicePointer *pointer)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_pointer_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
MetaDevicePointerClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_POINTER (pointer));
|
||||
g_return_if_fail (META_IS_SCREEN (screen));
|
||||
|
||||
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
|
||||
|
||||
if (klass->warp)
|
||||
(klass->warp) (pointer, screen, x, y);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_pointer_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaDevicePointerClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_POINTER (pointer));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
|
||||
|
||||
if (klass->set_window_cursor)
|
||||
(klass->set_window_cursor) (pointer, xwindow, cursor);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_pointer_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root_ret,
|
||||
Window *child_ret,
|
||||
gint *root_x_ret,
|
||||
gint *root_y_ret,
|
||||
gint *x_ret,
|
||||
gint *y_ret,
|
||||
guint *mask_ret)
|
||||
{
|
||||
MetaDevicePointerClass *klass;
|
||||
gint root_x, root_y, x, y;
|
||||
Window root, child;
|
||||
gboolean retval;
|
||||
guint mask;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_POINTER (pointer), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
|
||||
|
||||
if (!klass->query_position)
|
||||
return FALSE;
|
||||
|
||||
retval = (klass->query_position) (pointer, xwindow, &root, &child,
|
||||
&root_x, &root_y, &x, &y, &mask);
|
||||
|
||||
if (root_ret)
|
||||
*root_ret = root;
|
||||
|
||||
if (child_ret)
|
||||
*child_ret = child;
|
||||
|
||||
if (root_x_ret)
|
||||
*root_x_ret = root_x;
|
||||
|
||||
if (root_y_ret)
|
||||
*root_y_ret = root_y;
|
||||
|
||||
if (x_ret)
|
||||
*x_ret = x;
|
||||
|
||||
if (y_ret)
|
||||
*y_ret = y;
|
||||
|
||||
if (mask_ret)
|
||||
*mask_ret = mask;
|
||||
|
||||
return retval;
|
||||
}
|
95
src/core/device-pointer.h
Normal file
95
src/core/device-pointer.h
Normal file
@@ -0,0 +1,95 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-pointer.h Pointer device abstraction
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the internal abstraction of pointer devices so
|
||||
* XInput2/core events can be handled similarly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_POINTER_H
|
||||
#define META_DEVICE_POINTER_H
|
||||
|
||||
#include "display-private.h"
|
||||
#include <meta/screen.h>
|
||||
#include "device-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_POINTER (meta_device_pointer_get_type ())
|
||||
#define META_DEVICE_POINTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER, MetaDevicePointer))
|
||||
#define META_DEVICE_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER, MetaDevicePointerClass))
|
||||
#define META_IS_DEVICE_POINTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER))
|
||||
#define META_IS_DEVICE_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER))
|
||||
#define META_DEVICE_POINTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER, MetaDevicePointerClass))
|
||||
|
||||
typedef struct _MetaDevicePointer MetaDevicePointer;
|
||||
typedef struct _MetaDevicePointerClass MetaDevicePointerClass;
|
||||
|
||||
struct _MetaDevicePointer
|
||||
{
|
||||
MetaDevice parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDevicePointerClass
|
||||
{
|
||||
MetaDeviceClass parent_instance;
|
||||
|
||||
void (* warp) (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y);
|
||||
|
||||
void (* set_window_cursor) (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor);
|
||||
gboolean (* query_position) (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root,
|
||||
Window *child,
|
||||
gint *root_x,
|
||||
gint *root_y,
|
||||
gint *x,
|
||||
gint *y,
|
||||
guint *mask);
|
||||
};
|
||||
|
||||
GType meta_device_pointer_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void meta_device_pointer_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y);
|
||||
void meta_device_pointer_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor);
|
||||
|
||||
gboolean meta_device_pointer_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root,
|
||||
Window *child,
|
||||
gint *root_x,
|
||||
gint *root_y,
|
||||
gint *x,
|
||||
gint *y,
|
||||
guint *mask);
|
||||
|
||||
#endif /* META_DEVICE_POINTER_H */
|
80
src/core/device-private.h
Normal file
80
src/core/device-private.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device.h Input device abstraction
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the internal abstraction of input devices so
|
||||
* XInput2/core events can be handled similarly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_PRIVATE_H
|
||||
#define META_DEVICE_PRIVATE_H
|
||||
|
||||
#include <meta/device.h>
|
||||
#include "display-private.h"
|
||||
|
||||
struct _MetaDevice
|
||||
{
|
||||
GObject parent_instance;
|
||||
gpointer priv;
|
||||
};
|
||||
|
||||
struct _MetaDeviceClass
|
||||
{
|
||||
GObjectClass parent_instance;
|
||||
|
||||
void (* allow_events) (MetaDevice *device,
|
||||
int mode,
|
||||
Time time);
|
||||
|
||||
gboolean (* grab) (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time);
|
||||
void (* ungrab) (MetaDevice *device,
|
||||
Time time);
|
||||
};
|
||||
|
||||
GType meta_device_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void meta_device_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time);
|
||||
|
||||
gboolean meta_device_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time);
|
||||
void meta_device_ungrab (MetaDevice *device,
|
||||
Time time);
|
||||
|
||||
void meta_device_pair_devices (MetaDevice *device,
|
||||
MetaDevice *other_device);
|
||||
|
||||
#endif /* META_DEVICE_PRIVATE_H */
|
270
src/core/device.c
Normal file
270
src/core/device.c
Normal file
@@ -0,0 +1,270 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device abstraction */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "device-private.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaDevice, meta_device, G_TYPE_OBJECT)
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_DEVICE_ID,
|
||||
PROP_DISPLAY,
|
||||
PROP_PAIRED_DEVICE
|
||||
};
|
||||
|
||||
typedef struct MetaDevicePrivate MetaDevicePrivate;
|
||||
|
||||
struct MetaDevicePrivate
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaDevice *paired_device;
|
||||
gint device_id;
|
||||
};
|
||||
|
||||
static void
|
||||
meta_device_get_property (GObject *object,
|
||||
guint param_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DEVICE_ID:
|
||||
g_value_set_int (value,
|
||||
meta_device_get_id (META_DEVICE (object)));
|
||||
break;
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value,
|
||||
meta_device_get_display (META_DEVICE (object)));
|
||||
break;
|
||||
case PROP_PAIRED_DEVICE:
|
||||
g_value_set_object (value,
|
||||
meta_device_get_paired_device (META_DEVICE (object)));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_set_property (GObject *object,
|
||||
guint param_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaDevicePrivate *priv = META_DEVICE (object)->priv;
|
||||
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DEVICE_ID:
|
||||
priv->device_id = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_DISPLAY:
|
||||
priv->display = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_PAIRED_DEVICE:
|
||||
meta_device_pair_devices (META_DEVICE (object),
|
||||
g_value_get_object (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_class_init (MetaDeviceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = meta_device_get_property;
|
||||
object_class->set_property = meta_device_set_property;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DEVICE_ID,
|
||||
g_param_spec_int ("device-id",
|
||||
"Device ID",
|
||||
"Device ID",
|
||||
2, G_MAXINT, 2,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DISPLAY,
|
||||
g_param_spec_object ("display",
|
||||
"Display",
|
||||
"Display",
|
||||
META_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_PAIRED_DEVICE,
|
||||
g_param_spec_object ("paired-device",
|
||||
"Paired device",
|
||||
"Paired device",
|
||||
META_TYPE_DEVICE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaDevicePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_init (MetaDevice *device)
|
||||
{
|
||||
device->priv = G_TYPE_INSTANCE_GET_PRIVATE (device,
|
||||
META_TYPE_DEVICE,
|
||||
MetaDevicePrivate);
|
||||
}
|
||||
|
||||
int
|
||||
meta_device_get_id (MetaDevice *device)
|
||||
{
|
||||
MetaDevicePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), 0);
|
||||
|
||||
priv = device->priv;
|
||||
return priv->device_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_get_display:
|
||||
* @device: a #MetaDevice
|
||||
*
|
||||
* Returns the #MetaDisplay to which the device belongs
|
||||
*
|
||||
* Returns: (transfer none): the #MetaDisplay to which the device belongs
|
||||
**/
|
||||
MetaDisplay *
|
||||
meta_device_get_display (MetaDevice *device)
|
||||
{
|
||||
MetaDevicePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), NULL);
|
||||
|
||||
priv = device->priv;
|
||||
return priv->display;
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time)
|
||||
{
|
||||
MetaDeviceClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE (device));
|
||||
|
||||
klass = META_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (klass->allow_events)
|
||||
(klass->allow_events) (device, mode, time);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDeviceClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (!klass->grab)
|
||||
return FALSE;
|
||||
|
||||
return (klass->grab) (device, xwindow, evmask, cursor,
|
||||
owner_events, sync, time);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDeviceClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE (device));
|
||||
|
||||
klass = META_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (klass->ungrab)
|
||||
(klass->ungrab) (device, time);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_pair_devices (MetaDevice *device,
|
||||
MetaDevice *other_device)
|
||||
{
|
||||
MetaDevicePrivate *priv1, *priv2;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE (device));
|
||||
g_return_if_fail (META_IS_DEVICE (other_device));
|
||||
|
||||
priv1 = device->priv;
|
||||
priv2 = other_device->priv;
|
||||
|
||||
/* Consider safe multiple calls
|
||||
* on already paired devices
|
||||
*/
|
||||
if (priv1->paired_device != NULL &&
|
||||
priv2->paired_device != NULL &&
|
||||
priv1->paired_device == other_device &&
|
||||
priv2->paired_device == device)
|
||||
return;
|
||||
|
||||
g_return_if_fail (priv1->paired_device == NULL);
|
||||
g_return_if_fail (priv2->paired_device == NULL);
|
||||
|
||||
priv1->paired_device = g_object_ref (other_device);
|
||||
priv2->paired_device = g_object_ref (device);
|
||||
|
||||
g_object_notify (G_OBJECT (device), "paired-device");
|
||||
g_object_notify (G_OBJECT (other_device), "paired-device");
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_get_paired_device:
|
||||
* @device: a #MetaDevice
|
||||
*
|
||||
* Returns the paired device. Devices come in keyboard/pointer pairs.
|
||||
*
|
||||
* Returns: (transfer none): The paired device.
|
||||
**/
|
||||
MetaDevice *
|
||||
meta_device_get_paired_device (MetaDevice *device)
|
||||
{
|
||||
MetaDevicePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), NULL);
|
||||
|
||||
priv = device->priv;
|
||||
return priv->paired_device;
|
||||
}
|
256
src/core/devices-core.c
Normal file
256
src/core/devices-core.c
Normal file
@@ -0,0 +1,256 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Core input devices implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "screen-private.h"
|
||||
#include "devices-core.h"
|
||||
#include "device-map-private.h"
|
||||
|
||||
/* Common functions */
|
||||
static void
|
||||
meta_device_core_common_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
XAllowEvents (display->xdisplay, mode, time);
|
||||
}
|
||||
|
||||
/* Core pointer */
|
||||
|
||||
G_DEFINE_TYPE (MetaDevicePointerCore,
|
||||
meta_device_pointer_core,
|
||||
META_TYPE_DEVICE_POINTER)
|
||||
|
||||
static gboolean
|
||||
meta_device_pointer_core_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Cursor xcursor;
|
||||
int retval;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
retval = XGrabPointer (display->xdisplay,
|
||||
xwindow, owner_events,
|
||||
evmask,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
None, xcursor, time);
|
||||
|
||||
if (xcursor != None)
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
XUngrabPointer (display->xdisplay, time);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
XWarpPointer (display->xdisplay,
|
||||
None, screen->xroot,
|
||||
0, 0, 0, 0, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Cursor xcursor;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
XDefineCursor (display->xdisplay, xwindow, xcursor);
|
||||
|
||||
if (xcursor != None)
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_pointer_core_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root,
|
||||
Window *child,
|
||||
gint *root_x,
|
||||
gint *root_y,
|
||||
gint *x,
|
||||
gint *y,
|
||||
guint *mask)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
return XQueryPointer (display->xdisplay, xwindow,
|
||||
root, child, root_x, root_y,
|
||||
x, y, mask);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_class_init (MetaDevicePointerCoreClass *klass)
|
||||
{
|
||||
MetaDevicePointerClass *pointer_class = META_DEVICE_POINTER_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
device_class->allow_events = meta_device_core_common_allow_events;
|
||||
device_class->grab = meta_device_pointer_core_grab;
|
||||
device_class->ungrab = meta_device_pointer_core_ungrab;
|
||||
|
||||
pointer_class->warp = meta_device_pointer_core_warp;
|
||||
pointer_class->set_window_cursor = meta_device_pointer_core_set_window_cursor;
|
||||
pointer_class->query_position = meta_device_pointer_core_query_position;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_init (MetaDevicePointerCore *pointer)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_pointer_core_new (MetaDisplay *display)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_POINTER_CORE,
|
||||
"device-id", META_CORE_POINTER_ID,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
/* Core Keyboard */
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceKeyboardCore,
|
||||
meta_device_keyboard_core,
|
||||
META_TYPE_DEVICE_KEYBOARD)
|
||||
|
||||
static gboolean
|
||||
meta_device_keyboard_core_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
retval = XGrabKeyboard (display->xdisplay, xwindow, owner_events,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
time);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
XUngrabKeyboard (display->xdisplay, time);
|
||||
}
|
||||
|
||||
static Window
|
||||
meta_device_keyboard_core_get_focus_window (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Window xwindow;
|
||||
int unused;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
XGetInputFocus (display->xdisplay, &xwindow, &unused);
|
||||
|
||||
return xwindow;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
XSetInputFocus (display->xdisplay,
|
||||
xwindow,
|
||||
RevertToPointerRoot,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_class_init (MetaDeviceKeyboardCoreClass *klass)
|
||||
{
|
||||
MetaDeviceKeyboardClass *keyboard_class = META_DEVICE_KEYBOARD_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
keyboard_class->get_focus_window = meta_device_keyboard_core_get_focus_window;
|
||||
keyboard_class->set_focus_window = meta_device_keyboard_core_set_focus_window;
|
||||
|
||||
device_class->allow_events = meta_device_core_common_allow_events;
|
||||
device_class->grab = meta_device_keyboard_core_grab;
|
||||
device_class->ungrab = meta_device_keyboard_core_ungrab;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_init (MetaDeviceKeyboardCore *keyboard)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_keyboard_core_new (MetaDisplay *display)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_KEYBOARD_CORE,
|
||||
"device-id", META_CORE_KEYBOARD_ID,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
85
src/core/devices-core.h
Normal file
85
src/core/devices-core.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file devices-core.h Core input devices implementation
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the core X protocol implementation of input devices.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICES_CORE_H
|
||||
#define META_DEVICES_CORE_H
|
||||
|
||||
#include "device-pointer.h"
|
||||
#include "device-keyboard.h"
|
||||
|
||||
/* Pointer */
|
||||
#define META_TYPE_DEVICE_POINTER_CORE (meta_device_pointer_core_get_type ())
|
||||
#define META_DEVICE_POINTER_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCore))
|
||||
#define META_DEVICE_POINTER_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCoreClass))
|
||||
#define META_IS_DEVICE_POINTER_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER_CORE))
|
||||
#define META_IS_DEVICE_POINTER_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER_CORE))
|
||||
#define META_DEVICE_POINTER_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCoreClass))
|
||||
|
||||
typedef struct _MetaDevicePointerCore MetaDevicePointerCore;
|
||||
typedef struct _MetaDevicePointerCoreClass MetaDevicePointerCoreClass;
|
||||
|
||||
struct _MetaDevicePointerCore
|
||||
{
|
||||
MetaDevicePointer parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDevicePointerCoreClass
|
||||
{
|
||||
MetaDevicePointerClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_pointer_core_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_pointer_core_new (MetaDisplay *display);
|
||||
|
||||
/* Keyboard */
|
||||
#define META_TYPE_DEVICE_KEYBOARD_CORE (meta_device_keyboard_core_get_type ())
|
||||
#define META_DEVICE_KEYBOARD_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCore))
|
||||
#define META_DEVICE_KEYBOARD_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCoreClass))
|
||||
#define META_IS_DEVICE_KEYBOARD_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD_CORE))
|
||||
#define META_IS_DEVICE_KEYBOARD_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD_CORE))
|
||||
#define META_DEVICE_KEYBOARD_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCoreClass))
|
||||
|
||||
typedef struct _MetaDeviceKeyboardCore MetaDeviceKeyboardCore;
|
||||
typedef struct _MetaDeviceKeyboardCoreClass MetaDeviceKeyboardCoreClass;
|
||||
|
||||
struct _MetaDeviceKeyboardCore
|
||||
{
|
||||
MetaDeviceKeyboard parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceKeyboardCoreClass
|
||||
{
|
||||
MetaDeviceKeyboardClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_keyboard_core_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_keyboard_core_new (MetaDisplay *display);
|
||||
|
||||
#endif /* META_DEVICES_CORE_H */
|
353
src/core/devices-xi2.c
Normal file
353
src/core/devices-xi2.c
Normal file
@@ -0,0 +1,353 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* XInput2 devices implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "devices-xi2.h"
|
||||
#include "display-private.h"
|
||||
#include "screen-private.h"
|
||||
#include "input-events.h"
|
||||
#include <X11/extensions/XInput2.h>
|
||||
|
||||
/* Common functions */
|
||||
static void
|
||||
meta_device_xi2_common_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint device_id;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
device_id = meta_device_get_id (device);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case AsyncPointer:
|
||||
case AsyncKeyboard:
|
||||
mode = XIAsyncDevice;
|
||||
break;
|
||||
case SyncPointer:
|
||||
case SyncKeyboard:
|
||||
mode = XISyncDevice;
|
||||
break;
|
||||
case ReplayPointer:
|
||||
case ReplayKeyboard:
|
||||
mode = XIReplayDevice;
|
||||
break;
|
||||
case AsyncBoth:
|
||||
mode = XIAsyncPair;
|
||||
break;
|
||||
case SyncBoth:
|
||||
mode = XISyncPair;
|
||||
break;
|
||||
}
|
||||
|
||||
XIAllowEvents (display->xdisplay, device_id, mode, time);
|
||||
}
|
||||
|
||||
guchar *
|
||||
meta_device_xi2_translate_event_mask (guint evmask,
|
||||
gint *len)
|
||||
{
|
||||
guchar *mask;
|
||||
|
||||
*len = XIMaskLen (XI_LASTEVENT);
|
||||
mask = g_new0 (guchar, *len);
|
||||
|
||||
if (evmask & KeyPressMask)
|
||||
XISetMask (mask, XI_KeyPress);
|
||||
if (evmask & KeyReleaseMask)
|
||||
XISetMask (mask, XI_KeyRelease);
|
||||
if (evmask & ButtonPressMask)
|
||||
XISetMask (mask, XI_ButtonPress);
|
||||
if (evmask & ButtonReleaseMask)
|
||||
XISetMask (mask, XI_ButtonRelease);
|
||||
if (evmask & EnterWindowMask)
|
||||
XISetMask (mask, XI_Enter);
|
||||
if (evmask & LeaveWindowMask)
|
||||
XISetMask (mask, XI_Leave);
|
||||
|
||||
/* No motion hints in XI2 at the moment... */
|
||||
if (evmask & PointerMotionMask ||
|
||||
evmask & PointerMotionHintMask)
|
||||
XISetMask (mask, XI_Motion);
|
||||
|
||||
if (evmask & FocusChangeMask)
|
||||
{
|
||||
XISetMask (mask, XI_FocusIn);
|
||||
XISetMask (mask, XI_FocusOut);
|
||||
}
|
||||
|
||||
#ifdef HAVE_XTOUCH
|
||||
if (evmask & META_INPUT_TOUCH_EVENTS_MASK)
|
||||
{
|
||||
XISetMask (mask, XI_TouchBegin);
|
||||
XISetMask (mask, XI_TouchEnd);
|
||||
XISetMask (mask, XI_TouchUpdate);
|
||||
}
|
||||
#endif
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_xi2_common_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
XIEventMask mask;
|
||||
gint device_id, retval;
|
||||
Cursor xcursor;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
device_id = meta_device_get_id (device);
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
mask.deviceid = device_id;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (evmask, &mask.mask_len);
|
||||
|
||||
retval = XIGrabDevice (display->xdisplay,
|
||||
device_id, xwindow,
|
||||
time, xcursor,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
owner_events, &mask);
|
||||
|
||||
if (xcursor != None)
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_xi2_common_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint device_id;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
device_id = meta_device_get_id (device);
|
||||
|
||||
XIUngrabDevice (display->xdisplay, device_id, time);
|
||||
}
|
||||
|
||||
/* Pointer */
|
||||
|
||||
G_DEFINE_TYPE (MetaDevicePointerXI2,
|
||||
meta_device_pointer_xi2,
|
||||
META_TYPE_DEVICE_POINTER)
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
int device_id;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
device_id = meta_device_get_id (META_DEVICE (pointer));
|
||||
|
||||
XIWarpPointer (display->xdisplay,
|
||||
device_id,
|
||||
None, screen->xroot,
|
||||
0, 0, 0, 0, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Cursor xcursor;
|
||||
int device_id;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
device_id = meta_device_get_id (META_DEVICE (pointer));
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
if (xcursor != None)
|
||||
{
|
||||
XIDefineCursor (display->xdisplay, device_id, xwindow, xcursor);
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
}
|
||||
else
|
||||
XIUndefineCursor (display->xdisplay, device_id, xwindow);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_pointer_xi2_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root_ret,
|
||||
Window *child_ret,
|
||||
gint *root_x_ret,
|
||||
gint *root_y_ret,
|
||||
gint *x_ret,
|
||||
gint *y_ret,
|
||||
guint *mask_ret)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
XIModifierState mods;
|
||||
XIGroupState group_unused;
|
||||
XIButtonState buttons;
|
||||
gdouble root_x, root_y, x, y;
|
||||
int device_id;
|
||||
gboolean retval;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
device_id = meta_device_get_id (META_DEVICE (pointer));
|
||||
|
||||
retval = XIQueryPointer (display->xdisplay,
|
||||
device_id, xwindow,
|
||||
root_ret, child_ret,
|
||||
&root_x, &root_y, &x, &y,
|
||||
&buttons, &mods,
|
||||
&group_unused);
|
||||
if (mask_ret)
|
||||
{
|
||||
*mask_ret = mods.effective;
|
||||
|
||||
if (XIMaskIsSet (buttons.mask, 1))
|
||||
*mask_ret |= Button1Mask;
|
||||
else if (XIMaskIsSet (buttons.mask, 2))
|
||||
*mask_ret |= Button2Mask;
|
||||
else if (XIMaskIsSet (buttons.mask, 3))
|
||||
*mask_ret |= Button3Mask;
|
||||
}
|
||||
|
||||
if (root_x_ret)
|
||||
*root_x_ret = (int) root_x;
|
||||
|
||||
if (root_y_ret)
|
||||
*root_y_ret = (int) root_y;
|
||||
|
||||
if (x_ret)
|
||||
*x_ret = (int) x;
|
||||
|
||||
if (y_ret)
|
||||
*y_ret = (int) y;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_class_init (MetaDevicePointerXI2Class *klass)
|
||||
{
|
||||
MetaDevicePointerClass *pointer_class = META_DEVICE_POINTER_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
device_class->allow_events = meta_device_xi2_common_allow_events;
|
||||
device_class->grab = meta_device_xi2_common_grab;
|
||||
device_class->ungrab = meta_device_xi2_common_ungrab;
|
||||
|
||||
pointer_class->warp = meta_device_pointer_xi2_warp;
|
||||
pointer_class->set_window_cursor = meta_device_pointer_xi2_set_window_cursor;
|
||||
pointer_class->query_position = meta_device_pointer_xi2_query_position;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_init (MetaDevicePointerXI2 *pointer)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_pointer_xi2_new (MetaDisplay *display,
|
||||
gint device_id)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_POINTER_XI2,
|
||||
"device-id", device_id,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* Keyboard */
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceKeyboardXI2,
|
||||
meta_device_keyboard_xi2,
|
||||
META_TYPE_DEVICE_KEYBOARD)
|
||||
|
||||
static Window
|
||||
meta_device_keyboard_xi2_get_focus_window (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Window xwindow;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
XIGetFocus (display->xdisplay,
|
||||
meta_device_get_id (META_DEVICE (keyboard)),
|
||||
&xwindow);
|
||||
|
||||
return xwindow;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_xi2_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
|
||||
XISetFocus (display->xdisplay,
|
||||
meta_device_get_id (META_DEVICE (keyboard)),
|
||||
xwindow,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_xi2_class_init (MetaDeviceKeyboardXI2Class *klass)
|
||||
{
|
||||
MetaDeviceKeyboardClass *keyboard_class = META_DEVICE_KEYBOARD_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
keyboard_class->get_focus_window = meta_device_keyboard_xi2_get_focus_window;
|
||||
keyboard_class->set_focus_window = meta_device_keyboard_xi2_set_focus_window;
|
||||
|
||||
device_class->allow_events = meta_device_xi2_common_allow_events;
|
||||
device_class->grab = meta_device_xi2_common_grab;
|
||||
device_class->ungrab = meta_device_xi2_common_ungrab;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_xi2_init (MetaDeviceKeyboardXI2 *keyboard)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_keyboard_xi2_new (MetaDisplay *display,
|
||||
gint device_id)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_KEYBOARD_XI2,
|
||||
"device-id", device_id,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
92
src/core/devices-xi2.h
Normal file
92
src/core/devices-xi2.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file devices-xi2.h XInput2 input devices implementation
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the XInput2 implementation of input devices.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICES_XI2_H
|
||||
#define META_DEVICES_XI2_H
|
||||
|
||||
#include "device-pointer.h"
|
||||
#include "device-keyboard.h"
|
||||
|
||||
/* Pointer */
|
||||
#define META_TYPE_DEVICE_POINTER_XI2 (meta_device_pointer_xi2_get_type ())
|
||||
#define META_DEVICE_POINTER_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2))
|
||||
#define META_DEVICE_POINTER_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2Class))
|
||||
#define META_IS_DEVICE_POINTER_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER_XI2))
|
||||
#define META_IS_DEVICE_POINTER_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER_XI2))
|
||||
#define META_DEVICE_POINTER_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2Class))
|
||||
|
||||
typedef struct _MetaDevicePointerXI2 MetaDevicePointerXI2;
|
||||
typedef struct _MetaDevicePointerXI2Class MetaDevicePointerXI2Class;
|
||||
|
||||
struct _MetaDevicePointerXI2
|
||||
{
|
||||
MetaDevicePointer parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDevicePointerXI2Class
|
||||
{
|
||||
MetaDevicePointerClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_pointer_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_pointer_xi2_new (MetaDisplay *display,
|
||||
gint device_id);
|
||||
|
||||
/* Keyboard */
|
||||
#define META_TYPE_DEVICE_KEYBOARD_XI2 (meta_device_keyboard_xi2_get_type ())
|
||||
#define META_DEVICE_KEYBOARD_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2))
|
||||
#define META_DEVICE_KEYBOARD_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2Class))
|
||||
#define META_IS_DEVICE_KEYBOARD_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD_XI2))
|
||||
#define META_IS_DEVICE_KEYBOARD_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD_XI2))
|
||||
#define META_DEVICE_KEYBOARD_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2Class))
|
||||
|
||||
typedef struct _MetaDeviceKeyboardXI2 MetaDeviceKeyboardXI2;
|
||||
typedef struct _MetaDeviceKeyboardXI2Class MetaDeviceKeyboardXI2Class;
|
||||
|
||||
struct _MetaDeviceKeyboardXI2
|
||||
{
|
||||
MetaDeviceKeyboard parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceKeyboardXI2Class
|
||||
{
|
||||
MetaDeviceKeyboardClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_keyboard_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_keyboard_xi2_new (MetaDisplay *display,
|
||||
gint device_id);
|
||||
|
||||
/* Helper function for translating event masks */
|
||||
guchar * meta_device_xi2_translate_event_mask (guint evmask,
|
||||
gint *len);
|
||||
|
||||
|
||||
#endif /* META_DEVICES_XI2_H */
|
@@ -38,6 +38,7 @@
|
||||
#include <meta/boxes.h>
|
||||
#include <meta/display.h>
|
||||
#include "keybindings-private.h"
|
||||
#include "device-map-private.h"
|
||||
#include <meta/prefs.h>
|
||||
|
||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||
@@ -56,6 +57,10 @@ typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
|
||||
|
||||
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
||||
|
||||
typedef struct _MetaGrabInfo MetaGrabInfo;
|
||||
typedef struct _MetaFocusInfo MetaFocusInfo;
|
||||
typedef struct _MetaTouchInfo MetaTouchInfo;
|
||||
|
||||
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
guint32 timestamp,
|
||||
@@ -86,6 +91,78 @@ typedef enum {
|
||||
META_TILE_MAXIMIZED
|
||||
} MetaTileMode;
|
||||
|
||||
struct _MetaGrabInfo
|
||||
{
|
||||
MetaDevice *grab_pointer;
|
||||
MetaDevice *grab_keyboard;
|
||||
|
||||
MetaGrabOp grab_op;
|
||||
MetaScreen *grab_screen;
|
||||
MetaWindow *grab_window;
|
||||
Window grab_xwindow;
|
||||
int grab_button;
|
||||
int grab_anchor_root_x;
|
||||
int grab_anchor_root_y;
|
||||
MetaRectangle grab_anchor_window_pos;
|
||||
MetaTileMode grab_tile_mode;
|
||||
int grab_tile_monitor_number;
|
||||
int grab_latest_motion_x;
|
||||
int grab_latest_motion_y;
|
||||
gulong grab_mask;
|
||||
guint grab_have_pointer : 1;
|
||||
guint grab_have_keyboard : 1;
|
||||
guint grab_frame_action : 1;
|
||||
/* During a resize operation, the directions in which we've broken
|
||||
* out of the initial maximization state */
|
||||
guint grab_resize_unmaximize : 2; /* MetaMaximizeFlags */
|
||||
MetaRectangle grab_initial_window_pos;
|
||||
int grab_initial_x, grab_initial_y; /* These are only relevant for */
|
||||
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
|
||||
MetaResizePopup *grab_resize_popup;
|
||||
GTimeVal grab_last_moveresize_time;
|
||||
guint32 grab_motion_notify_time;
|
||||
GList* grab_old_window_stacking;
|
||||
unsigned int grab_last_user_action_was_snap;
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
XSyncAlarm grab_sync_request_alarm;
|
||||
#endif
|
||||
int grab_resize_timeout_id;
|
||||
};
|
||||
|
||||
struct _MetaFocusInfo
|
||||
{
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for or the current focus
|
||||
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||
* perfect because applications can call XSetInputFocus directly.
|
||||
* (It could also be messed up if a timestamp later than current
|
||||
* time is sent to meta_display_set_input_focus_window, though that
|
||||
* would be a programming error). See bug 154598 for more info.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
|
||||
/* last timestamp passed to XSetInputFocus */
|
||||
guint32 last_focus_time;
|
||||
};
|
||||
|
||||
struct _MetaTouchInfo
|
||||
{
|
||||
gdouble root_x;
|
||||
gdouble root_y;
|
||||
|
||||
gdouble initial_root_x;
|
||||
gdouble initial_root_y;
|
||||
|
||||
guint notified : 1;
|
||||
guint use_for_hotspot : 1;
|
||||
};
|
||||
|
||||
struct _MetaDisplay
|
||||
{
|
||||
GObject parent_instance;
|
||||
@@ -104,22 +181,8 @@ struct _MetaDisplay
|
||||
#include <meta/atomnames.h>
|
||||
#undef item
|
||||
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for or the current focus
|
||||
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||
* perfect because applications can call XSetInputFocus directly.
|
||||
* (It could also be messed up if a timestamp later than current
|
||||
* time is sent to meta_display_set_input_focus_window, though that
|
||||
* would be a programming error). See bug 154598 for more info.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
|
||||
/* last timestamp passed to XSetInputFocus */
|
||||
guint32 last_focus_time;
|
||||
/* keyboard -> MetaFocusInfo hashtable */
|
||||
GHashTable *focus_info;
|
||||
|
||||
/* last user interaction time in any app */
|
||||
guint32 last_user_time;
|
||||
@@ -179,34 +242,11 @@ struct _MetaDisplay
|
||||
/* Alt+click button grabs */
|
||||
unsigned int window_grab_modifiers;
|
||||
|
||||
/* current window operation */
|
||||
MetaGrabOp grab_op;
|
||||
MetaScreen *grab_screen;
|
||||
MetaWindow *grab_window;
|
||||
Window grab_xwindow;
|
||||
int grab_button;
|
||||
int grab_anchor_root_x;
|
||||
int grab_anchor_root_y;
|
||||
MetaRectangle grab_anchor_window_pos;
|
||||
MetaTileMode grab_tile_mode;
|
||||
int grab_latest_motion_x;
|
||||
int grab_latest_motion_y;
|
||||
gulong grab_mask;
|
||||
guint grab_have_pointer : 1;
|
||||
guint grab_have_keyboard : 1;
|
||||
guint grab_frame_action : 1;
|
||||
/* During a resize operation, the directions in which we've broken
|
||||
* out of the initial maximization state */
|
||||
guint grab_resize_unmaximize : 2; /* MetaMaximizeFlags */
|
||||
MetaRectangle grab_initial_window_pos;
|
||||
int grab_initial_x, grab_initial_y; /* These are only relevant for */
|
||||
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
|
||||
MetaResizePopup *grab_resize_popup;
|
||||
GTimeVal grab_last_moveresize_time;
|
||||
guint32 grab_motion_notify_time;
|
||||
GList* grab_old_window_stacking;
|
||||
MetaEdgeResistanceData *grab_edge_resistance_data;
|
||||
unsigned int grab_last_user_action_was_snap;
|
||||
/* per-device current window operation */
|
||||
GHashTable *current_grabs;
|
||||
|
||||
/* per-screen edge resistance cache */
|
||||
GHashTable *edge_resistance_info;
|
||||
|
||||
/* we use property updates as sentinels for certain window focus events
|
||||
* to avoid some race conditions on EnterNotify events
|
||||
@@ -217,11 +257,6 @@ struct _MetaDisplay
|
||||
int xkb_base_event_type;
|
||||
guint32 last_bell_time;
|
||||
#endif
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
XSyncAlarm grab_sync_request_alarm;
|
||||
#endif
|
||||
int grab_resize_timeout_id;
|
||||
|
||||
/* Keybindings stuff */
|
||||
MetaKeyBinding *key_bindings;
|
||||
@@ -268,6 +303,9 @@ struct _MetaDisplay
|
||||
/* Managed by compositor.c */
|
||||
MetaCompositor *compositor;
|
||||
|
||||
/* Managed by device-map.c */
|
||||
MetaDeviceMap *device_map;
|
||||
|
||||
int render_event_base;
|
||||
int render_error_base;
|
||||
|
||||
@@ -291,6 +329,15 @@ struct _MetaDisplay
|
||||
int shape_event_base;
|
||||
int shape_error_base;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
int xinput2_opcode;
|
||||
unsigned int have_xinput2 : 1;
|
||||
#ifdef HAVE_XTOUCH
|
||||
unsigned int have_xtouch : 1;
|
||||
#endif /* HAVE_XTOUCH */
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
unsigned int have_xsync : 1;
|
||||
#define META_DISPLAY_HAS_XSYNC(display) ((display)->have_xsync)
|
||||
@@ -343,10 +390,6 @@ MetaScreen* meta_display_screen_for_xwindow (MetaDisplay *display,
|
||||
void meta_display_grab (MetaDisplay *display);
|
||||
void meta_display_ungrab (MetaDisplay *display);
|
||||
|
||||
void meta_display_unmanage_screen (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_display_unmanage_windows_for_screen (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
guint32 timestamp);
|
||||
@@ -380,18 +423,24 @@ Cursor meta_display_create_x_cursor (MetaDisplay *display,
|
||||
|
||||
void meta_display_set_grab_op_cursor (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaDevice *device,
|
||||
MetaGrabOp op,
|
||||
gboolean change_pointer,
|
||||
Window grab_xwindow,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_display_check_threshold_reached (MetaDisplay *display,
|
||||
MetaDevice *device,
|
||||
int x,
|
||||
int y);
|
||||
void meta_display_grab_window_buttons (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
void meta_display_ungrab_window_buttons (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
void meta_display_grab_window_touches (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
void meta_display_ungrab_window_touches (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
|
||||
void meta_display_grab_focus_window_button (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
@@ -399,7 +448,8 @@ void meta_display_ungrab_focus_window_button (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
|
||||
/* Next function is defined in edge-resistance.c */
|
||||
void meta_display_cleanup_edges (MetaDisplay *display);
|
||||
void meta_display_cleanup_edges (MetaDisplay *display,
|
||||
MetaScreen *screen);
|
||||
|
||||
/* make a request to ensure the event serial has changed */
|
||||
void meta_display_increment_event_serial (MetaDisplay *display);
|
||||
@@ -447,4 +497,15 @@ void meta_display_overlay_key_activate (MetaDisplay *display);
|
||||
/* In above-tab-keycode.c */
|
||||
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
||||
|
||||
MetaGrabInfo * meta_display_create_grab_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
void meta_display_remove_grab_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
|
||||
MetaGrabInfo * meta_display_get_grab_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
MetaFocusInfo * meta_display_get_focus_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
|
||||
|
||||
#endif
|
||||
|
2990
src/core/display.c
2990
src/core/display.c
File diff suppressed because it is too large
Load Diff
@@ -30,12 +30,12 @@
|
||||
/* A simple macro for whether a given window's edges are potentially
|
||||
* relevant for resistance/snapping during a move/resize operation
|
||||
*/
|
||||
#define WINDOW_EDGES_RELEVANT(window, display) \
|
||||
meta_window_should_be_showing (window) && \
|
||||
window->screen == display->grab_screen && \
|
||||
window != display->grab_window && \
|
||||
window->type != META_WINDOW_DESKTOP && \
|
||||
window->type != META_WINDOW_MENU && \
|
||||
#define WINDOW_EDGES_RELEVANT(window, display, screen) \
|
||||
meta_window_should_be_showing (window) && \
|
||||
window->screen == screen && \
|
||||
window->cur_grab == NULL && \
|
||||
window->type != META_WINDOW_DESKTOP && \
|
||||
window->type != META_WINDOW_MENU && \
|
||||
window->type != META_WINDOW_SPLASHSCREEN
|
||||
|
||||
struct ResistanceDataForAnEdge
|
||||
@@ -44,8 +44,9 @@ struct ResistanceDataForAnEdge
|
||||
guint timeout_id;
|
||||
int timeout_edge_pos;
|
||||
gboolean timeout_over;
|
||||
GSourceFunc timeout_func;
|
||||
MetaEdgeResistanceFunc timeout_func;
|
||||
MetaWindow *window;
|
||||
MetaDevice *device;
|
||||
int keyboard_buildup;
|
||||
};
|
||||
typedef struct ResistanceDataForAnEdge ResistanceDataForAnEdge;
|
||||
@@ -63,7 +64,9 @@ struct MetaEdgeResistanceData
|
||||
ResistanceDataForAnEdge bottom_data;
|
||||
};
|
||||
|
||||
static void compute_resistance_and_snapping_edges (MetaDisplay *display);
|
||||
static MetaEdgeResistanceData *
|
||||
compute_resistance_and_snapping_edges (MetaDisplay *display,
|
||||
MetaScreen *screen);
|
||||
|
||||
/* !WARNING!: this function can return invalid indices (namely, either -1 or
|
||||
* edges->len); this is by design, but you need to remember this.
|
||||
@@ -318,20 +321,22 @@ edge_resistance_timeout (gpointer data)
|
||||
|
||||
resistance_data->timeout_over = TRUE;
|
||||
resistance_data->timeout_id = 0;
|
||||
(*resistance_data->timeout_func)(resistance_data->window);
|
||||
(*resistance_data->timeout_func) (resistance_data->window,
|
||||
resistance_data->device);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int
|
||||
apply_edge_resistance (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
int old_pos,
|
||||
int new_pos,
|
||||
const MetaRectangle *old_rect,
|
||||
const MetaRectangle *new_rect,
|
||||
GArray *edges,
|
||||
ResistanceDataForAnEdge *resistance_data,
|
||||
GSourceFunc timeout_func,
|
||||
MetaEdgeResistanceFunc timeout_func,
|
||||
gboolean xdir,
|
||||
gboolean keyboard_op)
|
||||
{
|
||||
@@ -445,6 +450,7 @@ apply_edge_resistance (MetaWindow *window,
|
||||
resistance_data->timeout_over = FALSE;
|
||||
resistance_data->timeout_func = timeout_func;
|
||||
resistance_data->window = window;
|
||||
resistance_data->device = device;
|
||||
}
|
||||
if (!resistance_data->timeout_over &&
|
||||
timeout_length_ms != 0)
|
||||
@@ -533,29 +539,28 @@ apply_edge_snapping (int old_pos,
|
||||
* a proposed new position (ignoring edge resistance/snapping), and then
|
||||
* applies edge resistance to EACH edge (separately) updating new_outer.
|
||||
* It returns true if new_outer is modified, false otherwise.
|
||||
*
|
||||
* display->grab_edge_resistance_data MUST already be setup or calling this
|
||||
* function will cause a crash.
|
||||
*/
|
||||
static gboolean
|
||||
apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
const MetaRectangle *old_outer,
|
||||
MetaRectangle *new_outer,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean auto_snap,
|
||||
gboolean keyboard_op,
|
||||
gboolean is_resize)
|
||||
apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
const MetaRectangle *old_outer,
|
||||
MetaRectangle *new_outer,
|
||||
MetaEdgeResistanceFunc timeout_func,
|
||||
gboolean auto_snap,
|
||||
gboolean keyboard_op,
|
||||
gboolean is_resize)
|
||||
{
|
||||
MetaEdgeResistanceData *edge_data;
|
||||
MetaRectangle modified_rect;
|
||||
gboolean modified;
|
||||
int new_left, new_right, new_top, new_bottom;
|
||||
|
||||
if (display->grab_edge_resistance_data == NULL)
|
||||
compute_resistance_and_snapping_edges (display);
|
||||
edge_data = g_hash_table_lookup (display->edge_resistance_info,
|
||||
window->screen);
|
||||
|
||||
edge_data = display->grab_edge_resistance_data;
|
||||
if (!edge_data)
|
||||
edge_data = compute_resistance_and_snapping_edges (display, window->screen);
|
||||
|
||||
if (auto_snap)
|
||||
{
|
||||
@@ -601,7 +606,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
if (!is_resize || window->size_hints.width_inc == 1)
|
||||
{
|
||||
/* Now, apply the normal horizontal edge resistance */
|
||||
new_left = apply_edge_resistance (window,
|
||||
new_left = apply_edge_resistance (window, device,
|
||||
BOX_LEFT (*old_outer),
|
||||
BOX_LEFT (*new_outer),
|
||||
old_outer,
|
||||
@@ -611,7 +616,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
timeout_func,
|
||||
TRUE,
|
||||
keyboard_op);
|
||||
new_right = apply_edge_resistance (window,
|
||||
new_right = apply_edge_resistance (window, device,
|
||||
BOX_RIGHT (*old_outer),
|
||||
BOX_RIGHT (*new_outer),
|
||||
old_outer,
|
||||
@@ -630,7 +635,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
/* Same for vertical resizes... */
|
||||
if (!is_resize || window->size_hints.height_inc == 1)
|
||||
{
|
||||
new_top = apply_edge_resistance (window,
|
||||
new_top = apply_edge_resistance (window, device,
|
||||
BOX_TOP (*old_outer),
|
||||
BOX_TOP (*new_outer),
|
||||
old_outer,
|
||||
@@ -640,7 +645,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
timeout_func,
|
||||
FALSE,
|
||||
keyboard_op);
|
||||
new_bottom = apply_edge_resistance (window,
|
||||
new_bottom = apply_edge_resistance (window, device,
|
||||
BOX_BOTTOM (*old_outer),
|
||||
BOX_BOTTOM (*new_outer),
|
||||
old_outer,
|
||||
@@ -669,15 +674,20 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_cleanup_edges (MetaDisplay *display)
|
||||
meta_display_cleanup_edges (MetaDisplay *display,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
guint i,j;
|
||||
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;
|
||||
MetaEdgeResistanceData *edge_data;
|
||||
GHashTable *edges_to_be_freed;
|
||||
|
||||
edge_data = g_hash_table_lookup (display->edge_resistance_info, screen);
|
||||
|
||||
if (edge_data == NULL) /* Not currently cached */
|
||||
return;
|
||||
|
||||
g_hash_table_steal (display->edge_resistance_info, screen);
|
||||
|
||||
/* We first need to clean out any window edges */
|
||||
edges_to_be_freed = g_hash_table_new_full (g_direct_hash, g_direct_equal,
|
||||
g_free, NULL);
|
||||
@@ -750,8 +760,7 @@ meta_display_cleanup_edges (MetaDisplay *display)
|
||||
edge_data->bottom_data.timeout_id != 0)
|
||||
g_source_remove (edge_data->bottom_data.timeout_id);
|
||||
|
||||
g_free (display->grab_edge_resistance_data);
|
||||
display->grab_edge_resistance_data = NULL;
|
||||
g_free (edge_data);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -763,8 +772,9 @@ stupid_sort_requiring_extra_pointer_dereference (gconstpointer a,
|
||||
return meta_rectangle_edge_cmp_ignore_type (*a_edge, *b_edge);
|
||||
}
|
||||
|
||||
static void
|
||||
static MetaEdgeResistanceData *
|
||||
cache_edges (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
GList *window_edges,
|
||||
GList *monitor_edges,
|
||||
GList *screen_edges)
|
||||
@@ -848,9 +858,8 @@ cache_edges (MetaDisplay *display,
|
||||
/*
|
||||
* 2nd: Allocate the edges
|
||||
*/
|
||||
g_assert (display->grab_edge_resistance_data == NULL);
|
||||
display->grab_edge_resistance_data = g_new0 (MetaEdgeResistanceData, 1);
|
||||
edge_data = display->grab_edge_resistance_data;
|
||||
edge_data = g_new0 (MetaEdgeResistanceData, 1);
|
||||
|
||||
edge_data->left_edges = g_array_sized_new (FALSE,
|
||||
FALSE,
|
||||
sizeof(MetaEdge*),
|
||||
@@ -917,21 +926,21 @@ cache_edges (MetaDisplay *display,
|
||||
* avoided this sort by sticking them into the array with some simple
|
||||
* merging of the lists).
|
||||
*/
|
||||
g_array_sort (display->grab_edge_resistance_data->left_edges,
|
||||
g_array_sort (edge_data->left_edges,
|
||||
stupid_sort_requiring_extra_pointer_dereference);
|
||||
g_array_sort (display->grab_edge_resistance_data->right_edges,
|
||||
g_array_sort (edge_data->right_edges,
|
||||
stupid_sort_requiring_extra_pointer_dereference);
|
||||
g_array_sort (display->grab_edge_resistance_data->top_edges,
|
||||
g_array_sort (edge_data->top_edges,
|
||||
stupid_sort_requiring_extra_pointer_dereference);
|
||||
g_array_sort (display->grab_edge_resistance_data->bottom_edges,
|
||||
g_array_sort (edge_data->bottom_edges,
|
||||
stupid_sort_requiring_extra_pointer_dereference);
|
||||
|
||||
return edge_data;
|
||||
}
|
||||
|
||||
static void
|
||||
initialize_grab_edge_resistance_data (MetaDisplay *display)
|
||||
initialize_grab_edge_resistance_data (MetaEdgeResistanceData *edge_data)
|
||||
{
|
||||
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;
|
||||
|
||||
edge_data->left_data.timeout_setup = FALSE;
|
||||
edge_data->right_data.timeout_setup = FALSE;
|
||||
edge_data->top_data.timeout_setup = FALSE;
|
||||
@@ -943,8 +952,9 @@ initialize_grab_edge_resistance_data (MetaDisplay *display)
|
||||
edge_data->bottom_data.keyboard_buildup = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
compute_resistance_and_snapping_edges (MetaDisplay *display)
|
||||
static MetaEdgeResistanceData *
|
||||
compute_resistance_and_snapping_edges (MetaDisplay *display,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
GList *stacked_windows;
|
||||
GList *cur_window_iter;
|
||||
@@ -956,18 +966,17 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
||||
* in the layer that we are working on
|
||||
*/
|
||||
GSList *rem_windows, *rem_win_stacking;
|
||||
MetaEdgeResistanceData *edge_data;
|
||||
|
||||
g_assert (display->grab_window != NULL);
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Computing edges to resist-movement or snap-to for %s.\n",
|
||||
display->grab_window->desc);
|
||||
"Computing edges to resist-movement or snap-to for screen %s.\n",
|
||||
screen->screen_name);
|
||||
|
||||
/*
|
||||
* 1st: Get the list of relevant windows, from bottom to top
|
||||
*/
|
||||
stacked_windows =
|
||||
meta_stack_list_windows (display->grab_screen->stack,
|
||||
display->grab_screen->active_workspace);
|
||||
meta_stack_list_windows (screen->stack, screen->active_workspace);
|
||||
|
||||
/*
|
||||
* 2nd: we need to separate that stacked list into a list of windows that
|
||||
@@ -981,7 +990,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
||||
while (cur_window_iter != NULL)
|
||||
{
|
||||
MetaWindow *cur_window = cur_window_iter->data;
|
||||
if (WINDOW_EDGES_RELEVANT (cur_window, display))
|
||||
if (WINDOW_EDGES_RELEVANT (cur_window, display, screen))
|
||||
{
|
||||
MetaRectangle *new_rect;
|
||||
new_rect = g_new (MetaRectangle, 1);
|
||||
@@ -1016,7 +1025,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
||||
* resistance (note that dock edges are considered screen edges
|
||||
* which are handled separately
|
||||
*/
|
||||
if (WINDOW_EDGES_RELEVANT (cur_window, display) &&
|
||||
if (WINDOW_EDGES_RELEVANT (cur_window, display, screen) &&
|
||||
cur_window->type != META_WINDOW_DOCK)
|
||||
{
|
||||
GList *new_edges;
|
||||
@@ -1028,7 +1037,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
||||
* by other windows or DOCKS, but that's handled below).
|
||||
*/
|
||||
meta_rectangle_intersect (&cur_rect,
|
||||
&display->grab_screen->rect,
|
||||
&screen->rect,
|
||||
&reduced);
|
||||
|
||||
new_edges = NULL;
|
||||
@@ -1123,32 +1132,36 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
||||
* monitor edges in an array for quick access. Free the edges since
|
||||
* they've been cached elsewhere.
|
||||
*/
|
||||
cache_edges (display,
|
||||
edges,
|
||||
display->grab_screen->active_workspace->monitor_edges,
|
||||
display->grab_screen->active_workspace->screen_edges);
|
||||
edge_data = cache_edges (display, screen,
|
||||
edges,
|
||||
screen->active_workspace->monitor_edges,
|
||||
screen->active_workspace->screen_edges);
|
||||
g_list_free (edges);
|
||||
|
||||
/*
|
||||
* 6th: Initialize the resistance timeouts and buildups
|
||||
*/
|
||||
initialize_grab_edge_resistance_data (display);
|
||||
initialize_grab_edge_resistance_data (edge_data);
|
||||
|
||||
return edge_data;
|
||||
}
|
||||
|
||||
/* Note that old_[xy] and new_[xy] are with respect to inner positions of
|
||||
* the window.
|
||||
*/
|
||||
void
|
||||
meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
int old_x,
|
||||
int old_y,
|
||||
int *new_x,
|
||||
int *new_y,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op)
|
||||
meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
int old_x,
|
||||
int old_y,
|
||||
int *new_x,
|
||||
int *new_y,
|
||||
MetaEdgeResistanceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op)
|
||||
{
|
||||
MetaRectangle old_outer, proposed_outer, new_outer;
|
||||
MetaGrabInfo *grab_info;
|
||||
gboolean is_resize;
|
||||
|
||||
meta_window_get_outer_rect (window, &old_outer);
|
||||
@@ -1158,10 +1171,14 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
proposed_outer.y += (*new_y - old_y);
|
||||
new_outer = proposed_outer;
|
||||
|
||||
window->display->grab_last_user_action_was_snap = snap;
|
||||
grab_info = meta_display_get_grab_info (window->display, device);
|
||||
g_assert (grab_info != NULL);
|
||||
|
||||
grab_info->grab_last_user_action_was_snap = snap;
|
||||
is_resize = FALSE;
|
||||
if (apply_edge_resistance_to_each_side (window->display,
|
||||
window,
|
||||
device,
|
||||
&old_outer,
|
||||
&new_outer,
|
||||
timeout_func,
|
||||
@@ -1223,18 +1240,20 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
* sizes of the inner window.
|
||||
*/
|
||||
void
|
||||
meta_window_edge_resistance_for_resize (MetaWindow *window,
|
||||
int old_width,
|
||||
int old_height,
|
||||
int *new_width,
|
||||
int *new_height,
|
||||
int gravity,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op)
|
||||
meta_window_edge_resistance_for_resize (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
int old_width,
|
||||
int old_height,
|
||||
int *new_width,
|
||||
int *new_height,
|
||||
int gravity,
|
||||
MetaEdgeResistanceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op)
|
||||
{
|
||||
MetaRectangle old_outer, new_outer;
|
||||
int proposed_outer_width, proposed_outer_height;
|
||||
MetaGrabInfo *grab_info;
|
||||
gboolean is_resize;
|
||||
|
||||
meta_window_get_outer_rect (window, &old_outer);
|
||||
@@ -1246,10 +1265,14 @@ meta_window_edge_resistance_for_resize (MetaWindow *window,
|
||||
proposed_outer_width,
|
||||
proposed_outer_height);
|
||||
|
||||
window->display->grab_last_user_action_was_snap = snap;
|
||||
grab_info = meta_display_get_grab_info (window->display, device);
|
||||
g_assert (grab_info != NULL);
|
||||
|
||||
grab_info->grab_last_user_action_was_snap = snap;
|
||||
is_resize = TRUE;
|
||||
if (apply_edge_resistance_to_each_side (window->display,
|
||||
window,
|
||||
device,
|
||||
&old_outer,
|
||||
&new_outer,
|
||||
timeout_func,
|
||||
|
@@ -26,23 +26,28 @@
|
||||
|
||||
#include "window-private.h"
|
||||
|
||||
void meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
int old_x,
|
||||
int old_y,
|
||||
int *new_x,
|
||||
int *new_y,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op);
|
||||
void meta_window_edge_resistance_for_resize (MetaWindow *window,
|
||||
int old_width,
|
||||
int old_height,
|
||||
int *new_width,
|
||||
int *new_height,
|
||||
int gravity,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op);
|
||||
typedef gboolean (* MetaEdgeResistanceFunc) (MetaWindow *window,
|
||||
MetaDevice *device);
|
||||
|
||||
void meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
int old_x,
|
||||
int old_y,
|
||||
int *new_x,
|
||||
int *new_y,
|
||||
MetaEdgeResistanceFunc func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op);
|
||||
void meta_window_edge_resistance_for_resize (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
int old_width,
|
||||
int old_height,
|
||||
int *new_width,
|
||||
int *new_height,
|
||||
int gravity,
|
||||
MetaEdgeResistanceFunc func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op);
|
||||
|
||||
#endif /* META_EDGE_RESISTANCE_H */
|
||||
|
||||
|
@@ -28,6 +28,7 @@
|
||||
#include "bell.h"
|
||||
#include <meta/errors.h>
|
||||
#include "keybindings-private.h"
|
||||
#include "device-pointer.h"
|
||||
|
||||
#include <X11/extensions/Xrender.h>
|
||||
|
||||
@@ -64,7 +65,7 @@ meta_window_ensure_frame (MetaWindow *window)
|
||||
frame->child_y = 0;
|
||||
frame->bottom_height = 0;
|
||||
frame->right_width = 0;
|
||||
frame->current_cursor = 0;
|
||||
frame->cursors = g_hash_table_new (NULL, NULL);
|
||||
|
||||
frame->mapped = FALSE;
|
||||
frame->is_flashing = FALSE;
|
||||
@@ -173,6 +174,7 @@ void
|
||||
meta_window_destroy_frame (MetaWindow *window)
|
||||
{
|
||||
MetaFrame *frame;
|
||||
MetaFrameBorders borders;
|
||||
|
||||
if (window->frame == NULL)
|
||||
return;
|
||||
@@ -180,6 +182,8 @@ meta_window_destroy_frame (MetaWindow *window)
|
||||
meta_verbose ("Unframing window %s\n", window->desc);
|
||||
|
||||
frame = window->frame;
|
||||
|
||||
meta_frame_calc_borders (frame, &borders);
|
||||
|
||||
meta_bell_notify_frame_destroy (frame);
|
||||
|
||||
@@ -207,8 +211,8 @@ meta_window_destroy_frame (MetaWindow *window)
|
||||
* coordinates here means we'll need to ensure a configure
|
||||
* notify event is sent; see bug 399552.
|
||||
*/
|
||||
window->frame->rect.x,
|
||||
window->frame->rect.y);
|
||||
window->frame->rect.x + borders.invisible.left,
|
||||
window->frame->rect.y + borders.invisible.top);
|
||||
meta_error_trap_pop (window->display);
|
||||
|
||||
meta_ui_destroy_frame_window (window->screen->ui, frame->xwindow);
|
||||
@@ -217,12 +221,18 @@ meta_window_destroy_frame (MetaWindow *window)
|
||||
frame->xwindow);
|
||||
|
||||
window->frame = NULL;
|
||||
if (window->frame_bounds)
|
||||
{
|
||||
cairo_region_destroy (window->frame_bounds);
|
||||
window->frame_bounds = NULL;
|
||||
}
|
||||
|
||||
/* Move keybindings to window instead of frame */
|
||||
meta_window_grab_keys (window);
|
||||
|
||||
|
||||
g_hash_table_destroy (frame->cursors);
|
||||
g_free (frame);
|
||||
|
||||
|
||||
/* Put our state back where it should be */
|
||||
meta_window_queue (window, META_QUEUE_CALC_SHOWING);
|
||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||
@@ -236,6 +246,12 @@ meta_frame_get_flags (MetaFrame *frame)
|
||||
|
||||
flags = 0;
|
||||
|
||||
/* Disallow frame operations
|
||||
* while the popup menu is open.
|
||||
*/
|
||||
if (frame->window->menu)
|
||||
return flags;
|
||||
|
||||
if (frame->window->border_only)
|
||||
{
|
||||
; /* FIXME this may disable the _function_ as well as decor
|
||||
@@ -369,8 +385,7 @@ meta_frame_sync_to_window (MetaFrame *frame,
|
||||
/* If we're interactively resizing the frame, repaint
|
||||
* it immediately so we don't start to lag.
|
||||
*/
|
||||
if (frame->window->display->grab_window ==
|
||||
frame->window)
|
||||
if (frame->window->cur_grab != NULL)
|
||||
meta_ui_repaint_frame (frame->window->screen->ui,
|
||||
frame->xwindow);
|
||||
}
|
||||
@@ -395,22 +410,22 @@ meta_frame_queue_draw (MetaFrame *frame)
|
||||
}
|
||||
|
||||
void
|
||||
meta_frame_set_screen_cursor (MetaFrame *frame,
|
||||
MetaCursor cursor)
|
||||
meta_frame_set_screen_cursor (MetaFrame *frame,
|
||||
MetaDevice *pointer,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
Cursor xcursor;
|
||||
if (cursor == frame->current_cursor)
|
||||
MetaCursor old_cursor;
|
||||
|
||||
old_cursor = GPOINTER_TO_UINT (g_hash_table_lookup (frame->cursors, pointer));
|
||||
|
||||
if (cursor == old_cursor)
|
||||
return;
|
||||
frame->current_cursor = cursor;
|
||||
if (cursor == META_CURSOR_DEFAULT)
|
||||
XUndefineCursor (frame->window->display->xdisplay, frame->xwindow);
|
||||
else
|
||||
{
|
||||
xcursor = meta_display_create_x_cursor (frame->window->display, cursor);
|
||||
XDefineCursor (frame->window->display->xdisplay, frame->xwindow, xcursor);
|
||||
XFlush (frame->window->display->xdisplay);
|
||||
XFreeCursor (frame->window->display->xdisplay, xcursor);
|
||||
}
|
||||
|
||||
g_hash_table_insert (frame->cursors, pointer,
|
||||
GUINT_TO_POINTER (cursor));
|
||||
meta_device_pointer_set_window_cursor (META_DEVICE_POINTER (pointer),
|
||||
frame->xwindow, cursor);
|
||||
XFlush (frame->window->display->xdisplay);
|
||||
}
|
||||
|
||||
Window
|
||||
|
@@ -34,7 +34,7 @@ struct _MetaFrame
|
||||
/* reparent window */
|
||||
Window xwindow;
|
||||
|
||||
MetaCursor current_cursor;
|
||||
GHashTable *cursors;
|
||||
|
||||
/* This rect is trusted info from where we put the
|
||||
* frame, not the result of ConfigureNotify
|
||||
@@ -76,7 +76,8 @@ gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
||||
|
||||
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
||||
|
||||
void meta_frame_set_screen_cursor (MetaFrame *frame,
|
||||
void meta_frame_set_screen_cursor (MetaFrame *frame,
|
||||
MetaDevice *pointer,
|
||||
MetaCursor cursor);
|
||||
|
||||
#endif
|
||||
|
803
src/core/input-events.c
Normal file
803
src/core/input-events.c
Normal file
@@ -0,0 +1,803 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* XEvent utility methods */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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 "input-events.h"
|
||||
#include "devices-core.h"
|
||||
#include "device-map-private.h"
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#endif
|
||||
|
||||
/* Quite a hack: normalizes XI2 events to their
|
||||
* core event equivalent, so most code is shared
|
||||
* for both implementations, code handling input
|
||||
* events should use the helper functions so
|
||||
* the actual event is treated correctly.
|
||||
*/
|
||||
gboolean
|
||||
meta_input_event_get_type (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *ev_type)
|
||||
{
|
||||
guint type = 0; /* Silence gcc */
|
||||
gboolean retval = TRUE;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (display->have_xinput2 &&
|
||||
ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
/* NB: GDK event filters already have generic events
|
||||
* allocated, so no need to do XGetEventData() on our own
|
||||
*/
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
type = MotionNotify;
|
||||
break;
|
||||
case XI_ButtonPress:
|
||||
type = ButtonPress;
|
||||
break;
|
||||
case XI_ButtonRelease:
|
||||
type = ButtonRelease;
|
||||
break;
|
||||
case XI_KeyPress:
|
||||
type = KeyPress;
|
||||
break;
|
||||
case XI_KeyRelease:
|
||||
type = KeyRelease;
|
||||
break;
|
||||
case XI_FocusIn:
|
||||
type = FocusIn;
|
||||
break;
|
||||
case XI_FocusOut:
|
||||
type = FocusOut;
|
||||
break;
|
||||
case XI_Enter:
|
||||
type = EnterNotify;
|
||||
break;
|
||||
case XI_Leave:
|
||||
type = LeaveNotify;
|
||||
break;
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
type = ButtonPress;
|
||||
break;
|
||||
case XI_TouchEnd:
|
||||
type = ButtonRelease;
|
||||
break;
|
||||
case XI_TouchUpdate:
|
||||
if (((XIDeviceEvent *) xev)->flags & XITouchPendingEnd)
|
||||
{
|
||||
/* Consider these events like TouchEnd, as we
|
||||
* could still need to call XIAllowTouchEvents()
|
||||
* for this touch sequence so we get the real
|
||||
* TouchEnd event, handling this event type the
|
||||
* second time it arrives should be a NO-OP.
|
||||
*/
|
||||
type = ButtonRelease;
|
||||
}
|
||||
else
|
||||
type = MotionNotify;
|
||||
break;
|
||||
#endif /* HAVE_XTOUCH */
|
||||
default:
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
switch (ev->type)
|
||||
{
|
||||
case MotionNotify:
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
case FocusIn:
|
||||
case FocusOut:
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
type = ev->type;
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (retval)
|
||||
{
|
||||
if (ev_type)
|
||||
*ev_type = type;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_input_event_is_type (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint ev_type)
|
||||
{
|
||||
guint type;
|
||||
|
||||
if (!meta_input_event_get_type (display, ev, &type))
|
||||
return FALSE;
|
||||
|
||||
return (type == ev_type);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_input_event_get_touch_id (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *touch_id)
|
||||
{
|
||||
#if defined(HAVE_XINPUT2) && defined(HAVE_XTOUCH)
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
if (touch_id)
|
||||
*touch_id = ((XIDeviceEvent *) xev)->detail;
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_XINPUT2 && HAVE_XTOUCH */
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Window
|
||||
meta_input_event_get_window (MetaDisplay *display,
|
||||
XEvent *ev)
|
||||
{
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
/* GDK event filters already have generic events allocated */
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
return ((XIDeviceEvent *) xev)->event;
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
return ((XIEnterEvent *) xev)->event;
|
||||
default:
|
||||
return None;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
return ev->xany.window;
|
||||
}
|
||||
|
||||
Window
|
||||
meta_input_event_get_root_window (MetaDisplay *display,
|
||||
XEvent *ev)
|
||||
{
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
return ((XIDeviceEvent *) xev)->root;
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
return ((XIEnterEvent *) xev)->root;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
switch (ev->type)
|
||||
{
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
return ev->xkey.root;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
return ev->xbutton.root;
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
return ev->xcrossing.root;
|
||||
case MotionNotify:
|
||||
return ev->xbutton.root;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return None;
|
||||
}
|
||||
|
||||
Time
|
||||
meta_input_event_get_time (MetaDisplay *display,
|
||||
XEvent *ev)
|
||||
{
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
return ((XIDeviceEvent *) xev)->time;
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
return ((XIEnterEvent *) xev)->time;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
switch (ev->type)
|
||||
{
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
return ev->xkey.time;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
return ev->xbutton.time;
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
return ev->xcrossing.time;
|
||||
case MotionNotify:
|
||||
return ev->xmotion.time;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return CurrentTime;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_input_event_get_coordinates (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
gdouble *x_ret,
|
||||
gdouble *y_ret,
|
||||
gdouble *x_root_ret,
|
||||
gdouble *y_root_ret)
|
||||
{
|
||||
gdouble x, y, x_root, y_root;
|
||||
gboolean retval = TRUE;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
{
|
||||
XIDeviceEvent *event = (XIDeviceEvent *) xev;
|
||||
|
||||
x = event->event_x;
|
||||
y = event->event_y;
|
||||
x_root = event->root_x;
|
||||
y_root = event->root_y;
|
||||
}
|
||||
|
||||
break;
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
{
|
||||
XIEnterEvent *event = (XIEnterEvent *) xev;
|
||||
|
||||
x = event->event_x;
|
||||
y = event->event_y;
|
||||
x_root = event->root_x;
|
||||
y_root = event->root_y;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
switch (ev->type)
|
||||
{
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
x = ev->xkey.x;
|
||||
y = ev->xkey.y;
|
||||
x_root = ev->xkey.x_root;
|
||||
y_root = ev->xkey.y_root;
|
||||
break;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
x = ev->xbutton.x;
|
||||
y = ev->xbutton.y;
|
||||
x_root = ev->xbutton.x_root;
|
||||
y_root = ev->xbutton.y_root;
|
||||
break;
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
x = ev->xcrossing.x;
|
||||
y = ev->xcrossing.y;
|
||||
x_root = ev->xcrossing.x_root;
|
||||
y_root = ev->xcrossing.y_root;
|
||||
break;
|
||||
case MotionNotify:
|
||||
x = ev->xmotion.x;
|
||||
y = ev->xmotion.y;
|
||||
x_root = ev->xmotion.x_root;
|
||||
y_root = ev->xmotion.y_root;
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (retval)
|
||||
{
|
||||
if (x_ret)
|
||||
*x_ret = x;
|
||||
|
||||
if (y_ret)
|
||||
*y_ret = y;
|
||||
|
||||
if (x_root_ret)
|
||||
*x_root_ret = x_root;
|
||||
|
||||
if (y_root_ret)
|
||||
*y_root_ret = y_root;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_input_event_get_state (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *state)
|
||||
{
|
||||
gboolean retval = TRUE;
|
||||
guint s;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
s = ((XIDeviceEvent *) xev)->mods.effective;
|
||||
break;
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
s = ((XIDeviceEvent *) xev)->mods.effective;
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
switch (ev->type)
|
||||
{
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
s = ev->xkey.state;
|
||||
break;
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
s = ev->xbutton.state;
|
||||
break;
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
s = ev->xcrossing.state;
|
||||
break;
|
||||
case MotionNotify:
|
||||
s = ev->xmotion.state;
|
||||
break;
|
||||
default:
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (retval && state)
|
||||
*state = s;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_input_event_get_keycode (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *keycode)
|
||||
{
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
if (xev->evtype == XI_KeyPress ||
|
||||
xev->evtype == XI_KeyRelease)
|
||||
{
|
||||
if (keycode)
|
||||
{
|
||||
/* The detail field contains keycode for key events */
|
||||
*keycode = ((XIDeviceEvent *) xev)->detail;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
if (ev->type == KeyPress ||
|
||||
ev->type == KeyRelease)
|
||||
{
|
||||
if (keycode)
|
||||
*keycode = ev->xkey.keycode;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_input_event_get_button (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *button)
|
||||
{
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
if (xev->evtype == XI_ButtonPress ||
|
||||
xev->evtype == XI_ButtonRelease)
|
||||
{
|
||||
if (button)
|
||||
{
|
||||
/* The detail field contains
|
||||
* button number for button events
|
||||
*/
|
||||
*button = ((XIDeviceEvent *) xev)->detail;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
if (ev->type == ButtonPress ||
|
||||
ev->type == ButtonRelease)
|
||||
{
|
||||
if (button)
|
||||
*button = ev->xbutton.button;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* NB: Also works for focus in/out events */
|
||||
gboolean
|
||||
meta_input_event_get_crossing_details (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *mode_out,
|
||||
guint *detail_out)
|
||||
{
|
||||
gboolean retval = TRUE;
|
||||
guint mode, detail;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
if (xev->evtype == XI_Enter ||
|
||||
xev->evtype == XI_Leave ||
|
||||
xev->evtype == XI_FocusIn ||
|
||||
xev->evtype == XI_FocusOut)
|
||||
{
|
||||
mode = ((XIEnterEvent *) xev)->mode;
|
||||
detail = ((XIEnterEvent *) xev)->detail;
|
||||
}
|
||||
else
|
||||
retval = FALSE;
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
{
|
||||
if (ev->type == EnterNotify ||
|
||||
ev->type == LeaveNotify)
|
||||
{
|
||||
mode = ev->xcrossing.mode;
|
||||
detail = ev->xcrossing.detail;
|
||||
}
|
||||
else if (ev->type == FocusIn ||
|
||||
ev->type == FocusOut)
|
||||
{
|
||||
mode = ev->xfocus.mode;
|
||||
detail = ev->xfocus.detail;
|
||||
}
|
||||
else
|
||||
retval = FALSE;
|
||||
}
|
||||
|
||||
if (retval)
|
||||
{
|
||||
if (mode_out)
|
||||
*mode_out = mode;
|
||||
|
||||
if (detail_out)
|
||||
*detail_out = detail;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_input_event_get_device (MetaDisplay *display,
|
||||
XEvent *ev)
|
||||
{
|
||||
guint evtype;
|
||||
|
||||
if (!meta_input_event_get_type (display, ev, &evtype))
|
||||
return NULL;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
return meta_device_map_lookup (display->device_map,
|
||||
((XIDeviceEvent *) xev)->deviceid);
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
return meta_device_map_lookup (display->device_map,
|
||||
((XIEnterEvent *) xev)->deviceid);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
switch (ev->type)
|
||||
{
|
||||
case KeyPress:
|
||||
case KeyRelease:
|
||||
case FocusIn:
|
||||
case FocusOut:
|
||||
return meta_device_map_lookup (display->device_map,
|
||||
META_CORE_KEYBOARD_ID);
|
||||
default:
|
||||
/* All other events are pointers' */
|
||||
return meta_device_map_lookup (display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_input_event_get_source_device (MetaDisplay *display,
|
||||
XEvent *ev)
|
||||
{
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIEvent *xev;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIEvent *) ev->xcookie.data;
|
||||
|
||||
switch (xev->evtype)
|
||||
{
|
||||
case XI_Motion:
|
||||
case XI_ButtonPress:
|
||||
case XI_ButtonRelease:
|
||||
case XI_KeyPress:
|
||||
case XI_KeyRelease:
|
||||
#ifdef HAVE_XTOUCH
|
||||
case XI_TouchBegin:
|
||||
case XI_TouchEnd:
|
||||
case XI_TouchUpdate:
|
||||
#endif /* HAVE_XTOUCH */
|
||||
return meta_device_map_lookup (display->device_map,
|
||||
((XIDeviceEvent *) xev)->sourceid);
|
||||
case XI_FocusIn:
|
||||
case XI_FocusOut:
|
||||
case XI_Enter:
|
||||
case XI_Leave:
|
||||
return meta_device_map_lookup (display->device_map,
|
||||
((XIEnterEvent *) xev)->sourceid);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
}
|
88
src/core/input-events.h
Normal file
88
src/core/input-events.h
Normal file
@@ -0,0 +1,88 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file event.h Utility functions for handling events
|
||||
*
|
||||
* Handling events.
|
||||
* This file contains helper methods to handle events, specially
|
||||
* input events, which can be either core or XInput2.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_EVENT_H
|
||||
#define META_EVENT_H
|
||||
|
||||
#include <config.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include "display-private.h"
|
||||
#include <meta/device-map.h>
|
||||
|
||||
/* Add an extra flag for touch events in
|
||||
* evmasks, an arbitrarily high bit is taken.
|
||||
*/
|
||||
#define META_INPUT_TOUCH_EVENTS_MASK (1L<<31)
|
||||
|
||||
gboolean meta_input_event_get_type (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *ev_type);
|
||||
gboolean meta_input_event_is_type (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint ev_type);
|
||||
|
||||
gboolean meta_input_event_get_touch_id (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *touch_id);
|
||||
|
||||
Window meta_input_event_get_window (MetaDisplay *display,
|
||||
XEvent *ev);
|
||||
Window meta_input_event_get_root_window (MetaDisplay *display,
|
||||
XEvent *ev);
|
||||
|
||||
Time meta_input_event_get_time (MetaDisplay *display,
|
||||
XEvent *ev);
|
||||
|
||||
gboolean meta_input_event_get_coordinates (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
gdouble *x_ret,
|
||||
gdouble *y_ret,
|
||||
gdouble *x_root_ret,
|
||||
gdouble *y_root_ret);
|
||||
|
||||
gboolean meta_input_event_get_state (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *state);
|
||||
gboolean meta_input_event_get_keycode (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *keycode);
|
||||
gboolean meta_input_event_get_button (MetaDisplay *display,
|
||||
XEvent *event,
|
||||
guint *button);
|
||||
gboolean meta_input_event_get_crossing_details (MetaDisplay *display,
|
||||
XEvent *ev,
|
||||
guint *mode_out,
|
||||
guint *detail_out);
|
||||
|
||||
MetaDevice *meta_input_event_get_device (MetaDisplay *display,
|
||||
XEvent *ev);
|
||||
MetaDevice *meta_input_event_get_source_device (MetaDisplay *display,
|
||||
XEvent *ev);
|
||||
|
||||
#endif /* META_EVENT_H */
|
@@ -36,14 +36,18 @@ void meta_display_shutdown_keys (MetaDisplay *display);
|
||||
void meta_screen_grab_keys (MetaScreen *screen);
|
||||
void meta_screen_ungrab_keys (MetaScreen *screen);
|
||||
gboolean meta_screen_grab_all_keys (MetaScreen *screen,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
void meta_screen_ungrab_all_keys (MetaScreen *screen,
|
||||
void meta_screen_ungrab_all_keys (MetaScreen *screen,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
void meta_window_grab_keys (MetaWindow *window);
|
||||
void meta_window_ungrab_keys (MetaWindow *window);
|
||||
gboolean meta_window_grab_all_keys (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
void meta_window_ungrab_all_keys (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
gboolean meta_display_process_key_event (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -311,9 +311,12 @@ static GSourceFuncs event_funcs = {
|
||||
static void
|
||||
meta_clutter_init (void)
|
||||
{
|
||||
if (!meta_get_use_core_devices ())
|
||||
clutter_x11_enable_xinput ();
|
||||
|
||||
clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
|
||||
clutter_x11_disable_event_retrieval ();
|
||||
|
||||
|
||||
if (CLUTTER_INIT_SUCCESS == clutter_init (NULL, NULL))
|
||||
{
|
||||
GSource *source = g_source_new (&event_funcs, sizeof (GSource));
|
||||
@@ -424,6 +427,8 @@ meta_init (void)
|
||||
meta_set_verbose (TRUE);
|
||||
if (g_getenv ("MUTTER_DEBUG"))
|
||||
meta_set_debugging (TRUE);
|
||||
if (g_getenv ("MUTTER_USE_CORE_DEVICES"))
|
||||
meta_set_use_core_devices (TRUE);
|
||||
|
||||
if (g_get_home_dir ())
|
||||
if (chdir (g_get_home_dir ()) < 0)
|
||||
|
@@ -90,6 +90,7 @@ northwestcmp (gconstpointer a, gconstpointer b)
|
||||
|
||||
static void
|
||||
find_next_cascade (MetaWindow *window,
|
||||
MetaDevice *pointer,
|
||||
MetaFrameBorders *borders,
|
||||
/* visible windows on relevant workspaces */
|
||||
GList *windows,
|
||||
@@ -136,7 +137,7 @@ find_next_cascade (MetaWindow *window,
|
||||
* of NW corner of window frame.
|
||||
*/
|
||||
|
||||
current = meta_screen_get_current_monitor (window->screen);
|
||||
current = meta_screen_get_current_monitor (window->screen, pointer);
|
||||
meta_window_get_work_area_for_monitor (window, current->number, &work_area);
|
||||
|
||||
cascade_x = MAX (0, work_area.x);
|
||||
@@ -354,10 +355,17 @@ avoid_being_obscured_as_second_modal_dialog (MetaWindow *window,
|
||||
* know about the modal-to-the-main-window part.
|
||||
*/
|
||||
|
||||
MetaWindow *focus_window;
|
||||
MetaWindow *focus_window = NULL;
|
||||
MetaFocusInfo *focus_info;
|
||||
MetaRectangle overlap;
|
||||
MetaDevice *pointer, *keyboard;
|
||||
|
||||
focus_window = window->display->focus_window;
|
||||
pointer = meta_window_guess_grab_pointer (window);
|
||||
keyboard = meta_device_get_paired_device (pointer);
|
||||
focus_info = meta_display_get_focus_info (window->display, keyboard);
|
||||
|
||||
if (focus_window)
|
||||
focus_window = focus_info->focus_window;
|
||||
|
||||
if (window->denied_focus_and_not_transient &&
|
||||
window->wm_state_modal && /* FIXME: Maybe do this for all transients? */
|
||||
@@ -660,6 +668,7 @@ meta_window_place (MetaWindow *window,
|
||||
{
|
||||
GList *windows;
|
||||
const MetaMonitorInfo *xi;
|
||||
MetaDevice *pointer, *keyboard;
|
||||
|
||||
/* frame member variables should NEVER be used in here, only
|
||||
* MetaFrameBorders. But remember borders == NULL
|
||||
@@ -671,7 +680,9 @@ meta_window_place (MetaWindow *window,
|
||||
meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc);
|
||||
|
||||
windows = NULL;
|
||||
|
||||
pointer = meta_window_guess_grab_pointer (window);
|
||||
keyboard = meta_device_get_paired_device (pointer);
|
||||
|
||||
switch (window->type)
|
||||
{
|
||||
/* Run placement algorithm on these. */
|
||||
@@ -815,7 +826,7 @@ meta_window_place (MetaWindow *window,
|
||||
int w, h;
|
||||
|
||||
/* Warning, this function is a round trip! */
|
||||
xi = meta_screen_get_current_monitor (window->screen);
|
||||
xi = meta_screen_get_current_monitor (window->screen, pointer);
|
||||
|
||||
w = xi->rect.width;
|
||||
h = xi->rect.height;
|
||||
@@ -860,8 +871,8 @@ meta_window_place (MetaWindow *window,
|
||||
}
|
||||
|
||||
/* Warning, this is a round trip! */
|
||||
xi = meta_screen_get_current_monitor (window->screen);
|
||||
|
||||
xi = meta_screen_get_current_monitor (window->screen, pointer);
|
||||
|
||||
/* "Origin" placement algorithm */
|
||||
x = xi->rect.x;
|
||||
y = xi->rect.y;
|
||||
@@ -899,8 +910,8 @@ meta_window_place (MetaWindow *window,
|
||||
/* If no placement has been done, revert to cascade to avoid
|
||||
* fully overlapping window (e.g. starting multiple terminals)
|
||||
* */
|
||||
if (x == xi->rect.x && y == xi->rect.y)
|
||||
find_next_cascade (window, borders, windows, x, y, &x, &y);
|
||||
if (x == xi->rect.x && y == xi->rect.y)
|
||||
find_next_cascade (window, pointer, borders, windows, x, y, &x, &y);
|
||||
|
||||
done_check_denied_focus:
|
||||
/* If the window is being denied focus and isn't a transient of the
|
||||
@@ -913,8 +924,12 @@ meta_window_place (MetaWindow *window,
|
||||
gboolean found_fit;
|
||||
MetaWindow *focus_window;
|
||||
MetaRectangle overlap;
|
||||
MetaFocusInfo *focus_info;
|
||||
|
||||
focus_window = window->display->focus_window;
|
||||
focus_info = meta_display_get_focus_info (window->display, keyboard);
|
||||
g_assert (focus_info != NULL);
|
||||
|
||||
focus_window = focus_info->focus_window;
|
||||
g_assert (focus_window != NULL);
|
||||
|
||||
/* No need to do anything if the window doesn't overlap at all */
|
||||
|
@@ -92,7 +92,8 @@ struct _MetaScreen
|
||||
MetaStack *stack;
|
||||
MetaStackTracker *stack_tracker;
|
||||
|
||||
MetaCursor current_cursor;
|
||||
/* per-pointer cursors */
|
||||
GHashTable *cursors;
|
||||
|
||||
Window flash_window;
|
||||
|
||||
@@ -160,8 +161,10 @@ void meta_screen_queue_frame_redraws (MetaScreen *scree
|
||||
void meta_screen_queue_window_resizes (MetaScreen *screen);
|
||||
|
||||
void meta_screen_set_cursor (MetaScreen *screen,
|
||||
MetaDevice *pointer,
|
||||
MetaCursor cursor);
|
||||
void meta_screen_update_cursor (MetaScreen *screen);
|
||||
void meta_screen_update_cursor (MetaScreen *screen,
|
||||
MetaDevice *pointer);
|
||||
|
||||
void meta_screen_tab_popup_create (MetaScreen *screen,
|
||||
MetaTabList list_type,
|
||||
@@ -184,9 +187,11 @@ void meta_screen_tile_preview_update (MetaScreen *screen,
|
||||
void meta_screen_tile_preview_hide (MetaScreen *screen);
|
||||
|
||||
MetaWindow* meta_screen_get_mouse_window (MetaScreen *screen,
|
||||
MetaDevice *pointer,
|
||||
MetaWindow *not_this_one);
|
||||
|
||||
const MetaMonitorInfo* meta_screen_get_current_monitor (MetaScreen *screen);
|
||||
const MetaMonitorInfo* meta_screen_get_current_monitor (MetaScreen *screen,
|
||||
MetaDevice *pointer);
|
||||
const MetaMonitorInfo* meta_screen_get_monitor_for_rect (MetaScreen *screen,
|
||||
MetaRectangle *rect);
|
||||
const MetaMonitorInfo* meta_screen_get_monitor_for_window (MetaScreen *screen,
|
||||
|
@@ -37,10 +37,12 @@
|
||||
#include "workspace-private.h"
|
||||
#include "keybindings-private.h"
|
||||
#include "stack.h"
|
||||
#include "core.h"
|
||||
#include "xprops.h"
|
||||
#include <meta/compositor.h>
|
||||
#include "mutter-marshal.h"
|
||||
#include "mutter-enum-types.h"
|
||||
#include "device-pointer.h"
|
||||
|
||||
#ifdef HAVE_SOLARIS_XINERAMA
|
||||
#include <X11/extensions/xinerama.h>
|
||||
@@ -710,7 +712,6 @@ meta_screen_new (MetaDisplay *display,
|
||||
MetaScreen *screen;
|
||||
Window xroot;
|
||||
Display *xdisplay;
|
||||
XWindowAttributes attr;
|
||||
Window new_wm_sn_owner;
|
||||
Window current_wm_sn_owner;
|
||||
gboolean replace_current_wm;
|
||||
@@ -825,15 +826,15 @@ meta_screen_new (MetaDisplay *display,
|
||||
/* We need to or with the existing event mask since
|
||||
* gtk+ may be interested in other events.
|
||||
*/
|
||||
XGetWindowAttributes (xdisplay, xroot, &attr);
|
||||
XSelectInput (xdisplay,
|
||||
xroot,
|
||||
SubstructureRedirectMask | SubstructureNotifyMask |
|
||||
ColormapChangeMask | PropertyChangeMask |
|
||||
LeaveWindowMask | EnterWindowMask |
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
FocusChangeMask | StructureNotifyMask |
|
||||
ExposureMask | attr.your_event_mask);
|
||||
meta_core_select_events (xdisplay, xroot,
|
||||
(SubstructureRedirectMask | SubstructureNotifyMask |
|
||||
ColormapChangeMask | PropertyChangeMask |
|
||||
LeaveWindowMask | EnterWindowMask |
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
FocusChangeMask | StructureNotifyMask |
|
||||
ExposureMask),
|
||||
TRUE);
|
||||
|
||||
if (meta_error_trap_pop_with_return (display) != Success)
|
||||
{
|
||||
meta_warning (_("Screen %d on display \"%s\" already has a window manager\n"),
|
||||
@@ -855,10 +856,10 @@ meta_screen_new (MetaDisplay *display,
|
||||
screen->rect.x = screen->rect.y = 0;
|
||||
screen->rect.width = WidthOfScreen (screen->xscreen);
|
||||
screen->rect.height = HeightOfScreen (screen->xscreen);
|
||||
screen->current_cursor = -1; /* invalid/unset */
|
||||
screen->default_xvisual = DefaultVisualOfScreen (screen->xscreen);
|
||||
screen->default_depth = DefaultDepthOfScreen (screen->xscreen);
|
||||
screen->flash_window = None;
|
||||
screen->cursors = g_hash_table_new (NULL, NULL);
|
||||
|
||||
screen->wm_sn_selection_window = new_wm_sn_owner;
|
||||
screen->wm_sn_atom = wm_sn_atom;
|
||||
@@ -883,8 +884,6 @@ meta_screen_new (MetaDisplay *display,
|
||||
screen->last_monitor_index = 0;
|
||||
|
||||
reload_monitor_infos (screen);
|
||||
|
||||
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
|
||||
|
||||
/* Handle creating a no_focus_window for this screen */
|
||||
screen->no_focus_window =
|
||||
@@ -1019,7 +1018,10 @@ meta_screen_free (MetaScreen *screen,
|
||||
meta_stack_tracker_free (screen->stack_tracker);
|
||||
|
||||
meta_error_trap_push_with_return (screen->display);
|
||||
XSelectInput (screen->display->xdisplay, screen->xroot, 0);
|
||||
meta_core_select_events (screen->display->xdisplay,
|
||||
screen->xroot, NoEventMask,
|
||||
FALSE);
|
||||
|
||||
if (meta_error_trap_pop_with_return (screen->display) != Success)
|
||||
meta_warning (_("Could not release screen %d on display \"%s\"\n"),
|
||||
screen->number, screen->display->name);
|
||||
@@ -1043,6 +1045,8 @@ meta_screen_free (MetaScreen *screen,
|
||||
|
||||
g_free (screen->screen_name);
|
||||
|
||||
g_hash_table_destroy (screen->cursors);
|
||||
|
||||
g_object_unref (screen);
|
||||
|
||||
XFlush (display->xdisplay);
|
||||
@@ -1656,31 +1660,33 @@ update_focus_mode (MetaScreen *screen)
|
||||
|
||||
void
|
||||
meta_screen_set_cursor (MetaScreen *screen,
|
||||
MetaDevice *pointer,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
Cursor xcursor;
|
||||
MetaCursor old_cursor;
|
||||
|
||||
if (cursor == screen->current_cursor)
|
||||
old_cursor = GPOINTER_TO_UINT (g_hash_table_lookup (screen->cursors, pointer));
|
||||
|
||||
if (cursor == old_cursor)
|
||||
return;
|
||||
|
||||
screen->current_cursor = cursor;
|
||||
|
||||
xcursor = meta_display_create_x_cursor (screen->display, cursor);
|
||||
XDefineCursor (screen->display->xdisplay, screen->xroot, xcursor);
|
||||
XFlush (screen->display->xdisplay);
|
||||
XFreeCursor (screen->display->xdisplay, xcursor);
|
||||
g_hash_table_insert (screen->cursors, pointer,
|
||||
GUINT_TO_POINTER (cursor));
|
||||
|
||||
meta_screen_update_cursor (screen, pointer);
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_update_cursor (MetaScreen *screen)
|
||||
meta_screen_update_cursor (MetaScreen *screen,
|
||||
MetaDevice *pointer)
|
||||
{
|
||||
Cursor xcursor;
|
||||
MetaCursor cursor;
|
||||
|
||||
xcursor = meta_display_create_x_cursor (screen->display,
|
||||
screen->current_cursor);
|
||||
XDefineCursor (screen->display->xdisplay, screen->xroot, xcursor);
|
||||
cursor = GPOINTER_TO_UINT (g_hash_table_lookup (screen->cursors, pointer));
|
||||
meta_device_pointer_set_window_cursor (META_DEVICE_POINTER (pointer),
|
||||
screen->xroot,
|
||||
cursor);
|
||||
XFlush (screen->display->xdisplay);
|
||||
XFreeCursor (screen->display->xdisplay, xcursor);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1934,9 +1940,21 @@ static gboolean
|
||||
meta_screen_tile_preview_update_timeout (gpointer data)
|
||||
{
|
||||
MetaScreen *screen = data;
|
||||
MetaWindow *window = screen->display->grab_window;
|
||||
MetaWindow *window = NULL;
|
||||
gboolean composited = screen->display->compositor != NULL;
|
||||
gboolean needs_preview = FALSE;
|
||||
MetaGrabInfo *grab_info;
|
||||
MetaDevice *pointer = NULL;
|
||||
GHashTableIter iter;
|
||||
|
||||
/* FIXME: we're just handling the first grab we find */
|
||||
g_hash_table_iter_init (&iter, screen->display->current_grabs);
|
||||
|
||||
if (g_hash_table_iter_next (&iter, NULL, (gpointer *) &grab_info))
|
||||
{
|
||||
window = grab_info->grab_window;
|
||||
pointer = grab_info->grab_pointer;
|
||||
}
|
||||
|
||||
screen->tile_preview_timeout_id = 0;
|
||||
|
||||
@@ -1980,7 +1998,7 @@ meta_screen_tile_preview_update_timeout (gpointer data)
|
||||
MetaRectangle tile_rect;
|
||||
|
||||
meta_window_get_current_tile_area (window, &tile_rect);
|
||||
meta_tile_preview_show (screen->tile_preview, &tile_rect);
|
||||
meta_tile_preview_show (screen->tile_preview, pointer, &tile_rect);
|
||||
}
|
||||
else
|
||||
meta_tile_preview_hide (screen->tile_preview);
|
||||
@@ -2025,28 +2043,23 @@ meta_screen_tile_preview_hide (MetaScreen *screen)
|
||||
|
||||
MetaWindow*
|
||||
meta_screen_get_mouse_window (MetaScreen *screen,
|
||||
MetaDevice *pointer,
|
||||
MetaWindow *not_this_one)
|
||||
{
|
||||
MetaWindow *window;
|
||||
Window root_return, child_return;
|
||||
int root_x_return, root_y_return;
|
||||
int win_x_return, win_y_return;
|
||||
unsigned int mask_return;
|
||||
|
||||
|
||||
if (not_this_one)
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focusing mouse window excluding %s\n", not_this_one->desc);
|
||||
|
||||
meta_error_trap_push (screen->display);
|
||||
XQueryPointer (screen->display->xdisplay,
|
||||
screen->xroot,
|
||||
&root_return,
|
||||
&child_return,
|
||||
&root_x_return,
|
||||
&root_y_return,
|
||||
&win_x_return,
|
||||
&win_y_return,
|
||||
&mask_return);
|
||||
meta_device_pointer_query_position (META_DEVICE_POINTER (pointer),
|
||||
screen->xroot,
|
||||
NULL, NULL,
|
||||
&root_x_return,
|
||||
&root_y_return,
|
||||
NULL, NULL, NULL);
|
||||
meta_error_trap_pop (screen->display);
|
||||
|
||||
window = meta_stack_get_default_focus_window_at_point (screen->stack,
|
||||
@@ -2142,6 +2155,7 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
|
||||
const MetaMonitorInfo* current;
|
||||
const MetaMonitorInfo* tmp;
|
||||
GQueue* monitor_queue;
|
||||
MetaDevice *pointer;
|
||||
int* visited;
|
||||
int cur = 0;
|
||||
int i;
|
||||
@@ -2149,6 +2163,9 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
|
||||
*n_monitors = screen->n_monitor_infos;
|
||||
*monitors_list = g_new (int, screen->n_monitor_infos);
|
||||
|
||||
pointer = meta_device_map_lookup (screen->display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
|
||||
/* we calculate a natural ordering by which to choose monitors for
|
||||
* window placement. We start at the current monitor, and perform
|
||||
* a breadth-first search of the monitors starting from that
|
||||
@@ -2163,7 +2180,7 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
|
||||
visited[i] = FALSE;
|
||||
}
|
||||
|
||||
current = meta_screen_get_current_monitor (screen);
|
||||
current = meta_screen_get_current_monitor (screen, pointer);
|
||||
monitor_queue = g_queue_new ();
|
||||
g_queue_push_tail (monitor_queue, (gpointer) current);
|
||||
visited[current->number] = TRUE;
|
||||
@@ -2230,7 +2247,8 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
|
||||
}
|
||||
|
||||
const MetaMonitorInfo*
|
||||
meta_screen_get_current_monitor (MetaScreen *screen)
|
||||
meta_screen_get_current_monitor (MetaScreen *screen,
|
||||
MetaDevice *pointer)
|
||||
{
|
||||
if (screen->n_monitor_infos == 1)
|
||||
return &screen->monitor_infos[0];
|
||||
@@ -2240,24 +2258,18 @@ meta_screen_get_current_monitor (MetaScreen *screen)
|
||||
|
||||
if (screen->display->monitor_cache_invalidated)
|
||||
{
|
||||
Window root_return, child_return;
|
||||
int win_x_return, win_y_return;
|
||||
unsigned int mask_return;
|
||||
int i;
|
||||
MetaRectangle pointer_position;
|
||||
|
||||
screen->display->monitor_cache_invalidated = FALSE;
|
||||
|
||||
pointer_position.width = pointer_position.height = 1;
|
||||
XQueryPointer (screen->display->xdisplay,
|
||||
screen->xroot,
|
||||
&root_return,
|
||||
&child_return,
|
||||
&pointer_position.x,
|
||||
&pointer_position.y,
|
||||
&win_x_return,
|
||||
&win_y_return,
|
||||
&mask_return);
|
||||
meta_device_pointer_query_position (META_DEVICE_POINTER (pointer),
|
||||
screen->xroot,
|
||||
NULL, NULL,
|
||||
&pointer_position.x,
|
||||
&pointer_position.y,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
screen->last_monitor_index = 0;
|
||||
for (i = 0; i < screen->n_monitor_infos; i++)
|
||||
@@ -3114,17 +3126,22 @@ static gboolean startup_sequence_timeout (void *data);
|
||||
static void
|
||||
update_startup_feedback (MetaScreen *screen)
|
||||
{
|
||||
MetaDevice *pointer;
|
||||
|
||||
pointer = meta_device_map_lookup (screen->display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
|
||||
if (screen->startup_sequences != NULL)
|
||||
{
|
||||
meta_topic (META_DEBUG_STARTUP,
|
||||
"Setting busy cursor\n");
|
||||
meta_screen_set_cursor (screen, META_CURSOR_BUSY);
|
||||
meta_screen_set_cursor (screen, pointer, META_CURSOR_BUSY);
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_topic (META_DEBUG_STARTUP,
|
||||
"Setting default cursor\n");
|
||||
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
|
||||
meta_screen_set_cursor (screen, pointer, META_CURSOR_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3490,6 +3507,14 @@ meta_screen_get_xroot (MetaScreen *screen)
|
||||
return screen->xroot;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_screen_get_size:
|
||||
* @screen: A #MetaScreen
|
||||
* @width: (out): The width of the screen
|
||||
* @height: (out): The height of the screen
|
||||
*
|
||||
* Retrieve the size of the screen.
|
||||
*/
|
||||
void
|
||||
meta_screen_get_size (MetaScreen *screen,
|
||||
int *width,
|
||||
|
@@ -211,13 +211,23 @@ meta_stack_thaw (MetaStack *stack)
|
||||
stack_sync_to_server (stack);
|
||||
}
|
||||
|
||||
typedef struct _FocusedForeachData FocusedForeachData;
|
||||
|
||||
struct _FocusedForeachData
|
||||
{
|
||||
MetaWindow *window;
|
||||
gboolean focused_transient;
|
||||
};
|
||||
|
||||
static gboolean
|
||||
is_focused_foreach (MetaWindow *window,
|
||||
void *data)
|
||||
{
|
||||
if (window == window->display->expected_focus_window)
|
||||
FocusedForeachData *focused_data = data;
|
||||
|
||||
if (window == focused_data->window)
|
||||
{
|
||||
*((gboolean*) data) = TRUE;
|
||||
focused_data->focused_transient = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
@@ -239,7 +249,9 @@ static MetaStackLayer
|
||||
get_standalone_layer (MetaWindow *window)
|
||||
{
|
||||
MetaStackLayer layer;
|
||||
gboolean focused_transient = FALSE;
|
||||
MetaFocusInfo *focus_info;
|
||||
MetaDevice *keyboard;
|
||||
FocusedForeachData focused_data = { NULL, FALSE };
|
||||
|
||||
switch (window->type)
|
||||
{
|
||||
@@ -263,20 +275,33 @@ get_standalone_layer (MetaWindow *window)
|
||||
case META_WINDOW_OVERRIDE_OTHER:
|
||||
layer = META_LAYER_OVERRIDE_REDIRECT;
|
||||
break;
|
||||
default:
|
||||
meta_window_foreach_transient (window,
|
||||
is_focused_foreach,
|
||||
&focused_transient);
|
||||
default:
|
||||
/* FIXME: How about other keyboards? should
|
||||
* we allow fullscreen for non-VCP/K anyway?
|
||||
*/
|
||||
keyboard = meta_device_map_lookup (window->display->device_map,
|
||||
META_CORE_KEYBOARD_ID);
|
||||
|
||||
focus_info = meta_display_get_focus_info (window->display, keyboard);
|
||||
|
||||
if (focus_info)
|
||||
{
|
||||
focused_data.window = focus_info->expected_focus_window;
|
||||
meta_window_foreach_transient (window,
|
||||
is_focused_foreach,
|
||||
&focused_data);
|
||||
}
|
||||
|
||||
if (window->wm_state_below)
|
||||
layer = META_LAYER_BOTTOM;
|
||||
else if (window->fullscreen &&
|
||||
(focused_transient ||
|
||||
window == window->display->expected_focus_window ||
|
||||
window->display->expected_focus_window == NULL ||
|
||||
(window->display->expected_focus_window != NULL &&
|
||||
(focused_data.focused_transient ||
|
||||
!focus_info ||
|
||||
window == focus_info->expected_focus_window ||
|
||||
focus_info->expected_focus_window == NULL ||
|
||||
(focus_info->expected_focus_window != NULL &&
|
||||
windows_on_different_monitor (window,
|
||||
window->display->expected_focus_window))))
|
||||
focus_info->expected_focus_window))))
|
||||
layer = META_LAYER_FULLSCREEN;
|
||||
else if (window->wm_state_above)
|
||||
layer = META_LAYER_TOP;
|
||||
|
@@ -81,6 +81,7 @@ meta_print_backtrace (void)
|
||||
static gint verbose_topics = 0;
|
||||
static gboolean is_debugging = FALSE;
|
||||
static gboolean replace_current = FALSE;
|
||||
static gboolean use_core_devices = FALSE;
|
||||
static int no_prefix = 0;
|
||||
|
||||
#ifdef WITH_VERBOSE_MODE
|
||||
@@ -209,6 +210,18 @@ meta_set_debugging (gboolean setting)
|
||||
is_debugging = setting;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_get_use_core_devices (void)
|
||||
{
|
||||
return use_core_devices;
|
||||
}
|
||||
|
||||
void
|
||||
meta_set_use_core_devices (gboolean setting)
|
||||
{
|
||||
use_core_devices = setting;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_get_replace_current_wm (void)
|
||||
{
|
||||
@@ -916,7 +929,7 @@ meta_later_remove (guint later_id)
|
||||
MetaLater *later = l->data;
|
||||
if (later->id == later_id)
|
||||
{
|
||||
laters = g_slist_remove_link (laters, l);
|
||||
laters = g_slist_delete_link (laters, l);
|
||||
/* If this was a "repaint func" later, we just let the
|
||||
* repaint func run and get removed
|
||||
*/
|
||||
|
@@ -107,6 +107,10 @@ struct _MetaWindow
|
||||
Window xgroup_leader;
|
||||
Window xclient_leader;
|
||||
|
||||
/* window menu if any, and the pointer that popped it up */
|
||||
MetaWindowMenu *menu;
|
||||
MetaDevice *menu_device;
|
||||
|
||||
/* Initial workspace property */
|
||||
int initial_workspace;
|
||||
|
||||
@@ -129,6 +133,7 @@ struct _MetaWindow
|
||||
* this is the current mode. If not, it is the mode which will be
|
||||
* requested after the window grab is released */
|
||||
guint tile_mode : 2;
|
||||
int tile_monitor_number;
|
||||
|
||||
/* Whether we're shaded */
|
||||
guint shaded : 1;
|
||||
@@ -321,6 +326,15 @@ struct _MetaWindow
|
||||
/* if TRUE, window is attached to its parent */
|
||||
guint attached : 1;
|
||||
|
||||
/* if TRUE, window didn't yet get the FocusIn for window->focus_keyboard */
|
||||
guint expecting_focus_in : 1;
|
||||
|
||||
/* if TRUE, tiling mode is held regardless of newer touch updates */
|
||||
guint touch_hold_tiling_mode : 1;
|
||||
|
||||
/* Keyboard currently owning the window focus, or NULL */
|
||||
MetaDevice *focus_keyboard;
|
||||
|
||||
/* if non-NULL, the bounds of the window frame */
|
||||
cairo_region_t *frame_bounds;
|
||||
|
||||
@@ -398,6 +412,18 @@ struct _MetaWindow
|
||||
|
||||
/* Focused window that is (directly or indirectly) attached to this one */
|
||||
MetaWindow *attached_focus_window;
|
||||
|
||||
/* Current grab op for this window, or NULL */
|
||||
MetaGrabInfo *cur_grab;
|
||||
|
||||
/* Focus info if the window is focused, or NULL */
|
||||
MetaFocusInfo *cur_focus;
|
||||
|
||||
GHashTable *cur_touches;
|
||||
gdouble initial_touch_area_width;
|
||||
gdouble initial_touch_area_height;
|
||||
gdouble cur_touch_area_width;
|
||||
gdouble cur_touch_area_height;
|
||||
};
|
||||
|
||||
struct _MetaWindowClass
|
||||
@@ -425,6 +451,8 @@ struct _MetaWindowClass
|
||||
(w)->tile_mode == META_TILE_LEFT)
|
||||
#define META_WINDOW_TILED_RIGHT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
|
||||
(w)->tile_mode == META_TILE_RIGHT)
|
||||
#define META_WINDOW_TILED_MAXIMIZED(w)(META_WINDOW_MAXIMIZED(w) && \
|
||||
(w)->tile_mode == META_TILE_MAXIMIZED)
|
||||
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->fullscreen)
|
||||
#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !META_WINDOW_TILED_SIDE_BY_SIDE(w) && !(w)->fullscreen && !(w)->shaded)
|
||||
#define META_WINDOW_ALLOWS_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && \
|
||||
@@ -567,6 +595,7 @@ void meta_window_set_current_workspace_hint (MetaWindow *window);
|
||||
unsigned long meta_window_get_net_wm_desktop (MetaWindow *window);
|
||||
|
||||
void meta_window_show_menu (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
@@ -616,13 +645,16 @@ void meta_window_free_delete_dialog (MetaWindow *window);
|
||||
|
||||
|
||||
void meta_window_begin_grab_op (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
MetaGrabOp op,
|
||||
gboolean frame_action,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_window_update_keyboard_resize (MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
gboolean update_cursor);
|
||||
void meta_window_update_keyboard_move (MetaWindow *window);
|
||||
void meta_window_update_keyboard_move (MetaWindow *window,
|
||||
MetaDevice *device);
|
||||
|
||||
void meta_window_update_layer (MetaWindow *window);
|
||||
|
||||
@@ -644,8 +676,20 @@ void meta_window_update_for_monitors_changed (MetaWindow *window);
|
||||
void meta_window_update_on_all_workspaces (MetaWindow *window);
|
||||
|
||||
void meta_window_propagate_focus_appearance (MetaWindow *window,
|
||||
MetaDevice *keyboard,
|
||||
gboolean focused);
|
||||
|
||||
gboolean meta_window_should_attach_to_parent (MetaWindow *window);
|
||||
|
||||
void meta_window_set_client_pointer (MetaWindow *window,
|
||||
MetaDevice *pointer);
|
||||
MetaDevice * meta_window_get_client_pointer (MetaWindow *window);
|
||||
|
||||
MetaDevice * meta_window_guess_grab_pointer (MetaWindow *window);
|
||||
|
||||
gboolean meta_window_update_touch (MetaWindow *window,
|
||||
XEvent *event);
|
||||
void meta_window_end_touch (MetaWindow *window,
|
||||
XEvent *event);
|
||||
|
||||
#endif
|
||||
|
@@ -1507,7 +1507,9 @@ reload_transient_for (MetaWindow *window,
|
||||
return;
|
||||
|
||||
if (meta_window_appears_focused (window) && window->xtransient_for != None)
|
||||
meta_window_propagate_focus_appearance (window, FALSE);
|
||||
meta_window_propagate_focus_appearance (window,
|
||||
window->focus_keyboard,
|
||||
FALSE);
|
||||
|
||||
old_transient_for = window->xtransient_for;
|
||||
window->xtransient_for = transient_for;
|
||||
@@ -1560,7 +1562,9 @@ reload_transient_for (MetaWindow *window,
|
||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||
|
||||
if (meta_window_appears_focused (window) && window->xtransient_for != None)
|
||||
meta_window_propagate_focus_appearance (window, TRUE);
|
||||
meta_window_propagate_focus_appearance (window,
|
||||
window->focus_keyboard,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
1343
src/core/window.c
1343
src/core/window.c
File diff suppressed because it is too large
Load Diff
@@ -85,6 +85,7 @@ GList* meta_workspace_get_onmonitor_region (MetaWorkspace *workspace,
|
||||
int which_monitor);
|
||||
|
||||
void meta_workspace_focus_default_window (MetaWorkspace *workspace,
|
||||
MetaDevice *pointer,
|
||||
MetaWindow *not_this_one,
|
||||
guint32 timestamp);
|
||||
|
||||
|
@@ -538,7 +538,9 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
||||
MetaWorkspaceLayout layout1, layout2;
|
||||
gint num_workspaces, current_space, new_space;
|
||||
MetaMotionDirection direction;
|
||||
|
||||
MetaGrabInfo *grab_info;
|
||||
GHashTableIter iter;
|
||||
|
||||
meta_verbose ("Activating workspace %d\n",
|
||||
meta_workspace_index (workspace));
|
||||
|
||||
@@ -547,7 +549,7 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
||||
|
||||
/* Free any cached pointers to the workspaces's edges from
|
||||
* a current resize or move operation */
|
||||
meta_display_cleanup_edges (workspace->screen->display);
|
||||
meta_display_cleanup_edges (workspace->screen->display, workspace->screen);
|
||||
|
||||
if (workspace->screen->active_workspace)
|
||||
workspace_switch_sound (workspace->screen->active_workspace, workspace);
|
||||
@@ -570,10 +572,22 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
||||
return;
|
||||
|
||||
move_window = NULL;
|
||||
if (workspace->screen->display->grab_op == META_GRAB_OP_MOVING ||
|
||||
workspace->screen->display->grab_op == META_GRAB_OP_KEYBOARD_MOVING)
|
||||
move_window = workspace->screen->display->grab_window;
|
||||
|
||||
|
||||
/* FIXME: not quite multidevice friendly, but the whole
|
||||
* "move window to another workspace" isn't.
|
||||
*/
|
||||
g_hash_table_iter_init (&iter, workspace->screen->display->current_grabs);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &grab_info))
|
||||
{
|
||||
if (grab_info->grab_op == META_GRAB_OP_MOVING ||
|
||||
grab_info->grab_op == META_GRAB_OP_KEYBOARD_MOVING)
|
||||
{
|
||||
move_window = grab_info->grab_window;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (move_window != NULL)
|
||||
{
|
||||
if (move_window->on_all_workspaces)
|
||||
@@ -673,8 +687,13 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaDevice *pointer;
|
||||
|
||||
pointer = meta_device_map_lookup (screen->display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
meta_topic (META_DEBUG_FOCUS, "Focusing default window on new workspace\n");
|
||||
meta_workspace_focus_default_window (workspace, NULL, timestamp);
|
||||
meta_workspace_focus_default_window (workspace, pointer,
|
||||
NULL, timestamp);
|
||||
}
|
||||
|
||||
/* Emit switched signal from screen.c */
|
||||
@@ -774,7 +793,7 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace)
|
||||
/* If we are in the middle of a resize or move operation, we
|
||||
* might have cached pointers to the workspace's edges */
|
||||
if (workspace == workspace->screen->active_workspace)
|
||||
meta_display_cleanup_edges (workspace->screen->display);
|
||||
meta_display_cleanup_edges (workspace->screen->display, workspace->screen);
|
||||
|
||||
g_free (workspace->work_area_monitor);
|
||||
workspace->work_area_monitor = NULL;
|
||||
@@ -1191,6 +1210,7 @@ meta_workspace_get_name (MetaWorkspace *workspace)
|
||||
|
||||
void
|
||||
meta_workspace_focus_default_window (MetaWorkspace *workspace,
|
||||
MetaDevice *pointer,
|
||||
MetaWindow *not_this_one,
|
||||
guint32 timestamp)
|
||||
{
|
||||
@@ -1207,7 +1227,8 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
|
||||
else
|
||||
{
|
||||
MetaWindow * window;
|
||||
window = meta_screen_get_mouse_window (workspace->screen, not_this_one);
|
||||
window = meta_screen_get_mouse_window (workspace->screen,
|
||||
pointer, not_this_one);
|
||||
if (window &&
|
||||
window->type != META_WINDOW_DOCK &&
|
||||
window->type != META_WINDOW_DESKTOP)
|
||||
|
46
src/meta/device-map.h
Normal file
46
src/meta/device-map.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_MAP_H
|
||||
#define META_DEVICE_MAP_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <meta/types.h>
|
||||
#include <meta/device.h>
|
||||
|
||||
#define META_TYPE_DEVICE_MAP (meta_device_map_get_type ())
|
||||
#define META_DEVICE_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP, MetaDeviceMap))
|
||||
#define META_DEVICE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP, MetaDeviceMapClass))
|
||||
#define META_IS_DEVICE_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP))
|
||||
#define META_IS_DEVICE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP))
|
||||
#define META_DEVICE_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP, MetaDeviceMapClass))
|
||||
|
||||
typedef struct _MetaDeviceMapClass MetaDeviceMapClass;
|
||||
|
||||
GType meta_device_map_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice * meta_device_map_lookup (MetaDeviceMap *device_map,
|
||||
gint device_id);
|
||||
|
||||
MetaDisplay * meta_device_map_get_display (MetaDeviceMap *device_map);
|
||||
GList * meta_device_map_list_devices (MetaDeviceMap *device_map);
|
||||
|
||||
#endif
|
44
src/meta/device.h
Normal file
44
src/meta/device.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* 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_DEVICE_H
|
||||
#define META_DEVICE_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <meta/types.h>
|
||||
|
||||
#define META_TYPE_DEVICE (meta_device_get_type ())
|
||||
#define META_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE, MetaDevice))
|
||||
#define META_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE, MetaDeviceClass))
|
||||
#define META_IS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE))
|
||||
#define META_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE))
|
||||
#define META_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE, MetaDeviceClass))
|
||||
|
||||
typedef struct _MetaDeviceClass MetaDeviceClass;
|
||||
|
||||
GType meta_device_get_type (void) G_GNUC_CONST;
|
||||
|
||||
int meta_device_get_id (MetaDevice *device);
|
||||
MetaDisplay *meta_device_get_display (MetaDevice *device);
|
||||
|
||||
MetaDevice * meta_device_get_paired_device (MetaDevice *device);
|
||||
|
||||
#endif
|
@@ -28,6 +28,7 @@
|
||||
#include <meta/types.h>
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/common.h>
|
||||
#include <meta/device-map.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
@@ -74,6 +75,9 @@ gboolean meta_display_has_shape (MetaDisplay *display);
|
||||
|
||||
MetaScreen *meta_display_screen_for_root (MetaDisplay *display,
|
||||
Window xroot);
|
||||
|
||||
MetaWindow *meta_display_get_keyboard_focus_window (MetaDisplay *display,
|
||||
MetaDevice *keyboard);
|
||||
MetaWindow *meta_display_get_focus_window (MetaDisplay *display);
|
||||
|
||||
gboolean meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
|
||||
@@ -108,9 +112,30 @@ MetaWindow* meta_display_get_tab_current (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *workspace);
|
||||
|
||||
GList* meta_display_get_device_tab_list (MetaDisplay *display,
|
||||
MetaTabList type,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *workspace,
|
||||
MetaDevice *device);
|
||||
|
||||
MetaWindow* meta_display_get_device_tab_next (MetaDisplay *display,
|
||||
MetaTabList type,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *workspace,
|
||||
MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
gboolean backward);
|
||||
|
||||
MetaWindow* meta_display_get_device_tab_current (MetaDisplay *display,
|
||||
MetaTabList type,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *workspace,
|
||||
MetaDevice *device);
|
||||
|
||||
gboolean meta_display_begin_grab_op (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
MetaDevice *device,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
gboolean frame_action,
|
||||
@@ -120,14 +145,28 @@ gboolean meta_display_begin_grab_op (MetaDisplay *display,
|
||||
int root_x,
|
||||
int root_y);
|
||||
void meta_display_end_grab_op (MetaDisplay *display,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
|
||||
MetaGrabOp meta_display_get_grab_op (MetaDisplay *display);
|
||||
|
||||
MetaGrabOp meta_display_get_device_grab_op (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
|
||||
MetaKeyBindingAction meta_display_get_keybinding_action (MetaDisplay *display,
|
||||
unsigned int keycode,
|
||||
unsigned long mask);
|
||||
|
||||
void meta_display_set_keyboard_focus (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
MetaDevice *keyboard,
|
||||
gboolean focus_frame,
|
||||
guint32 timestamp);
|
||||
void meta_display_unset_keyboard_focus (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaDevice *keyboard,
|
||||
guint32 timestamp);
|
||||
|
||||
/* meta_display_set_input_focus_window is like XSetInputFocus, except
|
||||
* that (a) it can't detect timestamps later than the current time,
|
||||
* since Mutter isn't part of the XServer, and thus gives erroneous
|
||||
@@ -158,4 +197,10 @@ Window meta_display_get_leader_window (MetaDisplay *display);
|
||||
void meta_display_add_ignored_crossing_serial (MetaDisplay *display,
|
||||
unsigned long serial);
|
||||
|
||||
void meta_display_unmanage_screen (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
guint32 timestamp);
|
||||
|
||||
MetaDeviceMap * meta_display_get_device_map (MetaDisplay *display);
|
||||
|
||||
#endif
|
||||
|
@@ -67,6 +67,10 @@ void meta_keybindings_switch_window (MetaDisplay *display,
|
||||
MetaKeyBinding *binding);
|
||||
|
||||
|
||||
void meta_screen_ungrab_all_keys (MetaScreen *screen, guint32 timestamp);
|
||||
gboolean meta_screen_grab_all_keys (MetaScreen *screen, guint32 timestamp);
|
||||
void meta_screen_ungrab_all_keys (MetaScreen *screen,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
gboolean meta_screen_grab_all_keys (MetaScreen *screen,
|
||||
MetaDevice *device,
|
||||
guint32 timestamp);
|
||||
#endif
|
||||
|
@@ -32,6 +32,8 @@ typedef struct _MetaFrame MetaFrame;
|
||||
typedef struct _MetaScreen MetaScreen;
|
||||
typedef struct _MetaWindow MetaWindow;
|
||||
typedef struct _MetaWorkspace MetaWorkspace;
|
||||
typedef struct _MetaDevice MetaDevice;
|
||||
typedef struct _MetaDeviceMap MetaDeviceMap;
|
||||
/**
|
||||
* MetaGroup: (skip)
|
||||
*
|
||||
|
@@ -38,6 +38,9 @@ gboolean meta_is_syncing (void);
|
||||
void meta_set_syncing (gboolean setting);
|
||||
void meta_set_replace_current_wm (gboolean setting);
|
||||
|
||||
gboolean meta_get_use_core_devices (void);
|
||||
void meta_set_use_core_devices (gboolean setting);
|
||||
|
||||
void meta_debug_spew_real (const char *format,
|
||||
...) G_GNUC_PRINTF (1, 2);
|
||||
void meta_verbose_real (const char *format,
|
||||
|
@@ -148,8 +148,15 @@ grab_area_at_mouse (GtkWidget *invisible,
|
||||
static void
|
||||
shutdown_grab (void)
|
||||
{
|
||||
gdk_keyboard_ungrab (gtk_get_current_event_time ());
|
||||
gdk_pointer_ungrab (gtk_get_current_event_time ());
|
||||
GdkDeviceManager *manager;
|
||||
GdkDevice *device;
|
||||
|
||||
manager = gdk_display_get_device_manager (gdk_display_get_default ());
|
||||
device = gdk_device_manager_get_client_pointer (manager);
|
||||
|
||||
gdk_device_ungrab (device, gtk_get_current_event_time ());
|
||||
gdk_device_ungrab (gdk_device_get_associated_device (device),
|
||||
gtk_get_current_event_time ());
|
||||
gtk_grab_remove (grab_widget);
|
||||
}
|
||||
|
||||
@@ -197,6 +204,8 @@ key_press (GtkWidget *invisible,
|
||||
g_signal_handlers_disconnect_by_func (invisible, mouse_press, NULL);
|
||||
g_signal_handlers_disconnect_by_func (invisible, key_press, NULL);
|
||||
|
||||
gtk_main_quit ();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -227,6 +236,8 @@ static void
|
||||
begin_area_grab (void)
|
||||
{
|
||||
GdkWindow *window;
|
||||
GdkDeviceManager *manager;
|
||||
GdkDevice *device;
|
||||
|
||||
if (grab_widget == NULL)
|
||||
{
|
||||
@@ -239,24 +250,31 @@ begin_area_grab (void)
|
||||
}
|
||||
|
||||
window = gtk_widget_get_window (grab_widget);
|
||||
manager = gdk_display_get_device_manager (gdk_display_get_default ());
|
||||
device = gdk_device_manager_get_client_pointer (manager);
|
||||
|
||||
if (gdk_keyboard_grab (window,
|
||||
FALSE,
|
||||
gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS)
|
||||
if (gdk_device_grab (device,
|
||||
window,
|
||||
GDK_OWNERSHIP_NONE,
|
||||
FALSE,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK,
|
||||
NULL,
|
||||
gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS)
|
||||
{
|
||||
g_warning ("Failed to grab keyboard to do eyedropper");
|
||||
g_warning ("Failed to grab pointer to do eyedropper");
|
||||
return;
|
||||
}
|
||||
|
||||
if (gdk_pointer_grab (window,
|
||||
FALSE,
|
||||
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK,
|
||||
NULL,
|
||||
NULL,
|
||||
gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS)
|
||||
|
||||
if (gdk_device_grab (gdk_device_get_associated_device (device),
|
||||
window,
|
||||
GDK_OWNERSHIP_NONE,
|
||||
FALSE,
|
||||
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
|
||||
NULL,
|
||||
gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS)
|
||||
{
|
||||
gdk_keyboard_ungrab (GDK_CURRENT_TIME);
|
||||
g_warning ("Failed to grab pointer to do eyedropper");
|
||||
gdk_device_ungrab (device, gtk_get_current_event_time ());
|
||||
g_warning ("Failed to grab keyboard to do eyedropper");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -353,7 +353,7 @@ utility_cb (GtkAction *action,
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
||||
|
||||
@@ -386,7 +386,7 @@ toolbar_cb (GtkAction *action,
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
||||
|
||||
@@ -410,7 +410,7 @@ menu_cb (GtkAction *action,
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
||||
|
||||
@@ -431,7 +431,7 @@ override_redirect_cb (GtkAction *action,
|
||||
window = gtk_window_new (GTK_WINDOW_POPUP);
|
||||
gtk_window_set_title (GTK_WINDOW (window), "Override Redirect");
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
||||
|
||||
@@ -455,7 +455,7 @@ border_only_cb (GtkAction *action,
|
||||
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
||||
|
||||
@@ -477,7 +477,7 @@ changing_icon_cb (GtkAction *action,
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_title (GTK_WINDOW (window), "Changing Icon");
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
||||
|
||||
@@ -545,7 +545,7 @@ splashscreen_cb (GtkAction *action,
|
||||
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_SPLASHSCREEN");
|
||||
gtk_window_set_title (GTK_WINDOW (window), "Splashscreen");
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
|
||||
@@ -581,11 +581,11 @@ make_dock (int type)
|
||||
{
|
||||
case DOCK_LEFT:
|
||||
case DOCK_RIGHT:
|
||||
box = gtk_vbox_new (FALSE, 0);
|
||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
break;
|
||||
case DOCK_TOP:
|
||||
case DOCK_BOTTOM:
|
||||
box = gtk_hbox_new (FALSE, 0);
|
||||
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
break;
|
||||
case DOCK_ALL:
|
||||
break;
|
||||
@@ -909,8 +909,7 @@ static GtkWidget *
|
||||
do_appwindow (void)
|
||||
{
|
||||
GtkWidget *window;
|
||||
GtkWidget *table;
|
||||
GtkWidget *handlebox;
|
||||
GtkWidget *grid;
|
||||
GtkWidget *statusbar;
|
||||
GtkWidget *contents;
|
||||
GtkWidget *sw;
|
||||
@@ -931,9 +930,12 @@ do_appwindow (void)
|
||||
g_signal_connect (G_OBJECT (window), "destroy",
|
||||
G_CALLBACK (destroy_cb), NULL);
|
||||
|
||||
table = gtk_table_new (1, 4, FALSE);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), table);
|
||||
grid = gtk_grid_new ();
|
||||
|
||||
gtk_widget_set_vexpand (grid, TRUE);
|
||||
gtk_widget_set_hexpand (grid, TRUE);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (window), grid);
|
||||
|
||||
/* Create the menubar
|
||||
*/
|
||||
@@ -958,12 +960,12 @@ do_appwindow (void)
|
||||
|
||||
gtk_ui_manager_add_ui_from_string (ui_manager, menu_item_string, -1, NULL);
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, 0,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
|
||||
0, 0, 1, 1);
|
||||
|
||||
gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
|
||||
TRUE);
|
||||
|
||||
/* Create document
|
||||
*/
|
||||
@@ -976,13 +978,13 @@ do_appwindow (void)
|
||||
|
||||
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
|
||||
GTK_SHADOW_IN);
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
sw,
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
|
||||
0, 0);
|
||||
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
sw,
|
||||
0, 2, 1, 1);
|
||||
|
||||
gtk_widget_set_hexpand (sw, TRUE);
|
||||
gtk_widget_set_vexpand (sw, TRUE);
|
||||
|
||||
gtk_window_set_default_size (GTK_WINDOW (window),
|
||||
200, 200);
|
||||
@@ -996,27 +998,22 @@ do_appwindow (void)
|
||||
/* Create the toolbar
|
||||
*/
|
||||
|
||||
handlebox = gtk_handle_box_new ();
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"),
|
||||
0, 1, 1, 1);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (handlebox),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"));
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
handlebox,
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 1, 2,
|
||||
GTK_EXPAND | GTK_FILL, 0,
|
||||
0, 0);
|
||||
gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"),
|
||||
TRUE);
|
||||
|
||||
/* Create statusbar */
|
||||
|
||||
statusbar = gtk_statusbar_new ();
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
statusbar,
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 3, 4,
|
||||
GTK_EXPAND | GTK_FILL, 0,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
statusbar,
|
||||
0, 3, 1, 1);
|
||||
|
||||
gtk_widget_set_hexpand (statusbar,
|
||||
TRUE);
|
||||
|
||||
/* Show text widget info in the statusbar */
|
||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents));
|
||||
|
184
src/ui/frames.c
184
src/ui/frames.c
@@ -52,6 +52,7 @@ static void meta_frames_unmap (GtkWidget *widget);
|
||||
|
||||
static void meta_frames_update_prelit_control (MetaFrames *frames,
|
||||
MetaUIFrame *frame,
|
||||
GdkDevice *device,
|
||||
MetaFrameControl control);
|
||||
static gboolean meta_frames_button_press_event (GtkWidget *widget,
|
||||
GdkEventButton *event);
|
||||
@@ -734,10 +735,18 @@ meta_frames_unmanage_window (MetaFrames *frames,
|
||||
*/
|
||||
invalidate_all_caches (frames);
|
||||
|
||||
#if 0
|
||||
/* This function is only called when destroying the frame
|
||||
* in core/frame.c, ideally this should be done for every
|
||||
* device with a cursor on the frame, but in practical
|
||||
* effects it doesn't matter.
|
||||
*/
|
||||
|
||||
/* restore the cursor */
|
||||
meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
frame->xwindow,
|
||||
META_CURSOR_DEFAULT);
|
||||
#endif
|
||||
|
||||
gdk_window_set_user_data (frame->window, NULL);
|
||||
|
||||
@@ -1293,10 +1302,12 @@ meta_frame_titlebar_event (MetaUIFrame *frame,
|
||||
int action)
|
||||
{
|
||||
MetaFrameFlags flags;
|
||||
GdkDevice *pointer;
|
||||
Display *display;
|
||||
|
||||
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
||||
|
||||
pointer = gdk_event_get_device ((GdkEvent *) event);
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case META_ACTION_TITLEBAR_TOGGLE_SHADE:
|
||||
@@ -1378,12 +1389,14 @@ meta_frame_titlebar_event (MetaUIFrame *frame,
|
||||
case META_ACTION_TITLEBAR_LOWER:
|
||||
meta_core_user_lower_and_unfocus (display,
|
||||
frame->xwindow,
|
||||
gdk_x11_device_get_id (pointer),
|
||||
event->time);
|
||||
break;
|
||||
|
||||
case META_ACTION_TITLEBAR_MENU:
|
||||
meta_core_show_window_menu (display,
|
||||
frame->xwindow,
|
||||
gdk_x11_device_get_id (pointer),
|
||||
event->x_root,
|
||||
event->y_root,
|
||||
event->button,
|
||||
@@ -1432,7 +1445,9 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
MetaFrames *frames;
|
||||
MetaFrameControl control;
|
||||
Display *display;
|
||||
|
||||
GdkDevice *device;
|
||||
int device_id;
|
||||
|
||||
frames = META_FRAMES (widget);
|
||||
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
||||
|
||||
@@ -1465,7 +1480,10 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
/* don't do the rest of this if on client area */
|
||||
if (control == META_FRAME_CONTROL_CLIENT_AREA)
|
||||
return FALSE; /* not on the frame, just passed through from client */
|
||||
|
||||
|
||||
device = gdk_event_get_device ((GdkEvent *) event);
|
||||
device_id = gdk_x11_device_get_id (device);
|
||||
|
||||
/* We want to shade even if we have a GrabOp, since we'll have a move grab
|
||||
* if we double click the titlebar.
|
||||
*/
|
||||
@@ -1473,13 +1491,13 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
event->button == 1 &&
|
||||
event->type == GDK_2BUTTON_PRESS)
|
||||
{
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
return meta_frame_double_click_event (frame, event);
|
||||
}
|
||||
|
||||
if (meta_core_get_grab_op (display) !=
|
||||
if (meta_core_frame_has_grab (display, frame->xwindow, NULL, NULL) !=
|
||||
META_GRAB_OP_NONE)
|
||||
return FALSE; /* already up to something */
|
||||
return FALSE; /* already up to something */
|
||||
|
||||
if (event->button == 1 &&
|
||||
(control == META_FRAME_CONTROL_MAXIMIZE ||
|
||||
@@ -1538,6 +1556,7 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
|
||||
meta_core_begin_grab_op (display,
|
||||
frame->xwindow,
|
||||
device_id,
|
||||
op,
|
||||
TRUE,
|
||||
TRUE,
|
||||
@@ -1570,6 +1589,7 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
|
||||
meta_core_show_window_menu (display,
|
||||
frame->xwindow,
|
||||
device_id,
|
||||
rect->x + dx,
|
||||
rect->y + rect->height + dy,
|
||||
event->button,
|
||||
@@ -1623,6 +1643,7 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
|
||||
meta_core_begin_grab_op (display,
|
||||
frame->xwindow,
|
||||
device_id,
|
||||
op,
|
||||
TRUE,
|
||||
TRUE,
|
||||
@@ -1645,6 +1666,7 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
{
|
||||
meta_core_begin_grab_op (display,
|
||||
frame->xwindow,
|
||||
device_id,
|
||||
META_GRAB_OP_MOVING,
|
||||
TRUE,
|
||||
TRUE,
|
||||
@@ -1668,28 +1690,28 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
}
|
||||
|
||||
void
|
||||
meta_frames_notify_menu_hide (MetaFrames *frames)
|
||||
meta_frames_notify_menu_hide (MetaFrames *frames,
|
||||
Window client_xwindow)
|
||||
{
|
||||
Display *display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
||||
if (meta_core_get_grab_op (display) ==
|
||||
Window frame_xwindow;
|
||||
int device_id;
|
||||
|
||||
frame_xwindow = meta_core_get_frame (display, client_xwindow);
|
||||
|
||||
if (frame_xwindow != None &&
|
||||
meta_core_frame_has_grab (display, frame_xwindow, &device_id, NULL) ==
|
||||
META_GRAB_OP_CLICKING_MENU)
|
||||
{
|
||||
Window grab_frame;
|
||||
MetaUIFrame *frame;
|
||||
|
||||
grab_frame = meta_core_get_grab_frame (display);
|
||||
frame = meta_frames_lookup_window (frames, frame_xwindow);
|
||||
|
||||
if (grab_frame != None)
|
||||
if (frame)
|
||||
{
|
||||
MetaUIFrame *frame;
|
||||
|
||||
frame = meta_frames_lookup_window (frames, grab_frame);
|
||||
|
||||
if (frame)
|
||||
{
|
||||
redraw_control (frames, frame,
|
||||
META_FRAME_CONTROL_MENU);
|
||||
meta_core_end_grab_op (display, CurrentTime);
|
||||
}
|
||||
redraw_control (frames, frame,
|
||||
META_FRAME_CONTROL_MENU);
|
||||
meta_core_end_grab_op (display, device_id, CurrentTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1702,7 +1724,10 @@ meta_frames_button_release_event (GtkWidget *widget,
|
||||
MetaFrames *frames;
|
||||
MetaGrabOp op;
|
||||
Display *display;
|
||||
|
||||
int grab_button;
|
||||
GdkDevice *device;
|
||||
int device_id, grab_device_id;
|
||||
|
||||
frames = META_FRAMES (widget);
|
||||
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
||||
|
||||
@@ -1712,17 +1737,21 @@ meta_frames_button_release_event (GtkWidget *widget,
|
||||
|
||||
clear_tip (frames);
|
||||
|
||||
op = meta_core_get_grab_op (display);
|
||||
op = meta_core_frame_has_grab (display, frame->xwindow,
|
||||
&grab_device_id, &grab_button);
|
||||
|
||||
if (op == META_GRAB_OP_NONE)
|
||||
device = gdk_event_get_device ((GdkEvent *) event);
|
||||
device_id = gdk_x11_device_get_id (device);
|
||||
|
||||
if (op == META_GRAB_OP_NONE ||
|
||||
grab_device_id != device_id)
|
||||
return FALSE;
|
||||
|
||||
/* We only handle the releases we handled the presses for (things
|
||||
* involving frame controls). Window ops that don't require a
|
||||
* frame are handled in the Xlib part of the code, display.c/window.c
|
||||
*/
|
||||
if (frame->xwindow == meta_core_get_grab_frame (display) &&
|
||||
((int) event->button) == meta_core_get_grab_button (display))
|
||||
if (((int) event->button) == grab_button)
|
||||
{
|
||||
MetaFrameControl control;
|
||||
|
||||
@@ -1733,8 +1762,8 @@ meta_frames_button_release_event (GtkWidget *widget,
|
||||
case META_GRAB_OP_CLICKING_MINIMIZE:
|
||||
if (control == META_FRAME_CONTROL_MINIMIZE)
|
||||
meta_core_minimize (display, frame->xwindow);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_MAXIMIZE:
|
||||
@@ -1746,67 +1775,67 @@ meta_frames_button_release_event (GtkWidget *widget,
|
||||
event->time);
|
||||
meta_core_maximize (display, frame->xwindow);
|
||||
}
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_UNMAXIMIZE:
|
||||
if (control == META_FRAME_CONTROL_UNMAXIMIZE)
|
||||
meta_core_unmaximize (display, frame->xwindow);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_DELETE:
|
||||
if (control == META_FRAME_CONTROL_DELETE)
|
||||
meta_core_delete (display, frame->xwindow, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_MENU:
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_SHADE:
|
||||
if (control == META_FRAME_CONTROL_SHADE)
|
||||
meta_core_shade (display, frame->xwindow, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_UNSHADE:
|
||||
if (control == META_FRAME_CONTROL_UNSHADE)
|
||||
meta_core_unshade (display, frame->xwindow, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_ABOVE:
|
||||
if (control == META_FRAME_CONTROL_ABOVE)
|
||||
meta_core_make_above (display, frame->xwindow);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_UNABOVE:
|
||||
if (control == META_FRAME_CONTROL_UNABOVE)
|
||||
meta_core_unmake_above (display, frame->xwindow);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_STICK:
|
||||
if (control == META_FRAME_CONTROL_STICK)
|
||||
meta_core_stick (display, frame->xwindow);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_CLICKING_UNSTICK:
|
||||
if (control == META_FRAME_CONTROL_UNSTICK)
|
||||
meta_core_unstick (display, frame->xwindow);
|
||||
|
||||
meta_core_end_grab_op (display, event->time);
|
||||
meta_core_end_grab_op (display, device_id, event->time);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1818,7 +1847,9 @@ meta_frames_button_release_event (GtkWidget *widget,
|
||||
* prelit so to let the user know that it can now be pressed.
|
||||
* :)
|
||||
*/
|
||||
meta_frames_update_prelit_control (frames, frame, control);
|
||||
meta_frames_update_prelit_control (frames, frame,
|
||||
gdk_event_get_device ((GdkEvent *) event),
|
||||
control);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@@ -1827,12 +1858,12 @@ meta_frames_button_release_event (GtkWidget *widget,
|
||||
static void
|
||||
meta_frames_update_prelit_control (MetaFrames *frames,
|
||||
MetaUIFrame *frame,
|
||||
GdkDevice *device,
|
||||
MetaFrameControl control)
|
||||
{
|
||||
MetaFrameControl old_control;
|
||||
MetaCursor cursor;
|
||||
|
||||
|
||||
meta_verbose ("Updating prelit control from %u to %u\n",
|
||||
frame->prelit_control, control);
|
||||
|
||||
@@ -1897,6 +1928,7 @@ meta_frames_update_prelit_control (MetaFrames *frames,
|
||||
/* set/unset the prelight cursor */
|
||||
meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
frame->xwindow,
|
||||
gdk_x11_device_get_id (device),
|
||||
cursor);
|
||||
|
||||
switch (control)
|
||||
@@ -1942,7 +1974,7 @@ meta_frames_motion_notify_event (GtkWidget *widget,
|
||||
Display *display;
|
||||
|
||||
frames = META_FRAMES (widget);
|
||||
display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
||||
display = GDK_DISPLAY_XDISPLAY (gdk_window_get_display (event->window));
|
||||
|
||||
frame = meta_frames_lookup_window (frames, GDK_WINDOW_XID (event->window));
|
||||
if (frame == NULL)
|
||||
@@ -1952,8 +1984,8 @@ meta_frames_motion_notify_event (GtkWidget *widget,
|
||||
|
||||
frames->last_motion_frame = frame;
|
||||
|
||||
grab_op = meta_core_get_grab_op (display);
|
||||
|
||||
grab_op = meta_core_frame_has_grab (display, frame->xwindow, NULL, NULL);
|
||||
|
||||
switch (grab_op)
|
||||
{
|
||||
case META_GRAB_OP_CLICKING_MENU:
|
||||
@@ -1969,9 +2001,9 @@ meta_frames_motion_notify_event (GtkWidget *widget,
|
||||
case META_GRAB_OP_CLICKING_UNSTICK:
|
||||
{
|
||||
MetaFrameControl control;
|
||||
int x, y;
|
||||
|
||||
gdk_window_get_pointer (frame->window, &x, &y, NULL);
|
||||
gdouble x, y;
|
||||
|
||||
gdk_event_get_coords ((GdkEvent *) event, &x, &y);
|
||||
|
||||
/* Control is set to none unless it matches
|
||||
* the current grab
|
||||
@@ -2002,7 +2034,9 @@ meta_frames_motion_notify_event (GtkWidget *widget,
|
||||
control = META_FRAME_CONTROL_NONE;
|
||||
|
||||
/* Update prelit control and cursor */
|
||||
meta_frames_update_prelit_control (frames, frame, control);
|
||||
meta_frames_update_prelit_control (frames, frame,
|
||||
gdk_event_get_device ((GdkEvent *) event),
|
||||
control);
|
||||
|
||||
/* No tooltip while in the process of clicking */
|
||||
}
|
||||
@@ -2010,14 +2044,15 @@ meta_frames_motion_notify_event (GtkWidget *widget,
|
||||
case META_GRAB_OP_NONE:
|
||||
{
|
||||
MetaFrameControl control;
|
||||
int x, y;
|
||||
|
||||
gdk_window_get_pointer (frame->window, &x, &y, NULL);
|
||||
gdouble x, y;
|
||||
|
||||
gdk_event_get_coords ((GdkEvent *) event, &x, &y);
|
||||
control = get_control (frames, frame, x, y);
|
||||
|
||||
/* Update prelit control and cursor */
|
||||
meta_frames_update_prelit_control (frames, frame, control);
|
||||
meta_frames_update_prelit_control (frames, frame,
|
||||
gdk_event_get_device ((GdkEvent *) event),
|
||||
control);
|
||||
|
||||
queue_tip (frames);
|
||||
}
|
||||
@@ -2366,7 +2401,6 @@ meta_frames_paint (MetaFrames *frames,
|
||||
GdkPixbuf *icon;
|
||||
int w, h;
|
||||
MetaButtonState button_states[META_BUTTON_TYPE_LAST];
|
||||
Window grab_frame;
|
||||
int i;
|
||||
MetaButtonLayout button_layout;
|
||||
MetaGrabOp grab_op;
|
||||
@@ -2378,11 +2412,8 @@ meta_frames_paint (MetaFrames *frames,
|
||||
for (i = 0; i < META_BUTTON_TYPE_LAST; i++)
|
||||
button_states[i] = META_BUTTON_STATE_NORMAL;
|
||||
|
||||
grab_frame = meta_core_get_grab_frame (display);
|
||||
grab_op = meta_core_get_grab_op (display);
|
||||
if (grab_frame != frame->xwindow)
|
||||
grab_op = META_GRAB_OP_NONE;
|
||||
|
||||
grab_op = meta_core_frame_has_grab (display, frame->xwindow, NULL, NULL);
|
||||
|
||||
/* Set prelight state */
|
||||
switch (frame->prelit_control)
|
||||
{
|
||||
@@ -2544,7 +2575,9 @@ meta_frames_enter_notify_event (GtkWidget *widget,
|
||||
return FALSE;
|
||||
|
||||
control = get_control (frames, frame, event->x, event->y);
|
||||
meta_frames_update_prelit_control (frames, frame, control);
|
||||
meta_frames_update_prelit_control (frames, frame,
|
||||
gdk_event_get_device ((GdkEvent *) event),
|
||||
control);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -2562,7 +2595,9 @@ meta_frames_leave_notify_event (GtkWidget *widget,
|
||||
if (frame == NULL)
|
||||
return FALSE;
|
||||
|
||||
meta_frames_update_prelit_control (frames, frame, META_FRAME_CONTROL_NONE);
|
||||
meta_frames_update_prelit_control (frames, frame,
|
||||
gdk_event_get_device ((GdkEvent *) event),
|
||||
META_FRAME_CONTROL_NONE);
|
||||
|
||||
clear_tip (frames);
|
||||
|
||||
@@ -2637,7 +2672,6 @@ control_rect (MetaFrameControl control,
|
||||
return rect;
|
||||
}
|
||||
|
||||
#define RESIZE_EXTENDS 15
|
||||
#define TOP_RESIZE_HEIGHT 4
|
||||
static MetaFrameControl
|
||||
get_control (MetaFrames *frames,
|
||||
@@ -2726,8 +2760,8 @@ get_control (MetaFrames *frames,
|
||||
* in case of overlap.
|
||||
*/
|
||||
|
||||
if (y >= (fgeom.height - fgeom.borders.total.bottom - RESIZE_EXTENDS) &&
|
||||
x >= (fgeom.width - fgeom.borders.total.right - RESIZE_EXTENDS))
|
||||
if (y >= (fgeom.height - fgeom.borders.total.bottom) &&
|
||||
x >= (fgeom.width - fgeom.borders.total.right))
|
||||
{
|
||||
if (has_vert && has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_SE;
|
||||
@@ -2736,8 +2770,8 @@ get_control (MetaFrames *frames,
|
||||
else if (has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_E;
|
||||
}
|
||||
else if (y >= (fgeom.height - fgeom.borders.total.bottom - RESIZE_EXTENDS) &&
|
||||
x <= (fgeom.borders.total.left + RESIZE_EXTENDS))
|
||||
else if (y >= (fgeom.height - fgeom.borders.total.bottom) &&
|
||||
x <= fgeom.borders.total.left)
|
||||
{
|
||||
if (has_vert && has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_SW;
|
||||
@@ -2746,8 +2780,8 @@ get_control (MetaFrames *frames,
|
||||
else if (has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_W;
|
||||
}
|
||||
else if (y < (fgeom.borders.invisible.top + RESIZE_EXTENDS) &&
|
||||
x <= (fgeom.borders.total.left + RESIZE_EXTENDS) && has_north_resize)
|
||||
else if (y < (fgeom.borders.invisible.top) &&
|
||||
x <= fgeom.borders.total.left && has_north_resize)
|
||||
{
|
||||
if (has_vert && has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_NW;
|
||||
@@ -2756,8 +2790,8 @@ get_control (MetaFrames *frames,
|
||||
else if (has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_W;
|
||||
}
|
||||
else if (y < (fgeom.borders.invisible.top + RESIZE_EXTENDS) &&
|
||||
x >= (fgeom.width - fgeom.borders.total.right - RESIZE_EXTENDS) && has_north_resize)
|
||||
else if (y < (fgeom.borders.invisible.top) &&
|
||||
x >= fgeom.width - fgeom.borders.total.right && has_north_resize)
|
||||
{
|
||||
if (has_vert && has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_NE;
|
||||
@@ -2771,17 +2805,17 @@ get_control (MetaFrames *frames,
|
||||
if (has_vert && has_north_resize)
|
||||
return META_FRAME_CONTROL_RESIZE_N;
|
||||
}
|
||||
else if (y >= (fgeom.height - fgeom.borders.total.bottom - RESIZE_EXTENDS))
|
||||
else if (y >= (fgeom.height - fgeom.borders.total.bottom))
|
||||
{
|
||||
if (has_vert)
|
||||
return META_FRAME_CONTROL_RESIZE_S;
|
||||
}
|
||||
else if (x <= fgeom.borders.total.left + RESIZE_EXTENDS)
|
||||
else if (x <= fgeom.borders.total.left)
|
||||
{
|
||||
if (has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_W;
|
||||
}
|
||||
else if (x >= (fgeom.width - fgeom.borders.total.right - RESIZE_EXTENDS))
|
||||
else if (x >= (fgeom.width - fgeom.borders.total.right))
|
||||
{
|
||||
if (has_horiz)
|
||||
return META_FRAME_CONTROL_RESIZE_E;
|
||||
|
@@ -165,7 +165,8 @@ void meta_frames_move_resize_frame (MetaFrames *frames,
|
||||
void meta_frames_queue_draw (MetaFrames *frames,
|
||||
Window xwindow);
|
||||
|
||||
void meta_frames_notify_menu_hide (MetaFrames *frames);
|
||||
void meta_frames_notify_menu_hide (MetaFrames *frames,
|
||||
Window client_xwindow);
|
||||
|
||||
Window meta_frames_get_moving_frame (MetaFrames *frames);
|
||||
|
||||
|
@@ -137,7 +137,7 @@ menu_closed (GtkMenu *widget,
|
||||
|
||||
menu = data;
|
||||
|
||||
meta_frames_notify_menu_hide (menu->frames);
|
||||
meta_frames_notify_menu_hide (menu->frames, menu->client_xwindow);
|
||||
(* menu->func) (menu,
|
||||
GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
menu->client_xwindow,
|
||||
@@ -157,7 +157,7 @@ activate_cb (GtkWidget *menuitem, gpointer data)
|
||||
|
||||
md = data;
|
||||
|
||||
meta_frames_notify_menu_hide (md->menu->frames);
|
||||
meta_frames_notify_menu_hide (md->menu->frames, md->menu->client_xwindow);
|
||||
(* md->menu->func) (md->menu,
|
||||
GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
md->menu->client_xwindow,
|
||||
@@ -498,13 +498,17 @@ meta_window_menu_new (MetaFrames *frames,
|
||||
|
||||
void
|
||||
meta_window_menu_popup (MetaWindowMenu *menu,
|
||||
MetaDevice *device,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
guint32 timestamp)
|
||||
{
|
||||
GdkDeviceManager *device_manager;
|
||||
GdkDevice *gdkdevice;
|
||||
GdkDisplay *display;
|
||||
GdkPoint *pt;
|
||||
|
||||
|
||||
pt = g_new (GdkPoint, 1);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (menu->menu),
|
||||
@@ -514,12 +518,18 @@ meta_window_menu_popup (MetaWindowMenu *menu,
|
||||
|
||||
pt->x = root_x;
|
||||
pt->y = root_y;
|
||||
|
||||
gtk_menu_popup (GTK_MENU (menu->menu),
|
||||
NULL, NULL,
|
||||
popup_position_func, pt,
|
||||
button,
|
||||
timestamp);
|
||||
|
||||
display = gtk_widget_get_display (menu->menu);
|
||||
device_manager = gdk_display_get_device_manager (display);
|
||||
gdkdevice = gdk_x11_device_manager_lookup (device_manager,
|
||||
meta_device_get_id (device));
|
||||
|
||||
gtk_menu_popup_for_device (GTK_MENU (menu->menu),
|
||||
gdkdevice,
|
||||
NULL, NULL,
|
||||
popup_position_func, pt, NULL,
|
||||
button,
|
||||
timestamp);
|
||||
|
||||
if (!gtk_widget_get_visible (menu->menu))
|
||||
meta_warning ("GtkMenu failed to grab the pointer\n");
|
||||
|
@@ -25,6 +25,7 @@
|
||||
#define META_MENU_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <meta/device.h>
|
||||
#include "frames.h"
|
||||
|
||||
/* Stock icons */
|
||||
@@ -52,6 +53,7 @@ MetaWindowMenu* meta_window_menu_new (MetaFrames *frames,
|
||||
MetaWindowMenuFunc func,
|
||||
gpointer data);
|
||||
void meta_window_menu_popup (MetaWindowMenu *menu,
|
||||
MetaDevice *device,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
|
@@ -217,9 +217,9 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
|
||||
gboolean outline)
|
||||
{
|
||||
MetaTabPopup *popup;
|
||||
int i, left, right, top, bottom;
|
||||
int i, left, top;
|
||||
int height;
|
||||
GtkWidget *table;
|
||||
GtkWidget *grid;
|
||||
GtkWidget *vbox;
|
||||
GtkWidget *align;
|
||||
GList *tmp;
|
||||
@@ -273,12 +273,12 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
|
||||
if (i % width)
|
||||
height += 1;
|
||||
|
||||
table = gtk_table_new (height, width, FALSE);
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
grid = gtk_grid_new ();
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
frame = gtk_frame_new (NULL);
|
||||
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (table), 1);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (grid), 1);
|
||||
gtk_container_add (GTK_CONTAINER (popup->window),
|
||||
frame);
|
||||
gtk_container_add (GTK_CONTAINER (frame),
|
||||
@@ -289,7 +289,7 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
|
||||
gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (align),
|
||||
table);
|
||||
grid);
|
||||
|
||||
popup->label = gtk_label_new ("");
|
||||
|
||||
@@ -306,13 +306,11 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
|
||||
|
||||
max_label_width = 0;
|
||||
top = 0;
|
||||
bottom = 1;
|
||||
tmp = popup->entries;
|
||||
|
||||
while (tmp && top < height)
|
||||
{
|
||||
left = 0;
|
||||
right = 1;
|
||||
|
||||
while (tmp && left < width)
|
||||
{
|
||||
@@ -351,11 +349,9 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
|
||||
|
||||
te->widget = image;
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
te->widget,
|
||||
left, right, top, bottom,
|
||||
0, 0,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
te->widget,
|
||||
left, top, 1, 1);
|
||||
|
||||
/* Efficiency rules! */
|
||||
gtk_label_set_markup (GTK_LABEL (popup->label),
|
||||
@@ -366,11 +362,9 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,
|
||||
tmp = tmp->next;
|
||||
|
||||
++left;
|
||||
++right;
|
||||
}
|
||||
|
||||
++top;
|
||||
++bottom;
|
||||
}
|
||||
|
||||
/* remove all the temporary text */
|
||||
@@ -858,12 +852,21 @@ static WnckWindowDisplayInfo
|
||||
meta_convert_meta_to_wnck (MetaWindow *window, MetaScreen *screen)
|
||||
{
|
||||
WnckWindowDisplayInfo wnck_window;
|
||||
MetaFocusInfo *focus_info;
|
||||
GHashTableIter iter;
|
||||
|
||||
wnck_window.icon = window->icon;
|
||||
wnck_window.mini_icon = window->mini_icon;
|
||||
|
||||
wnck_window.is_active = FALSE;
|
||||
if (window == window->display->expected_focus_window)
|
||||
wnck_window.is_active = TRUE;
|
||||
|
||||
g_hash_table_iter_init (&iter, window->display->focus_info);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &focus_info))
|
||||
{
|
||||
if (window == focus_info->expected_focus_window)
|
||||
wnck_window.is_active = TRUE;
|
||||
}
|
||||
|
||||
if (window->frame)
|
||||
{
|
||||
|
@@ -723,8 +723,6 @@ typedef enum
|
||||
META_FRAME_PIECE_LAST
|
||||
} MetaFramePiece;
|
||||
|
||||
#define N_GTK_STATES 5
|
||||
|
||||
/**
|
||||
* How to draw a frame in a particular state (say, a focussed, non-maximised,
|
||||
* resizable frame). This corresponds closely to the <frame_style> tag
|
||||
|
@@ -122,19 +122,18 @@ static GtkActionEntry tool_items[] =
|
||||
static GtkWidget *
|
||||
normal_contents (void)
|
||||
{
|
||||
GtkWidget *table;
|
||||
GtkWidget *handlebox;
|
||||
GtkWidget *grid;
|
||||
GtkWidget *statusbar;
|
||||
GtkWidget *contents;
|
||||
GtkWidget *sw;
|
||||
GtkActionGroup *action_group;
|
||||
GtkUIManager *ui_manager;
|
||||
|
||||
table = gtk_table_new (1, 4, FALSE);
|
||||
|
||||
grid = gtk_grid_new ();
|
||||
|
||||
/* Create the menubar
|
||||
*/
|
||||
|
||||
|
||||
action_group = gtk_action_group_new ("mainmenu");
|
||||
gtk_action_group_add_actions (action_group,
|
||||
menu_items,
|
||||
@@ -152,24 +151,21 @@ normal_contents (void)
|
||||
/* create menu items */
|
||||
gtk_ui_manager_add_ui_from_string (ui_manager, menu_item_string, -1, NULL);
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 0, 1,
|
||||
GTK_EXPAND | GTK_FILL, 0,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
|
||||
0, 0, 1, 1);
|
||||
|
||||
handlebox = gtk_handle_box_new ();
|
||||
gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
|
||||
TRUE);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (handlebox),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"));
|
||||
/* Create the toolbar
|
||||
*/
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"),
|
||||
0, 1, 1, 1);
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
handlebox,
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 1, 2,
|
||||
GTK_EXPAND | GTK_FILL, 0,
|
||||
0, 0);
|
||||
gtk_widget_set_hexpand (gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"),
|
||||
TRUE);
|
||||
|
||||
/* Create document
|
||||
*/
|
||||
@@ -183,12 +179,12 @@ normal_contents (void)
|
||||
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
|
||||
GTK_SHADOW_IN);
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
sw,
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 2, 3,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
sw,
|
||||
0, 2, 1, 1);
|
||||
|
||||
gtk_widget_set_hexpand (sw, TRUE);
|
||||
gtk_widget_set_vexpand (sw, TRUE);
|
||||
|
||||
contents = gtk_text_view_new ();
|
||||
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (contents),
|
||||
@@ -200,18 +196,17 @@ normal_contents (void)
|
||||
/* Create statusbar */
|
||||
|
||||
statusbar = gtk_statusbar_new ();
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
statusbar,
|
||||
/* X direction */ /* Y direction */
|
||||
0, 1, 3, 4,
|
||||
GTK_EXPAND | GTK_FILL, 0,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
statusbar,
|
||||
0, 3, 1, 1);
|
||||
|
||||
gtk_widget_show_all (table);
|
||||
gtk_widget_set_hexpand (statusbar, TRUE);
|
||||
|
||||
gtk_widget_show_all (grid);
|
||||
|
||||
g_object_unref (ui_manager);
|
||||
|
||||
return table;
|
||||
return grid;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -233,7 +228,7 @@ dialog_contents (void)
|
||||
GtkWidget *image;
|
||||
GtkWidget *button;
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
action_area = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
|
||||
|
||||
@@ -258,7 +253,7 @@ dialog_contents (void)
|
||||
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
|
||||
gtk_label_set_selectable (GTK_LABEL (label), TRUE);
|
||||
|
||||
hbox = gtk_hbox_new (FALSE, 6);
|
||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (hbox), image,
|
||||
FALSE, FALSE, 0);
|
||||
@@ -278,11 +273,11 @@ dialog_contents (void)
|
||||
static GtkWidget*
|
||||
utility_contents (void)
|
||||
{
|
||||
GtkWidget *table;
|
||||
GtkWidget *grid;
|
||||
GtkWidget *button;
|
||||
int i, j;
|
||||
|
||||
table = gtk_table_new (3, 4, FALSE);
|
||||
grid = gtk_grid_new ();
|
||||
|
||||
i = 0;
|
||||
while (i < 3)
|
||||
@@ -298,12 +293,9 @@ utility_contents (void)
|
||||
|
||||
g_free (str);
|
||||
|
||||
gtk_table_attach (GTK_TABLE (table),
|
||||
button,
|
||||
/* X direction */ /* Y direction */
|
||||
i, i+1, j, j+1,
|
||||
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
|
||||
0, 0);
|
||||
gtk_grid_attach (GTK_GRID (grid),
|
||||
button,
|
||||
i, j, 1, 1);
|
||||
|
||||
++j;
|
||||
}
|
||||
@@ -311,9 +303,9 @@ utility_contents (void)
|
||||
++i;
|
||||
}
|
||||
|
||||
gtk_widget_show_all (table);
|
||||
gtk_widget_show_all (grid);
|
||||
|
||||
return table;
|
||||
return grid;
|
||||
}
|
||||
|
||||
static GtkWidget*
|
||||
@@ -328,7 +320,7 @@ menu_contents (void)
|
||||
gtk_frame_set_shadow_type (GTK_FRAME (frame),
|
||||
GTK_SHADOW_OUT);
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
i = 0;
|
||||
while (i < 10)
|
||||
@@ -365,7 +357,7 @@ border_only_contents (void)
|
||||
color.alpha = 1.0;
|
||||
gtk_widget_override_background_color (event_box, 0, &color);
|
||||
|
||||
vbox = gtk_vbox_new (FALSE, 0);
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
|
||||
|
||||
w = gtk_label_new (_("Border-only window"));
|
||||
@@ -487,7 +479,7 @@ preview_collection (int font_size,
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
|
||||
box = gtk_vbox_new (FALSE, 0);
|
||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_box_set_spacing (GTK_BOX (box), 20);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (box), 20);
|
||||
|
||||
@@ -711,7 +703,7 @@ previews_of_button_layouts (void)
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
|
||||
box = gtk_vbox_new (FALSE, 0);
|
||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_box_set_spacing (GTK_BOX (box), 20);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (box), 20);
|
||||
|
||||
|
@@ -406,6 +406,12 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
{
|
||||
int buttons_height, title_height, draggable_borders;
|
||||
|
||||
meta_frame_borders_clear (borders);
|
||||
|
||||
/* For a full-screen window, we don't have any borders, visible or not. */
|
||||
if (flags & META_FRAME_FULLSCREEN)
|
||||
return;
|
||||
|
||||
g_return_if_fail (layout != NULL);
|
||||
|
||||
if (!layout->has_title)
|
||||
@@ -417,33 +423,29 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
layout->title_vertical_pad +
|
||||
layout->title_border.top + layout->title_border.bottom;
|
||||
|
||||
borders->visible.top = MAX (buttons_height, title_height);
|
||||
borders->visible.left = layout->left_width;
|
||||
borders->visible.right = layout->right_width;
|
||||
borders->visible.top = MAX (buttons_height, title_height);
|
||||
borders->visible.left = layout->left_width;
|
||||
borders->visible.right = layout->right_width;
|
||||
borders->visible.bottom = layout->bottom_height;
|
||||
|
||||
if (flags & META_FRAME_FULLSCREEN)
|
||||
{
|
||||
meta_frame_borders_clear (borders);
|
||||
return;
|
||||
}
|
||||
|
||||
draggable_borders = meta_prefs_get_draggable_border_width ();
|
||||
|
||||
borders->invisible.left = MAX (0, draggable_borders - borders->visible.left);
|
||||
borders->invisible.right = MAX (0, draggable_borders - borders->visible.right);
|
||||
borders->invisible.bottom = MAX (0, draggable_borders - borders->visible.bottom);
|
||||
if (flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE)
|
||||
{
|
||||
borders->invisible.left = MAX (0, draggable_borders - borders->visible.left);
|
||||
borders->invisible.right = MAX (0, draggable_borders - borders->visible.right);
|
||||
}
|
||||
|
||||
/* borders.visible is the height of the *title bar*. We can't do the same
|
||||
* algorithm here, titlebars are expectedly much bigger. Just subtract a couple
|
||||
* pixels to get a proper feel. */
|
||||
borders->invisible.top = MAX (0, draggable_borders - 2);
|
||||
if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE)
|
||||
{
|
||||
borders->invisible.bottom = MAX (0, draggable_borders - borders->visible.bottom);
|
||||
|
||||
if (type == META_FRAME_TYPE_ATTACHED)
|
||||
borders->invisible.top = 0;
|
||||
|
||||
if (flags & META_FRAME_SHADED)
|
||||
borders->visible.bottom = borders->invisible.bottom = 0;
|
||||
/* borders.visible.top is the height of the *title bar*. We can't do the same
|
||||
* algorithm here, titlebars are expectedly much bigger. Just subtract a couple
|
||||
* pixels to get a proper feel. */
|
||||
if (type != META_FRAME_TYPE_ATTACHED)
|
||||
borders->invisible.top = MAX (0, draggable_borders - 2);
|
||||
}
|
||||
|
||||
borders->total.left = borders->invisible.left + borders->visible.left;
|
||||
borders->total.right = borders->invisible.right + borders->visible.right;
|
||||
@@ -1337,7 +1339,6 @@ meta_color_spec_new_from_string (const char *str,
|
||||
spec = meta_color_spec_new (META_COLOR_SPEC_GTK);
|
||||
spec->data.gtk.state = state;
|
||||
spec->data.gtk.component = component;
|
||||
g_assert (spec->data.gtk.state < N_GTK_STATES);
|
||||
g_assert (spec->data.gtk.component < META_GTK_COLOR_LAST);
|
||||
}
|
||||
else if (str[0] == 'b' && str[1] == 'l' && str[2] == 'e' && str[3] == 'n' &&
|
||||
|
@@ -171,6 +171,7 @@ meta_tile_preview_free (MetaTilePreview *preview)
|
||||
|
||||
void
|
||||
meta_tile_preview_show (MetaTilePreview *preview,
|
||||
MetaDevice *pointer,
|
||||
MetaRectangle *tile_rect)
|
||||
{
|
||||
GdkWindow *window;
|
||||
@@ -187,6 +188,7 @@ meta_tile_preview_show (MetaTilePreview *preview,
|
||||
window = gtk_widget_get_window (preview->preview_window);
|
||||
meta_core_lower_beneath_grab_window (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
|
||||
GDK_WINDOW_XID (window),
|
||||
meta_device_get_id (pointer),
|
||||
gtk_get_current_event_time ());
|
||||
|
||||
old_rect.x = old_rect.y = 0;
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#define META_TILE_PREVIEW_H
|
||||
|
||||
#include <meta/boxes.h>
|
||||
#include <meta/device.h>
|
||||
|
||||
typedef struct _MetaTilePreview MetaTilePreview;
|
||||
|
||||
@@ -31,6 +32,7 @@ MetaTilePreview *meta_tile_preview_new (int screen_number,
|
||||
gboolean composited);
|
||||
void meta_tile_preview_free (MetaTilePreview *preview);
|
||||
void meta_tile_preview_show (MetaTilePreview *preview,
|
||||
MetaDevice *pointer,
|
||||
MetaRectangle *rect);
|
||||
void meta_tile_preview_hide (MetaTilePreview *preview);
|
||||
Window meta_tile_preview_get_xwindow (MetaTilePreview *preview,
|
||||
|
118
src/ui/ui.c
118
src/ui/ui.c
@@ -30,6 +30,7 @@
|
||||
#include "menu.h"
|
||||
#include "core.h"
|
||||
#include "theme-private.h"
|
||||
#include "input-events.h"
|
||||
|
||||
#include "inlinepixbufs.h"
|
||||
|
||||
@@ -60,15 +61,8 @@ struct _MetaUI
|
||||
void
|
||||
meta_ui_init (void)
|
||||
{
|
||||
/* As of 2.91.7, Gdk uses XI2 by default, which conflicts with the
|
||||
* direct X calls we use - in particular, events caused by calls to
|
||||
* XGrabPointer/XGrabKeyboard are no longer understood by GDK, while
|
||||
* GDK will no longer generate the core XEvents we process.
|
||||
* So at least for now, enforce the previous behavior.
|
||||
*/
|
||||
#if GTK_CHECK_VERSION(2, 91, 7)
|
||||
gdk_disable_multidevice ();
|
||||
#endif
|
||||
if (meta_get_use_core_devices ())
|
||||
gdk_disable_multidevice ();
|
||||
|
||||
if (!gtk_init_check (NULL, NULL))
|
||||
meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL));
|
||||
@@ -102,27 +96,30 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
||||
{
|
||||
GdkDisplay *gdisplay;
|
||||
GdkDeviceManager *gmanager;
|
||||
GdkDevice *gdevice;
|
||||
MetaUI *ui;
|
||||
GdkEvent *gevent;
|
||||
GdkWindow *gdk_window;
|
||||
Window window;
|
||||
MetaDisplay *display;
|
||||
MetaDevice *device;
|
||||
gdouble x, y, x_root, y_root;
|
||||
guint evtype, n_button;
|
||||
Time evtime;
|
||||
|
||||
switch (xevent->type)
|
||||
{
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
window = xevent->xbutton.window;
|
||||
break;
|
||||
case MotionNotify:
|
||||
window = xevent->xmotion.window;
|
||||
break;
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
window = xevent->xcrossing.window;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
display = meta_display_for_x_display (xevent->xany.display);
|
||||
|
||||
if (!meta_input_event_get_type (display, xevent, &evtype))
|
||||
return FALSE;
|
||||
|
||||
if (evtype != ButtonPress &&
|
||||
evtype != ButtonRelease &&
|
||||
evtype != EnterNotify &&
|
||||
evtype != LeaveNotify &&
|
||||
evtype != MotionNotify)
|
||||
return FALSE;
|
||||
|
||||
window = meta_input_event_get_window (display, xevent);
|
||||
|
||||
gdisplay = gdk_x11_lookup_xdisplay (xevent->xany.display);
|
||||
ui = g_object_get_data (G_OBJECT (gdisplay), "meta-ui");
|
||||
@@ -133,18 +130,32 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
||||
if (gdk_window == NULL)
|
||||
return FALSE;
|
||||
|
||||
device = meta_input_event_get_device (display, xevent);
|
||||
|
||||
if (!device)
|
||||
return FALSE;
|
||||
|
||||
gmanager = gdk_display_get_device_manager (gdisplay);
|
||||
gdevice = gdk_x11_device_manager_lookup (gmanager,
|
||||
meta_device_get_id (device));
|
||||
|
||||
/* If GDK already thinks it has a grab, we better let it see events; this
|
||||
* is the menu-navigation case and events need to get sent to the appropriate
|
||||
* (client-side) subwindow for individual menu items.
|
||||
*/
|
||||
if (gdk_display_pointer_is_grabbed (gdisplay))
|
||||
if (gdk_display_device_is_grabbed (gdisplay, gdevice))
|
||||
return FALSE;
|
||||
|
||||
switch (xevent->type)
|
||||
evtime = meta_input_event_get_time (display, xevent);
|
||||
meta_input_event_get_coordinates (display, xevent,
|
||||
&x, &y, &x_root, &y_root);
|
||||
switch (evtype)
|
||||
{
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
if (xevent->type == ButtonPress)
|
||||
meta_input_event_get_button (display, xevent, &n_button);
|
||||
|
||||
if (evtype == ButtonPress)
|
||||
{
|
||||
GtkSettings *settings = gtk_settings_get_default ();
|
||||
int double_click_time;
|
||||
@@ -155,11 +166,11 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
||||
"gtk-double-click-distance", &double_click_distance,
|
||||
NULL);
|
||||
|
||||
if (xevent->xbutton.button == ui->button_click_number &&
|
||||
xevent->xbutton.window == ui->button_click_window &&
|
||||
xevent->xbutton.time < ui->button_click_time + double_click_time &&
|
||||
ABS (xevent->xbutton.x - ui->button_click_x) <= double_click_distance &&
|
||||
ABS (xevent->xbutton.y - ui->button_click_y) <= double_click_distance)
|
||||
if (n_button == ui->button_click_number &&
|
||||
window == ui->button_click_window &&
|
||||
evtime < ui->button_click_time + double_click_time &&
|
||||
ABS ((int) x - ui->button_click_x) <= double_click_distance &&
|
||||
ABS ((int) y - ui->button_click_y) <= double_click_distance)
|
||||
{
|
||||
gevent = gdk_event_new (GDK_2BUTTON_PRESS);
|
||||
|
||||
@@ -168,11 +179,11 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
||||
else
|
||||
{
|
||||
gevent = gdk_event_new (GDK_BUTTON_PRESS);
|
||||
ui->button_click_number = xevent->xbutton.button;
|
||||
ui->button_click_window = xevent->xbutton.window;
|
||||
ui->button_click_time = xevent->xbutton.time;
|
||||
ui->button_click_x = xevent->xbutton.x;
|
||||
ui->button_click_y = xevent->xbutton.y;
|
||||
ui->button_click_number = n_button;
|
||||
ui->button_click_window = window;
|
||||
ui->button_click_time = evtime;
|
||||
ui->button_click_x = (int) x;
|
||||
ui->button_click_y = (int) y;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -181,25 +192,29 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
||||
}
|
||||
|
||||
gevent->button.window = g_object_ref (gdk_window);
|
||||
gevent->button.button = xevent->xbutton.button;
|
||||
gevent->button.time = xevent->xbutton.time;
|
||||
gevent->button.x = xevent->xbutton.x;
|
||||
gevent->button.y = xevent->xbutton.y;
|
||||
gevent->button.x_root = xevent->xbutton.x_root;
|
||||
gevent->button.y_root = xevent->xbutton.y_root;
|
||||
gevent->button.button = n_button;
|
||||
gevent->button.time = evtime;
|
||||
gevent->button.x = x;
|
||||
gevent->button.y = y;
|
||||
gevent->button.x_root = x_root;
|
||||
gevent->button.y_root = y_root;
|
||||
|
||||
break;
|
||||
case MotionNotify:
|
||||
gevent = gdk_event_new (GDK_MOTION_NOTIFY);
|
||||
gevent->motion.type = GDK_MOTION_NOTIFY;
|
||||
gevent->motion.window = g_object_ref (gdk_window);
|
||||
gevent->motion.x = x;
|
||||
gevent->motion.y = y;
|
||||
gevent->motion.x_root = x_root;
|
||||
gevent->motion.y_root = y_root;
|
||||
break;
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
gevent = gdk_event_new (xevent->type == EnterNotify ? GDK_ENTER_NOTIFY : GDK_LEAVE_NOTIFY);
|
||||
gevent = gdk_event_new (evtype == EnterNotify ? GDK_ENTER_NOTIFY : GDK_LEAVE_NOTIFY);
|
||||
gevent->crossing.window = g_object_ref (gdk_window);
|
||||
gevent->crossing.x = xevent->xcrossing.x;
|
||||
gevent->crossing.y = xevent->xcrossing.y;
|
||||
gevent->crossing.x = x;
|
||||
gevent->crossing.y = y;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
@@ -207,8 +222,7 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
||||
}
|
||||
|
||||
/* If we've gotten here, we've created the gdk_event and should send it on */
|
||||
gmanager = gdk_display_get_device_manager (gdisplay);
|
||||
gdk_event_set_device (gevent, gdk_device_manager_get_client_pointer (gmanager));
|
||||
gdk_event_set_device (gevent, gdevice);
|
||||
gtk_main_do_event (gevent);
|
||||
gdk_event_free (gevent);
|
||||
|
||||
@@ -393,7 +407,8 @@ meta_ui_create_frame_window (MetaUI *ui,
|
||||
&attrs, attributes_mask);
|
||||
|
||||
gdk_window_resize (window, width, height);
|
||||
|
||||
gdk_window_set_support_multidevice (window, TRUE);
|
||||
|
||||
meta_frames_manage_window (ui->frames, GDK_WINDOW_XID (window), window);
|
||||
|
||||
return GDK_WINDOW_XID (window);
|
||||
@@ -521,12 +536,13 @@ meta_ui_window_menu_new (MetaUI *ui,
|
||||
|
||||
void
|
||||
meta_ui_window_menu_popup (MetaWindowMenu *menu,
|
||||
MetaDevice *device,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
guint32 timestamp)
|
||||
{
|
||||
meta_window_menu_popup (menu, root_x, root_y, button, timestamp);
|
||||
meta_window_menu_popup (menu, device, root_x, root_y, button, timestamp);
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -26,6 +26,7 @@
|
||||
|
||||
/* Don't include gtk.h or gdk.h here */
|
||||
#include <meta/common.h>
|
||||
#include <meta/device.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <cairo.h>
|
||||
@@ -129,6 +130,7 @@ MetaWindowMenu* meta_ui_window_menu_new (MetaUI *ui,
|
||||
MetaWindowMenuFunc func,
|
||||
gpointer data);
|
||||
void meta_ui_window_menu_popup (MetaWindowMenu *menu,
|
||||
MetaDevice *device,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
|
Reference in New Issue
Block a user