Compare commits
12 Commits
wip/resize
...
wip/tower
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2b8e75ad48 | ||
![]() |
ce0c6b8d9f | ||
![]() |
9552ec89fb | ||
![]() |
3a7c1e7b6c | ||
![]() |
6980256a42 | ||
![]() |
3f2dcf1698 | ||
![]() |
44097c1b37 | ||
![]() |
551b188c01 | ||
![]() |
3a786542c4 | ||
![]() |
bb2df9b2c6 | ||
![]() |
7d1e149905 | ||
![]() |
1dcd52838b |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -74,6 +74,7 @@ src/mutter-enum-types.[ch]
|
|||||||
src/stamp-mutter-enum-types.h
|
src/stamp-mutter-enum-types.h
|
||||||
src/mutter-marshal.[ch]
|
src/mutter-marshal.[ch]
|
||||||
src/stamp-mutter-marshal.h
|
src/stamp-mutter-marshal.h
|
||||||
|
src/meta-dbus-xrandr.[ch]
|
||||||
src/mutter-plugins.pc
|
src/mutter-plugins.pc
|
||||||
doc/reference/*.args
|
doc/reference/*.args
|
||||||
doc/reference/*.bak
|
doc/reference/*.bak
|
||||||
|
@@ -67,7 +67,7 @@ CANBERRA_GTK_VERSION=0.26
|
|||||||
CLUTTER_PACKAGE=clutter-1.0
|
CLUTTER_PACKAGE=clutter-1.0
|
||||||
|
|
||||||
MUTTER_PC_MODULES="
|
MUTTER_PC_MODULES="
|
||||||
gtk+-3.0 >= 3.3.7
|
gtk+-3.0 >= 3.9.11
|
||||||
gio-2.0 >= 2.25.10
|
gio-2.0 >= 2.25.10
|
||||||
pango >= 1.2.0
|
pango >= 1.2.0
|
||||||
cairo >= 1.10.0
|
cairo >= 1.10.0
|
||||||
|
353
po/cs.po
353
po/cs.po
@@ -6,22 +6,23 @@
|
|||||||
# Petr Tomeš <ptomes@gmail.com>, 2006.
|
# Petr Tomeš <ptomes@gmail.com>, 2006.
|
||||||
# Jakub Friedl <jfriedl@suse.cz>, 2006, 2007.
|
# Jakub Friedl <jfriedl@suse.cz>, 2006, 2007.
|
||||||
# Petr Kovar <pknbe@volny.cz>, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
|
# Petr Kovar <pknbe@volny.cz>, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
|
||||||
# Marek Černocký <marek@manet.cz>, 2012.
|
# Marek Černocký <marek@manet.cz>, 2012, 2013.
|
||||||
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-03-22 10:02+0000\n"
|
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
||||||
"PO-Revision-Date: 2013-03-24 20:55+0200\n"
|
"PO-Revision-Date: 2013-08-20 08:50+0200\n"
|
||||||
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
|
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||||
"Language: cs\n"
|
"Language: cs\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||||
"X-Generator: Virtaal 0.7.1\n"
|
"X-Generator: Gtranslator 2.91.6\n"
|
||||||
"X-Project-Style: gnome\n"
|
"X-Project-Style: gnome\n"
|
||||||
|
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:1
|
#: ../src/50-mutter-navigation.xml.in.h:1
|
||||||
@@ -186,7 +187,8 @@ msgstr "Přepnout výskyt okna na všech plochách nebo jen na jedné"
|
|||||||
|
|
||||||
#: ../src/50-mutter-windows.xml.in.h:13
|
#: ../src/50-mutter-windows.xml.in.h:13
|
||||||
msgid "Raise window if covered, otherwise lower it"
|
msgid "Raise window if covered, otherwise lower it"
|
||||||
msgstr "Přenést okno do popředí, pokud je zakryté, jinak jej odsunout do pozadí"
|
msgstr ""
|
||||||
|
"Přenést okno do popředí, pokud je zakryté, jinak jej odsunout do pozadí"
|
||||||
|
|
||||||
#: ../src/50-mutter-windows.xml.in.h:14
|
#: ../src/50-mutter-windows.xml.in.h:14
|
||||||
msgid "Raise window above other windows"
|
msgid "Raise window above other windows"
|
||||||
@@ -214,14 +216,14 @@ msgstr "Zobrazit rozdělení napravo"
|
|||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:568
|
#: ../src/compositor/compositor.c:589
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
"\"."
|
"\"."
|
||||||
msgstr "Jiný kompozitní správce již běží na obrazovce %i displeje „%s“."
|
msgstr "Jiný kompozitní správce již běží na obrazovce %i displeje „%s“."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1191
|
#: ../src/compositor/meta-background.c:1076
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "textura pozadí nemohla být ze souboru vytvořena"
|
msgstr "textura pozadí nemohla být ze souboru vytvořena"
|
||||||
|
|
||||||
@@ -259,17 +261,17 @@ msgstr "_Počkat"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Vynutit ukončení"
|
msgstr "_Vynutit ukončení"
|
||||||
|
|
||||||
#: ../src/core/display.c:401
|
#: ../src/core/display.c:421
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "Schází rozšíření %s vyžadované funkcemi kompozitoru"
|
msgstr "Schází rozšíření %s vyžadované funkcemi kompozitoru"
|
||||||
|
|
||||||
#: ../src/core/display.c:493
|
#: ../src/core/display.c:513
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Nelze otevřít displej X Window System „%s“\n"
|
msgstr "Nelze otevřít displej X Window System „%s“\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:935
|
#: ../src/core/keybindings.c:1136
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -277,9 +279,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Klávesu %s s modifikátory %x již jako zkratku používá nějaký jiný program\n"
|
"Klávesu %s s modifikátory %x již jako zkratku používá nějaký jiný program\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1135
|
#: ../src/core/keybindings.c:1333
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "\"%s\" is not a valid value for focus attribute"
|
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "„%s“ není platný akcelerátor\n"
|
msgstr "„%s“ není platný akcelerátor\n"
|
||||||
|
|
||||||
@@ -320,6 +321,19 @@ msgstr ""
|
|||||||
"Nelze najít motiv! Ujistěte se prosím, že existuje %s a obsahuje obvyklé "
|
"Nelze najít motiv! Ujistěte se prosím, že existuje %s a obsahuje obvyklé "
|
||||||
"motivy.\n"
|
"motivy.\n"
|
||||||
|
|
||||||
|
#: ../src/core/monitor.c:711
|
||||||
|
msgid "Built-in display"
|
||||||
|
msgstr "Vestavěný displej"
|
||||||
|
|
||||||
|
#. TRANSLATORS: this is a monitor name (in case we don't know
|
||||||
|
#. the vendor), it's Unknown followed by a size in inches,
|
||||||
|
#. like 'Unknown 15"'
|
||||||
|
#.
|
||||||
|
#: ../src/core/monitor.c:739
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown %s"
|
||||||
|
msgstr "Neznámý %s"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -344,7 +358,7 @@ msgstr "Vypíše verzi"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Zásuvný modul Mutter, který se má použít"
|
msgstr "Zásuvný modul Mutter, který se má použít"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1095
|
#: ../src/core/prefs.c:1202
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -352,12 +366,12 @@ msgstr ""
|
|||||||
"Bylo zakázáno obcházení chyb aplikací. Některé aplikace se možná nebudou "
|
"Bylo zakázáno obcházení chyb aplikací. Některé aplikace se možná nebudou "
|
||||||
"chovat správně.\n"
|
"chovat správně.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1170
|
#: ../src/core/prefs.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Nelze zpracovat popis písma „%s“ v klíči GSettings %s\n"
|
msgstr "Nelze zpracovat popis písma „%s“ v klíči GSettings %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1236
|
#: ../src/core/prefs.c:1343
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -366,7 +380,7 @@ msgstr ""
|
|||||||
"„%s“ nalezené v databázi nastavení není platnou hodnotou modifikátoru "
|
"„%s“ nalezené v databázi nastavení není platnou hodnotou modifikátoru "
|
||||||
"tlačítka myši\n"
|
"tlačítka myši\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1788
|
#: ../src/core/prefs.c:1909
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -375,17 +389,17 @@ msgstr ""
|
|||||||
"„%s“ nalezené v databázi nastavení není platnou hodnotou klávesové zkratky "
|
"„%s“ nalezené v databázi nastavení není platnou hodnotou klávesové zkratky "
|
||||||
"„%s“\n"
|
"„%s“\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1887
|
#: ../src/core/prefs.c:1999
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Plocha %d"
|
msgstr "Plocha %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:691
|
#: ../src/core/screen.c:534
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Obrazovka %d na displeji „%s“ je neplatná\n"
|
msgstr "Obrazovka %d na displeji „%s“ je neplatná\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:707
|
#: ../src/core/screen.c:550
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -394,18 +408,18 @@ msgstr ""
|
|||||||
"Obrazovka %d na displeji „%s“ již správce oken má; zkuste prosím nahradit "
|
"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"
|
"aktuálního správce oken pomocí přepínače --replace.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:734
|
#: ../src/core/screen.c:577
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"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"
|
msgstr "Nelze získat výběr správce oken na obrazovce %d displeje „%s“\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:812
|
#: ../src/core/screen.c:655
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr "Obrazovka %d na displeji „%s“ již má správce oken\n"
|
msgstr "Obrazovka %d na displeji „%s“ již má správce oken\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:998
|
#: ../src/core/screen.c:846
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "Nelze uvolnit obrazovku %d na displeji „%s“\n"
|
msgstr "Nelze uvolnit obrazovku %d na displeji „%s“\n"
|
||||||
@@ -480,8 +494,7 @@ msgstr "Nelze provést fdopen() soubor záznamu %s: %s\n"
|
|||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Otevřen soubor záznamu %s\n"
|
msgstr "Otevřen soubor záznamu %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:119 ../src/tools/mutter-message.c:149
|
#: ../src/core/util.c:119
|
||||||
#, c-format
|
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n"
|
msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n"
|
||||||
|
|
||||||
@@ -489,20 +502,20 @@ msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n"
|
|||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "Správce oken: "
|
msgstr "Správce oken: "
|
||||||
|
|
||||||
#: ../src/core/util.c:412
|
#: ../src/core/util.c:414
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "Chyba ve správci oken: "
|
msgstr "Chyba ve správci oken: "
|
||||||
|
|
||||||
#: ../src/core/util.c:443
|
#: ../src/core/util.c:445
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "Varování správce oken: "
|
msgstr "Varování správce oken: "
|
||||||
|
|
||||||
#: ../src/core/util.c:471
|
#: ../src/core/util.c:473
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "Chyba správce oken: "
|
msgstr "Chyba správce oken: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7596
|
#: ../src/core/window.c:7533
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -518,7 +531,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8320
|
#: ../src/core/window.c:8257
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -528,22 +541,22 @@ msgstr ""
|
|||||||
"velikost, ale nastavuje min. velikost %d × %d a max. velikost %d × %d; to "
|
"velikost, ale nastavuje min. velikost %d × %d a max. velikost %d × %d; to "
|
||||||
"nedává smysl.\n"
|
"nedává smysl.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:318
|
#: ../src/core/window-props.c:347
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "Aplikace nastavila neplatný _NET_WM_PID %lu\n"
|
msgstr "Aplikace nastavila neplatný _NET_WM_PID %lu\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:434
|
#: ../src/core/window-props.c:463
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (na %s)"
|
msgstr "%s (na %s)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1517
|
#: ../src/core/window-props.c:1546
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
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"
|
msgstr "Neplatné okno WM_TRANSIENT_FOR 0x%lx specifikováno pro %s.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1528
|
#: ../src/core/window-props.c:1557
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
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"
|
msgstr "Okno WM_TRANSIENT_FOR 0x%lx by vytvořilo smyčku pro %s.\n"
|
||||||
@@ -707,109 +720,104 @@ msgstr "Vybrat okno z překryvné nabídky tabulátoru"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Zrušit překryvné okno tabulátoru"
|
msgstr "Zrušit překryvné okno tabulátoru"
|
||||||
|
|
||||||
#: ../src/tools/mutter-message.c:123
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: %s\n"
|
|
||||||
msgstr "Použití: %s\n"
|
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:67
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "Mi_nimalizovat"
|
msgstr "Mi_nimalizovat"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "Ma_ximalizovat"
|
msgstr "Ma_ximalizovat"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "Zrušit ma_ximalizaci"
|
msgstr "Zrušit ma_ximalizaci"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "Sv_inout"
|
msgstr "Sv_inout"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:75
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "Rozv_inout"
|
msgstr "Rozv_inout"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "_Přesunout"
|
msgstr "_Přesunout"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "Z_měnit velikost"
|
msgstr "Z_měnit velikost"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:83
|
#: ../src/ui/menu.c:81
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "Přesunout záhlaví okna na _obrazovku"
|
msgstr "Přesunout záhlaví okna na _obrazovku"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "_Vždy navrchu"
|
msgstr "_Vždy navrchu"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:88
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "Vžd_y na viditelné ploše"
|
msgstr "Vžd_y na viditelné ploše"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "_Jen na této ploše"
|
msgstr "_Jen na této ploše"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:92
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "Přesunout na plochu v_levo"
|
msgstr "Přesunout na plochu v_levo"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "Přesunout na plochu vp_ravo"
|
msgstr "Přesunout na plochu vp_ravo"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "Přesunout na plochu na_hoře"
|
msgstr "Přesunout na plochu na_hoře"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:100
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "Přesunout na plochu _dole"
|
msgstr "Přesunout na plochu _dole"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:104
|
#: ../src/ui/menu.c:102
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "_Zavřít"
|
msgstr "_Zavřít"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:204
|
#: ../src/ui/menu.c:202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "Plocha %d%n"
|
msgstr "Plocha %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:212
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "Plocha 1_0"
|
msgstr "Plocha 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:216
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "Plocha %s%d"
|
msgstr "Plocha %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:397
|
#: ../src/ui/menu.c:384
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "Přes_unout na jinou plochu"
|
msgstr "Přes_unout na jinou plochu"
|
||||||
|
|
||||||
@@ -985,8 +993,8 @@ msgid ""
|
|||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||||
"where NORMAL is the state; could not parse \"%s\""
|
"where NORMAL is the state; could not parse \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Specifikace GTK barvy musí mít stav v hranatých závorkách, např. gtk:fg"
|
"Specifikace GTK barvy musí mít stav v hranatých závorkách, např. gtk:"
|
||||||
"[NORMAL], kde NORMAL je stav; nelze analyzovat „%s“"
|
"fg[NORMAL], kde NORMAL je stav; nelze analyzovat „%s“"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1292
|
#: ../src/ui/theme.c:1292
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -994,8 +1002,8 @@ msgid ""
|
|||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
"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\""
|
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Specifikace GTK barvy musí mít za stavem hranatou závorku, např. gtk:fg"
|
"Specifikace GTK barvy musí mít za stavem hranatou závorku, např. gtk:"
|
||||||
"[NORMAL], kde NORMAL je stav; nelze analyzovat „%s“"
|
"fg[NORMAL], kde NORMAL je stav; nelze analyzovat „%s“"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1303
|
#: ../src/ui/theme.c:1303
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1165,18 +1173,18 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Chybí <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"cokoliv\"/>"
|
"Chybí <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"cokoliv\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5084
|
#: ../src/ui/theme.c:5082
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "Nelze načíst motiv „%s“: %s\n"
|
msgstr "Nelze načíst motiv „%s“: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5220 ../src/ui/theme.c:5227 ../src/ui/theme.c:5234
|
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||||
#: ../src/ui/theme.c:5241 ../src/ui/theme.c:5248
|
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "Není nastaveno <%s> motivu „%s“"
|
msgstr "Není nastaveno <%s> motivu „%s“"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5256
|
#: ../src/ui/theme.c:5254
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1185,7 +1193,7 @@ msgstr ""
|
|||||||
"U typu okna „%s“ motivu „%s“ není nastaven typ rámu, přidejte prosím prvek "
|
"U typu okna „%s“ motivu „%s“ není nastaven typ rámu, přidejte prosím prvek "
|
||||||
"<window type=\"%s\" style_set=\"cokoliv\"/>"
|
"<window type=\"%s\" style_set=\"cokoliv\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5663 ../src/ui/theme.c:5725 ../src/ui/theme.c:5788
|
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
@@ -1193,7 +1201,7 @@ msgstr ""
|
|||||||
"Uživatelem definované konstanty musí začínat velkým písmenem; „%s“ toto "
|
"Uživatelem definované konstanty musí začínat velkým písmenem; „%s“ toto "
|
||||||
"nesplňuje"
|
"nesplňuje"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5671 ../src/ui/theme.c:5733 ../src/ui/theme.c:5796
|
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "Konstanta „%s“ již byla definována"
|
msgstr "Konstanta „%s“ již byla definována"
|
||||||
@@ -1572,205 +1580,4 @@ msgstr "<%s> u tohoto motivu definováno dvakrát"
|
|||||||
#: ../src/ui/theme-parser.c:4336
|
#: ../src/ui/theme-parser.c:4336
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Nelze nalézt platný soubor motivu %s\n"
|
msgstr "Nelze nalézt platný soubor motivu %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:99
|
|
||||||
msgid "_Windows"
|
|
||||||
msgstr "_Okna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:100
|
|
||||||
msgid "_Dialog"
|
|
||||||
msgstr "_Dialogové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:101
|
|
||||||
msgid "_Modal dialog"
|
|
||||||
msgstr "_Modální dialogové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:102
|
|
||||||
msgid "_Utility"
|
|
||||||
msgstr "_Nástroje"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:103
|
|
||||||
msgid "_Splashscreen"
|
|
||||||
msgstr "_Spouštěcí obrazovka"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:104
|
|
||||||
msgid "_Top dock"
|
|
||||||
msgstr "_Horní dok"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:105
|
|
||||||
msgid "_Bottom dock"
|
|
||||||
msgstr "Dolní do_k"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:106
|
|
||||||
msgid "_Left dock"
|
|
||||||
msgstr "_Levý dok"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:107
|
|
||||||
msgid "_Right dock"
|
|
||||||
msgstr "P_ravý dok"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:108
|
|
||||||
msgid "_All docks"
|
|
||||||
msgstr "_Všechny doky"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:109
|
|
||||||
msgid "Des_ktop"
|
|
||||||
msgstr "Pra_covní prostředí"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:115
|
|
||||||
msgid "Open another one of these windows"
|
|
||||||
msgstr "Otevřít další takové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:117
|
|
||||||
msgid "This is a demo button with an 'open' icon"
|
|
||||||
msgstr "Toto je demonstrační tlačítko s ikonou „otevřít“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:119
|
|
||||||
msgid "This is a demo button with a 'quit' icon"
|
|
||||||
msgstr "Toto je demonstrační tlačítko s ikonou „ukončit“"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:248
|
|
||||||
msgid "This is a sample message in a sample dialog"
|
|
||||||
msgstr "Toto je ukázková zpráva v ukázkovém dialogu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:328
|
|
||||||
#, c-format
|
|
||||||
msgid "Fake menu item %d\n"
|
|
||||||
msgstr "Falešná položka nabídky %d\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:363
|
|
||||||
msgid "Border-only window"
|
|
||||||
msgstr "Okno jen s okrajem"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:365
|
|
||||||
msgid "Bar"
|
|
||||||
msgstr "Lišta"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:382
|
|
||||||
msgid "Normal Application Window"
|
|
||||||
msgstr "Normální okno aplikace"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:386
|
|
||||||
msgid "Dialog Box"
|
|
||||||
msgstr "Dialogové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:390
|
|
||||||
msgid "Modal Dialog Box"
|
|
||||||
msgstr "Modální dialogové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:394
|
|
||||||
msgid "Utility Palette"
|
|
||||||
msgstr "Paleta nástrojů"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:398
|
|
||||||
msgid "Torn-off Menu"
|
|
||||||
msgstr "Odtržení nabídky"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:402
|
|
||||||
msgid "Border"
|
|
||||||
msgstr "Okraj"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:406
|
|
||||||
msgid "Attached Modal Dialog"
|
|
||||||
msgstr "Připojené modální dialogové okno"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:737
|
|
||||||
#, c-format
|
|
||||||
msgid "Button layout test %d"
|
|
||||||
msgstr "Test rozložení tlačítek %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:766
|
|
||||||
#, c-format
|
|
||||||
msgid "%g milliseconds to draw one window frame"
|
|
||||||
msgstr "%g milisekund na nakreslení jednoho rámu okna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:811
|
|
||||||
#, c-format
|
|
||||||
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
|
||||||
msgstr "Použití: metacity-theme-viewer [NÁZEVMOTIVU]\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:818
|
|
||||||
#, c-format
|
|
||||||
msgid "Error loading theme: %s\n"
|
|
||||||
msgstr "Chyba při načítání motivu: %s\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:824
|
|
||||||
#, c-format
|
|
||||||
msgid "Loaded theme \"%s\" in %g seconds\n"
|
|
||||||
msgstr "Načten motiv „%s“ za %g sekund\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:869
|
|
||||||
msgid "Normal Title Font"
|
|
||||||
msgstr "Normální písmo nadpisu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:875
|
|
||||||
msgid "Small Title Font"
|
|
||||||
msgstr "Malé písmo nadpisu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:881
|
|
||||||
msgid "Large Title Font"
|
|
||||||
msgstr "Velké písmo nadpisu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:886
|
|
||||||
msgid "Button Layouts"
|
|
||||||
msgstr "Rozložení tlačítek"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:891
|
|
||||||
msgid "Benchmark"
|
|
||||||
msgstr "Test výkonnosti"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:947
|
|
||||||
msgid "Window Title Goes Here"
|
|
||||||
msgstr "Sem patří nadpis okna"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1053
|
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
|
||||||
"seconds wall clock time including X server resources (%g milliseconds per "
|
|
||||||
"frame)\n"
|
|
||||||
msgstr ""
|
|
||||||
"Nakresleno %d rámů za %g sekund na straně klienta (%g milisekund na rám) a "
|
|
||||||
"%g sekund reálného času včetně zdrojů serveru X (%g milisekund na rám)\n"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1273
|
|
||||||
msgid "position expression test returned TRUE but set error"
|
|
||||||
msgstr "test výrazu umístění vrátil TRUE, ale nastavil chybu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1275
|
|
||||||
msgid "position expression test returned FALSE but didn't set error"
|
|
||||||
msgstr "test výrazu umístění vrátil FALSE, ale nenastavil chybu"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1279
|
|
||||||
msgid "Error was expected but none given"
|
|
||||||
msgstr "Byla očekávána chyba, ale nebyla přijata"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1281
|
|
||||||
#, c-format
|
|
||||||
msgid "Error %d was expected but %d given"
|
|
||||||
msgstr "Byla očekávána chyba %d, ale bylo přijato %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1287
|
|
||||||
#, c-format
|
|
||||||
msgid "Error not expected but one was returned: %s"
|
|
||||||
msgstr "Chyba nebyla očekávána, ale byla vrácena: %s"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1291
|
|
||||||
#, c-format
|
|
||||||
msgid "x value was %d, %d was expected"
|
|
||||||
msgstr "Hodnota x byla %d, bylo očekáváno %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1294
|
|
||||||
#, c-format
|
|
||||||
msgid "y value was %d, %d was expected"
|
|
||||||
msgstr "Hodnota y byla %d, bylo očekáváno %d"
|
|
||||||
|
|
||||||
#: ../src/ui/theme-viewer.c:1359
|
|
||||||
#, c-format
|
|
||||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
|
||||||
msgstr "Zpracováno %d výrazů souřadnic za %g sekund (průměr %g sekund)\n"
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~ msgid "Minimize window"
|
|
||||||
#~ msgstr "Minimalizovat okno"
|
|
@@ -65,8 +65,6 @@ libmutter_la_SOURCES = \
|
|||||||
compositor/meta-shaped-texture.c \
|
compositor/meta-shaped-texture.c \
|
||||||
compositor/meta-texture-rectangle.c \
|
compositor/meta-texture-rectangle.c \
|
||||||
compositor/meta-texture-rectangle.h \
|
compositor/meta-texture-rectangle.h \
|
||||||
compositor/meta-texture-tower.c \
|
|
||||||
compositor/meta-texture-tower.h \
|
|
||||||
compositor/meta-window-actor.c \
|
compositor/meta-window-actor.c \
|
||||||
compositor/meta-window-actor-private.h \
|
compositor/meta-window-actor-private.h \
|
||||||
compositor/meta-window-group.c \
|
compositor/meta-window-group.c \
|
||||||
@@ -113,6 +111,8 @@ libmutter_la_SOURCES = \
|
|||||||
core/keybindings.c \
|
core/keybindings.c \
|
||||||
core/keybindings-private.h \
|
core/keybindings-private.h \
|
||||||
core/main.c \
|
core/main.c \
|
||||||
|
core/meta-cursor-tracker.c \
|
||||||
|
core/meta-cursor-tracker-private.h \
|
||||||
core/meta-xrandr-shared.h \
|
core/meta-xrandr-shared.h \
|
||||||
core/monitor.c \
|
core/monitor.c \
|
||||||
core/monitor-config.c \
|
core/monitor-config.c \
|
||||||
@@ -186,6 +186,7 @@ libmutterinclude_base_headers = \
|
|||||||
meta/meta-background-actor.h \
|
meta/meta-background-actor.h \
|
||||||
meta/meta-background-group.h \
|
meta/meta-background-group.h \
|
||||||
meta/meta-background.h \
|
meta/meta-background.h \
|
||||||
|
meta/meta-cursor-tracker.h \
|
||||||
meta/meta-plugin.h \
|
meta/meta-plugin.h \
|
||||||
meta/meta-shaped-texture.h \
|
meta/meta-shaped-texture.h \
|
||||||
meta/meta-shadow-factory.h \
|
meta/meta-shadow-factory.h \
|
||||||
@@ -303,6 +304,7 @@ EXTRA_DIST=$(desktopfiles_files) \
|
|||||||
$(wmproperties_in_files) \
|
$(wmproperties_in_files) \
|
||||||
$(xml_in_files) \
|
$(xml_in_files) \
|
||||||
org.gnome.mutter.gschema.xml.in \
|
org.gnome.mutter.gschema.xml.in \
|
||||||
|
xrandr.xml \
|
||||||
mutter-schemas.convert \
|
mutter-schemas.convert \
|
||||||
libmutter.pc.in \
|
libmutter.pc.in \
|
||||||
mutter-plugins.pc.in \
|
mutter-plugins.pc.in \
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
Intro
|
|
||||||
=====
|
|
||||||
|
|
||||||
Fix me.
|
|
||||||
|
|
||||||
|
|
||||||
Env Vars
|
|
||||||
========
|
|
||||||
|
|
||||||
MUTTER_DISABLE_MIPMAPS - set to disable use of mipmaped windows.
|
|
@@ -31,7 +31,6 @@ struct _MetaCompositor
|
|||||||
guint server_time_is_monotonic_time : 1;
|
guint server_time_is_monotonic_time : 1;
|
||||||
guint show_redraw : 1;
|
guint show_redraw : 1;
|
||||||
guint debug : 1;
|
guint debug : 1;
|
||||||
guint no_mipmaps : 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaCompScreen
|
struct _MetaCompScreen
|
||||||
@@ -66,8 +65,6 @@ void meta_switch_workspace_completed (MetaScreen *screen);
|
|||||||
|
|
||||||
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||||
MetaPlugin *plugin,
|
MetaPlugin *plugin,
|
||||||
Window grab_window,
|
|
||||||
Cursor cursor,
|
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
void meta_end_modal_for_plugin (MetaScreen *screen,
|
void meta_end_modal_for_plugin (MetaScreen *screen,
|
||||||
|
@@ -412,8 +412,6 @@ meta_stage_is_focused (MetaScreen *screen)
|
|||||||
gboolean
|
gboolean
|
||||||
meta_begin_modal_for_plugin (MetaScreen *screen,
|
meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||||
MetaPlugin *plugin,
|
MetaPlugin *plugin,
|
||||||
Window grab_window,
|
|
||||||
Cursor cursor,
|
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
@@ -424,10 +422,19 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
|||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
Display *xdpy = meta_display_get_xdisplay (display);
|
Display *xdpy = meta_display_get_xdisplay (display);
|
||||||
MetaCompositor *compositor = display->compositor;
|
MetaCompositor *compositor = display->compositor;
|
||||||
|
ClutterStage *stage;
|
||||||
|
Window grab_window;
|
||||||
|
Cursor cursor = None;
|
||||||
gboolean pointer_grabbed = FALSE;
|
gboolean pointer_grabbed = FALSE;
|
||||||
gboolean keyboard_grabbed = FALSE;
|
gboolean keyboard_grabbed = FALSE;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
||||||
|
if (!stage)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
grab_window = clutter_x11_get_stage_window (stage);
|
||||||
|
|
||||||
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@@ -1525,9 +1532,6 @@ meta_compositor_new (MetaDisplay *display)
|
|||||||
|
|
||||||
compositor->display = display;
|
compositor->display = display;
|
||||||
|
|
||||||
if (g_getenv("META_DISABLE_MIPMAPS"))
|
|
||||||
compositor->no_mipmaps = TRUE;
|
|
||||||
|
|
||||||
meta_verbose ("Creating %d atoms\n", (int) G_N_ELEMENTS (atom_names));
|
meta_verbose ("Creating %d atoms\n", (int) G_N_ELEMENTS (atom_names));
|
||||||
XInternAtoms (xdisplay, atom_names, G_N_ELEMENTS (atom_names),
|
XInternAtoms (xdisplay, atom_names, G_N_ELEMENTS (atom_names),
|
||||||
False, atoms);
|
False, atoms);
|
||||||
|
@@ -267,10 +267,6 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
|||||||
/**
|
/**
|
||||||
* meta_plugin_begin_modal:
|
* meta_plugin_begin_modal:
|
||||||
* @plugin: a #MetaPlugin
|
* @plugin: a #MetaPlugin
|
||||||
* @grab_window: the X window to grab the keyboard and mouse on
|
|
||||||
* @cursor: the cursor to use for the pointer grab, or None,
|
|
||||||
* to use the normal cursor for the grab window and
|
|
||||||
* its descendants.
|
|
||||||
* @options: flags that modify the behavior of the modal grab
|
* @options: flags that modify the behavior of the modal grab
|
||||||
* @timestamp: the timestamp used for establishing grabs
|
* @timestamp: the timestamp used for establishing grabs
|
||||||
*
|
*
|
||||||
@@ -291,15 +287,13 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
|||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
meta_plugin_begin_modal (MetaPlugin *plugin,
|
meta_plugin_begin_modal (MetaPlugin *plugin,
|
||||||
Window grab_window,
|
|
||||||
Cursor cursor,
|
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||||
|
|
||||||
return meta_begin_modal_for_plugin (priv->screen, plugin,
|
return meta_begin_modal_for_plugin (priv->screen, plugin,
|
||||||
grab_window, cursor, options, timestamp);
|
options, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -30,7 +30,6 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
#include <meta/meta-shaped-texture.h>
|
||||||
#include "meta-texture-tower.h"
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
@@ -64,7 +63,6 @@ G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
|||||||
|
|
||||||
struct _MetaShapedTexturePrivate
|
struct _MetaShapedTexturePrivate
|
||||||
{
|
{
|
||||||
MetaTextureTower *paint_tower;
|
|
||||||
Pixmap pixmap;
|
Pixmap pixmap;
|
||||||
CoglTexturePixmapX11 *texture;
|
CoglTexturePixmapX11 *texture;
|
||||||
CoglTexture *mask_texture;
|
CoglTexture *mask_texture;
|
||||||
@@ -74,8 +72,6 @@ struct _MetaShapedTexturePrivate
|
|||||||
cairo_region_t *clip_region;
|
cairo_region_t *clip_region;
|
||||||
|
|
||||||
guint tex_width, tex_height;
|
guint tex_width, tex_height;
|
||||||
|
|
||||||
guint create_mipmaps : 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -102,10 +98,8 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
|||||||
|
|
||||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||||
|
|
||||||
priv->paint_tower = meta_texture_tower_new ();
|
|
||||||
priv->texture = NULL;
|
priv->texture = NULL;
|
||||||
priv->mask_texture = NULL;
|
priv->mask_texture = NULL;
|
||||||
priv->create_mipmaps = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -114,10 +108,6 @@ meta_shaped_texture_dispose (GObject *object)
|
|||||||
MetaShapedTexture *self = (MetaShapedTexture *) object;
|
MetaShapedTexture *self = (MetaShapedTexture *) object;
|
||||||
MetaShapedTexturePrivate *priv = self->priv;
|
MetaShapedTexturePrivate *priv = self->priv;
|
||||||
|
|
||||||
if (priv->paint_tower)
|
|
||||||
meta_texture_tower_free (priv->paint_tower);
|
|
||||||
priv->paint_tower = NULL;
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||||
g_clear_pointer (&priv->pipeline_unshaped, cogl_object_unref);
|
g_clear_pointer (&priv->pipeline_unshaped, cogl_object_unref);
|
||||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||||
@@ -133,7 +123,6 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
{
|
{
|
||||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||||
MetaShapedTexturePrivate *priv = stex->priv;
|
MetaShapedTexturePrivate *priv = stex->priv;
|
||||||
CoglTexture *paint_tex;
|
|
||||||
guint tex_width, tex_height;
|
guint tex_width, tex_height;
|
||||||
ClutterActorBox alloc;
|
ClutterActorBox alloc;
|
||||||
|
|
||||||
@@ -148,29 +137,6 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex)))
|
if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex)))
|
||||||
clutter_actor_realize (CLUTTER_ACTOR (stex));
|
clutter_actor_realize (CLUTTER_ACTOR (stex));
|
||||||
|
|
||||||
/* The GL EXT_texture_from_pixmap extension does allow for it to be
|
|
||||||
* used together with SGIS_generate_mipmap, however this is very
|
|
||||||
* rarely supported. Also, even when it is supported there
|
|
||||||
* are distinct performance implications from:
|
|
||||||
*
|
|
||||||
* - Updating mipmaps that we don't need
|
|
||||||
* - Having to reallocate pixmaps on the server into larger buffers
|
|
||||||
*
|
|
||||||
* So, we just unconditionally use our mipmap emulation code. If we
|
|
||||||
* wanted to use SGIS_generate_mipmap, we'd have to query COGL to
|
|
||||||
* see if it was supported (no API currently), and then if and only
|
|
||||||
* if that was the case, set the clutter texture quality to HIGH.
|
|
||||||
* Setting the texture quality to high without SGIS_generate_mipmap
|
|
||||||
* support for TFP textures will result in fallbacks to XGetImage.
|
|
||||||
*/
|
|
||||||
if (priv->create_mipmaps)
|
|
||||||
paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
|
|
||||||
else
|
|
||||||
paint_tex = COGL_TEXTURE (priv->texture);
|
|
||||||
|
|
||||||
if (paint_tex == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
tex_width = priv->tex_width;
|
tex_width = priv->tex_width;
|
||||||
tex_height = priv->tex_height;
|
tex_height = priv->tex_height;
|
||||||
|
|
||||||
@@ -212,7 +178,10 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
cogl_pipeline_set_layer_filters (pipeline, 0,
|
||||||
|
COGL_PIPELINE_FILTER_LINEAR_MIPMAP_LINEAR,
|
||||||
|
COGL_PIPELINE_FILTER_LINEAR);
|
||||||
|
cogl_pipeline_set_layer_texture (pipeline, 0, priv->texture);
|
||||||
|
|
||||||
{
|
{
|
||||||
CoglColor color;
|
CoglColor color;
|
||||||
@@ -373,28 +342,6 @@ meta_shaped_texture_new (void)
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
|
||||||
gboolean create_mipmaps)
|
|
||||||
{
|
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
|
||||||
|
|
||||||
priv = stex->priv;
|
|
||||||
|
|
||||||
create_mipmaps = create_mipmaps != FALSE;
|
|
||||||
|
|
||||||
if (create_mipmaps != priv->create_mipmaps)
|
|
||||||
{
|
|
||||||
CoglTexture *base_texture;
|
|
||||||
priv->create_mipmaps = create_mipmaps;
|
|
||||||
base_texture = create_mipmaps ?
|
|
||||||
COGL_TEXTURE (priv->texture) : NULL;
|
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||||
CoglTexture *mask_texture)
|
CoglTexture *mask_texture)
|
||||||
@@ -434,8 +381,6 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
|||||||
cogl_texture_pixmap_x11_update_area (priv->texture,
|
cogl_texture_pixmap_x11_update_area (priv->texture,
|
||||||
x, y, width, height);
|
x, y, width, height);
|
||||||
|
|
||||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
|
||||||
|
|
||||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,10 +459,6 @@ meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
set_cogl_texture (stex, NULL);
|
set_cogl_texture (stex, NULL);
|
||||||
|
|
||||||
if (priv->create_mipmaps)
|
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
|
||||||
COGL_TEXTURE (priv->texture));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,624 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
/*
|
|
||||||
* MetaTextureTower
|
|
||||||
*
|
|
||||||
* Mipmap emulation by creation of scaled down images
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* 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 <math.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "meta-texture-tower.h"
|
|
||||||
#include "meta-texture-rectangle.h"
|
|
||||||
|
|
||||||
#ifndef M_LOG2E
|
|
||||||
#define M_LOG2E 1.4426950408889634074
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_TEXTURE_LEVELS 12
|
|
||||||
|
|
||||||
/* If the texture format in memory doesn't match this, then Mesa
|
|
||||||
* will do the conversion, so things will still work, but it might
|
|
||||||
* be slow depending on how efficient Mesa is. These should be the
|
|
||||||
* native formats unless the display is 16bpp. If conversions
|
|
||||||
* here are a bottleneck, investigate whether we are converting when
|
|
||||||
* storing window data *into* the texture before adding extra code
|
|
||||||
* to handle multiple texture formats.
|
|
||||||
*/
|
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
||||||
#define TEXTURE_FORMAT COGL_PIXEL_FORMAT_BGRA_8888_PRE
|
|
||||||
#else
|
|
||||||
#define TEXTURE_FORMAT COGL_PIXEL_FORMAT_ARGB_8888_PRE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
guint16 x1;
|
|
||||||
guint16 y1;
|
|
||||||
guint16 x2;
|
|
||||||
guint16 y2;
|
|
||||||
} Box;
|
|
||||||
|
|
||||||
struct _MetaTextureTower
|
|
||||||
{
|
|
||||||
int n_levels;
|
|
||||||
CoglTexture *textures[MAX_TEXTURE_LEVELS];
|
|
||||||
CoglOffscreen *fbos[MAX_TEXTURE_LEVELS];
|
|
||||||
Box invalid[MAX_TEXTURE_LEVELS];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_texture_tower_new:
|
|
||||||
*
|
|
||||||
* Creates a new texture tower. The base texture has to be set with
|
|
||||||
* meta_texture_tower_set_base_texture() before use.
|
|
||||||
*
|
|
||||||
* Return value: the new texture tower. Free with meta_texture_tower_free()
|
|
||||||
*/
|
|
||||||
MetaTextureTower *
|
|
||||||
meta_texture_tower_new (void)
|
|
||||||
{
|
|
||||||
MetaTextureTower *tower;
|
|
||||||
|
|
||||||
tower = g_slice_new0 (MetaTextureTower);
|
|
||||||
|
|
||||||
return tower;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_texture_tower_free:
|
|
||||||
* @tower: a #MetaTextureTower
|
|
||||||
*
|
|
||||||
* Frees a texture tower created with meta_texture_tower_new().
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_texture_tower_free (MetaTextureTower *tower)
|
|
||||||
{
|
|
||||||
g_return_if_fail (tower != NULL);
|
|
||||||
|
|
||||||
meta_texture_tower_set_base_texture (tower, NULL);
|
|
||||||
|
|
||||||
g_slice_free (MetaTextureTower, tower);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
* scaled textures of the tower are derived from. The texture itself
|
|
||||||
* will be used as level 0 of the tower and will be referenced until
|
|
||||||
* unset or until the tower is freed.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
|
||||||
CoglTexture *texture)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_return_if_fail (tower != NULL);
|
|
||||||
|
|
||||||
if (texture == tower->textures[0])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (tower->textures[0] != NULL)
|
|
||||||
{
|
|
||||||
for (i = 1; i < tower->n_levels; i++)
|
|
||||||
{
|
|
||||||
if (tower->textures[i] != NULL)
|
|
||||||
{
|
|
||||||
cogl_object_unref (tower->textures[i]);
|
|
||||||
tower->textures[i] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tower->fbos[i] != NULL)
|
|
||||||
{
|
|
||||||
cogl_object_unref (tower->fbos[i]);
|
|
||||||
tower->fbos[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cogl_object_unref (tower->textures[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
tower->textures[0] = texture;
|
|
||||||
|
|
||||||
if (tower->textures[0] != NULL)
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
|
|
||||||
cogl_object_ref (tower->textures[0]);
|
|
||||||
|
|
||||||
width = cogl_texture_get_width (tower->textures[0]);
|
|
||||||
height = cogl_texture_get_height (tower->textures[0]);
|
|
||||||
|
|
||||||
tower->n_levels = 1 + MAX ((int)(M_LOG2E * log (width)), (int)(M_LOG2E * log (height)));
|
|
||||||
tower->n_levels = MIN(tower->n_levels, MAX_TEXTURE_LEVELS);
|
|
||||||
|
|
||||||
meta_texture_tower_update_area (tower, 0, 0, width, height);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tower->n_levels = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_texture_tower_update_area:
|
|
||||||
* @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
|
|
||||||
* @height: height rectangle that changed
|
|
||||||
*
|
|
||||||
* Mark a region of the base texture as having changed; the next
|
|
||||||
* time a scaled down version of the base texture is retrieved,
|
|
||||||
* the appropriate area of the scaled down texture will be updated.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_texture_tower_update_area (MetaTextureTower *tower,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height)
|
|
||||||
{
|
|
||||||
int texture_width, texture_height;
|
|
||||||
Box invalid;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_return_if_fail (tower != NULL);
|
|
||||||
|
|
||||||
if (tower->textures[0] == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
|
||||||
texture_height = cogl_texture_get_height (tower->textures[0]);
|
|
||||||
|
|
||||||
invalid.x1 = x;
|
|
||||||
invalid.y1 = y;
|
|
||||||
invalid.x2 = x + width;
|
|
||||||
invalid.y2 = y + height;
|
|
||||||
|
|
||||||
for (i = 1; i < tower->n_levels; i++)
|
|
||||||
{
|
|
||||||
texture_width = MAX (1, texture_width / 2);
|
|
||||||
texture_height = MAX (1, texture_height / 2);
|
|
||||||
|
|
||||||
invalid.x1 = invalid.x1 / 2;
|
|
||||||
invalid.y1 = invalid.y1 / 2;
|
|
||||||
invalid.x2 = MIN (texture_width, (invalid.x2 + 1) / 2);
|
|
||||||
invalid.y2 = MIN (texture_height, (invalid.y2 + 1) / 2);
|
|
||||||
|
|
||||||
if (tower->invalid[i].x1 == tower->invalid[i].x2 ||
|
|
||||||
tower->invalid[i].y1 == tower->invalid[i].y2)
|
|
||||||
{
|
|
||||||
tower->invalid[i] = invalid;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tower->invalid[i].x1 = MIN (tower->invalid[i].x1, invalid.x1);
|
|
||||||
tower->invalid[i].y1 = MIN (tower->invalid[i].y1, invalid.y1);
|
|
||||||
tower->invalid[i].x2 = MAX (tower->invalid[i].x2, invalid.x2);
|
|
||||||
tower->invalid[i].y2 = MAX (tower->invalid[i].y2, invalid.y2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* It generally looks worse if we scale up a window texture by even a
|
|
||||||
* small amount than if we scale it down using bilinear filtering, so
|
|
||||||
* we always pick the *larger* adjacent level. */
|
|
||||||
#define LOD_BIAS (-0.49)
|
|
||||||
|
|
||||||
/* This determines the appropriate level of detail to use when drawing the
|
|
||||||
* texture, in a way that corresponds to what the GL specification does
|
|
||||||
* when mip-mapping. This is probably fancier and slower than what we need,
|
|
||||||
* but we do the computation only once each time we paint a window, and
|
|
||||||
* its easier to just use the equations from the specification than to
|
|
||||||
* come up with something simpler.
|
|
||||||
*
|
|
||||||
* If window is being painted at an angle from the viewer, then we have to
|
|
||||||
* pick a point in the texture; we use the middle of the texture (which is
|
|
||||||
* why the width/height are passed in.) This is not the normal case for
|
|
||||||
* Meta.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
get_paint_level (int width, int height)
|
|
||||||
{
|
|
||||||
CoglMatrix projection, modelview, pm;
|
|
||||||
float v[4];
|
|
||||||
double viewport_width, viewport_height;
|
|
||||||
double u0, v0;
|
|
||||||
double xc, yc, wc;
|
|
||||||
double dxdu_, dxdv_, dydu_, dydv_;
|
|
||||||
double det_, det_sq;
|
|
||||||
double rho_sq;
|
|
||||||
double lambda;
|
|
||||||
|
|
||||||
/* See
|
|
||||||
* http://www.opengl.org/registry/doc/glspec32.core.20090803.pdf
|
|
||||||
* Section 3.8.9, p. 1.6.2. Here we have
|
|
||||||
*
|
|
||||||
* u(x,y) = x_o;
|
|
||||||
* v(x,y) = y_o;
|
|
||||||
*
|
|
||||||
* Since we are mapping 1:1 from object coordinates into pixel
|
|
||||||
* texture coordinates, the clip coordinates are:
|
|
||||||
*
|
|
||||||
* (x_c) (x_o) (u)
|
|
||||||
* (y_c) = (M_projection)(M_modelview) (y_o) = (PM) (v)
|
|
||||||
* (z_c) (z_o) (0)
|
|
||||||
* (w_c) (w_o) (1)
|
|
||||||
*/
|
|
||||||
|
|
||||||
cogl_get_projection_matrix (&projection);
|
|
||||||
cogl_get_modelview_matrix (&modelview);
|
|
||||||
|
|
||||||
cogl_matrix_multiply (&pm, &projection, &modelview);
|
|
||||||
|
|
||||||
cogl_get_viewport (v);
|
|
||||||
viewport_width = v[2];
|
|
||||||
viewport_height = v[3];
|
|
||||||
|
|
||||||
u0 = width / 2.;
|
|
||||||
v0 = height / 2.;
|
|
||||||
|
|
||||||
xc = pm.xx * u0 + pm.xy * v0 + pm.xw;
|
|
||||||
yc = pm.yx * u0 + pm.yy * v0 + pm.yw;
|
|
||||||
wc = pm.wx * u0 + pm.wy * v0 + pm.ww;
|
|
||||||
|
|
||||||
/* We'll simplify the equations below for a bit of micro-optimization.
|
|
||||||
* The commented out code is the unsimplified version.
|
|
||||||
|
|
||||||
// Partial derivates of window coordinates:
|
|
||||||
//
|
|
||||||
// x_w = 0.5 * viewport_width * x_c / w_c + viewport_center_x
|
|
||||||
// y_w = 0.5 * viewport_height * y_c / w_c + viewport_center_y
|
|
||||||
//
|
|
||||||
// with respect to u, v, using
|
|
||||||
// d(a/b)/dx = da/dx * (1/b) - a * db/dx / (b^2)
|
|
||||||
|
|
||||||
dxdu = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)) / wc;
|
|
||||||
dxdv = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)) / wc;
|
|
||||||
dydu = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)) / wc;
|
|
||||||
dydv = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)) / wc;
|
|
||||||
|
|
||||||
// Compute the inverse partials as the matrix inverse
|
|
||||||
det = dxdu * dydv - dxdv * dydu;
|
|
||||||
|
|
||||||
dudx = dydv / det;
|
|
||||||
dudy = - dxdv / det;
|
|
||||||
dvdx = - dydu / det;
|
|
||||||
dvdy = dvdu / det;
|
|
||||||
|
|
||||||
// Scale factor; maximum of the distance in texels for a change of 1 pixel
|
|
||||||
// in the X direction or 1 pixel in the Y direction
|
|
||||||
rho = MAX (sqrt (dudx * dudx + dvdx * dvdx), sqrt(dudy * dudy + dvdy * dvdy));
|
|
||||||
|
|
||||||
// Level of detail
|
|
||||||
lambda = log2 (rho) + LOD_BIAS;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* dxdu * wc, etc */
|
|
||||||
dxdu_ = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc));
|
|
||||||
dxdv_ = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc));
|
|
||||||
dydu_ = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc));
|
|
||||||
dydv_ = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc));
|
|
||||||
|
|
||||||
/* det * wc^2 */
|
|
||||||
det_ = dxdu_ * dydv_ - dxdv_ * dydu_;
|
|
||||||
det_sq = det_ * det_;
|
|
||||||
if (det_sq == 0.0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* (rho * det * wc)^2 */
|
|
||||||
rho_sq = MAX (dydv_ * dydv_ + dydu_ * dydu_, dxdv_ * dxdv_ + dxdu_ * dxdu_);
|
|
||||||
lambda = 0.5 * M_LOG2E * log (rho_sq * wc * wc / det_sq) + LOD_BIAS;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
g_print ("%g %g %g\n", 0.5 * viewport_width * pm.xx / pm.ww, 0.5 * viewport_height * pm.yy / pm.ww, lambda);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (lambda <= 0.)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return (int)(0.5 + lambda);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
is_power_of_two (int x)
|
|
||||||
{
|
|
||||||
return (x & (x - 1)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
texture_tower_create_texture (MetaTextureTower *tower,
|
|
||||||
int level,
|
|
||||||
int width,
|
|
||||||
int height)
|
|
||||||
{
|
|
||||||
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
|
||||||
meta_texture_rectangle_check (tower->textures[level - 1]))
|
|
||||||
{
|
|
||||||
tower->textures[level] =
|
|
||||||
meta_texture_rectangle_new (width, height,
|
|
||||||
/* data format */
|
|
||||||
TEXTURE_FORMAT,
|
|
||||||
/* internal cogl format */
|
|
||||||
TEXTURE_FORMAT,
|
|
||||||
/* rowstride */
|
|
||||||
width * 4,
|
|
||||||
/* data */
|
|
||||||
NULL,
|
|
||||||
/* error */
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tower->textures[level] = cogl_texture_new_with_size (width, height,
|
|
||||||
COGL_TEXTURE_NO_AUTO_MIPMAP,
|
|
||||||
TEXTURE_FORMAT);
|
|
||||||
}
|
|
||||||
|
|
||||||
tower->invalid[level].x1 = 0;
|
|
||||||
tower->invalid[level].y1 = 0;
|
|
||||||
tower->invalid[level].x2 = width;
|
|
||||||
tower->invalid[level].y2 = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
texture_tower_revalidate_fbo (MetaTextureTower *tower,
|
|
||||||
int level)
|
|
||||||
{
|
|
||||||
CoglTexture *source_texture = tower->textures[level - 1];
|
|
||||||
int source_texture_width = cogl_texture_get_width (source_texture);
|
|
||||||
int source_texture_height = cogl_texture_get_height (source_texture);
|
|
||||||
CoglTexture *dest_texture = tower->textures[level];
|
|
||||||
int dest_texture_width = cogl_texture_get_width (dest_texture);
|
|
||||||
int dest_texture_height = cogl_texture_get_height (dest_texture);
|
|
||||||
Box *invalid = &tower->invalid[level];
|
|
||||||
CoglMatrix modelview;
|
|
||||||
|
|
||||||
if (tower->fbos[level] == NULL)
|
|
||||||
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
|
|
||||||
|
|
||||||
if (tower->fbos[level] == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
cogl_push_framebuffer (COGL_FRAMEBUFFER (tower->fbos[level]));
|
|
||||||
|
|
||||||
cogl_ortho (0, dest_texture_width, dest_texture_height, 0, -1., 1.);
|
|
||||||
|
|
||||||
cogl_matrix_init_identity (&modelview);
|
|
||||||
cogl_set_modelview_matrix (&modelview);
|
|
||||||
|
|
||||||
cogl_set_source_texture (tower->textures[level - 1]);
|
|
||||||
cogl_rectangle_with_texture_coords (invalid->x1, invalid->y1,
|
|
||||||
invalid->x2, invalid->y2,
|
|
||||||
(2. * invalid->x1) / source_texture_width,
|
|
||||||
(2. * invalid->y1) / source_texture_height,
|
|
||||||
(2. * invalid->x2) / source_texture_width,
|
|
||||||
(2. * invalid->y2) / source_texture_height);
|
|
||||||
|
|
||||||
cogl_pop_framebuffer ();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
fill_copy (guchar *buf,
|
|
||||||
const guchar *source,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
memcpy (buf, source, width * 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
fill_scale_down (guchar *buf,
|
|
||||||
const guchar *source,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
while (width > 1)
|
|
||||||
{
|
|
||||||
buf[0] = (source[0] + source[4]) / 2;
|
|
||||||
buf[1] = (source[1] + source[5]) / 2;
|
|
||||||
buf[2] = (source[2] + source[6]) / 2;
|
|
||||||
buf[3] = (source[3] + source[7]) / 2;
|
|
||||||
|
|
||||||
buf += 4;
|
|
||||||
source += 8;
|
|
||||||
width -= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (width > 0)
|
|
||||||
{
|
|
||||||
buf[0] = source[0] / 2;
|
|
||||||
buf[1] = source[1] / 2;
|
|
||||||
buf[2] = source[2] / 2;
|
|
||||||
buf[3] = source[3] / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
texture_tower_revalidate_client (MetaTextureTower *tower,
|
|
||||||
int level)
|
|
||||||
{
|
|
||||||
CoglTexture *source_texture = tower->textures[level - 1];
|
|
||||||
int source_texture_width = cogl_texture_get_width (source_texture);
|
|
||||||
int source_texture_height = cogl_texture_get_height (source_texture);
|
|
||||||
guint source_rowstride;
|
|
||||||
guchar *source_data;
|
|
||||||
CoglTexture *dest_texture = tower->textures[level];
|
|
||||||
int dest_texture_width = cogl_texture_get_width (dest_texture);
|
|
||||||
int dest_texture_height = cogl_texture_get_height (dest_texture);
|
|
||||||
int dest_x = tower->invalid[level].x1;
|
|
||||||
int dest_y = tower->invalid[level].y1;
|
|
||||||
int dest_width = tower->invalid[level].x2 - tower->invalid[level].x1;
|
|
||||||
int dest_height = tower->invalid[level].y2 - tower->invalid[level].y1;
|
|
||||||
guchar *dest_data;
|
|
||||||
guchar *source_tmp1 = NULL, *source_tmp2 = NULL;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
source_rowstride = source_texture_width * 4;
|
|
||||||
|
|
||||||
source_data = g_malloc (source_texture_height * source_rowstride);
|
|
||||||
cogl_texture_get_data (source_texture, TEXTURE_FORMAT, source_rowstride,
|
|
||||||
source_data);
|
|
||||||
|
|
||||||
dest_data = g_malloc (dest_height * dest_width * 4);
|
|
||||||
|
|
||||||
if (dest_texture_height < source_texture_height)
|
|
||||||
{
|
|
||||||
source_tmp1 = g_malloc (dest_width * 4);
|
|
||||||
source_tmp2 = g_malloc (dest_width * 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < dest_height; i++)
|
|
||||||
{
|
|
||||||
guchar *dest_row = dest_data + i * dest_width * 4;
|
|
||||||
if (dest_texture_height < source_texture_height)
|
|
||||||
{
|
|
||||||
guchar *source1, *source2;
|
|
||||||
guchar *dest;
|
|
||||||
|
|
||||||
if (dest_texture_width < source_texture_width)
|
|
||||||
{
|
|
||||||
fill_scale_down (source_tmp1,
|
|
||||||
source_data + ((i + dest_y) * 2) * source_rowstride + dest_x * 2 * 4,
|
|
||||||
dest_width * 2);
|
|
||||||
fill_scale_down (source_tmp2,
|
|
||||||
source_data + ((i + dest_y) * 2 + 1) * source_rowstride + dest_x * 2 * 4,
|
|
||||||
dest_width * 2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fill_copy (source_tmp1,
|
|
||||||
source_data + ((i + dest_y) * 2) * source_rowstride + dest_x * 4,
|
|
||||||
dest_width);
|
|
||||||
fill_copy (source_tmp2,
|
|
||||||
source_data + ((i + dest_y) * 2 + 1) * source_rowstride + dest_x * 4,
|
|
||||||
dest_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
source1 = source_tmp1;
|
|
||||||
source2 = source_tmp2;
|
|
||||||
|
|
||||||
dest = dest_row;
|
|
||||||
for (j = 0; j < dest_width * 4; j++)
|
|
||||||
*(dest++) = (*(source1++) + *(source2++)) / 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (dest_texture_width < source_texture_width)
|
|
||||||
fill_scale_down (dest_row,
|
|
||||||
source_data + (i + dest_y) * source_rowstride + dest_x * 2 * 4,
|
|
||||||
dest_width * 2);
|
|
||||||
else
|
|
||||||
fill_copy (dest_row,
|
|
||||||
source_data + (i + dest_y) * source_rowstride,
|
|
||||||
dest_width);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cogl_texture_set_region (dest_texture,
|
|
||||||
0, 0,
|
|
||||||
dest_x, dest_y,
|
|
||||||
dest_width, dest_height,
|
|
||||||
dest_width, dest_height,
|
|
||||||
TEXTURE_FORMAT,
|
|
||||||
4 * dest_width,
|
|
||||||
dest_data);
|
|
||||||
|
|
||||||
if (dest_texture_height < source_texture_height)
|
|
||||||
{
|
|
||||||
g_free (source_tmp1);
|
|
||||||
g_free (source_tmp2);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (source_data);
|
|
||||||
g_free (dest_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
texture_tower_revalidate (MetaTextureTower *tower,
|
|
||||||
int level)
|
|
||||||
{
|
|
||||||
if (!texture_tower_revalidate_fbo (tower, level))
|
|
||||||
texture_tower_revalidate_client (tower, level);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_texture_tower_get_paint_texture:
|
|
||||||
* @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
|
|
||||||
* be rendered with vertex coordinates that correspond to its
|
|
||||||
* size in pixels, so a 200x200 texture will be rendered on the
|
|
||||||
* rectangle (0, 0, 200, 200).
|
|
||||||
*
|
|
||||||
* Return value: the COGL texture handle to use for painting, or
|
|
||||||
* %NULL if no base texture has yet been set.
|
|
||||||
*/
|
|
||||||
CoglTexture *
|
|
||||||
meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
|
|
||||||
{
|
|
||||||
int texture_width, texture_height;
|
|
||||||
int level;
|
|
||||||
|
|
||||||
g_return_val_if_fail (tower != NULL, NULL);
|
|
||||||
|
|
||||||
if (tower->textures[0] == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
texture_width = cogl_texture_get_width (tower->textures[0]);
|
|
||||||
texture_height = cogl_texture_get_height (tower->textures[0]);
|
|
||||||
|
|
||||||
level = get_paint_level(texture_width, texture_height);
|
|
||||||
if (level < 0) /* singular paint matrix, scaled to nothing */
|
|
||||||
return NULL;
|
|
||||||
level = MIN (level, tower->n_levels - 1);
|
|
||||||
|
|
||||||
if (tower->textures[level] == NULL ||
|
|
||||||
(tower->invalid[level].x2 != tower->invalid[level].x1 &&
|
|
||||||
tower->invalid[level].y2 != tower->invalid[level].y1))
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 1; i <= level; i++)
|
|
||||||
{
|
|
||||||
/* Use "floor" convention here to be consistent with the NPOT texture extension */
|
|
||||||
texture_width = MAX (1, texture_width / 2);
|
|
||||||
texture_height = MAX (1, texture_height / 2);
|
|
||||||
|
|
||||||
if (tower->textures[i] == NULL)
|
|
||||||
texture_tower_create_texture (tower, i, texture_width, texture_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i <= level; i++)
|
|
||||||
{
|
|
||||||
if (tower->invalid[level].x2 != tower->invalid[level].x1 &&
|
|
||||||
tower->invalid[level].y2 != tower->invalid[level].y1)
|
|
||||||
texture_tower_revalidate (tower, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return tower->textures[level];
|
|
||||||
}
|
|
@@ -1,69 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
/*
|
|
||||||
* MetaTextureTower
|
|
||||||
*
|
|
||||||
* Mipmap emulation by creation of scaled down images
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* 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_TEXTURE_TOWER_H__
|
|
||||||
#define __META_TEXTURE_TOWER_H__
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:MetaTextureTower
|
|
||||||
* @short_description: mipmap emulation by creation of scaled down images
|
|
||||||
*
|
|
||||||
* A #MetaTextureTower is used to get good looking scaled down images when
|
|
||||||
* we can't use the GL drivers mipmap support. There are two separate reasons
|
|
||||||
*
|
|
||||||
* - Some cards (including radeon cards <= r5xx) only support
|
|
||||||
* TEXTURE_RECTANGLE_ARB and not NPOT textures. Rectangular textures
|
|
||||||
* are defined not to support mipmapping.
|
|
||||||
* - Even when NPOT textures are available, the combination of NPOT
|
|
||||||
* textures, texture_from_pixmap, and mipmapping doesn't typically
|
|
||||||
* work, since the X server doesn't allocate pixmaps in the right
|
|
||||||
* layout for mipmapping.
|
|
||||||
*
|
|
||||||
* So, what we do is create the "mipmap" levels ourselves by successive
|
|
||||||
* power-of-two scaledowns, and when rendering pick the single texture
|
|
||||||
* that best matches the scale we are rendering at. (Since we aren't
|
|
||||||
* typically using perspective transforms, we'll frequently have a single
|
|
||||||
* scale for the entire texture.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _MetaTextureTower MetaTextureTower;
|
|
||||||
|
|
||||||
MetaTextureTower *meta_texture_tower_new (void);
|
|
||||||
void meta_texture_tower_free (MetaTextureTower *tower);
|
|
||||||
void meta_texture_tower_set_base_texture (MetaTextureTower *tower,
|
|
||||||
CoglTexture *texture);
|
|
||||||
void meta_texture_tower_update_area (MetaTextureTower *tower,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height);
|
|
||||||
CoglTexture *meta_texture_tower_get_paint_texture (MetaTextureTower *tower);
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#endif /* __META_TEXTURE_TOWER_H__ */
|
|
@@ -1782,10 +1782,6 @@ check_needs_pixmap (MetaWindowActor *self)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compositor->no_mipmaps)
|
|
||||||
meta_shaped_texture_set_create_mipmaps (META_SHAPED_TEXTURE (priv->actor),
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
|
meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
|
||||||
priv->back_pixmap);
|
priv->back_pixmap);
|
||||||
|
|
||||||
|
@@ -2147,6 +2147,7 @@ event_callback (XEvent *event,
|
|||||||
gboolean filter_out_event;
|
gboolean filter_out_event;
|
||||||
XIEvent *input_event;
|
XIEvent *input_event;
|
||||||
MetaMonitorManager *monitor;
|
MetaMonitorManager *monitor;
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
display = data;
|
display = data;
|
||||||
|
|
||||||
@@ -2184,6 +2185,13 @@ event_callback (XEvent *event,
|
|||||||
display->server_focus_serial);
|
display->server_focus_serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
screen = meta_display_screen_for_root (display, event->xany.window);
|
||||||
|
if (screen)
|
||||||
|
{
|
||||||
|
if (meta_screen_handle_xevent (screen, event))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
modified = event_get_modified_window (display, event);
|
modified = event_get_modified_window (display, event);
|
||||||
|
|
||||||
input_event = get_input_event (display, event);
|
input_event = get_input_event (display, event);
|
||||||
|
34
src/core/meta-cursor-tracker-private.h
Normal file
34
src/core/meta-cursor-tracker-private.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Author: Giovanni Campagna <gcampagn@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_CURSOR_TRACKER_PRIVATE_H
|
||||||
|
#define META_CURSOR_TRACKER_PRIVATE_H
|
||||||
|
|
||||||
|
#include <meta/meta-cursor-tracker.h>
|
||||||
|
|
||||||
|
gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
||||||
|
XEvent *xevent);
|
||||||
|
|
||||||
|
void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
||||||
|
MetaCursor cursor);
|
||||||
|
#endif
|
275
src/core/meta-cursor-tracker.c
Normal file
275
src/core/meta-cursor-tracker.c
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2013 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Author: Giovanni Campagna <gcampagn@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION:cursor-tracker
|
||||||
|
* @title: MetaCursorTracker
|
||||||
|
* @short_description: Mutter cursor tracking helper
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <meta/main.h>
|
||||||
|
#include <meta/util.h>
|
||||||
|
#include <meta/errors.h>
|
||||||
|
|
||||||
|
#include <cogl/cogl.h>
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
|
#include <X11/extensions/Xfixes.h>
|
||||||
|
|
||||||
|
#include "meta-cursor-tracker-private.h"
|
||||||
|
#include "screen-private.h"
|
||||||
|
|
||||||
|
#define META_WAYLAND_DEFAULT_CURSOR_HOTSPOT_X 7
|
||||||
|
#define META_WAYLAND_DEFAULT_CURSOR_HOTSPOT_Y 4
|
||||||
|
|
||||||
|
struct _MetaCursorTracker {
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
|
gboolean is_showing;
|
||||||
|
|
||||||
|
CoglTexture2D *sprite;
|
||||||
|
int hot_x, hot_y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaCursorTrackerClass {
|
||||||
|
GObjectClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
CURSOR_CHANGED,
|
||||||
|
LAST_SIGNAL
|
||||||
|
};
|
||||||
|
|
||||||
|
static guint signals[LAST_SIGNAL];
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_tracker_init (MetaCursorTracker *self)
|
||||||
|
{
|
||||||
|
/* (JS) Best (?) that can be assumed since XFixes doesn't provide a way of
|
||||||
|
* detecting if the system mouse cursor is showing or not.
|
||||||
|
*
|
||||||
|
* On wayland we start with the cursor showing
|
||||||
|
*/
|
||||||
|
self->is_showing = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_tracker_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
|
||||||
|
|
||||||
|
if (self->sprite)
|
||||||
|
cogl_object_unref (self->sprite);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_cursor_tracker_finalize;
|
||||||
|
|
||||||
|
signals[CURSOR_CHANGED] = g_signal_new ("cursor-changed",
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaCursorTracker *
|
||||||
|
make_x11_cursor_tracker (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
MetaCursorTracker *self = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
|
||||||
|
self->screen = screen;
|
||||||
|
|
||||||
|
XFixesSelectCursorInput (screen->display->xdisplay,
|
||||||
|
screen->xroot,
|
||||||
|
XFixesDisplayCursorNotifyMask);
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cursor_tracker_get_for_screen:
|
||||||
|
* @screen: the #MetaScreen
|
||||||
|
*
|
||||||
|
* Retrieves the cursor tracker object for @screen.
|
||||||
|
*
|
||||||
|
* Returns: (transfer none):
|
||||||
|
*/
|
||||||
|
MetaCursorTracker *
|
||||||
|
meta_cursor_tracker_get_for_screen (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
MetaCursorTracker *self;
|
||||||
|
|
||||||
|
if (screen->cursor_tracker)
|
||||||
|
return screen->cursor_tracker;
|
||||||
|
|
||||||
|
self = make_x11_cursor_tracker (screen);
|
||||||
|
|
||||||
|
screen->cursor_tracker = self;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
||||||
|
XEvent *xevent)
|
||||||
|
{
|
||||||
|
XFixesCursorNotifyEvent *notify_event;
|
||||||
|
|
||||||
|
if (xevent->xany.type != tracker->screen->display->xfixes_event_base + XFixesCursorNotify)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
notify_event = (XFixesCursorNotifyEvent *)xevent;
|
||||||
|
if (notify_event->subtype != XFixesDisplayCursorNotify)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
g_clear_pointer (&tracker->sprite, cogl_object_unref);
|
||||||
|
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ensure_xfixes_cursor (MetaCursorTracker *tracker)
|
||||||
|
{
|
||||||
|
XFixesCursorImage *cursor_image;
|
||||||
|
CoglTexture2D *sprite;
|
||||||
|
guint8 *cursor_data;
|
||||||
|
gboolean free_cursor_data;
|
||||||
|
CoglContext *ctx;
|
||||||
|
|
||||||
|
if (tracker->sprite)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cursor_image = XFixesGetCursorImage (tracker->screen->display->xdisplay);
|
||||||
|
if (!cursor_image)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Like all X APIs, XFixesGetCursorImage() returns arrays of 32-bit
|
||||||
|
* quantities as arrays of long; we need to convert on 64 bit */
|
||||||
|
if (sizeof(long) == 4)
|
||||||
|
{
|
||||||
|
cursor_data = (guint8 *)cursor_image->pixels;
|
||||||
|
free_cursor_data = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
guint32 *cursor_words;
|
||||||
|
gulong *p;
|
||||||
|
guint32 *q;
|
||||||
|
|
||||||
|
cursor_words = g_new (guint32, cursor_image->width * cursor_image->height);
|
||||||
|
cursor_data = (guint8 *)cursor_words;
|
||||||
|
|
||||||
|
p = cursor_image->pixels;
|
||||||
|
q = cursor_words;
|
||||||
|
for (j = 0; j < cursor_image->height; j++)
|
||||||
|
for (i = 0; i < cursor_image->width; i++)
|
||||||
|
*(q++) = *(p++);
|
||||||
|
|
||||||
|
free_cursor_data = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
sprite = cogl_texture_2d_new_from_data (ctx,
|
||||||
|
cursor_image->width,
|
||||||
|
cursor_image->height,
|
||||||
|
CLUTTER_CAIRO_FORMAT_ARGB32,
|
||||||
|
COGL_PIXEL_FORMAT_ANY,
|
||||||
|
cursor_image->width * 4, /* stride */
|
||||||
|
cursor_data,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (free_cursor_data)
|
||||||
|
g_free (cursor_data);
|
||||||
|
|
||||||
|
if (sprite != NULL)
|
||||||
|
{
|
||||||
|
tracker->sprite = sprite;
|
||||||
|
tracker->hot_x = cursor_image->xhot;
|
||||||
|
tracker->hot_y = cursor_image->yhot;
|
||||||
|
}
|
||||||
|
XFree (cursor_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cursor_tracker_get_sprite:
|
||||||
|
*
|
||||||
|
* Returns: (transfer none):
|
||||||
|
*/
|
||||||
|
CoglTexture *
|
||||||
|
meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (META_IS_CURSOR_TRACKER (tracker), NULL);
|
||||||
|
|
||||||
|
ensure_xfixes_cursor (tracker);
|
||||||
|
|
||||||
|
return COGL_TEXTURE (tracker->sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_cursor_tracker_get_hot:
|
||||||
|
* @tracker:
|
||||||
|
* @x: (out):
|
||||||
|
* @y: (out):
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
||||||
|
int *x,
|
||||||
|
int *y)
|
||||||
|
{
|
||||||
|
g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
|
||||||
|
|
||||||
|
ensure_xfixes_cursor (tracker);
|
||||||
|
|
||||||
|
if (x)
|
||||||
|
*x = tracker->hot_x;
|
||||||
|
if (y)
|
||||||
|
*y = tracker->hot_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
|
||||||
|
MetaCursor cursor)
|
||||||
|
{
|
||||||
|
Cursor xcursor;
|
||||||
|
MetaDisplay *display = tracker->screen->display;
|
||||||
|
|
||||||
|
/* First create a cursor for X11 applications that don't specify their own */
|
||||||
|
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||||
|
|
||||||
|
XDefineCursor (display->xdisplay, tracker->screen->xroot, xcursor);
|
||||||
|
XFlush (display->xdisplay);
|
||||||
|
XFreeCursor (display->xdisplay, xcursor);
|
||||||
|
}
|
@@ -42,7 +42,6 @@
|
|||||||
#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MONITORS_CHANGED,
|
|
||||||
CONFIRM_DISPLAY_CHANGE,
|
CONFIRM_DISPLAY_CHANGE,
|
||||||
SIGNALS_LAST
|
SIGNALS_LAST
|
||||||
};
|
};
|
||||||
@@ -660,14 +659,6 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
|||||||
klass->get_edid_file = get_edid_file_dummy;
|
klass->get_edid_file = get_edid_file_dummy;
|
||||||
klass->read_edid = read_edid_dummy;
|
klass->read_edid = read_edid_dummy;
|
||||||
|
|
||||||
signals[MONITORS_CHANGED] =
|
|
||||||
g_signal_new ("monitors-changed",
|
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
0,
|
|
||||||
NULL, NULL, NULL,
|
|
||||||
G_TYPE_NONE, 0);
|
|
||||||
|
|
||||||
signals[CONFIRM_DISPLAY_CHANGE] =
|
signals[CONFIRM_DISPLAY_CHANGE] =
|
||||||
g_signal_new ("confirm-display-change",
|
g_signal_new ("confirm-display-change",
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
@@ -813,6 +804,10 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
g_variant_new_string (output->product));
|
g_variant_new_string (output->product));
|
||||||
g_variant_builder_add (&properties, "{sv}", "serial",
|
g_variant_builder_add (&properties, "{sv}", "serial",
|
||||||
g_variant_new_string (output->serial));
|
g_variant_new_string (output->serial));
|
||||||
|
g_variant_builder_add (&properties, "{sv}", "width-mm",
|
||||||
|
g_variant_new_int32 (output->width_mm));
|
||||||
|
g_variant_builder_add (&properties, "{sv}", "height-mm",
|
||||||
|
g_variant_new_int32 (output->height_mm));
|
||||||
g_variant_builder_add (&properties, "{sv}", "display-name",
|
g_variant_builder_add (&properties, "{sv}", "display-name",
|
||||||
g_variant_new_take_string (make_display_name (manager, output)));
|
g_variant_new_take_string (make_display_name (manager, output)));
|
||||||
g_variant_builder_add (&properties, "{sv}", "backlight",
|
g_variant_builder_add (&properties, "{sv}", "backlight",
|
||||||
@@ -1493,7 +1488,7 @@ invalidate_logical_config (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
make_logical_config (manager);
|
make_logical_config (manager);
|
||||||
|
|
||||||
g_signal_emit (manager, signals[MONITORS_CHANGED], 0);
|
g_signal_emit_by_name (manager, "monitors-changed");
|
||||||
|
|
||||||
g_free (old_monitor_infos);
|
g_free (old_monitor_infos);
|
||||||
}
|
}
|
||||||
|
@@ -83,6 +83,7 @@ struct _MetaScreen
|
|||||||
MetaStack *stack;
|
MetaStack *stack;
|
||||||
MetaStackTracker *stack_tracker;
|
MetaStackTracker *stack_tracker;
|
||||||
|
|
||||||
|
MetaCursorTracker *cursor_tracker;
|
||||||
MetaCursor current_cursor;
|
MetaCursor current_cursor;
|
||||||
|
|
||||||
Window flash_window;
|
Window flash_window;
|
||||||
@@ -249,4 +250,7 @@ int meta_screen_xinerama_index_to_monitor_index (MetaScreen *screen,
|
|||||||
int meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen,
|
int meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen,
|
||||||
int index);
|
int index);
|
||||||
|
|
||||||
|
gboolean meta_screen_handle_xevent (MetaScreen *screen,
|
||||||
|
XEvent *xevent);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -45,6 +45,7 @@
|
|||||||
#include <meta/compositor.h>
|
#include <meta/compositor.h>
|
||||||
#include "mutter-enum-types.h"
|
#include "mutter-enum-types.h"
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
#include "meta-cursor-tracker-private.h"
|
||||||
|
|
||||||
#include <X11/extensions/Xinerama.h>
|
#include <X11/extensions/Xinerama.h>
|
||||||
|
|
||||||
@@ -705,7 +706,8 @@ meta_screen_new (MetaDisplay *display,
|
|||||||
screen->guard_window = None;
|
screen->guard_window = None;
|
||||||
|
|
||||||
reload_monitor_infos (screen);
|
reload_monitor_infos (screen);
|
||||||
|
|
||||||
|
meta_cursor_tracker_get_for_screen (screen);
|
||||||
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
|
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
|
||||||
|
|
||||||
/* Handle creating a no_focus_window for this screen */
|
/* Handle creating a no_focus_window for this screen */
|
||||||
@@ -1461,29 +1463,18 @@ void
|
|||||||
meta_screen_set_cursor (MetaScreen *screen,
|
meta_screen_set_cursor (MetaScreen *screen,
|
||||||
MetaCursor cursor)
|
MetaCursor cursor)
|
||||||
{
|
{
|
||||||
Cursor xcursor;
|
|
||||||
|
|
||||||
if (cursor == screen->current_cursor)
|
if (cursor == screen->current_cursor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
screen->current_cursor = cursor;
|
screen->current_cursor = cursor;
|
||||||
|
meta_cursor_tracker_set_root_cursor (screen->cursor_tracker, 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_screen_update_cursor (MetaScreen *screen)
|
meta_screen_update_cursor (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
Cursor xcursor;
|
meta_cursor_tracker_set_root_cursor (screen->cursor_tracker,
|
||||||
|
screen->current_cursor);
|
||||||
xcursor = meta_display_create_x_cursor (screen->display,
|
|
||||||
screen->current_cursor);
|
|
||||||
XDefineCursor (screen->display->xdisplay, screen->xroot, xcursor);
|
|
||||||
XFlush (screen->display->xdisplay);
|
|
||||||
XFreeCursor (screen->display->xdisplay, xcursor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -3688,3 +3679,17 @@ meta_screen_get_monitor_in_fullscreen (MetaScreen *screen,
|
|||||||
/* We use -1 as a flag to mean "not known yet" for notification purposes */
|
/* We use -1 as a flag to mean "not known yet" for notification purposes */
|
||||||
return screen->monitor_infos[monitor].in_fullscreen == TRUE;
|
return screen->monitor_infos[monitor].in_fullscreen == TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_screen_handle_xevent (MetaScreen *screen,
|
||||||
|
XEvent *xevent)
|
||||||
|
{
|
||||||
|
/* Go through our helpers and see if they want this event.
|
||||||
|
Currently, only MetaCursorTracker.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (meta_cursor_tracker_handle_xevent (screen->cursor_tracker, xevent))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
50
src/meta/meta-cursor-tracker.h
Normal file
50
src/meta/meta-cursor-tracker.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Author: Giovanni Campagna <gcampagn@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_CURSOR_TRACKER_H
|
||||||
|
#define META_CURSOR_TRACKER_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include <meta/types.h>
|
||||||
|
#include <meta/workspace.h>
|
||||||
|
#include <cogl/cogl.h>
|
||||||
|
|
||||||
|
#define META_TYPE_CURSOR_TRACKER (meta_cursor_tracker_get_type ())
|
||||||
|
#define META_CURSOR_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CURSOR_TRACKER, MetaCursorTracker))
|
||||||
|
#define META_CURSOR_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_TRACKER, MetaCursorTrackerClass))
|
||||||
|
#define META_IS_CURSOR_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_CURSOR_TRACKER))
|
||||||
|
#define META_IS_CURSOR_TRACKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_CURSOR_TRACKER))
|
||||||
|
#define META_CURSOR_TRACKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_CURSOR_TRACKER, MetaCursorTrackerClass))
|
||||||
|
|
||||||
|
typedef struct _MetaCursorTrackerClass MetaCursorTrackerClass;
|
||||||
|
|
||||||
|
GType meta_cursor_tracker_get_type (void);
|
||||||
|
|
||||||
|
MetaCursorTracker *meta_cursor_tracker_get_for_screen (MetaScreen *screen);
|
||||||
|
|
||||||
|
void meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
||||||
|
int *x,
|
||||||
|
int *y);
|
||||||
|
CoglTexture *meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker);
|
||||||
|
|
||||||
|
#endif
|
@@ -396,8 +396,6 @@ typedef enum {
|
|||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_plugin_begin_modal (MetaPlugin *plugin,
|
meta_plugin_begin_modal (MetaPlugin *plugin,
|
||||||
Window grab_window,
|
|
||||||
Cursor cursor,
|
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
|
||||||
|
@@ -66,9 +66,6 @@ GType meta_shaped_texture_get_type (void) G_GNUC_CONST;
|
|||||||
|
|
||||||
ClutterActor *meta_shaped_texture_new (void);
|
ClutterActor *meta_shaped_texture_new (void);
|
||||||
|
|
||||||
void meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
|
||||||
gboolean create_mipmaps);
|
|
||||||
|
|
||||||
void meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
void meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y,
|
||||||
|
@@ -38,5 +38,6 @@ typedef struct _MetaWorkspace MetaWorkspace;
|
|||||||
*/
|
*/
|
||||||
typedef struct _MetaGroup MetaGroup;
|
typedef struct _MetaGroup MetaGroup;
|
||||||
typedef struct _MetaKeyBinding MetaKeyBinding;
|
typedef struct _MetaKeyBinding MetaKeyBinding;
|
||||||
|
typedef struct _MetaCursorTracker MetaCursorTracker;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -58,6 +58,11 @@ meta_ui_init (void)
|
|||||||
{
|
{
|
||||||
if (!gtk_init_check (NULL, NULL))
|
if (!gtk_init_check (NULL, NULL))
|
||||||
meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL));
|
meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL));
|
||||||
|
|
||||||
|
/* We need to be able to fully trust that the window and monitor sizes
|
||||||
|
that Gdk reports corresponds to the X ones, so we disable the automatic
|
||||||
|
scale handling */
|
||||||
|
gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Display*
|
Display*
|
||||||
|
@@ -277,5 +277,14 @@
|
|||||||
XRandR interface directly).
|
XRandR interface directly).
|
||||||
-->
|
-->
|
||||||
<property name="PowerSaveMode" type="i" access="readwrite" />
|
<property name="PowerSaveMode" type="i" access="readwrite" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
MonitorsChanged:
|
||||||
|
|
||||||
|
The signal is emitted every time the screen configuration
|
||||||
|
changes.
|
||||||
|
The client should then call GetResources() to read the new layout.
|
||||||
|
-->
|
||||||
|
<signal name="MonitorsChanged" />
|
||||||
</interface>
|
</interface>
|
||||||
</node>
|
</node>
|
||||||
|
Reference in New Issue
Block a user