Skip to content
Commits on Source (11)
3.36.7
======
* Fix potential stack overflow in libcroco [Michael; !1404]
* Fix system action search regressions [Florian; #3169]
* Fix week number alignment when using font-scaling [Joonas; !1415]
* Misc. bug fixes and cleanups [Bastien, Carlos, Florian, Daniel;
!1444, !1451, #2230, !1423]
Contributors:
Michael Catanzaro, Carlos Garnacho, Joonas Henriksson, Florian Müllner,
Bastien Nocera, Daniel van Vugt
Translators:
Marek Černocký [cs]
3.36.6
======
* Fix lock screen on systems without GLSL shader support [Zephaniah; #3071]
......
......@@ -170,7 +170,6 @@
height: 1.8em;
width: 2.3em;
border-radius: 2px;
padding: 0.5em 0 0;
margin: 6px;
background-color: darken($bg_color, 2%);
color: lighten($fg_color, 5%);
......
......@@ -281,7 +281,12 @@ const SystemActions = GObject.registerClass({
getMatchingActions(terms) {
// terms is a list of strings
terms = terms.map(term => GLib.str_tokenize_and_fold(term, null)[0]);
terms = terms.map(
term => GLib.str_tokenize_and_fold(term, null)[0]).flat(2);
// tokenizing may return an empty array
if (terms.length === 0)
return [];
let results = [];
......
......@@ -684,6 +684,7 @@ var Calendar = GObject.registerClass({
style_class: 'calendar-day-base calendar-week-number',
can_focus: true });
let weekFormat = Shell.util_translate_time_string(N_("Week %V"));
label.clutter_text.y_align = Clutter.ActorAlign.CENTER;
label.accessible_name = iter.toLocaleFormat(weekFormat);
layout.attach(label, rtl ? 7 : 0, row, 1, 1);
}
......
......@@ -462,6 +462,11 @@ var Dash = GObject.registerClass({
this._syncLabel(item, appIcon);
});
item.child.connect('clicked', () => {
this._labelShowing = false;
item.hideLabel();
});
let id = Main.overview.connect('hiding', () => {
this._labelShowing = false;
item.hideLabel();
......
......@@ -572,15 +572,20 @@ class FreezableBinLayout extends Clutter.BinLayout {
var CalendarColumnLayout = GObject.registerClass(
class CalendarColumnLayout extends Clutter.BoxLayout {
_init(actor) {
_init(actors) {
super._init({ orientation: Clutter.Orientation.VERTICAL });
this._calActor = actor;
this._colActors = actors;
}
vfunc_get_preferred_width(container, forHeight) {
if (!this._calActor || this._calActor.get_parent() != container)
const actors =
this._colActors.filter(a => a.get_parent() === container);
if (actors.length === 0)
return super.vfunc_get_preferred_width(container, forHeight);
return this._calActor.get_preferred_width(forHeight);
return actors.reduce(([minAcc, natAcc], child) => {
const [min, nat] = child.get_preferred_width(forHeight);
return [Math.max(minAcc, min), Math.max(natAcc, nat)];
}, [0, 0]);
}
});
......@@ -631,6 +636,7 @@ class DateMenuButton extends PanelMenu.Button {
layout.frozen = !_isToday(date);
this._messageList.setDate(date);
});
this._date = new TodayButton(this._calendar);
this.menu.connect('open-state-changed', (menu, isOpen) => {
// Whenever the menu is opened, select today
......@@ -647,15 +653,13 @@ class DateMenuButton extends PanelMenu.Button {
hbox.add_child(this._messageList);
// Fill up the second column
let boxLayout = new CalendarColumnLayout(this._calendar);
const boxLayout = new CalendarColumnLayout([this._calendar, this._date]);
vbox = new St.Widget({ style_class: 'datemenu-calendar-column',
layout_manager: boxLayout });
boxLayout.hookup_style(vbox);
hbox.add(vbox);
this._date = new TodayButton(this._calendar);
vbox.add_actor(this._date);
vbox.add_actor(this._calendar);
this._displaysSection = new St.ScrollView({ style_class: 'datemenu-displays-section vfade',
......
project('gnome-shell', 'c',
version: '3.36.6',
version: '3.36.7',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)
......
......@@ -9,10 +9,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Project-Id-Version: gnome-shell gnome-3.36\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-04-22 12:52+0000\n"
"PO-Revision-Date: 2020-04-27 16:42+0200\n"
"POT-Creation-Date: 2020-09-07 20:32+0000\n"
"PO-Revision-Date: 2020-09-09 10:15+0200\n"
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
......@@ -414,7 +414,7 @@ msgstr "Navštívit domovskou stránku rozšíření"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:183
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
......@@ -452,7 +452,7 @@ msgstr "(např. uživatel nebo %s)"
msgid "Username"
msgstr "Uživatelské jméno"
#: js/gdm/loginDialog.js:1253
#: js/gdm/loginDialog.js:1252
msgid "Login Window"
msgstr "Přihlašovací okno"
......@@ -470,26 +470,26 @@ msgid "(or swipe finger)"
msgstr "(nebo otiskněte prst)"
#. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:89
#: js/misc/systemActions.js:93
msgctxt "search-result"
msgid "Power Off"
msgstr "Vypnout"
#. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:92
#: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr ""
"vypnout;vypnutí;restart;restartování;restartovat;reboot;znovu zavést systém;"
"zavedení systému;natažení systému;zastavit;stopnout;"
#. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:97
#: js/misc/systemActions.js:101
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Zamknout obrazovku"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:100
#: js/misc/systemActions.js:104
msgid "lock screen"
msgstr ""
"zamknout obrazovku;zamknout počítač;uzamknout obrazovku;uzamknout počítač;"
......@@ -498,40 +498,40 @@ msgstr ""
"obrazovky;zamčení počítače;uzamčení obrazovky;uzamčení počítače;"
#. Translators: The name of the logout action in search
#: js/misc/systemActions.js:105
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Log Out"
msgstr "Odhlásit se"
#. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:108
#: js/misc/systemActions.js:112
msgid "logout;log out;sign off"
msgstr "odhlásit se;odhlášení;odlogovat se;odlogování;"
#. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:113
#: js/misc/systemActions.js:117
msgctxt "search-result"
msgid "Suspend"
msgstr "Uspat do paměti"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:116
#: js/misc/systemActions.js:120
msgid "suspend;sleep"
msgstr "uspat do paměti;režim spánku;"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:121
#: js/misc/systemActions.js:125
msgctxt "search-result"
msgid "Switch User"
msgstr "Přepnout uživatele"
#. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:124
#: js/misc/systemActions.js:128
msgid "switch user"
msgstr "přepnout uživatele;přepnutí uživatele;"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr ""
"zamknout otočení;zamknout orientaci;uzamknout otočení;uzamknout orientaci;"
......@@ -542,12 +542,12 @@ msgstr ""
"otočení;odemknutí orientace;odemčení otočení;odemčení orientace;obrazovka;"
"otočení;orientace;"
#: js/misc/systemActions.js:251
#: js/misc/systemActions.js:255
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Odemknout otočení obrazovky"
#: js/misc/systemActions.js:252
#: js/misc/systemActions.js:256
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Zamknout otočení obrazovky"
......@@ -718,53 +718,53 @@ msgstr "Zamítnout přístup"
msgid "Grant Access"
msgstr "Schválit přístup"
#: js/ui/appDisplay.js:938
#: js/ui/appDisplay.js:939
msgid "Unnamed Folder"
msgstr "Nepojmenovaná složka"
#: js/ui/appDisplay.js:961
#: js/ui/appDisplay.js:962
msgid "Frequently used applications will appear here"
msgstr "Zde se objeví často používané aplikace"
#: js/ui/appDisplay.js:1096
#: js/ui/appDisplay.js:1097
msgid "Frequent"
msgstr "Časté"
#: js/ui/appDisplay.js:1103
#: js/ui/appDisplay.js:1104
msgid "All"
msgstr "Všechny"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2479 js/ui/panel.js:75
#: js/ui/appDisplay.js:2508 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Otevřená okna"
#: js/ui/appDisplay.js:2499 js/ui/panel.js:82
#: js/ui/appDisplay.js:2528 js/ui/panel.js:82
msgid "New Window"
msgstr "Nové okno"
#: js/ui/appDisplay.js:2510
#: js/ui/appDisplay.js:2539
msgid "Launch using Dedicated Graphics Card"
msgstr "Spustit pomocí vyhrazené grafické karty"
#: js/ui/appDisplay.js:2538 js/ui/dash.js:239
#: js/ui/appDisplay.js:2567 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených"
#: js/ui/appDisplay.js:2544
#: js/ui/appDisplay.js:2573
msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené"
#: js/ui/appDisplay.js:2554 js/ui/panel.js:93
#: js/ui/appDisplay.js:2583 js/ui/panel.js:93
msgid "Show Details"
msgstr "Zobrazit podrobnosti"
#: js/ui/appFavorites.js:152
#: js/ui/appFavorites.js:153
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s byl přidán mezi oblíbené."
#: js/ui/appFavorites.js:185
#: js/ui/appFavorites.js:186
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených."
......@@ -785,7 +785,7 @@ msgstr "Sluchátka"
msgid "Headset"
msgstr "Sluchátka s mikrofonem"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
msgid "Microphone"
msgstr "Mikrofon"
......@@ -859,7 +859,7 @@ msgstr "So"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:371
#: js/ui/calendar.js:396
msgid "%OB"
msgstr "%OB"
......@@ -872,61 +872,61 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:381
#: js/ui/calendar.js:406
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:440
#: js/ui/calendar.js:465
msgid "Previous month"
msgstr "Předchozí měsíc"
#: js/ui/calendar.js:455
#: js/ui/calendar.js:480
msgid "Next month"
msgstr "Následující měsíc"
#: js/ui/calendar.js:605
#: js/ui/calendar.js:630
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%e"
#: js/ui/calendar.js:661
#: js/ui/calendar.js:686
msgid "Week %V"
msgstr "%V. týden"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:730
#: js/ui/calendar.js:761
msgctxt "event list time"
msgid "All Day"
msgstr "Celý den"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:868
#: js/ui/calendar.js:899
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:871
#: js/ui/calendar.js:902
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %e. %B %Y"
#: js/ui/calendar.js:1100
#: js/ui/calendar.js:1132
msgid "No Notifications"
msgstr "Nejsou žádná upozornění"
#: js/ui/calendar.js:1103
#: js/ui/calendar.js:1135
msgid "No Events"
msgstr "Nejsou žádné události"
#: js/ui/calendar.js:1157
#: js/ui/calendar.js:1189
msgid "Do Not Disturb"
msgstr "Nevyrušovat"
#: js/ui/calendar.js:1176
#: js/ui/calendar.js:1208
msgid "Clear"
msgstr "Vymazat"
......@@ -1112,31 +1112,31 @@ msgstr "%e. %B %Y"
msgid "%A %B %e %Y"
msgstr "%A, %e. %B %Y"
#: js/ui/dateMenu.js:161
#: js/ui/dateMenu.js:162
msgid "Add world clocks…"
msgstr "Přidat světový čas…"
#: js/ui/dateMenu.js:162
#: js/ui/dateMenu.js:163
msgid "World Clocks"
msgstr "Světové hodiny"
#: js/ui/dateMenu.js:289
#: js/ui/dateMenu.js:308
msgid "Weather"
msgstr "Počasí"
#: js/ui/dateMenu.js:418
#: js/ui/dateMenu.js:437
msgid "Select a location…"
msgstr "Vybrat místo…"
#: js/ui/dateMenu.js:426
#: js/ui/dateMenu.js:445
msgid "Loading…"
msgstr "Načítá se…"
#: js/ui/dateMenu.js:436
#: js/ui/dateMenu.js:455
msgid "Go online for weather information"
msgstr "Připojit se kvůli informacím o počasí"
#: js/ui/dateMenu.js:438
#: js/ui/dateMenu.js:457
msgid "Weather information is currently unavailable"
msgstr "Informace o počasí nejsou nyní dostupné"
......@@ -1296,24 +1296,24 @@ msgstr "%s (vzdálený)"
msgid "%s (console)"
msgstr "%s (konzola)"
#: js/ui/extensionDownloader.js:185
#: js/ui/extensionDownloader.js:187
msgid "Install"
msgstr "Nainstalovat"
#: js/ui/extensionDownloader.js:191
#: js/ui/extensionDownloader.js:193
msgid "Install Extension"
msgstr "Instalace rozšíření"
#: js/ui/extensionDownloader.js:192
#: js/ui/extensionDownloader.js:194
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?"
#: js/ui/extensionSystem.js:252
#: js/ui/extensionSystem.js:253
msgid "Extension Updates Available"
msgstr "Jsou dostupné aktualizace rozšíření"
#: js/ui/extensionSystem.js:253
#: js/ui/extensionSystem.js:254
msgid "Extension updates are ready to be installed."
msgstr "Aktualizace rozšíření jsou připravené k instalaci."
......@@ -1337,11 +1337,11 @@ msgstr "Některá aplikace chce znemožnit klávesové zkratky"
msgid "You can restore shortcuts by pressing %s."
msgstr "Obnovit klávesové zkratky můžete zmáčknutím %s."
#: js/ui/inhibitShortcutsDialog.js:98
#: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny"
msgstr "Zamítnout"
#: js/ui/inhibitShortcutsDialog.js:105
#: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow"
msgstr "Povolit"
......@@ -1402,7 +1402,7 @@ msgstr "Zapnout"
#: js/ui/status/network.js:131 js/ui/status/network.js:315
#: js/ui/status/network.js:1288 js/ui/status/network.js:1400
#: js/ui/status/nightLight.js:41 js/ui/status/rfkill.js:81
#: js/ui/status/rfkill.js:108
#: js/ui/status/rfkill.js:110
msgid "Turn Off"
msgstr "Vypnout"
......@@ -1410,7 +1410,7 @@ msgstr "Vypnout"
msgid "Leave Off"
msgstr "Ponechat vypnuté"
#: js/ui/keyboard.js:207
#: js/ui/keyboard.js:225
msgid "Region & Language Settings"
msgstr "Nastavení regionu a jazyka"
......@@ -1483,25 +1483,25 @@ msgstr "Zamykání obrazovky zakázáno"
msgid "Screen Locking requires the GNOME display manager."
msgstr "Zamykání obrazovky vyžaduje správce displejů GNOME."
#: js/ui/messageTray.js:1551
#: js/ui/messageTray.js:1548
msgid "System Information"
msgstr "Informace o systému"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:204
msgid "Unknown artist"
msgstr "Neznámý umělec"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:214
msgid "Unknown title"
msgstr "Neznámý název"
#: js/ui/overview.js:73
#: js/ui/overview.js:74
msgid "Undo"
msgstr "Zpět"
#. Translators: This is the main view to select
#. activities. See also note for "Activities" string.
#: js/ui/overview.js:86
#: js/ui/overview.js:87
msgid "Overview"
msgstr "Přehled"
......@@ -1509,7 +1509,7 @@ msgstr "Přehled"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: js/ui/overview.js:107
#: js/ui/overview.js:108
msgid "Type to search"
msgstr "vyhledávejte psaním"
......@@ -1537,23 +1537,23 @@ msgstr "Přířadit klávesu"
msgid "Done"
msgstr "Hotovo"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "Upravit…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "Źádná"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "Zmáčkněte tlačítko pro nastavení"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Zmáčknutím Esc ukončíte"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "Zmáčknutím klávesy ukončíte"
......@@ -1563,16 +1563,16 @@ msgstr "Ukončit"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:434
#: js/ui/panel.js:437
msgid "Activities"
msgstr "Činnosti"
#: js/ui/panel.js:713
#: js/ui/panel.js:716
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Systém"
#: js/ui/panel.js:826
#: js/ui/panel.js:829
msgid "Top Bar"
msgstr "Horní lišta"
......@@ -1966,7 +1966,7 @@ msgstr "Vyberte síť"
msgid "No Networks"
msgstr "Žádné sítě"
#: js/ui/status/network.js:901 js/ui/status/rfkill.js:106
#: js/ui/status/network.js:901 js/ui/status/rfkill.js:108
msgid "Use hardware switch to turn off"
msgstr "K vypnutí použijte fyzický vypínač"
......@@ -2175,11 +2175,11 @@ msgstr "Chyba ověření Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s"
#: js/ui/status/volume.js:151
#: js/ui/status/volume.js:154
msgid "Volume changed"
msgstr "Hlasitost změněna"
#: js/ui/status/volume.js:222
#: js/ui/status/volume.js:225
msgid "Volume"
msgstr "Hlasitost"
......@@ -2225,11 +2225,11 @@ msgstr "Odemkněte máchnutím"
msgid "Click or press a key to unlock"
msgstr "Odemkněte kliknutím nebo zmáčknutím zámku"
#: js/ui/unlockDialog.js:550
#: js/ui/unlockDialog.js:554
msgid "Unlock Window"
msgstr "Odemykací okno"
#: js/ui/unlockDialog.js:559
#: js/ui/unlockDialog.js:563
msgid "Log in as another user"
msgstr "Přihlásit se jako jiný uživatel"
......@@ -2441,7 +2441,7 @@ msgstr[1] "Při příštím přihlášení budou aktualizována %d rozšíření
msgstr[2] "Při příštím přihlášení bude aktualizováno %d rozšíření."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/command-create.c:235
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Popis"
......@@ -2513,17 +2513,21 @@ msgstr ""
"Bohužel, ale není možné získat seznam nainstalovaných rozšíření. Ujistěte "
"se, že jste přihlášení do GNOME, a zkuste to znovu."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Jsou připravené aktualizace rozšíření"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Odhlásit se…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#: subprojects/extensions-tool/src/command-create.c:149
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "V %s bylo úspěšně vytvořeno nové rozšíření.\n"
#: subprojects/extensions-tool/src/command-create.c:194
#: subprojects/extensions-tool/src/command-create.c:218
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
......@@ -2532,12 +2536,12 @@ msgstr ""
"Název by měl být velmi krátký (nejlépe samopopisný) řetězec.\n"
"Příklady: %s"
#: subprojects/extensions-tool/src/command-create.c:197
#: subprojects/extensions-tool/src/command-create.c:221
#: subprojects/extensions-tool/src/main.c:170
msgid "Name"
msgstr "Název"
#: subprojects/extensions-tool/src/command-create.c:208
#: subprojects/extensions-tool/src/command-create.c:232
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
......@@ -2546,7 +2550,7 @@ msgstr ""
"Popis by měl jednou větou vysvětlit, co vaše rozšíření vlastně dělá.\n"
"Příklady: %s"
#: subprojects/extensions-tool/src/command-create.c:222
#: subprojects/extensions-tool/src/command-create.c:246
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
......@@ -2555,40 +2559,40 @@ msgstr ""
"UUID je globálně jedinečnou identifikací vašeho rozšíření.\n"
"Měl by být ve formátu e-mailové adresy (clicktofocus@janedoe.example.com)\n"
#: subprojects/extensions-tool/src/command-create.c:244
#: subprojects/extensions-tool/src/command-create.c:268
msgid "The unique identifier of the new extension"
msgstr "Jednoznačná identifikace nového rozšíření"
#: subprojects/extensions-tool/src/command-create.c:247
#: subprojects/extensions-tool/src/command-create.c:271
msgid "NAME"
msgstr "NÁZEV"
#: subprojects/extensions-tool/src/command-create.c:248
#: subprojects/extensions-tool/src/command-create.c:272
msgid "The user-visible name of the new extension"
msgstr "Název nového rozšíření, jak jej uvidí uživatel"
#: subprojects/extensions-tool/src/command-create.c:250
#: subprojects/extensions-tool/src/command-create.c:274
msgid "DESCRIPTION"
msgstr "POPIS"
#: subprojects/extensions-tool/src/command-create.c:252
#: subprojects/extensions-tool/src/command-create.c:276
msgid "A short description of what the extension does"
msgstr "Krátký popis toho, co rozšíření vlastně dělá"
#: subprojects/extensions-tool/src/command-create.c:255
#: subprojects/extensions-tool/src/command-create.c:279
msgid "Enter extension information interactively"
msgstr "Zadat informace o rozšíření interaktivně"
#: subprojects/extensions-tool/src/command-create.c:263
#: subprojects/extensions-tool/src/command-create.c:287
msgid "Create a new extension"
msgstr "Vytvořit nové rozšíření"
#: subprojects/extensions-tool/src/command-create.c:280
#: subprojects/extensions-tool/src/command-create.c:304
#: subprojects/extensions-tool/src/command-list.c:168
msgid "Unknown arguments"
msgstr "Neznámý argument"
#: subprojects/extensions-tool/src/command-create.c:289
#: subprojects/extensions-tool/src/command-create.c:313
msgid "UUID, name and description are required"
msgstr "Jsou vyžadovány UUID, název a popis"
......@@ -2854,6 +2858,3 @@ msgstr[2] "%u vstupů"
#: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds"
msgstr "Systémové zvuky"
#~ msgid "Copy Error"
#~ msgstr "Zkopírovat chybu"
......@@ -1332,31 +1332,32 @@ shell_global_sync_pointer (ShellGlobal *global)
{
int x, y;
ClutterModifierType mods;
ClutterMotionEvent event;
ClutterEvent *event;
ClutterSeat *seat;
shell_global_get_pointer (global, &x, &y, &mods);
seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
event = clutter_event_new (CLUTTER_MOTION);
event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global);
event.flags = CLUTTER_EVENT_FLAG_SYNTHETIC;
event.stage = global->stage;
event.x = x;
event.y = y;
event.modifier_state = mods;
event.axes = NULL;
event.device = clutter_seat_get_pointer (seat);
event->motion.time = shell_global_get_current_time (global);
event->motion.flags = CLUTTER_EVENT_FLAG_SYNTHETIC;
event->motion.stage = global->stage;
event->motion.x = x;
event->motion.y = y;
event->motion.modifier_state = mods;
event->motion.axes = NULL;
clutter_event_set_device (event, clutter_seat_get_pointer (seat));
/* Leaving event.source NULL will force clutter to look it up, which
* will generate enter/leave events as a side effect, if they are
* needed. We need a better way to do this though... see
* http://bugzilla.clutter-project.org/show_bug.cgi?id=2615.
*/
event.source = NULL;
clutter_event_set_source_device (event, NULL);
clutter_event_put ((ClutterEvent *)&event);
clutter_event_put (event);
clutter_event_free (event);
}
/**
......
......@@ -136,6 +136,8 @@ struct _CRParserPriv {
#define CHARS_TAB_SIZE 12
#define RECURSIVE_CALLERS_LIMIT 100
/**
* IS_NUM:
*@a_char: the char to test.
......@@ -343,9 +345,11 @@ static enum CRStatus cr_parser_parse_selector_core (CRParser * a_this);
static enum CRStatus cr_parser_parse_declaration_core (CRParser * a_this);
static enum CRStatus cr_parser_parse_any_core (CRParser * a_this);
static enum CRStatus cr_parser_parse_any_core (CRParser * a_this,
guint n_calls);
static enum CRStatus cr_parser_parse_block_core (CRParser * a_this);
static enum CRStatus cr_parser_parse_block_core (CRParser * a_this,
guint n_calls);
static enum CRStatus cr_parser_parse_value_core (CRParser * a_this);
......@@ -783,7 +787,7 @@ cr_parser_parse_atrule_core (CRParser * a_this)
cr_parser_try_to_skip_spaces_and_comments (a_this);
do {
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, 0);
} while (status == CR_OK);
status = cr_tknzr_get_next_token (PRIVATE (a_this)->tknzr,
......@@ -794,7 +798,7 @@ cr_parser_parse_atrule_core (CRParser * a_this)
cr_tknzr_unget_token (PRIVATE (a_this)->tknzr,
token);
token = NULL;
status = cr_parser_parse_block_core (a_this);
status = cr_parser_parse_block_core (a_this, 0);
CHECK_PARSING_STATUS (status,
FALSE);
goto done;
......@@ -929,11 +933,11 @@ cr_parser_parse_selector_core (CRParser * a_this)
RECORD_INITIAL_POS (a_this, &init_pos);
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, 0);
CHECK_PARSING_STATUS (status, FALSE);
do {
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, 0);
} while (status == CR_OK);
......@@ -955,10 +959,12 @@ cr_parser_parse_selector_core (CRParser * a_this)
*in chapter 4.1 of the css2 spec.
*block ::= '{' S* [ any | block | ATKEYWORD S* | ';' ]* '}' S*;
*@param a_this the current instance of #CRParser.
*@param n_calls used to limit recursion depth
*FIXME: code this function.
*/
static enum CRStatus
cr_parser_parse_block_core (CRParser * a_this)
cr_parser_parse_block_core (CRParser * a_this,
guint n_calls)
{
CRToken *token = NULL;
CRInputPos init_pos;
......@@ -966,6 +972,9 @@ cr_parser_parse_block_core (CRParser * a_this)
g_return_val_if_fail (a_this && PRIVATE (a_this), CR_BAD_PARAM_ERROR);
if (n_calls > RECURSIVE_CALLERS_LIMIT)
return CR_ERROR;
RECORD_INITIAL_POS (a_this, &init_pos);
status = cr_tknzr_get_next_token (PRIVATE (a_this)->tknzr, &token);
......@@ -995,13 +1004,13 @@ cr_parser_parse_block_core (CRParser * a_this)
} else if (token->type == CBO_TK) {
cr_tknzr_unget_token (PRIVATE (a_this)->tknzr, token);
token = NULL;
status = cr_parser_parse_block_core (a_this);
status = cr_parser_parse_block_core (a_this, n_calls + 1);
CHECK_PARSING_STATUS (status, FALSE);
goto parse_block_content;
} else {
cr_tknzr_unget_token (PRIVATE (a_this)->tknzr, token);
token = NULL;
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, n_calls + 1);
CHECK_PARSING_STATUS (status, FALSE);
goto parse_block_content;
}
......@@ -1108,7 +1117,7 @@ cr_parser_parse_value_core (CRParser * a_this)
status = cr_tknzr_unget_token (PRIVATE (a_this)->tknzr,
token);
token = NULL;
status = cr_parser_parse_block_core (a_this);
status = cr_parser_parse_block_core (a_this, 0);
CHECK_PARSING_STATUS (status, FALSE);
ref++;
goto continue_parsing;
......@@ -1122,7 +1131,7 @@ cr_parser_parse_value_core (CRParser * a_this)
status = cr_tknzr_unget_token (PRIVATE (a_this)->tknzr,
token);
token = NULL;
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, 0);
if (status == CR_OK) {
ref++;
goto continue_parsing;
......@@ -1161,10 +1170,12 @@ cr_parser_parse_value_core (CRParser * a_this)
* | FUNCTION | DASHMATCH | '(' any* ')' | '[' any* ']' ] S*;
*
*@param a_this the current instance of #CRParser.
*@param n_calls used to limit recursion depth
*@return CR_OK upon successfull completion, an error code otherwise.
*/
static enum CRStatus
cr_parser_parse_any_core (CRParser * a_this)
cr_parser_parse_any_core (CRParser * a_this,
guint n_calls)
{
CRToken *token1 = NULL,
*token2 = NULL;
......@@ -1173,6 +1184,9 @@ cr_parser_parse_any_core (CRParser * a_this)
g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR);
if (n_calls > RECURSIVE_CALLERS_LIMIT)
return CR_ERROR;
RECORD_INITIAL_POS (a_this, &init_pos);
status = cr_tknzr_get_next_token (PRIVATE (a_this)->tknzr, &token1);
......@@ -1211,7 +1225,7 @@ cr_parser_parse_any_core (CRParser * a_this)
*We consider parameter as being an "any*" production.
*/
do {
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, n_calls + 1);
} while (status == CR_OK);
ENSURE_PARSING_COND (status == CR_PARSING_ERROR);
......@@ -1236,7 +1250,7 @@ cr_parser_parse_any_core (CRParser * a_this)
}
do {
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, n_calls + 1);
} while (status == CR_OK);
ENSURE_PARSING_COND (status == CR_PARSING_ERROR);
......@@ -1264,7 +1278,7 @@ cr_parser_parse_any_core (CRParser * a_this)
}
do {
status = cr_parser_parse_any_core (a_this);
status = cr_parser_parse_any_core (a_this, n_calls + 1);
} while (status == CR_OK);
ENSURE_PARSING_COND (status == CR_PARSING_ERROR);
......
......@@ -38,6 +38,7 @@
</description>
<releases>
<release version="3.36.7" date="2020-10-06"/>
<release version="3.36.6" date="2020-09-07"/>
<release version="3.36.5" date="2020-08-11"/>
<release version="3.36.4" date="2020-07-07"/>
......
project('gnome-extensions-app',
version: '3.36.6',
version: '3.36.7',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)
......
project('gnome-extensions-tool', 'c',
version: '3.36.6',
version: '3.36.7',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)
......
......@@ -62,6 +62,7 @@ struct GvcMixerControlPrivate
pa_glib_mainloop *pa_mainloop;
pa_mainloop_api *pa_api;
pa_context *pa_context;
guint server_protocol_version;
int n_outstanding;
guint reconnect_id;
char *name;
......@@ -104,6 +105,11 @@ struct GvcMixerControlPrivate
gboolean has_headsetmic;
gboolean has_headphonemic;
gboolean headset_plugged_in;
char *headphones_name;
char *headsetmic_name;
char *headphonemic_name;
char *internalspk_name;
char *internalmic_name;
#endif /* HAVE_ALSA */
GvcMixerControlState state;
......@@ -1461,7 +1467,9 @@ translate_pa_state (pa_sink_state_t state) {
return GVC_STREAM_STATE_IDLE;
case PA_SINK_SUSPENDED:
return GVC_STREAM_STATE_SUSPENDED;
case PA_SINK_INIT:
case PA_SINK_INVALID_STATE:
case PA_SINK_UNLINKED:
default:
return GVC_STREAM_STATE_INVALID;
}
......@@ -2094,7 +2102,7 @@ create_ui_device_from_card (GvcMixerControl *control,
#ifdef HAVE_ALSA
typedef struct {
char *port_name_to_set;
int headset_card;
guint32 headset_card;
} PortStatusData;
static void
......@@ -2122,7 +2130,7 @@ sink_info_cb (pa_context *c,
{
PortStatusData *data = userdata;
pa_operation *o;
int j;
guint j;
const char *s;
if (eol != 0) {
......@@ -2158,7 +2166,7 @@ source_info_cb (pa_context *c,
{
PortStatusData *data = userdata;
pa_operation *o;
int j;
guint j;
const char *s;
if (eol != 0) {
......@@ -2171,6 +2179,19 @@ source_info_cb (pa_context *c,
s = data->port_name_to_set;
for (j = 0; j < i->n_ports; j++) {
if (g_str_equal (i->ports[j]->name, s)) {
o = pa_context_set_default_source (c,
i->name,
NULL,
NULL);
if (o == NULL) {
g_warning ("pa_context_set_default_source() failed");
return;
}
}
}
if (i->active_port && strcmp (i->active_port->name, s) == 0)
return;
......@@ -2194,6 +2215,9 @@ gvc_mixer_control_set_port_status_for_headset (GvcMixerControl *control,
pa_operation *o;
PortStatusData *data;
if (port_name == NULL)
return;
data = g_new0 (PortStatusData, 1);
data->port_name_to_set = g_strdup (port_name);
data->headset_card = id;
......@@ -2207,6 +2231,18 @@ gvc_mixer_control_set_port_status_for_headset (GvcMixerControl *control,
}
#endif /* HAVE_ALSA */
static void
free_priv_port_names (GvcMixerControl *control)
{
#ifdef HAVE_ALSA
g_clear_pointer (&control->priv->headphones_name, g_free);
g_clear_pointer (&control->priv->headsetmic_name, g_free);
g_clear_pointer (&control->priv->headphonemic_name, g_free);
g_clear_pointer (&control->priv->internalspk_name, g_free);
g_clear_pointer (&control->priv->internalmic_name, g_free);
#endif
}
void
gvc_mixer_control_set_headset_port (GvcMixerControl *control,
guint id,
......@@ -2217,17 +2253,18 @@ gvc_mixer_control_set_headset_port (GvcMixerControl *control,
#ifdef HAVE_ALSA
switch (choice) {
case GVC_HEADSET_PORT_CHOICE_HEADPHONES:
gvc_mixer_control_set_port_status_for_headset (control, id, "analog-output-headphones", TRUE);
gvc_mixer_control_set_port_status_for_headset (control, id, "analog-input-internal-mic", FALSE);
gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headphones_name, TRUE);
gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->internalmic_name, FALSE);
break;
case GVC_HEADSET_PORT_CHOICE_HEADSET:
gvc_mixer_control_set_port_status_for_headset (control, id, "analog-output-headphones", TRUE);
gvc_mixer_control_set_port_status_for_headset (control, id, "analog-input-headset-mic", FALSE);
gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headphones_name, TRUE);
gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headsetmic_name, FALSE);
break;
case GVC_HEADSET_PORT_CHOICE_MIC:
gvc_mixer_control_set_port_status_for_headset (control, id, "analog-output-speaker", TRUE);
gvc_mixer_control_set_port_status_for_headset (control, id, "analog-input-headphone-mic", FALSE);
gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->internalspk_name, TRUE);
gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headphonemic_name, FALSE);
break;
case GVC_HEADSET_PORT_CHOICE_NONE:
default:
g_assert_not_reached ();
}
......@@ -2241,12 +2278,12 @@ typedef struct {
const pa_card_port_info *headphones;
const pa_card_port_info *headsetmic;
const pa_card_port_info *headphonemic;
const pa_card_port_info *internalmic;
const pa_card_port_info *internalspk;
} headset_ports;
/*
TODO: Check if we still need this with the changed PA port names
In PulseAudio ports will show up with the following names:
In PulseAudio without ucm, ports will show up with the following names:
Headphones - analog-output-headphones
Headset mic - analog-input-headset-mic (was: analog-input-microphone-headset)
Jack in mic-in mode - analog-input-headphone-mic (was: analog-input-microphone)
......@@ -2265,10 +2302,24 @@ typedef struct {
Headset Mic Jack - indicates headset jack where hardware can distinguish
between headphones and headsets. There is no use popping up a dialog in
this case, unless we already need to do this for the mic-in mode.
From the PA_PROCOTOL_VERSION=34, The device_port structure adds 2 members
availability_group and type, with the help of these 2 members, we could
consolidate the port checking and port setting for non-ucm and with-ucm
cases.
*/
#define HEADSET_PORT_SET(dst, src) \
do { \
if (!(dst) || (dst)->priority < (src)->priority) \
dst = src; \
} while (0)
#define GET_PORT_NAME(x) (x ? g_strdup (x->name) : NULL)
static headset_ports *
get_headset_ports (const pa_card_info *c)
get_headset_ports (GvcMixerControl *control,
const pa_card_info *c)
{
headset_ports *h;
guint i;
......@@ -2277,14 +2328,55 @@ get_headset_ports (const pa_card_info *c)
for (i = 0; i < c->n_ports; i++) {
pa_card_port_info *p = c->ports[i];
if (control->priv->server_protocol_version < 34) {
if (g_str_equal (p->name, "analog-output-headphones"))
h->headphones = p;
else if (g_str_equal (p->name, "analog-input-headset-mic"))
h->headsetmic = p;
else if (g_str_equal (p->name, "analog-input-headphone-mic"))
h->headphonemic = p;
else if (g_str_equal (p->name, "analog-input-internal-mic"))
h->internalmic = p;
else if (g_str_equal (p->name, "analog-output-speaker"))
h->internalspk = p;
} else {
#if (PA_PROTOCOL_VERSION >= 34)
/* in the first loop, set only headphones */
/* the microphone ports are assigned in the second loop */
if (p->type == PA_DEVICE_PORT_TYPE_HEADPHONES) {
if (p->availability_group)
HEADSET_PORT_SET (h->headphones, p);
} else if (p->type == PA_DEVICE_PORT_TYPE_SPEAKER) {
HEADSET_PORT_SET (h->internalspk, p);
} else if (p->type == PA_DEVICE_PORT_TYPE_MIC) {
if (!p->availability_group)
HEADSET_PORT_SET (h->internalmic, p);
}
#else
g_warning_once ("libgnome-volume-control running against PulseAudio %u, "
"but compiled against older %d, report a bug to your distribution",
control->priv->server_protocol_version,
PA_PROTOCOL_VERSION);
#endif
}
}
if (strcmp (p->name, "analog-output-headphones") == 0)
h->headphones = p;
else if (strcmp (p->name, "analog-input-headset-mic") == 0)
h->headsetmic = p;
else if (strcmp(p->name, "analog-input-headphone-mic") == 0)
h->headphonemic = p;
#if (PA_PROTOCOL_VERSION >= 34)
if (h->headphones && (control->priv->server_protocol_version >= 34)) {
for (i = 0; i < c->n_ports; i++) {
pa_card_port_info *p = c->ports[i];
if (g_strcmp0(h->headphones->availability_group, p->availability_group))
continue;
if (p->direction != PA_DIRECTION_INPUT)
continue;
if (p->type == PA_DEVICE_PORT_TYPE_HEADSET)
HEADSET_PORT_SET (h->headsetmic, p);
else if (p->type == PA_DEVICE_PORT_TYPE_MIC)
HEADSET_PORT_SET (h->headphonemic, p);
}
}
#endif
return h;
}
......@@ -2350,7 +2442,7 @@ check_audio_device_selection_needed (GvcMixerControl *control,
start_dialog = FALSE;
stop_dialog = FALSE;
h = get_headset_ports (info);
h = get_headset_ports (control, info);
if (!h->headphones ||
(!h->headsetmic && !h->headphonemic)) {
......@@ -2360,7 +2452,8 @@ check_audio_device_selection_needed (GvcMixerControl *control,
if (control->priv->headset_card != (int) info->index) {
int cardindex;
gboolean hsmic, hpmic;
gboolean hsmic = TRUE;
gboolean hpmic = TRUE;
const char *s;
s = pa_proplist_gets (info->proplist, "alsa.card");
......@@ -2371,8 +2464,10 @@ check_audio_device_selection_needed (GvcMixerControl *control,
if (cardindex == 0 && strcmp(s, "0") != 0)
goto out;
if (!verify_alsa_card(cardindex, &hsmic, &hpmic))
goto out;
if (control->priv->server_protocol_version < 34) {
if (!verify_alsa_card(cardindex, &hsmic, &hpmic))
goto out;
}
control->priv->headset_card = info->index;
control->priv->has_headsetmic = hsmic && h->headsetmic;
......@@ -2383,6 +2478,12 @@ check_audio_device_selection_needed (GvcMixerControl *control,
}
control->priv->headset_plugged_in = h->headphones->available != PA_PORT_AVAILABLE_NO;
free_priv_port_names (control);
control->priv->headphones_name = GET_PORT_NAME(h->headphones);
control->priv->headsetmic_name = GET_PORT_NAME(h->headsetmic);
control->priv->headphonemic_name = GET_PORT_NAME(h->headphonemic);
control->priv->internalspk_name = GET_PORT_NAME(h->internalspk);
control->priv->internalmic_name = GET_PORT_NAME(h->internalmic);
if (!start_dialog &&
!stop_dialog)
......@@ -3265,6 +3366,7 @@ gvc_mixer_control_ready (GvcMixerControl *control)
req_update_sink_input_info (control, -1);
req_update_source_output_info (control, -1);
control->priv->server_protocol_version = pa_context_get_server_protocol_version (control->priv->pa_context);
control->priv->n_outstanding = 6;
......@@ -3347,6 +3449,7 @@ idle_reconnect (gpointer data)
if (control->priv->pa_context) {
pa_context_unref (control->priv->pa_context);
control->priv->pa_context = NULL;
control->priv->server_protocol_version = 0;
gvc_mixer_new_pa_context (control);
}
......@@ -3500,6 +3603,7 @@ gvc_mixer_control_dispose (GObject *object)
control->priv->ui_inputs = NULL;
}
free_priv_port_names (control);
G_OBJECT_CLASS (gvc_mixer_control_parent_class)->dispose (object);
}
......
......@@ -55,7 +55,7 @@ libgvc_no_gir_sources = [
libgvc_deps = [
dependency('gio-2.0'),
dependency('gobject-2.0'),
dependency('libpulse', version: '>= 2.0'),
dependency('libpulse', version: '>= 12.99.3'),
dependency('libpulse-mainloop-glib')
]
......
......@@ -8,7 +8,7 @@
typedef struct {
GvcHeadsetPortChoice choice;
gchar *name;
const char *name;
} AudioSelectionChoice;
static AudioSelectionChoice audio_selection_choices[] = {
......@@ -24,7 +24,7 @@ audio_selection_needed (GvcMixerControl *volume,
GvcHeadsetPortChoice choices,
gpointer user_data)
{
char *args[G_N_ELEMENTS (audio_selection_choices) + 1];
const char *args[G_N_ELEMENTS (audio_selection_choices) + 1];
guint i, n;
int response = -1;
......@@ -51,7 +51,7 @@ audio_selection_needed (GvcMixerControl *volume,
g_print ("What is your choice?\n");
if (scanf ("%d", &res) == 1 &&
res > 0 &&
res < g_strv_length (args)) {
res < (int) g_strv_length ((char **) args)) {
response = res;
break;
}
......
project('shew', 'c',
version: '3.36.6',
version: '3.36.7',
meson_version: '>= 0.47.0',
license: 'LGPLv2+',
)
......