diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-11-06 09:43:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-11-06 09:43:51 +0000 |
commit | 7df011e3c0bd09500ed23bff2e4dd253f131883b (patch) | |
tree | c8f7f7a6c2f5faa2942d27cefc6fd46cca492656 | |
parent | Adding upstream version 43.6. (diff) | |
download | gnome-shell-upstream.tar.xz gnome-shell-upstream.zip |
Adding upstream version 43.9.upstream/43.9upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
34 files changed, 796 insertions, 688 deletions
diff --git a/.gitlab-ci/check-potfiles.sh b/.gitlab-ci/check-potfiles.sh index 82f101c..0969da1 100755 --- a/.gitlab-ci/check-potfiles.sh +++ b/.gitlab-ci/check-potfiles.sh @@ -2,6 +2,7 @@ srcdirs="src subprojects/extensions-tool" uidirs="js subprojects/extensions-app" +desktopdirs="data subprojects/extensions-app/ subprojects/extensions-tool" # find source files that contain gettext keywords files=$(grep -lR --include='*.c' '\(gettext\|[^I_)]_\)(' $srcdirs) @@ -9,6 +10,9 @@ files=$(grep -lR --include='*.c' '\(gettext\|[^I_)]_\)(' $srcdirs) # find ui files that contain translatable string files="$files "$(grep -lRi --include='*.ui' 'translatable="[ty1]' $uidirs) +# find .desktop files +files="$files "$(find $desktopdirs -name '*.desktop*') + # filter out excluded files if [ -f po/POTFILES.skip ]; then files=$(for f in $files; do ! grep -q ^$f po/POTFILES.skip && echo $f; done) diff --git a/.gitlab-ci/checkout-mutter.sh b/.gitlab-ci/checkout-mutter.sh index 765e39d..76375fd 100755 --- a/.gitlab-ci/checkout-mutter.sh +++ b/.gitlab-ci/checkout-mutter.sh @@ -41,8 +41,9 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then fi if [ -z "$mutter_target" ]; then + ref_remote=${CI_PROJECT_URL//gnome-shell/mutter} echo -n Looking for $CI_COMMIT_REF_NAME on remote ... - if fetch origin $CI_COMMIT_REF_NAME; then + if fetch $ref_remote $CI_COMMIT_REF_NAME; then echo \ found mutter_target=FETCH_HEAD else @@ -1,3 +1,40 @@ +43.9 +==== +* Fix exposing window previews on lock screen via keyboard shortcuts + [Florian; !2944] +* Improve handling of latched vs. locked modes in OSK [Carlos; !2945] +* Reverse slider direction in RTL locales [Khalid; !2943] +* Misc. bug fixes and cleanups [xiaofan; !2947] + +Contributors: + Carlos Garnacho, Florian Müllner, Khalid Abu Shawarib, xiaofan + +Translators: + Daniel Rusek [cs] + +43.8 +==== +* Fix accessibility of quick settings sliders [Lukáš; !2762] +* Allow notification dismissal with backspace [Chris; !2435] +* Misc. bug fixes and cleanups [Florian, Takao, Carlos, Brendan, Daniel, Jonas; + !2814, !2842, !2849, !2668, !2666, !2876, !2729, !2828, !2904] + +Contributors: + Takao Fujiwara, Carlos Garnacho, Chris Heywood, Florian Müllner, + Lukáš Tyrychtr, Daniel van Vugt, Brendan William, Jonas Ådahl + +Translators: + Danial Behzadi [fa] + +43.7 +==== +* Fix cursor offset when using magnifier [Андрей; !2780] +* Fix missing workspace borders after wallpaper changes [Florian; !2801] +* Misc. bug fixes and cleanups [Florian; !2796] + +Contributors: + Florian Müllner, Андрей Гриценко + 43.6 ==== * Fix stuck authentication dialog in remote sessions [Joan; !2761] diff --git a/js/misc/ibusManager.js b/js/misc/ibusManager.js index 969556d..214db55 100644 --- a/js/misc/ibusManager.js +++ b/js/misc/ibusManager.js @@ -108,17 +108,9 @@ var IBusManager = class extends Signals.EventEmitter { _spawn(extraArgs = []) { try { - let cmdLine = ['ibus-daemon', '--panel', 'disable', ...extraArgs]; - let env = []; - - this._tryAppendEnv(env, 'DBUS_SESSION_BUS_ADDRESS'); - this._tryAppendEnv(env, 'WAYLAND_DISPLAY'); - this._tryAppendEnv(env, 'HOME'); - this._tryAppendEnv(env, 'LANG'); - this._tryAppendEnv(env, 'LC_CTYPE'); - this._tryAppendEnv(env, 'COMPOSE_FILE'); - this._tryAppendEnv(env, 'DISPLAY'); - + const cmdLine = ['ibus-daemon', '--panel', 'disable', ...extraArgs]; + const launchContext = global.create_app_launch_context(0, -1); + const env = launchContext.get_environment(); // Use DO_NOT_REAP_CHILD to avoid adouble-fork internally // since ibus-daemon refuses to start with init as its parent. const [success_, pid] = GLib.spawn_async( diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js index e008e64..e01eac8 100644 --- a/js/misc/inputMethod.js +++ b/js/misc/inputMethod.js @@ -12,6 +12,8 @@ Gio._promisify(IBus.InputContext.prototype, var HIDE_PANEL_TIME = 50; +const HAVE_REQUIRE_SURROUNDING_TEXT = GObject.signal_lookup('require-surrounding-text', IBus.InputContext); + var InputMethod = GObject.registerClass({ Signals: { 'surrounding-text-set': {}, @@ -76,7 +78,6 @@ var InputMethod = GObject.registerClass({ this._context.set_client_commit_preedit(true); this._context.connect('commit-text', this._onCommitText.bind(this)); - this._context.connect('require-surrounding-text', this._onRequireSurroundingText.bind(this)); this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this)); this._context.connect('update-preedit-text-with-mode', this._onUpdatePreeditText.bind(this)); this._context.connect('show-preedit-text', this._onShowPreeditText.bind(this)); @@ -84,6 +85,9 @@ var InputMethod = GObject.registerClass({ this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this)); this._context.connect('destroy', this._clear.bind(this)); + if (HAVE_REQUIRE_SURROUNDING_TEXT) + this._context.connect('require-surrounding-text', this._onRequireSurroundingText.bind(this)); + Main.keyboard.connectObject('visibility-changed', () => this._updateCapabilities()); this._updateCapabilities(); @@ -180,6 +184,7 @@ var InputMethod = GObject.registerClass({ vfunc_focus_in(focus) { this._currentFocus = focus; if (this._context) { + this.update(); this._context.focus_in(); this._emitRequestSurrounding(); } @@ -363,7 +368,6 @@ var InputMethod = GObject.registerClass({ _fullReset() { this._context.set_content_type(0, 0); this._context.set_cursor_location(0, 0, 0, 0); - this._context.set_capabilities(0); this._context.reset(); } @@ -372,9 +376,11 @@ var InputMethod = GObject.registerClass({ return; this._updateCapabilities(); this._context.set_content_type(this._purpose, this._hints); - this._context.set_cursor_location( - this._cursorRect.x, this._cursorRect.y, - this._cursorRect.width, this._cursorRect.height); + if (this._cursorRect) { + this._context.set_cursor_location( + this._cursorRect.x, this._cursorRect.y, + this._cursorRect.width, this._cursorRect.height); + } this._emitRequestSurrounding(); } }); diff --git a/js/misc/parentalControlsManager.js b/js/misc/parentalControlsManager.js index e2192ca..48f0ca2 100644 --- a/js/misc/parentalControlsManager.js +++ b/js/misc/parentalControlsManager.js @@ -74,18 +74,10 @@ var ParentalControlsManager = GObject.registerClass({ try { const connection = await Gio.DBus.get(Gio.BusType.SYSTEM, null); this._manager = new Malcontent.Manager({ connection }); - this._appFilter = await this._manager.get_app_filter_async( - Shell.util_get_uid(), - Malcontent.ManagerGetValueFlags.NONE, - null); + this._appFilter = await this._getAppFilter(); } catch (e) { - if (e.matches(Malcontent.ManagerError, Malcontent.ManagerError.DISABLED)) { - console.debug('Parental controls globally disabled'); - this._disabled = true; - } else { - logError(e, 'Failed to get parental controls settings'); - return; - } + logError(e, 'Failed to get parental controls settings'); + return; } this._manager.connect('app-filter-changed', this._onAppFilterChanged.bind(this)); @@ -95,6 +87,25 @@ var ParentalControlsManager = GObject.registerClass({ this.emit('app-filter-changed'); } + async _getAppFilter() { + let appFilter = null; + + try { + appFilter = await this._manager.get_app_filter_async( + Shell.util_get_uid(), + Malcontent.ManagerGetValueFlags.NONE, + null); + } catch (e) { + if (!e.matches(Malcontent.ManagerError, Malcontent.ManagerError.DISABLED)) + throw e; + + console.debug('Parental controls globally disabled'); + this._disabled = true; + } + + return appFilter; + } + async _onAppFilterChanged(manager, uid) { // Emit 'changed' signal only if app-filter is changed for currently logged-in user. let currentUid = Shell.util_get_uid(); @@ -102,10 +113,7 @@ var ParentalControlsManager = GObject.registerClass({ return; try { - this._appFilter = await this._manager.get_app_filter_async( - currentUid, - Malcontent.ManagerGetValueFlags.NONE, - null); + this._appFilter = await this._getAppFilter(); this.emit('app-filter-changed'); } catch (e) { // Log an error and keep the old app filter. diff --git a/js/misc/weather.js b/js/misc/weather.js index a01b832..2aa340a 100644 --- a/js/misc/weather.js +++ b/js/misc/weather.js @@ -267,10 +267,11 @@ var WeatherClient = class extends Signals.EventEmitter { _onGClueLocationChanged() { let geoLocation = this._gclueService.location; - let location = GWeather.Location.new_detached(geoLocation.description, - null, - geoLocation.latitude, - geoLocation.longitude); + // Provide empty name so GWeather sets location name + const location = GWeather.Location.new_detached('', + null, + geoLocation.latitude, + geoLocation.longitude); this._setLocation(location); } diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js index 25d4835..da5b34a 100644 --- a/js/ui/barLevel.js +++ b/js/ui/barLevel.js @@ -98,6 +98,7 @@ var BarLevel = GObject.registerClass({ let cr = this.get_context(); let themeNode = this.get_theme_node(); let [width, height] = this.get_surface_size(); + const rtl = this.get_text_direction() === Clutter.TextDirection.RTL; let barLevelHeight = themeNode.get_length('-barlevel-height'); let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2; @@ -124,20 +125,36 @@ var BarLevel = GObject.registerClass({ const TAU = Math.PI * 2; let endX = 0; - if (this._maxValue > 0) - endX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._value / this._maxValue; + if (this._maxValue > 0) { + let progress = this._value / this._maxValue; + if (rtl) + progress = 1 - progress; + endX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * progress; + } + + let overdriveRatio = this._overdriveStart / this._maxValue; + if (rtl) + overdriveRatio = 1 - overdriveRatio; + let overdriveSeparatorX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * overdriveRatio; - let overdriveSeparatorX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._overdriveStart / this._maxValue; let overdriveActive = this._overdriveStart !== this._maxValue; let overdriveSeparatorWidth = 0; if (overdriveActive) overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width'); + let xcArcStart = barLevelBorderRadius + barLevelBorderWidth; + let xcArcEnd = width - xcArcStart; + if (rtl) + [xcArcStart, xcArcEnd] = [xcArcEnd, xcArcStart]; + /* background bar */ - cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4)); + if (!rtl) + cr.arc(xcArcEnd, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4)); + else + cr.arcNegative(xcArcEnd, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4)); cr.lineTo(endX, (height + barLevelHeight) / 2); cr.lineTo(endX, (height - barLevelHeight) / 2); - cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2); + cr.lineTo(xcArcEnd, (height - barLevelHeight) / 2); Clutter.cairo_set_source_color(cr, barLevelColor); cr.fillPreserve(); Clutter.cairo_set_source_color(cr, barLevelBorderColor); @@ -145,11 +162,17 @@ var BarLevel = GObject.registerClass({ cr.stroke(); /* normal progress bar */ - let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2); - cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (1 / 4), TAU * (3 / 4)); + let x = 0; + if (!rtl) { + x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2); + cr.arc(xcArcStart, height / 2, barLevelBorderRadius, TAU * (1 / 4), TAU * (3 / 4)); + } else { + x = Math.max(endX, overdriveSeparatorX + overdriveSeparatorWidth / 2); + cr.arcNegative(xcArcStart, height / 2, barLevelBorderRadius, TAU * (1 / 4), TAU * (3 / 4)); + } cr.lineTo(x, (height - barLevelHeight) / 2); cr.lineTo(x, (height + barLevelHeight) / 2); - cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2); + cr.lineTo(xcArcStart, (height + barLevelHeight) / 2); if (this._value > 0) Clutter.cairo_set_source_color(cr, barLevelActiveColor); cr.fillPreserve(); @@ -158,7 +181,10 @@ var BarLevel = GObject.registerClass({ cr.stroke(); /* overdrive progress barLevel */ - x = Math.min(endX, overdriveSeparatorX) + overdriveSeparatorWidth / 2; + if (!rtl) + x = Math.min(endX, overdriveSeparatorX) + overdriveSeparatorWidth / 2; + else + x = Math.max(endX, overdriveSeparatorX) - overdriveSeparatorWidth / 2; if (this._value > this._overdriveStart) { cr.moveTo(x, (height - barLevelHeight) / 2); cr.lineTo(endX, (height - barLevelHeight) / 2); @@ -178,9 +204,15 @@ var BarLevel = GObject.registerClass({ Clutter.cairo_set_source_color(cr, barLevelActiveColor); else Clutter.cairo_set_source_color(cr, barLevelOverdriveColor); - cr.arc(endX, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4)); - cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2); - cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2); + if (!rtl) { + cr.arc(endX, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4)); + cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2); + cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2); + } else { + cr.arcNegative(endX, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4)); + cr.lineTo(Math.ceil(endX), (height + barLevelHeight) / 2); + cr.lineTo(Math.ceil(endX), (height - barLevelHeight) / 2); + } cr.lineTo(endX, (height - barLevelHeight) / 2); cr.fillPreserve(); cr.setLineWidth(barLevelBorderWidth); diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index b3c4cbe..be128d3 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -1492,6 +1492,7 @@ var Keyboard = GObject.registerClass({ let layout = new KeyContainer(); layout.shiftKeys = []; + layout.mode = currentLevel.mode; this._loadRows(currentLevel, level, levels.length, layout); layers[level] = layout; @@ -1527,7 +1528,10 @@ var Keyboard = GObject.registerClass({ if (key.action !== 'modifier') { button.connect('commit', (_actor, keyval, str) => { - this._commitAction(keyval, str); + this._commitAction(keyval, str).then(() => { + if (layout.mode === 'latched' && !this._latched) + this._setActiveLayer(0); + }); }); } @@ -1607,9 +1611,6 @@ var Keyboard = GObject.registerClass({ }); } } - - if (!this._latched) - this._setActiveLayer(0); } _previousWordPosition(text, cursor) { diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js index f3af563..6b6b65f 100644 --- a/js/ui/lookingGlass.js +++ b/js/ui/lookingGlass.js @@ -261,6 +261,11 @@ function objectToString(o) { if (typeof o == typeof objectToString) { // special case this since the default is way, way too verbose return '<js function>'; + } else if (o && o.toString === undefined) { + // eeks, something unprintable. we'll have to guess, probably a module + return typeof o === 'object' && !(o instanceof Object) + ? '<module>' + : '<unknown>'; } else { return `${o}`; } diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js index f4012de..bd69047 100644 --- a/js/ui/magnifier.js +++ b/js/ui/magnifier.js @@ -103,12 +103,15 @@ var Magnifier = class Magnifier extends Signals.EventEmitter { this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE }); this._mouseSprite.content = new MouseSpriteContent(); + this._cursorRoot = new Clutter.Actor(); + this._cursorRoot.add_actor(this._mouseSprite); + // Create the first ZoomRegion and initialize it according to the // magnification settings. [this.xMouse, this.yMouse] = global.get_pointer(); - let aZoomRegion = new ZoomRegion(this, this._mouseSprite); + let aZoomRegion = new ZoomRegion(this, this._cursorRoot); this._zoomRegions.push(aZoomRegion); this._settingsInit(aZoomRegion); aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse); @@ -283,7 +286,7 @@ var Magnifier = class Magnifier extends Signals.EventEmitter { * @returns {ZoomRegion} the newly created ZoomRegion. */ createZoomRegion(xMagFactor, yMagFactor, roi, viewPort) { - let zoomRegion = new ZoomRegion(this, this._mouseSprite); + let zoomRegion = new ZoomRegion(this, this._cursorRoot); zoomRegion.setViewPort(viewPort); // We ignore the redundant width/height on the ROI diff --git a/js/ui/messageList.js b/js/ui/messageList.js index 29e7675..c910ca7 100644 --- a/js/ui/messageList.js +++ b/js/ui/messageList.js @@ -533,8 +533,9 @@ var Message = GObject.registerClass({ vfunc_key_press_event(keyEvent) { let keysym = keyEvent.keyval; - if (keysym == Clutter.KEY_Delete || - keysym == Clutter.KEY_KP_Delete) { + if (keysym === Clutter.KEY_Delete || + keysym === Clutter.KEY_KP_Delete || + keysym === Clutter.KEY_BackSpace) { if (this.canClose()) { this.close(); return Clutter.EVENT_STOP; diff --git a/js/ui/quickSettings.js b/js/ui/quickSettings.js index f35a15c..7cfd4f4 100644 --- a/js/ui/quickSettings.js +++ b/js/ui/quickSettings.js @@ -193,7 +193,10 @@ var QuickSlider = GObject.registerClass({ }); box.add_child(sliderBin); - sliderBin.set_accessible(this.slider.get_accessible()); + // Make the slider bin transparent for a11y + const sliderAccessible = this.slider.get_accessible(); + sliderAccessible.set_parent(sliderBin.get_parent().get_accessible()); + sliderBin.set_accessible(sliderAccessible); sliderBin.connect('event', (bin, event) => this.slider.event(event, false)); this._menuButton = new St.Button({ diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js index 4d9e42e..5139052 100644 --- a/js/ui/screenshot.js +++ b/js/ui/screenshot.js @@ -1370,6 +1370,16 @@ var ScreenshotUI = GObject.registerClass({ this._castButton.reactive = Main.sessionMode.allowScreencast; } + _syncWindowButtonSensitivity() { + const windows = + this._windowSelectors.flatMap(selector => selector.windows()); + + this._windowButton.reactive = + Main.sessionMode.hasWindows && + windows.length > 0 && + !this._castButton.checked; + } + _refreshButtonLayout() { const buttonLayout = Meta.prefs_get_button_layout(); @@ -1486,10 +1496,7 @@ var ScreenshotUI = GObject.registerClass({ }); } - this._windowButton.reactive = - Main.sessionMode.hasWindows && - windows.length > 0 && - !this._castButton.checked; + this._syncWindowButtonSensitivity(); if (!this._windowButton.reactive) this._selectionButton.checked = true; @@ -1732,9 +1739,7 @@ var ScreenshotUI = GObject.registerClass({ this._captureButton.remove_style_pseudo_class('cast'); - const windows = - this._windowSelectors.flatMap(selector => selector.windows()); - this._windowButton.reactive = windows.length > 0; + this._syncWindowButtonSensitivity(); } } @@ -1996,7 +2001,8 @@ var ScreenshotUI = GObject.registerClass({ return Clutter.EVENT_STOP; } - if (symbol === Clutter.KEY_v || symbol === Clutter.KEY_V) { + if (this._castButton.reactive && + (symbol === Clutter.KEY_v || symbol === Clutter.KEY_V)) { this._castButton.checked = !this._castButton.checked; return Clutter.EVENT_STOP; } diff --git a/js/ui/slider.js b/js/ui/slider.js index 6ca76fe..849599d 100644 --- a/js/ui/slider.js +++ b/js/ui/slider.js @@ -36,6 +36,7 @@ var Slider = GObject.registerClass({ let cr = this.get_context(); let themeNode = this.get_theme_node(); let [width, height] = this.get_surface_size(); + const rtl = this.get_text_direction() === Clutter.TextDirection.RTL; let handleRadius = themeNode.get_length('-slider-handle-radius'); @@ -44,10 +45,13 @@ var Slider = GObject.registerClass({ themeNode.lookup_color('-slider-handle-border-color', false); const ceiledHandleRadius = Math.ceil(handleRadius + handleBorderWidth); - const handleX = ceiledHandleRadius + - (width - 2 * ceiledHandleRadius) * this._value / this._maxValue; const handleY = height / 2; + let handleX = ceiledHandleRadius + + (width - 2 * ceiledHandleRadius) * this._value / this._maxValue; + if (rtl) + handleX = width - handleX; + let color = themeNode.get_foreground_color(); Clutter.cairo_set_source_color(cr, color); cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI); @@ -189,9 +193,13 @@ var Slider = GObject.registerClass({ _moveHandle(absX, _absY) { let relX, sliderX; [sliderX] = this.get_transformed_position(); + const rtl = this.get_text_direction() === Clutter.TextDirection.RTL; + let width = this._barLevelWidth; + relX = absX - sliderX; + if (rtl) + relX = width - relX; - let width = this._barLevelWidth; let handleRadius = this.get_theme_node().get_length('-slider-handle-radius'); let newvalue; diff --git a/js/ui/workspace.js b/js/ui/workspace.js index 0069cdd..bf631a5 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -981,6 +981,11 @@ class WorkspaceBackground extends Shell.WorkspaceBackground { useContentSize: false, }); + this._bgManager.connect('changed', () => { + this._updateRoundedClipBounds(); + this._updateBorderRadius(); + }); + global.display.connectObject('workareas-changed', () => { this._workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); this._updateRoundedClipBounds(); diff --git a/meson.build b/meson.build index 4ed1a9b..1fa4311 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('gnome-shell', 'c', - version: '43.6', + version: '43.9', meson_version: '>= 0.58.0', license: 'GPLv2+' ) diff --git a/po/POTFILES.in b/po/POTFILES.in index b647698..0ba8752 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -5,6 +5,7 @@ data/50-gnome-shell-screenshots.xml data/50-gnome-shell-system.xml data/org.gnome.Shell.desktop.in.in data/org.gnome.shell.gschema.xml.in +data/org.gnome.Shell.Extensions.desktop.in.in data/org.gnome.Shell.PortalHelper.desktop.in.in js/dbusServices/extensions/ui/extension-error-page.ui js/gdm/authPrompt.js diff --git a/po/POTFILES.skip b/po/POTFILES.skip index 0c8451d..dd694f7 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -1,3 +1,4 @@ +data/gnome-shell-overrides-migration.desktop.in data/org.gnome.Shell@wayland.service.in data/org.gnome.Shell@x11.service.in js/ui/init.js @@ -12,16 +12,16 @@ msgid "" msgstr "" "Project-Id-Version: gnome-shell\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" -"POT-Creation-Date: 2022-09-14 22:12+0000\n" -"PO-Revision-Date: 2022-09-15 07:45+0200\n" -"Last-Translator: Marek Černocký <marek@manet.cz>\n" +"POT-Creation-Date: 2023-08-23 12:52+0000\n" +"PO-Revision-Date: 2023-09-08 16:52+0200\n" +"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n" "Language-Team: Czech <gnome-cs-list@gnome.org>\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -"X-Generator: Gtranslator 42.0\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Poedit 3.3.2\n" "X-Project-Style: gnome\n" #: data/50-gnome-shell-launchers.xml:6 @@ -65,27 +65,27 @@ msgid "Activate favorite application 9" msgstr "Aktivovat oblíbenou aplikaci č. 9" #. Translators: name of the folder under ~/Pictures for screenshots. -#: data/50-gnome-shell-screenshots.xml:6 js/ui/screenshot.js:2079 +#: data/50-gnome-shell-screenshots.xml:6 js/ui/screenshot.js:2076 msgid "Screenshots" msgstr "Snímky obrazovky" #: data/50-gnome-shell-screenshots.xml:9 -#: data/org.gnome.shell.gschema.xml.in:244 +#: data/org.gnome.shell.gschema.xml.in:234 msgid "Take a screenshot interactively" msgstr "Pořídit snímek obrazovky interaktivně" #: data/50-gnome-shell-screenshots.xml:12 -#: data/org.gnome.shell.gschema.xml.in:256 +#: data/org.gnome.shell.gschema.xml.in:246 msgid "Take a screenshot" msgstr "Pořídit snímek obrazovky" #: data/50-gnome-shell-screenshots.xml:15 -#: data/org.gnome.shell.gschema.xml.in:252 +#: data/org.gnome.shell.gschema.xml.in:242 msgid "Take a screenshot of a window" msgstr "Pořídit snímek okna" #: data/50-gnome-shell-screenshots.xml:18 -#: data/org.gnome.shell.gschema.xml.in:248 +#: data/org.gnome.shell.gschema.xml.in:238 msgid "Record a screencast interactively" msgstr "Zaznamenat dění na obrazovce interaktivně" @@ -246,27 +246,10 @@ msgstr "" "volby." #: data/org.gnome.shell.gschema.xml.in:89 -msgid "" -"Whether the default Bluetooth adapter had set up devices associated to it" -msgstr "Zda měl adaptér Bluetooth nastavená zařízení pro spolupráci s ním" - -#: data/org.gnome.shell.gschema.xml.in:90 -msgid "" -"The shell will only show a Bluetooth menu item if a Bluetooth adapter is " -"powered, or if there were devices set up associated with the default " -"adapter. This will be reset if the default adapter is ever seen not to have " -"devices associated to it." -msgstr "" -"Shell zobrazuje nabídku Bluetooth jen v případě, že je adaptér Bluetooth " -"zapnutý, nebo když existují nějaká zařízení nastavená pro spolupráci s " -"výchozím adaptérem. Nabídka zmizí, když se zjistí, že výchozí adaptér nemá " -"přiřazená žádná zařízení." - -#: data/org.gnome.shell.gschema.xml.in:99 msgid "The last selected non-default power profile" msgstr "Poslední vybraný profil napájení, jiný než výchozí" -#: data/org.gnome.shell.gschema.xml.in:100 +#: data/org.gnome.shell.gschema.xml.in:90 msgid "" "Some systems support more than two power profiles. In order to still support " "toggling between two profiles, this key records the last selected non-" @@ -276,11 +259,11 @@ msgstr "" "nadále podporovat přepínání mezi dvěma profily, uchovává tento klíč poslední " "vybraný profil, jiný než výchozí." -#: data/org.gnome.shell.gschema.xml.in:108 +#: data/org.gnome.shell.gschema.xml.in:98 msgid "The last version the “Welcome to GNOME” dialog was shown for" msgstr "Poslední verze „Vítá vás GNOME“ nabídnutá v dialogovém okně" -#: data/org.gnome.shell.gschema.xml.in:109 +#: data/org.gnome.shell.gschema.xml.in:99 msgid "" "This key determines for which version the “Welcome to GNOME” dialog was last " "shown. An empty string represents the oldest possible version, and a huge " @@ -292,11 +275,11 @@ msgstr "" "vysoké číslo představuje verzi, které doposud neexistuje. Takovýmto číslem " "se dá dialogové okno jednoduše zakázat." -#: data/org.gnome.shell.gschema.xml.in:142 +#: data/org.gnome.shell.gschema.xml.in:132 msgid "Layout of the app picker" msgstr "Rozvržení výběru aplikace" -#: data/org.gnome.shell.gschema.xml.in:143 +#: data/org.gnome.shell.gschema.xml.in:133 msgid "" "Layout of the app picker. Each entry in the array is a page. Pages are " "stored in the order they appear in GNOME Shell. Each page contains an " @@ -308,105 +291,105 @@ msgstr "" "obsahuje pár „id aplikace“ → „data“. V současnosti se jako „data“ ukládají " "následující hodnoty: • „pozice“: pozice ikony aplikace na stránce." -#: data/org.gnome.shell.gschema.xml.in:158 +#: data/org.gnome.shell.gschema.xml.in:148 msgid "Keybinding to open the application menu" msgstr "Klávesová zkratka otevírající nabidku aplikací" -#: data/org.gnome.shell.gschema.xml.in:159 +#: data/org.gnome.shell.gschema.xml.in:149 msgid "Keybinding to open the application menu." msgstr "Klávesová zkratka sloužící k otevření nabídky aplikací." -#: data/org.gnome.shell.gschema.xml.in:165 -#: data/org.gnome.shell.gschema.xml.in:172 +#: data/org.gnome.shell.gschema.xml.in:155 +#: data/org.gnome.shell.gschema.xml.in:162 msgid "Keybinding to shift between overview states" msgstr "Klávesová zkratka přesouvající mezi stavy přehledu" -#: data/org.gnome.shell.gschema.xml.in:166 +#: data/org.gnome.shell.gschema.xml.in:156 msgid "Keybinding to shift between session, window picker and app grid" msgstr "" "Klávesová zkratka přesouvající mezi sezením, výběrem oken a mřížkou aplikací" -#: data/org.gnome.shell.gschema.xml.in:173 +#: data/org.gnome.shell.gschema.xml.in:163 msgid "Keybinding to shift between app grid, window picker and session" msgstr "" "Klávesová zkratka přesouvající mezi mřížkou aplikací, výběrem oken a sezením" -#: data/org.gnome.shell.gschema.xml.in:179 +#: data/org.gnome.shell.gschema.xml.in:169 msgid "Keybinding to open the “Show Applications” view" msgstr "Klávesová zkratka otevírající zobrazení aplikací" -#: data/org.gnome.shell.gschema.xml.in:180 +#: data/org.gnome.shell.gschema.xml.in:170 msgid "" "Keybinding to open the “Show Applications” view of the Activities Overview." msgstr "" "Klávesová zkratka sloužící k otevření seznamu aplikací v Přehledu činností." -#: data/org.gnome.shell.gschema.xml.in:187 +#: data/org.gnome.shell.gschema.xml.in:177 msgid "Keybinding to open the overview" msgstr "Klávesová zkratka otevírající přehled" -#: data/org.gnome.shell.gschema.xml.in:188 +#: data/org.gnome.shell.gschema.xml.in:178 msgid "Keybinding to open the Activities Overview." msgstr "Klávesová zkratka sloužící k otevření přehledu činností." -#: data/org.gnome.shell.gschema.xml.in:194 +#: data/org.gnome.shell.gschema.xml.in:184 msgid "Keybinding to toggle the visibility of the notification list" msgstr "Klávesová zkratka přepínající viditelnost seznamu upozornění" -#: data/org.gnome.shell.gschema.xml.in:195 +#: data/org.gnome.shell.gschema.xml.in:185 msgid "Keybinding to toggle the visibility of the notification list." msgstr "Klávesová zkratka sloužící k přepnutí viditelnosti seznamu upozornění." -#: data/org.gnome.shell.gschema.xml.in:201 +#: data/org.gnome.shell.gschema.xml.in:191 msgid "Keybinding to focus the active notification" msgstr "Klávesová zkratka zaměřující aktivního upozornění" -#: data/org.gnome.shell.gschema.xml.in:202 +#: data/org.gnome.shell.gschema.xml.in:192 msgid "Keybinding to focus the active notification." msgstr "Klávesová zkratka sloužící k zaměření aktivního upozornění." -#: data/org.gnome.shell.gschema.xml.in:208 +#: data/org.gnome.shell.gschema.xml.in:198 msgid "Switch to application 1" msgstr "Přepnout do aplikace 1" -#: data/org.gnome.shell.gschema.xml.in:212 +#: data/org.gnome.shell.gschema.xml.in:202 msgid "Switch to application 2" msgstr "Přepnout do aplikace 2" -#: data/org.gnome.shell.gschema.xml.in:216 +#: data/org.gnome.shell.gschema.xml.in:206 msgid "Switch to application 3" msgstr "Přepnout do aplikace 3" -#: data/org.gnome.shell.gschema.xml.in:220 +#: data/org.gnome.shell.gschema.xml.in:210 msgid "Switch to application 4" msgstr "Přepnout do aplikace 4" -#: data/org.gnome.shell.gschema.xml.in:224 +#: data/org.gnome.shell.gschema.xml.in:214 msgid "Switch to application 5" msgstr "Přepnout do aplikace 5" -#: data/org.gnome.shell.gschema.xml.in:228 +#: data/org.gnome.shell.gschema.xml.in:218 msgid "Switch to application 6" msgstr "Přepnout do aplikace 6" -#: data/org.gnome.shell.gschema.xml.in:232 +#: data/org.gnome.shell.gschema.xml.in:222 msgid "Switch to application 7" msgstr "Přepnout do aplikace 7" -#: data/org.gnome.shell.gschema.xml.in:236 +#: data/org.gnome.shell.gschema.xml.in:226 msgid "Switch to application 8" msgstr "Přepnout do aplikace 8" -#: data/org.gnome.shell.gschema.xml.in:240 +#: data/org.gnome.shell.gschema.xml.in:230 msgid "Switch to application 9" msgstr "Přepnout do aplikace 9" -#: data/org.gnome.shell.gschema.xml.in:265 -#: data/org.gnome.shell.gschema.xml.in:292 +#: data/org.gnome.shell.gschema.xml.in:255 +#: data/org.gnome.shell.gschema.xml.in:282 msgid "Limit switcher to current workspace." msgstr "Omezit přepínání jen na aktuální plochu." -#: data/org.gnome.shell.gschema.xml.in:266 +#: data/org.gnome.shell.gschema.xml.in:256 msgid "" "If true, only applications that have windows on the current workspace are " "shown in the switcher. Otherwise, all applications are included." @@ -414,11 +397,11 @@ msgstr "" "Je-li zapnuto, objeví se v přepínači aplikací jen ty, co jsou na aktuální " "pracovní ploše. V opačném případě jsou zahrnuty všechny aplikace." -#: data/org.gnome.shell.gschema.xml.in:283 +#: data/org.gnome.shell.gschema.xml.in:273 msgid "The application icon mode." msgstr "Režim ikon aplikací." -#: data/org.gnome.shell.gschema.xml.in:284 +#: data/org.gnome.shell.gschema.xml.in:274 msgid "" "Configures how the windows are shown in the switcher. Valid possibilities " "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" @@ -428,7 +411,7 @@ msgstr "" "only“ (zobrazí náhled okna), „app-icon-only“ (zobrazí pouze ikonu aplikace) " "a „both“ (zobrazí náhled i ikonu)." -#: data/org.gnome.shell.gschema.xml.in:293 +#: data/org.gnome.shell.gschema.xml.in:283 msgid "" "If true, only windows from the current workspace are shown in the switcher. " "Otherwise, all windows are included." @@ -436,59 +419,69 @@ msgstr "" "Je-li zapnuto, objeví se v přepínači oken jen ty, co jsou na aktuální " "pracovní ploše. V opačném případě jsou zahrnuta všechna okna." -#: data/org.gnome.shell.gschema.xml.in:303 +#: data/org.gnome.shell.gschema.xml.in:293 msgid "Locations" msgstr "Místa" -#: data/org.gnome.shell.gschema.xml.in:304 +#: data/org.gnome.shell.gschema.xml.in:294 msgid "The locations to show in world clocks" msgstr "Místa, která se mají zobrazovat ve světových časech" -#: data/org.gnome.shell.gschema.xml.in:314 +#: data/org.gnome.shell.gschema.xml.in:304 msgid "Automatic location" msgstr "Automatické místo" -#: data/org.gnome.shell.gschema.xml.in:315 +#: data/org.gnome.shell.gschema.xml.in:305 msgid "Whether to fetch the current location or not" msgstr "Zda si zjistit, či ne, aktuální místo" -#: data/org.gnome.shell.gschema.xml.in:322 +#: data/org.gnome.shell.gschema.xml.in:312 msgid "Location" msgstr "Místo" -#: data/org.gnome.shell.gschema.xml.in:323 +#: data/org.gnome.shell.gschema.xml.in:313 msgid "The location for which to show a forecast" msgstr "Místo, pro které se má zobrazovat předpověď počasí" -#: data/org.gnome.shell.gschema.xml.in:335 +#: data/org.gnome.shell.gschema.xml.in:325 msgid "Attach modal dialog to the parent window" msgstr "Modální dialogová okna připojovat k rodičovskému oknu" -#: data/org.gnome.shell.gschema.xml.in:336 -#: data/org.gnome.shell.gschema.xml.in:345 -#: data/org.gnome.shell.gschema.xml.in:353 -#: data/org.gnome.shell.gschema.xml.in:361 -#: data/org.gnome.shell.gschema.xml.in:369 +#: data/org.gnome.shell.gschema.xml.in:326 +#: data/org.gnome.shell.gschema.xml.in:335 +#: data/org.gnome.shell.gschema.xml.in:343 +#: data/org.gnome.shell.gschema.xml.in:351 +#: data/org.gnome.shell.gschema.xml.in:359 msgid "" "This key overrides the key in org.gnome.mutter when running GNOME Shell." msgstr "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.mutter." -#: data/org.gnome.shell.gschema.xml.in:344 +#: data/org.gnome.shell.gschema.xml.in:334 msgid "Enable edge tiling when dropping windows on screen edges" msgstr "Okna upuštěná u okraje obrazovky nechat řadit jako dlaždice" -#: data/org.gnome.shell.gschema.xml.in:352 +#: data/org.gnome.shell.gschema.xml.in:342 msgid "Workspaces are managed dynamically" msgstr "Pracovní plochy jsou spravovány dynamicky" -#: data/org.gnome.shell.gschema.xml.in:360 +#: data/org.gnome.shell.gschema.xml.in:350 msgid "Workspaces only on primary monitor" msgstr "Pracovní plochy jen na hlavním monitoru" -#: data/org.gnome.shell.gschema.xml.in:368 +#: data/org.gnome.shell.gschema.xml.in:358 msgid "Delay focus changes in mouse mode until the pointer stops moving" msgstr "Se změnou zaměření v režimu myši čekat na zastavení pohybu ukazatele" +#. Keep in sync with subprojects/extensions-app +#: data/org.gnome.Shell.Extensions.desktop.in.in:5 +#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5 +#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4 +#: subprojects/extensions-app/js/main.js:212 +#: subprojects/extensions-app/data/ui/extensions-window.ui:18 +#: subprojects/extensions-app/data/ui/extensions-window.ui:83 +msgid "Extensions" +msgstr "Rozšíření" + #: data/org.gnome.Shell.PortalHelper.desktop.in.in:3 msgid "Network Login" msgstr "Přihlášení do sítě" @@ -519,7 +512,7 @@ msgstr "Domovská stránka" msgid "Visit extension homepage" msgstr "Navštívit domovskou stránku rozšíření" -#: js/gdm/authPrompt.js:144 js/ui/audioDeviceSelection.js:61 +#: js/gdm/authPrompt.js:146 js/ui/audioDeviceSelection.js:61 #: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:141 #: js/ui/endSessionDialog.js:440 js/ui/extensionDownloader.js:223 #: js/ui/shellMountOperation.js:377 js/ui/shellMountOperation.js:387 @@ -527,7 +520,7 @@ msgstr "Navštívit domovskou stránku rozšíření" msgid "Cancel" msgstr "Zrušit" -#: js/gdm/authPrompt.js:307 js/ui/components/networkAgent.js:209 +#: js/gdm/authPrompt.js:312 js/ui/components/networkAgent.js:209 #: js/ui/components/networkAgent.js:229 js/ui/components/networkAgent.js:261 #: js/ui/components/networkAgent.js:294 js/ui/components/networkAgent.js:333 #: js/ui/components/networkAgent.js:346 js/ui/components/polkitAgent.js:283 @@ -565,13 +558,13 @@ msgstr "Chyba ověření" #. Translators: this message is shown below the password entry field #. to indicate the user can swipe their finger on the fingerprint reader -#: js/gdm/util.js:603 +#: js/gdm/util.js:604 msgid "(or swipe finger across reader)" msgstr "(nebo přejeďte prstem přes čtečku)" #. Translators: this message is shown below the password entry field #. to indicate the user can place their finger on the fingerprint reader instead -#: js/gdm/util.js:608 +#: js/gdm/util.js:609 msgid "(or place finger on reader)" msgstr "(nebo přiložte prst na čtečku)" @@ -847,7 +840,7 @@ msgstr "Zamítnout přístup" msgid "Grant Access" msgstr "Schválit přístup" -#: js/ui/appDisplay.js:1728 +#: js/ui/appDisplay.js:1732 msgid "Unnamed Folder" msgstr "Nepojmenovaná složka" @@ -878,7 +871,7 @@ msgstr "Zobrazit podrobnosti" msgid "Quit" msgstr "Ukončit" -#: js/ui/appMenu.js:157 js/ui/dash.js:249 +#: js/ui/appMenu.js:157 js/ui/dash.js:250 msgid "Unpin" msgstr "Odebrat z oblíbených" @@ -910,7 +903,7 @@ msgstr "Sluchátka" msgid "Headset" msgstr "Sluchátka s mikrofonem" -#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:319 +#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:322 msgid "Microphone" msgstr "Mikrofon" @@ -1145,7 +1138,7 @@ msgstr "PIN" msgid "A password is required to connect to “%s”." msgstr "Pro připojení k „%s“ je vyžadováno heslo." -#: js/ui/components/networkAgent.js:736 +#: js/ui/components/networkAgent.js:736 js/ui/status/network.js:1960 msgid "Network Manager" msgstr "Network Manager" @@ -1178,17 +1171,17 @@ msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu." msgid "%s is now known as %s" msgstr "%s je teď znám jako %s" -#: js/ui/ctrlAltTab.js:22 js/ui/overviewControls.js:414 +#: js/ui/ctrlAltTab.js:22 js/ui/overviewControls.js:417 msgid "Windows" msgstr "Okna" -#: js/ui/dash.js:205 js/ui/dash.js:251 +#: js/ui/dash.js:206 js/ui/dash.js:252 msgid "Show Applications" msgstr "Zobrazit aplikace" #. Translators: this is the name of the dock/favorites area on #. the left of the overview -#: js/ui/dash.js:398 +#: js/ui/dash.js:399 msgid "Dash" msgstr "Oblíbené" @@ -1466,31 +1459,31 @@ msgstr "Jsou dostupné aktualizace rozšíření" msgid "Extension updates are ready to be installed." msgstr "Aktualizace rozšíření jsou připravené k instalaci." -#: js/ui/inhibitShortcutsDialog.js:79 +#: js/ui/inhibitShortcutsDialog.js:75 msgid "Allow inhibiting shortcuts" msgstr "Povolení znemožnit klávesové zkratky" #. Translators: %s is an application name like "Settings" -#: js/ui/inhibitShortcutsDialog.js:82 +#: js/ui/inhibitShortcutsDialog.js:78 #, javascript-format msgid "The application %s wants to inhibit shortcuts" msgstr "Aplikace %s chce znemožnit klávesové zkratky" -#: js/ui/inhibitShortcutsDialog.js:83 +#: js/ui/inhibitShortcutsDialog.js:79 msgid "An application wants to inhibit shortcuts" msgstr "Některá aplikace chce znemožnit klávesové zkratky" #. Translators: %s is a keyboard shortcut like "Super+x" -#: js/ui/inhibitShortcutsDialog.js:90 +#: js/ui/inhibitShortcutsDialog.js:86 #, javascript-format msgid "You can restore shortcuts by pressing %s." msgstr "Obnovit klávesové zkratky můžete zmáčknutím %s." -#: js/ui/inhibitShortcutsDialog.js:101 +#: js/ui/inhibitShortcutsDialog.js:97 msgid "Deny" msgstr "Zamítnout" -#: js/ui/inhibitShortcutsDialog.js:110 +#: js/ui/inhibitShortcutsDialog.js:106 msgid "Allow" msgstr "Povolit" @@ -1558,51 +1551,51 @@ msgstr "Ponechat vypnuté" msgid "Region & Language Settings" msgstr "Nastavení regionu a jazyka" -#: js/ui/lookingGlass.js:713 +#: js/ui/lookingGlass.js:718 msgid "No extensions installed" msgstr "Nejsou nainstalována žádná rozšíření" #. Translators: argument is an extension UUID. -#: js/ui/lookingGlass.js:774 +#: js/ui/lookingGlass.js:779 #, javascript-format msgid "%s has not emitted any errors." msgstr "Rozšíření %s nevyvolalo žádné chyby." -#: js/ui/lookingGlass.js:780 +#: js/ui/lookingGlass.js:785 msgid "Hide Errors" msgstr "Skrývat chyby" -#: js/ui/lookingGlass.js:784 js/ui/lookingGlass.js:857 +#: js/ui/lookingGlass.js:789 js/ui/lookingGlass.js:862 msgid "Show Errors" msgstr "Zobrazovat chyby" -#: js/ui/lookingGlass.js:793 +#: js/ui/lookingGlass.js:798 msgid "Enabled" msgstr "Povoleno" #. translators: #. * The device has been disabled -#: js/ui/lookingGlass.js:796 subprojects/gvc/gvc-mixer-control.c:1900 +#: js/ui/lookingGlass.js:801 subprojects/gvc/gvc-mixer-control.c:1908 msgid "Disabled" msgstr "Zakázáno" -#: js/ui/lookingGlass.js:798 +#: js/ui/lookingGlass.js:803 msgid "Error" msgstr "Chyba" -#: js/ui/lookingGlass.js:800 +#: js/ui/lookingGlass.js:805 msgid "Out of date" msgstr "Neaktuální" -#: js/ui/lookingGlass.js:802 +#: js/ui/lookingGlass.js:807 msgid "Downloading" msgstr "Stahování" -#: js/ui/lookingGlass.js:835 +#: js/ui/lookingGlass.js:840 msgid "View Source" msgstr "Zobrazit zdroj" -#: js/ui/lookingGlass.js:846 +#: js/ui/lookingGlass.js:851 msgid "Web Page" msgstr "Webová stránka" @@ -1639,7 +1632,7 @@ msgstr "Zamykání obrazovky je vypnuto" msgid "Screen Locking requires the GNOME display manager." msgstr "Zamykání obrazovky vyžaduje správce displeje GNOME." -#: js/ui/messageTray.js:1418 +#: js/ui/messageTray.js:1417 msgid "System Information" msgstr "Informace o systému" @@ -1655,11 +1648,11 @@ msgstr "Neznámý název" #. in the search entry when no search is #. active; it should not exceed ~30 #. characters. -#: js/ui/overviewControls.js:324 +#: js/ui/overviewControls.js:327 msgid "Type to search" msgstr "vyhledávejte psaním" -#: js/ui/overviewControls.js:402 +#: js/ui/overviewControls.js:405 msgid "Applications" msgstr "Aplikace" @@ -1761,103 +1754,103 @@ msgstr "Nelze uzamknout obrazovku" msgid "Lock was blocked by an application" msgstr "Zamknutí bylo zablokováno některou z aplikací" -#: js/ui/screenshot.js:1147 +#: js/ui/screenshot.js:1165 msgid "Selection" msgstr "Výběr" -#: js/ui/screenshot.js:1157 +#: js/ui/screenshot.js:1175 msgid "Area Selection" msgstr "Výběr oblasti" -#: js/ui/screenshot.js:1162 +#: js/ui/screenshot.js:1180 msgid "Screen" msgstr "Obrazovka" -#: js/ui/screenshot.js:1172 +#: js/ui/screenshot.js:1190 msgid "Screen Selection" msgstr "Výběr obrazovky" -#: js/ui/screenshot.js:1177 +#: js/ui/screenshot.js:1195 msgid "Window" msgstr "Okno" -#: js/ui/screenshot.js:1187 +#: js/ui/screenshot.js:1205 msgid "Window Selection" msgstr "Výběr okna" -#: js/ui/screenshot.js:1225 +#: js/ui/screenshot.js:1243 msgid "Screenshot / Screencast" msgstr "Snímek/záznam obrazovky" -#: js/ui/screenshot.js:1261 +#: js/ui/screenshot.js:1279 msgid "Show Pointer" msgstr "Zobrazit ukazatel" #. Translators: this is the folder where recorded #. screencasts are stored. -#: js/ui/screenshot.js:1849 +#: js/ui/screenshot.js:1870 msgid "Screencasts" msgstr "Záznamy obrazovky" #. Translators: this is a filename used for screencast #. * recording, where "%d" and "%t" date and time, e.g. #. * "Screencast from 07-17-2013 10:00:46 PM.webm" -#: js/ui/screenshot.js:1854 +#: js/ui/screenshot.js:1875 #, no-c-format msgid "Screencast from %d %t.webm" msgstr "Záznam obrazovky z %d %t.webm" #. Translators: notification source name. -#: js/ui/screenshot.js:1920 js/ui/screenshot.js:2132 +#: js/ui/screenshot.js:1917 js/ui/screenshot.js:2129 msgid "Screenshot" msgstr "Snímek obrazovky" #. Translators: notification title. -#: js/ui/screenshot.js:1926 +#: js/ui/screenshot.js:1923 msgid "Screencast recorded" msgstr "Bylo zaznamenáno dění na obrazovce" #. Translators: notification body when a screencast was recorded. -#: js/ui/screenshot.js:1928 +#: js/ui/screenshot.js:1925 msgid "Click here to view the video." msgstr "Kliknutím zde video zobrazíte." #. Translators: button on the screencast notification. #. Translators: button on the screenshot notification. -#: js/ui/screenshot.js:1931 js/ui/screenshot.js:2146 +#: js/ui/screenshot.js:1928 js/ui/screenshot.js:2143 msgid "Show in Files" msgstr "Zobrazit v Souborech" #. Translators: this is the name of the file that the screenshot is #. saved to. The placeholder is a timestamp, e.g. "2017-05-21 12-24-03". -#: js/ui/screenshot.js:2092 +#: js/ui/screenshot.js:2089 #, javascript-format msgid "Screenshot from %s" msgstr "Snímek obrazovky z %s" #. Translators: notification title. -#: js/ui/screenshot.js:2138 +#: js/ui/screenshot.js:2135 msgid "Screenshot captured" msgstr "Byl pořízen snímek obrazovky" #. Translators: notification body when a screenshot was captured. -#: js/ui/screenshot.js:2140 +#: js/ui/screenshot.js:2137 msgid "You can paste the image from the clipboard." msgstr "Obrázek můžete vložit ze schránky." -#: js/ui/screenshot.js:2193 js/ui/screenshot.js:2358 +#: js/ui/screenshot.js:2190 js/ui/screenshot.js:2355 msgid "Screenshot taken" msgstr "Byl pořízen snímek obrazovky" -#: js/ui/search.js:804 +#: js/ui/search.js:809 msgid "Searching…" msgstr "Hledá se…" -#: js/ui/search.js:806 +#: js/ui/search.js:811 msgid "No results." msgstr "Žádné výsledky." -#: js/ui/search.js:937 +#: js/ui/search.js:942 #, javascript-format msgid "%d more" msgid_plural "%d more" @@ -1992,7 +1985,7 @@ msgstr "Styl velkého textu" msgid "Auto Rotate" msgstr "Automaticky otáčet" -#: js/ui/status/bluetooth.js:171 +#: js/ui/status/bluetooth.js:151 msgid "Bluetooth" msgstr "Bluetooth" @@ -2024,11 +2017,11 @@ msgstr "Druhé kliknutí" msgid "Dwell Click" msgstr "Kliknutí posečkáním" -#: js/ui/status/keyboard.js:830 +#: js/ui/status/keyboard.js:842 msgid "Keyboard" msgstr "Klávesnice" -#: js/ui/status/keyboard.js:847 +#: js/ui/status/keyboard.js:859 msgid "Show Keyboard Layout" msgstr "Zobrazit rozložení klávesnice" @@ -2065,11 +2058,59 @@ msgid "Connect to %s" msgstr "Připojit %s" #. Translators: %s is a network identifier -#: js/ui/status/network.js:1107 +#: js/ui/status/network.js:1113 #, javascript-format msgid "%s Hotspot" msgstr "Přístupový bod %s" +#: js/ui/status/network.js:1472 js/ui/status/network.js:1488 +msgid "VPN" +msgstr "VPN" + +#: js/ui/status/network.js:1473 +msgid "VPN Settings" +msgstr "Nastavení VPN" + +#: js/ui/status/network.js:1722 +msgid "Wi–Fi" +msgstr "Wi-Fi" + +#: js/ui/status/network.js:1724 +msgid "All Networks" +msgstr "Všechny sítě" + +#: js/ui/status/network.js:1821 +msgid "Wired Connections" +msgstr "Drátová připojení" + +#: js/ui/status/network.js:1822 +msgid "Wired Settings" +msgstr "Nastavení drátových připojení" + +#: js/ui/status/network.js:1836 +msgid "Bluetooth Tethers" +msgstr "Sdílená připojení přes Bluetooth" + +#: js/ui/status/network.js:1837 +msgid "Bluetooth Settings" +msgstr "Nastavení Bluetooth" + +#: js/ui/status/network.js:1851 +msgid "Mobile Connections" +msgstr "Mobilní připojení" + +#: js/ui/status/network.js:1853 +msgid "Mobile Broadband Settings" +msgstr "Nastavení mobilního připojení" + +#: js/ui/status/network.js:1965 +msgid "Connection failed" +msgstr "Připojení selhalo" + +#: js/ui/status/network.js:1966 +msgid "Activation of network connection failed" +msgstr "Aktivace síťového připojení selhala" + #: js/ui/status/nightLight.js:20 msgid "Night Light" msgstr "Noční osvětlení" @@ -2089,15 +2130,15 @@ msgctxt "Power profile" msgid "Power Saver" msgstr "Šetření energií" -#: js/ui/status/powerProfiles.js:68 +#: js/ui/status/powerProfiles.js:70 msgid "Power Profiles" msgstr "Profily napájení" -#: js/ui/status/remoteAccess.js:74 +#: js/ui/status/remoteAccess.js:72 msgid "Stop Screencast" msgstr "Zastavit záznam obrazovky" -#: js/ui/status/remoteAccess.js:144 +#: js/ui/status/remoteAccess.js:142 msgid "Stop Screen Sharing" msgstr "Zastavit sdílení obrazovky" @@ -2179,19 +2220,19 @@ 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:191 +#: js/ui/status/volume.js:194 msgid "Volume changed" msgstr "Hlasitost změněna" -#: js/ui/status/volume.js:253 +#: js/ui/status/volume.js:256 msgid "Volume" msgstr "Hlasitost" -#: js/ui/status/volume.js:269 +#: js/ui/status/volume.js:272 msgid "Sound Output" msgstr "Zvukový výstup" -#: js/ui/status/volume.js:337 +#: js/ui/status/volume.js:340 msgid "Sound Input" msgstr "Zvukový vstup" @@ -2406,14 +2447,6 @@ msgstr "Heslo nemůže být prázdné." msgid "Authentication dialog was dismissed by the user" msgstr "Dialogové okno ověření bylo uživatelem zrušeno" -#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5 -#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4 -#: subprojects/extensions-app/js/main.js:212 -#: subprojects/extensions-app/data/ui/extensions-window.ui:18 -#: subprojects/extensions-app/data/ui/extensions-window.ui:83 -msgid "Extensions" -msgstr "Rozšíření" - #: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6 msgid "Manage your GNOME Extensions" msgstr "Správa vašich rozšíření GNOME" @@ -2513,11 +2546,11 @@ msgstr "Ručně nainstalované" #: subprojects/extensions-app/data/ui/extensions-window.ui:99 #: subprojects/extensions-app/data/ui/extensions-window.ui:134 msgid "" -"To find and add extensions, visit <a href=\"https://extensions.gnome.org" -"\">extensions.gnome.org</a>." +"To find and add extensions, visit <a href=\"https://extensions.gnome." +"org\">extensions.gnome.org</a>." msgstr "" -"Jestli chcete vyhledat a nainstalovat rozšíření, navštivte stránku <a href=" -"\"https://extensions.gnome.org\">extensions.gnome.org</a>." +"Jestli chcete vyhledat a nainstalovat rozšíření, navštivte stránku <a " +"href=\"https://extensions.gnome.org\">extensions.gnome.org</a>." #: subprojects/extensions-app/data/ui/extensions-window.ui:112 msgid "Built-In" @@ -2635,26 +2668,18 @@ msgstr "Neznámý argument" msgid "UUID, name and description are required" msgstr "Jsou vyžadovány UUID, název a popis" -#: subprojects/extensions-tool/src/command-disable.c:46 -#: subprojects/extensions-tool/src/command-enable.c:46 -#: subprojects/extensions-tool/src/command-info.c:50 -#: subprojects/extensions-tool/src/command-list.c:64 -#: subprojects/extensions-tool/src/main.c:146 -msgid "Failed to connect to GNOME Shell\n" -msgstr "Selhalo připojení ke GNOME Shellu\n" - -#: subprojects/extensions-tool/src/command-disable.c:53 -#: subprojects/extensions-tool/src/command-enable.c:53 +#: subprojects/extensions-tool/src/command-disable.c:62 +#: subprojects/extensions-tool/src/command-enable.c:62 #, c-format msgid "Extension “%s” does not exist\n" msgstr "Rozšíření „%s“ neexistuje\n" -#: subprojects/extensions-tool/src/command-disable.c:101 +#: subprojects/extensions-tool/src/command-disable.c:98 msgid "Disable an extension" msgstr "Zakázat rozšíření" -#: subprojects/extensions-tool/src/command-disable.c:119 -#: subprojects/extensions-tool/src/command-enable.c:119 +#: subprojects/extensions-tool/src/command-disable.c:116 +#: subprojects/extensions-tool/src/command-enable.c:116 #: subprojects/extensions-tool/src/command-info.c:103 #: subprojects/extensions-tool/src/command-prefs.c:105 #: subprojects/extensions-tool/src/command-reset.c:76 @@ -2662,8 +2687,8 @@ msgstr "Zakázat rozšíření" msgid "No UUID given" msgstr "Nebylo zadáno žádné UUID" -#: subprojects/extensions-tool/src/command-disable.c:124 -#: subprojects/extensions-tool/src/command-enable.c:124 +#: subprojects/extensions-tool/src/command-disable.c:121 +#: subprojects/extensions-tool/src/command-enable.c:121 #: subprojects/extensions-tool/src/command-info.c:108 #: subprojects/extensions-tool/src/command-prefs.c:110 #: subprojects/extensions-tool/src/command-reset.c:81 @@ -2671,10 +2696,16 @@ msgstr "Nebylo zadáno žádné UUID" msgid "More than one UUID given" msgstr "Bylo zadáno více než jedno UUID" -#: subprojects/extensions-tool/src/command-enable.c:101 +#: subprojects/extensions-tool/src/command-enable.c:98 msgid "Enable an extension" msgstr "Povolit rozšíření" +#: subprojects/extensions-tool/src/command-info.c:50 +#: subprojects/extensions-tool/src/command-list.c:64 +#: subprojects/extensions-tool/src/main.c:146 +msgid "Failed to connect to GNOME Shell\n" +msgstr "Selhalo připojení ke GNOME Shellu\n" + #: subprojects/extensions-tool/src/command-info.c:59 #: subprojects/extensions-tool/src/main.c:155 #, c-format @@ -2939,7 +2970,7 @@ msgstr "Přidá ikonu na horní lištu" #. translators: #. * The number of sound outputs on a particular device -#: subprojects/gvc/gvc-mixer-control.c:1907 +#: subprojects/gvc/gvc-mixer-control.c:1915 #, c-format msgid "%u Output" msgid_plural "%u Outputs" @@ -2949,7 +2980,7 @@ msgstr[2] "%u výstupů" #. translators: #. * The number of sound inputs on a particular device -#: subprojects/gvc/gvc-mixer-control.c:1917 +#: subprojects/gvc/gvc-mixer-control.c:1925 #, c-format msgid "%u Input" msgid_plural "%u Inputs" @@ -2957,6 +2988,21 @@ msgstr[0] "%u vstup" msgstr[1] "%u vstupy" msgstr[2] "%u vstupů" -#: subprojects/gvc/gvc-mixer-control.c:2867 +#: subprojects/gvc/gvc-mixer-control.c:2876 msgid "System Sounds" msgstr "Systémové zvuky" + +#~ msgid "" +#~ "Whether the default Bluetooth adapter had set up devices associated to it" +#~ msgstr "Zda měl adaptér Bluetooth nastavená zařízení pro spolupráci s ním" + +#~ msgid "" +#~ "The shell will only show a Bluetooth menu item if a Bluetooth adapter is " +#~ "powered, or if there were devices set up associated with the default " +#~ "adapter. This will be reset if the default adapter is ever seen not to " +#~ "have devices associated to it." +#~ msgstr "" +#~ "Shell zobrazuje nabídku Bluetooth jen v případě, že je adaptér Bluetooth " +#~ "zapnutý, nebo když existují nějaká zařízení nastavená pro spolupráci s " +#~ "výchozím adaptérem. Nabídka zmizí, když se zjistí, že výchozí adaptér " +#~ "nemá přiřazená žádná zařízení." @@ -3,14 +3,14 @@ # This file is distributed under the same license as the gnome-shell package. # Mahyar Moghimi <mahyar.moqimi@gmail.com>, 2010. # Arash Mousavi <mousavi.arash@gmail.com>, 2010-2017. -# Danial behzadi <dani.behzi@ubuntu.com>, 2018-2022. +# Danial behzadi <dani.behzi@ubuntu.com>, 2018-2023. # msgid "" msgstr "" "Project-Id-Version: gnome-shell master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" -"POT-Creation-Date: 2022-09-20 09:42+0000\n" -"PO-Revision-Date: 2022-09-20 14:34+0430\n" +"POT-Creation-Date: 2023-07-06 18:09+0000\n" +"PO-Revision-Date: 2023-08-07 13:04+0330\n" "Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n" "Language-Team: Persian <>\n" "Language: fa\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-DamnedLies-Scope: partial\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.2.2\n" "X-Poedit-SourceCharset: utf-8\n" #: data/50-gnome-shell-launchers.xml:6 @@ -63,7 +63,7 @@ msgid "Activate favorite application 9" msgstr "فعّالسازی برنامهٔ مورد علاقهٔ ۹" #. Translators: name of the folder under ~/Pictures for screenshots. -#: data/50-gnome-shell-screenshots.xml:6 js/ui/screenshot.js:2079 +#: data/50-gnome-shell-screenshots.xml:6 js/ui/screenshot.js:2076 msgid "Screenshots" msgstr "نماگرفتها" @@ -475,7 +475,7 @@ msgstr "صفحهٔ خانگی" msgid "Visit extension homepage" msgstr "مشاهدهٔ صفحهٔ خانگی افزونه" -#: js/gdm/authPrompt.js:144 js/ui/audioDeviceSelection.js:61 +#: js/gdm/authPrompt.js:146 js/ui/audioDeviceSelection.js:61 #: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:141 #: js/ui/endSessionDialog.js:440 js/ui/extensionDownloader.js:223 #: js/ui/shellMountOperation.js:377 js/ui/shellMountOperation.js:387 @@ -483,7 +483,7 @@ msgstr "مشاهدهٔ صفحهٔ خانگی افزونه" msgid "Cancel" msgstr "لغو" -#: js/gdm/authPrompt.js:307 js/ui/components/networkAgent.js:209 +#: js/gdm/authPrompt.js:312 js/ui/components/networkAgent.js:209 #: js/ui/components/networkAgent.js:229 js/ui/components/networkAgent.js:261 #: js/ui/components/networkAgent.js:294 js/ui/components/networkAgent.js:333 #: js/ui/components/networkAgent.js:346 js/ui/components/polkitAgent.js:283 @@ -521,13 +521,13 @@ msgstr "خطا تأیید هویت" #. Translators: this message is shown below the password entry field #. to indicate the user can swipe their finger on the fingerprint reader -#: js/gdm/util.js:603 +#: js/gdm/util.js:604 msgid "(or swipe finger across reader)" msgstr "(یا انگشتتان را روی خواننده بکشید)" #. Translators: this message is shown below the password entry field #. to indicate the user can place their finger on the fingerprint reader instead -#: js/gdm/util.js:608 +#: js/gdm/util.js:609 msgid "(or place finger on reader)" msgstr "(یا انگشتتان را روی خواننده بگذارید)" @@ -793,7 +793,7 @@ msgstr "رد دسترسی" msgid "Grant Access" msgstr "پذیرفتن دسترسی" -#: js/ui/appDisplay.js:1728 +#: js/ui/appDisplay.js:1732 msgid "Unnamed Folder" msgstr "پوشهٔ بینام" @@ -824,7 +824,7 @@ msgstr "نمایش جزییات" msgid "Quit" msgstr "خروج" -#: js/ui/appMenu.js:157 js/ui/dash.js:249 +#: js/ui/appMenu.js:157 js/ui/dash.js:250 msgid "Unpin" msgstr "سنجاق نکردن" @@ -856,7 +856,7 @@ msgstr "هدفونها" msgid "Headset" msgstr "هدست" -#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:319 +#: js/ui/audioDeviceSelection.js:73 js/ui/status/volume.js:322 msgid "Microphone" msgstr "میکروفون" @@ -1085,7 +1085,7 @@ msgstr "پین" msgid "A password is required to connect to “%s”." msgstr "برای اتّصال به «%s» گذرواژه لازم است." -#: js/ui/components/networkAgent.js:736 +#: js/ui/components/networkAgent.js:736 js/ui/status/network.js:1960 msgid "Network Manager" msgstr "مدیر شبکه" @@ -1123,13 +1123,13 @@ msgstr "%s با عنوان %s شناخته میشود" msgid "Windows" msgstr "پنجرهها" -#: js/ui/dash.js:205 js/ui/dash.js:251 +#: js/ui/dash.js:206 js/ui/dash.js:252 msgid "Show Applications" msgstr "نمایش برنامهها" #. Translators: this is the name of the dock/favorites area on #. the left of the overview -#: js/ui/dash.js:398 +#: js/ui/dash.js:399 msgid "Dash" msgstr "دَش" @@ -1395,31 +1395,31 @@ msgstr "بهروز رسانیهای افزونه موجودند" msgid "Extension updates are ready to be installed." msgstr "بهروز رسانیهای افزونهها آمادهٔ نصبند." -#: js/ui/inhibitShortcutsDialog.js:79 +#: js/ui/inhibitShortcutsDialog.js:75 msgid "Allow inhibiting shortcuts" msgstr "اجازه به جلوگیری از میانبر ها" #. Translators: %s is an application name like "Settings" -#: js/ui/inhibitShortcutsDialog.js:82 +#: js/ui/inhibitShortcutsDialog.js:78 #, javascript-format msgid "The application %s wants to inhibit shortcuts" msgstr "برنامهٔ %s میخواهد جلوی میانبرها را بگیرد" -#: js/ui/inhibitShortcutsDialog.js:83 +#: js/ui/inhibitShortcutsDialog.js:79 msgid "An application wants to inhibit shortcuts" msgstr "برنامهای میخواهد جلوی میانبرها را بگیرد" #. Translators: %s is a keyboard shortcut like "Super+x" -#: js/ui/inhibitShortcutsDialog.js:90 +#: js/ui/inhibitShortcutsDialog.js:86 #, javascript-format msgid "You can restore shortcuts by pressing %s." msgstr "میتوانید با فشردن %s میانبرها را برگردانید." -#: js/ui/inhibitShortcutsDialog.js:101 +#: js/ui/inhibitShortcutsDialog.js:97 msgid "Deny" msgstr "رد کردن" -#: js/ui/inhibitShortcutsDialog.js:110 +#: js/ui/inhibitShortcutsDialog.js:106 msgid "Allow" msgstr "اجازه دادن" @@ -1507,7 +1507,7 @@ msgstr "به کار افتاده" #. translators: #. * The device has been disabled -#: js/ui/lookingGlass.js:796 subprojects/gvc/gvc-mixer-control.c:1900 +#: js/ui/lookingGlass.js:796 subprojects/gvc/gvc-mixer-control.c:1908 msgid "Disabled" msgstr "از کار افتاده" @@ -1563,7 +1563,7 @@ msgstr "قفل صفحه از کار افتاده" msgid "Screen Locking requires the GNOME display manager." msgstr "قفل صفحه نیاز به مدیر نمایش گنوم دارد." -#: js/ui/messageTray.js:1418 +#: js/ui/messageTray.js:1417 msgid "System Information" msgstr "اطّلاعات سامانه" @@ -1685,103 +1685,103 @@ msgstr "نمیتوان قفل کرد" msgid "Lock was blocked by an application" msgstr "قفل توسط یک برنامه مسدود شده بود" -#: js/ui/screenshot.js:1147 +#: js/ui/screenshot.js:1165 msgid "Selection" msgstr "گزینش" -#: js/ui/screenshot.js:1157 +#: js/ui/screenshot.js:1175 msgid "Area Selection" msgstr "گزینش ناحیه" -#: js/ui/screenshot.js:1162 +#: js/ui/screenshot.js:1180 msgid "Screen" msgstr "صفحه" -#: js/ui/screenshot.js:1172 +#: js/ui/screenshot.js:1190 msgid "Screen Selection" msgstr "گزینش صفحه" -#: js/ui/screenshot.js:1177 +#: js/ui/screenshot.js:1195 msgid "Window" msgstr "پنجره" -#: js/ui/screenshot.js:1187 +#: js/ui/screenshot.js:1205 msgid "Window Selection" msgstr "گزینش پنجره" -#: js/ui/screenshot.js:1225 +#: js/ui/screenshot.js:1243 msgid "Screenshot / Screencast" msgstr "نماگرفت / ضبط صفحه" -#: js/ui/screenshot.js:1261 +#: js/ui/screenshot.js:1279 msgid "Show Pointer" msgstr "نمایش اشارهگر" #. Translators: this is the folder where recorded #. screencasts are stored. -#: js/ui/screenshot.js:1849 +#: js/ui/screenshot.js:1870 msgid "Screencasts" msgstr "ضبطهای صفحه" #. Translators: this is a filename used for screencast #. * recording, where "%d" and "%t" date and time, e.g. #. * "Screencast from 07-17-2013 10:00:46 PM.webm" -#: js/ui/screenshot.js:1854 +#: js/ui/screenshot.js:1875 #, no-c-format msgid "Screencast from %d %t.webm" msgstr "ضبط صفحه از %t %d.webm" #. Translators: notification source name. -#: js/ui/screenshot.js:1920 js/ui/screenshot.js:2132 +#: js/ui/screenshot.js:1917 js/ui/screenshot.js:2129 msgid "Screenshot" msgstr "نماگرفت" #. Translators: notification title. -#: js/ui/screenshot.js:1926 +#: js/ui/screenshot.js:1923 msgid "Screencast recorded" msgstr "صفحه ضبط شد" #. Translators: notification body when a screencast was recorded. -#: js/ui/screenshot.js:1928 +#: js/ui/screenshot.js:1925 msgid "Click here to view the video." msgstr "برای دیدن ویدیو اینجا بزنید." #. Translators: button on the screencast notification. #. Translators: button on the screenshot notification. -#: js/ui/screenshot.js:1931 js/ui/screenshot.js:2146 +#: js/ui/screenshot.js:1928 js/ui/screenshot.js:2143 msgid "Show in Files" msgstr "نمایش در پروندهها" #. Translators: this is the name of the file that the screenshot is #. saved to. The placeholder is a timestamp, e.g. "2017-05-21 12-24-03". -#: js/ui/screenshot.js:2092 +#: js/ui/screenshot.js:2089 #, javascript-format msgid "Screenshot from %s" msgstr "نماگرفت از %s" #. Translators: notification title. -#: js/ui/screenshot.js:2138 +#: js/ui/screenshot.js:2135 msgid "Screenshot captured" msgstr "نماگرفت ضبط شد" #. Translators: notification body when a screenshot was captured. -#: js/ui/screenshot.js:2140 +#: js/ui/screenshot.js:2137 msgid "You can paste the image from the clipboard." msgstr "میتوانید تصویر را از تختهگیره بچسبانید." -#: js/ui/screenshot.js:2193 js/ui/screenshot.js:2358 +#: js/ui/screenshot.js:2190 js/ui/screenshot.js:2355 msgid "Screenshot taken" msgstr "نماگرفت انجام شد" -#: js/ui/search.js:804 +#: js/ui/search.js:809 msgid "Searching…" msgstr "درحال جستوجو…" -#: js/ui/search.js:806 +#: js/ui/search.js:811 msgid "No results." msgstr "بدون نتیجه." -#: js/ui/search.js:937 +#: js/ui/search.js:942 #, javascript-format msgid "%d more" msgid_plural "%d more" @@ -1946,11 +1946,11 @@ msgstr "کلیک دوم" msgid "Dwell Click" msgstr "کلیک طولانی" -#: js/ui/status/keyboard.js:830 +#: js/ui/status/keyboard.js:842 msgid "Keyboard" msgstr "صفحهکلید" -#: js/ui/status/keyboard.js:847 +#: js/ui/status/keyboard.js:859 msgid "Show Keyboard Layout" msgstr "نمایش چیدمان صفحهکلید" @@ -1985,11 +1985,59 @@ msgid "Connect to %s" msgstr "وصل شدن به %s" #. Translators: %s is a network identifier -#: js/ui/status/network.js:1107 +#: js/ui/status/network.js:1113 #, javascript-format msgid "%s Hotspot" msgstr "نقطهٔ داغ %s" +#: js/ui/status/network.js:1472 js/ui/status/network.js:1488 +msgid "VPN" +msgstr "ویپیان" + +#: js/ui/status/network.js:1473 +msgid "VPN Settings" +msgstr "تنظیمات ویپیان" + +#: js/ui/status/network.js:1722 +msgid "Wi–Fi" +msgstr "وایفای" + +#: js/ui/status/network.js:1724 +msgid "All Networks" +msgstr "همهٔ شبکهها" + +#: js/ui/status/network.js:1821 +msgid "Wired Connections" +msgstr "اتّصالهای سیمی" + +#: js/ui/status/network.js:1822 +msgid "Wired Settings" +msgstr "تنظیمات اتّصال سیمی" + +#: js/ui/status/network.js:1836 +msgid "Bluetooth Tethers" +msgstr "چترهای بلوتوث" + +#: js/ui/status/network.js:1837 +msgid "Bluetooth Settings" +msgstr "تنظیمات بلوتوث" + +#: js/ui/status/network.js:1851 +msgid "Mobile Connections" +msgstr "اتّصالهای همراه" + +#: js/ui/status/network.js:1853 +msgid "Mobile Broadband Settings" +msgstr "تنظیمات پهنباند همراه" + +#: js/ui/status/network.js:1965 +msgid "Connection failed" +msgstr "اتّصال شکست خورد" + +#: js/ui/status/network.js:1966 +msgid "Activation of network connection failed" +msgstr "فعّالسازی اتّصال شبکه شکست خورد" + #: js/ui/status/nightLight.js:20 msgid "Night Light" msgstr "نور شب" @@ -2009,15 +2057,15 @@ msgctxt "Power profile" msgid "Power Saver" msgstr "ذخیرهٔ نیرو" -#: js/ui/status/powerProfiles.js:68 +#: js/ui/status/powerProfiles.js:70 msgid "Power Profiles" msgstr "نمایههای نیرو" -#: js/ui/status/remoteAccess.js:74 +#: js/ui/status/remoteAccess.js:72 msgid "Stop Screencast" msgstr "توقّف ضبط صفحه" -#: js/ui/status/remoteAccess.js:144 +#: js/ui/status/remoteAccess.js:142 msgid "Stop Screen Sharing" msgstr "توقّف همرسانی صفحه" @@ -2099,19 +2147,19 @@ msgstr "خطای تأیید هویت تاندربولت" msgid "Could not authorize the Thunderbolt device: %s" msgstr "نمیتوان افزارهٔ تاندربولت را تأیید هویت کرد: %s" -#: js/ui/status/volume.js:191 +#: js/ui/status/volume.js:194 msgid "Volume changed" msgstr "حجم صدا تغییر کرد" -#: js/ui/status/volume.js:253 +#: js/ui/status/volume.js:256 msgid "Volume" msgstr "حجم صدا" -#: js/ui/status/volume.js:269 +#: js/ui/status/volume.js:272 msgid "Sound Output" msgstr "خروجی صدا" -#: js/ui/status/volume.js:337 +#: js/ui/status/volume.js:340 msgid "Sound Input" msgstr "ورودی صدا" @@ -2551,26 +2599,18 @@ msgstr "آرگومان ناشناخته" msgid "UUID, name and description are required" msgstr "شناسهٔ یکتا، نام و شرح مورد نیازند" -#: subprojects/extensions-tool/src/command-disable.c:46 -#: subprojects/extensions-tool/src/command-enable.c:46 -#: subprojects/extensions-tool/src/command-info.c:50 -#: subprojects/extensions-tool/src/command-list.c:64 -#: subprojects/extensions-tool/src/main.c:146 -msgid "Failed to connect to GNOME Shell\n" -msgstr "شکست در وصل شدن به پوستهٔ گنوم\n" - -#: subprojects/extensions-tool/src/command-disable.c:53 -#: subprojects/extensions-tool/src/command-enable.c:53 +#: subprojects/extensions-tool/src/command-disable.c:62 +#: subprojects/extensions-tool/src/command-enable.c:62 #, c-format msgid "Extension “%s” does not exist\n" msgstr "افزونهٔ «%s» وجود ندارد\n" -#: subprojects/extensions-tool/src/command-disable.c:101 +#: subprojects/extensions-tool/src/command-disable.c:98 msgid "Disable an extension" msgstr "از کار انداختن یک افزونه" -#: subprojects/extensions-tool/src/command-disable.c:119 -#: subprojects/extensions-tool/src/command-enable.c:119 +#: subprojects/extensions-tool/src/command-disable.c:116 +#: subprojects/extensions-tool/src/command-enable.c:116 #: subprojects/extensions-tool/src/command-info.c:103 #: subprojects/extensions-tool/src/command-prefs.c:105 #: subprojects/extensions-tool/src/command-reset.c:76 @@ -2578,8 +2618,8 @@ msgstr "از کار انداختن یک افزونه" msgid "No UUID given" msgstr "هیچ شناسهٔ یکتایی داده نشده" -#: subprojects/extensions-tool/src/command-disable.c:124 -#: subprojects/extensions-tool/src/command-enable.c:124 +#: subprojects/extensions-tool/src/command-disable.c:121 +#: subprojects/extensions-tool/src/command-enable.c:121 #: subprojects/extensions-tool/src/command-info.c:108 #: subprojects/extensions-tool/src/command-prefs.c:110 #: subprojects/extensions-tool/src/command-reset.c:81 @@ -2587,10 +2627,16 @@ msgstr "هیچ شناسهٔ یکتایی داده نشده" msgid "More than one UUID given" msgstr "بیش از یک شناسهٔ یکتا داده شده" -#: subprojects/extensions-tool/src/command-enable.c:101 +#: subprojects/extensions-tool/src/command-enable.c:98 msgid "Enable an extension" msgstr "به کار انداختن یک افزونه" +#: subprojects/extensions-tool/src/command-info.c:50 +#: subprojects/extensions-tool/src/command-list.c:64 +#: subprojects/extensions-tool/src/main.c:146 +msgid "Failed to connect to GNOME Shell\n" +msgstr "شکست در وصل شدن به پوستهٔ گنوم\n" + #: subprojects/extensions-tool/src/command-info.c:59 #: subprojects/extensions-tool/src/main.c:155 #, c-format @@ -2855,7 +2901,7 @@ msgstr "افزودن نقشکی به نوار بالا" #. translators: #. * The number of sound outputs on a particular device -#: subprojects/gvc/gvc-mixer-control.c:1907 +#: subprojects/gvc/gvc-mixer-control.c:1915 #, c-format msgid "%u Output" msgid_plural "%u Outputs" @@ -2864,14 +2910,14 @@ msgstr[1] "%Iu خروجی" #. translators: #. * The number of sound inputs on a particular device -#: subprojects/gvc/gvc-mixer-control.c:1917 +#: subprojects/gvc/gvc-mixer-control.c:1925 #, c-format msgid "%u Input" msgid_plural "%u Inputs" msgstr[0] "%Iu ورودی" msgstr[1] "%Iu ورودی" -#: subprojects/gvc/gvc-mixer-control.c:2867 +#: subprojects/gvc/gvc-mixer-control.c:2876 msgid "System Sounds" msgstr "صداهای سامانه" @@ -2890,15 +2936,6 @@ msgstr "صداهای سامانه" #~ msgid "Log Out" #~ msgstr "خروج" -#~ msgid "Wired Settings" -#~ msgstr "تنظیمات اتّصال سیمی" - -#~ msgid "Mobile Broadband Settings" -#~ msgstr "تنظیمات پهنباند همراه" - -#~ msgid "Bluetooth Settings" -#~ msgstr "تنظیمات بلوتوث" - #~ msgid "Connect to Internet" #~ msgstr "وصل شدن به اینترنت" @@ -2926,9 +2963,6 @@ msgstr "صداهای سامانه" #~ msgid "Select a network" #~ msgstr "شبکهای برگزینید" -#~ msgid "No Networks" -#~ msgstr "هیچ شبکهای نیست" - #~ msgid "Use hardware switch to turn off" #~ msgstr "برای خاموش کردن از کلید سختافزاری استفاده کنید" @@ -2938,12 +2972,6 @@ msgstr "صداهای سامانه" #~ msgid "Wi-Fi Settings" #~ msgstr "تنظیمات وایفای" -#~ msgid "VPN Settings" -#~ msgstr "تنظیمات ویپیان" - -#~ msgid "VPN" -#~ msgstr "ویپیان" - #~ msgid "VPN Off" #~ msgstr "ویپیان خاموش است" @@ -2957,30 +2985,12 @@ msgstr "صداهای سامانه" #~ msgstr[1] "اتّصال وایفای %s" #, javascript-format -#~ msgid "%s Wired Connection" -#~ msgid_plural "%s Wired Connections" -#~ msgstr[0] "اتّصال سیمی %s" -#~ msgstr[1] "اتّصال سیمی %s" - -#, javascript-format #~ msgid "%s Bluetooth Connection" #~ msgid_plural "%s Bluetooth Connections" #~ msgstr[0] "اتّصال بلوتوثی %s" #~ msgstr[1] "اتّصالهای بلوتوثی %s" #, javascript-format -#~ msgid "%s Modem Connection" -#~ msgid_plural "%s Modem Connections" -#~ msgstr[0] "اتّصال مودم %s" -#~ msgstr[1] "اتّصال مودم %s" - -#~ msgid "Connection failed" -#~ msgstr "اتّصال شکست خورد" - -#~ msgid "Activation of network connection failed" -#~ msgstr "فعّالسازی اتّصال شبکه شکست خورد" - -#, javascript-format #~ msgid "%s Off" #~ msgstr "%s خاموش است" @@ -589,9 +589,11 @@ main (int argc, char **argv) shell_profiler_shutdown (); +#if 0 g_debug ("Doing final cleanup"); _shell_global_destroy_gjs_context (shell_global_get ()); g_object_unref (shell_global_get ()); +#endif return ecode; } diff --git a/src/st/st-viewport.c b/src/st/st-viewport.c index 3f0cdbb..e6b9127 100644 --- a/src/st/st-viewport.c +++ b/src/st/st-viewport.c @@ -370,10 +370,10 @@ st_viewport_apply_transform (ClutterActor *actor, graphene_point3d_t p = GRAPHENE_POINT3D_INIT_ZERO; if (priv->hadjustment) - p.x = -get_hadjustment_value (viewport); + p.x = -(int)get_hadjustment_value (viewport); if (priv->vadjustment) - p.y = -st_adjustment_get_value (priv->vadjustment); + p.y = -(int)st_adjustment_get_value (priv->vadjustment); graphene_matrix_translate (matrix, &p); @@ -384,8 +384,8 @@ st_viewport_apply_transform (ClutterActor *actor, * up or the background and borders will be drawn in the wrong place */ static void get_border_paint_offsets (StViewport *viewport, - double *x, - double *y) + int *x, + int *y) { StViewportPrivate *priv = st_viewport_get_instance_private (viewport); @@ -408,7 +408,7 @@ st_viewport_paint (ClutterActor *actor, StViewport *viewport = ST_VIEWPORT (actor); StViewportPrivate *priv = st_viewport_get_instance_private (viewport); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); - double x, y; + int x, y; ClutterActorBox allocation_box; ClutterActorBox content_box; ClutterActor *child; @@ -418,7 +418,7 @@ st_viewport_paint (ClutterActor *actor, if (x != 0 || y != 0) { cogl_framebuffer_push_matrix (fb); - cogl_framebuffer_translate (fb, (int)x, (int)y, 0); + cogl_framebuffer_translate (fb, x, y, 0); } st_widget_paint_background (ST_WIDGET (actor), paint_context); @@ -465,7 +465,7 @@ st_viewport_pick (ClutterActor *actor, StViewport *viewport = ST_VIEWPORT (actor); StViewportPrivate *priv = st_viewport_get_instance_private (viewport); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); - double x, y; + int x, y; g_autoptr (ClutterActorBox) allocation_box = NULL; ClutterActorBox content_box; ClutterActor *child; @@ -506,8 +506,7 @@ st_viewport_get_paint_volume (ClutterActor *actor, StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); ClutterActorBox allocation_box; ClutterActorBox content_box; - graphene_point3d_t origin; - double x, y, lower, upper; + int x, y; /* Setting the paint volume does not make sense when we don't have any allocation */ if (!clutter_actor_has_allocation (actor)) @@ -524,35 +523,9 @@ st_viewport_get_paint_volume (ClutterActor *actor, clutter_actor_get_allocation_box (actor, &allocation_box); st_theme_node_get_content_box (theme_node, &allocation_box, &content_box); - origin.x = content_box.x1 - allocation_box.x1; - origin.y = content_box.y1 - allocation_box.y2; - origin.z = 0.f; - if (priv->hadjustment) - { - g_object_get (priv->hadjustment, - "lower", &lower, - "upper", &upper, - NULL); - width = upper - lower; - } - else - { - width = content_box.x2 - content_box.x1; - } - - if (priv->vadjustment) - { - g_object_get (priv->vadjustment, - "lower", &lower, - "upper", &upper, - NULL); - height = upper - lower; - } - else - { - height = content_box.y2 - content_box.y1; - } + width = content_box.x2 - content_box.x1; + height = content_box.y2 - content_box.y1; clutter_paint_volume_set_width (volume, width); clutter_paint_volume_set_height (volume, height); @@ -570,6 +543,8 @@ st_viewport_get_paint_volume (ClutterActor *actor, get_border_paint_offsets (viewport, &x, &y); if (x != 0 || y != 0) { + graphene_point3d_t origin; + clutter_paint_volume_get_origin (volume, &origin); origin.x += x; origin.y += y; diff --git a/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in b/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in index eebbc8d..8ce6332 100644 --- a/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in +++ b/subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in @@ -39,6 +39,9 @@ </description> <releases> + <release version="43.9" date="2023-09-16"/> + <release version="43.8" date="2023-08-22"/> + <release version="43.7" date="2023-07-04"/> <release version="43.6" date="2023-06-03"/> <release version="43.5" date="2023-04-24"/> <release version="43.4" date="2023-03-19"/> diff --git a/subprojects/extensions-app/meson.build b/subprojects/extensions-app/meson.build index 77af7a5..dfb28dc 100644 --- a/subprojects/extensions-app/meson.build +++ b/subprojects/extensions-app/meson.build @@ -1,5 +1,5 @@ project('gnome-extensions-app', - version: '43.6', + version: '43.9', meson_version: '>= 0.58.0', license: 'GPLv2+' ) diff --git a/subprojects/extensions-tool/meson.build b/subprojects/extensions-tool/meson.build index 17e3bbe..11e48d9 100644 --- a/subprojects/extensions-tool/meson.build +++ b/subprojects/extensions-tool/meson.build @@ -1,5 +1,5 @@ project('gnome-extensions-tool', 'c', - version: '43.6', + version: '43.9', meson_version: '>= 0.58.0', license: 'GPLv2+' ) diff --git a/subprojects/gvc/.gitlab-ci.yml b/subprojects/gvc/.gitlab-ci.yml index ad894f0..447a655 100644 --- a/subprojects/gvc/.gitlab-ci.yml +++ b/subprojects/gvc/.gitlab-ci.yml @@ -5,9 +5,12 @@ build-fedora: image: fedora:latest stage: test before_script: - - dnf install -y redhat-rpm-config gcc meson pulseaudio-libs-devel alsa-lib-devel gtk3-devel + - dnf install -y redhat-rpm-config gcc clang meson pulseaudio-libs-devel alsa-lib-devel gtk3-devel script: - cd .gitlab-ci - meson _build - ninja -C _build + - rm -rf _build + - CC=clang meson _build + - ninja -C _build diff --git a/subprojects/gvc/gvc-channel-map.c b/subprojects/gvc/gvc-channel-map.c index bf4d737..688a451 100644 --- a/subprojects/gvc/gvc-channel-map.c +++ b/subprojects/gvc/gvc-channel-map.c @@ -166,8 +166,7 @@ gvc_channel_map_class_init (GvcChannelMapClass *klass) G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcChannelMapClass, volume_changed), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); } diff --git a/subprojects/gvc/gvc-mixer-card.c b/subprojects/gvc/gvc-mixer-card.c index 93be4da..39f59ca 100644 --- a/subprojects/gvc/gvc-mixer-card.c +++ b/subprojects/gvc/gvc-mixer-card.c @@ -61,7 +61,9 @@ enum PROP_ICON_NAME, PROP_PROFILE, PROP_HUMAN_PROFILE, + N_PROPS }; +static GParamSpec *obj_props[N_PROPS] = { NULL, }; static void gvc_mixer_card_finalize (GObject *object); @@ -117,7 +119,7 @@ gvc_mixer_card_set_name (GvcMixerCard *card, g_free (card->priv->name); card->priv->name = g_strdup (name); - g_object_notify (G_OBJECT (card), "name"); + g_object_notify_by_pspec (G_OBJECT (card), obj_props[PROP_NAME]); return TRUE; } @@ -137,7 +139,7 @@ gvc_mixer_card_set_icon_name (GvcMixerCard *card, g_free (card->priv->icon_name); card->priv->icon_name = g_strdup (icon_name); - g_object_notify (G_OBJECT (card), "icon-name"); + g_object_notify_by_pspec (G_OBJECT (card), obj_props[PROP_ICON_NAME]); return TRUE; } @@ -191,7 +193,7 @@ gvc_mixer_card_set_profile (GvcMixerCard *card, } } - g_object_notify (G_OBJECT (card), "profile"); + g_object_notify_by_pspec (G_OBJECT (card), obj_props[PROP_PROFILE]); return TRUE; } @@ -468,54 +470,42 @@ gvc_mixer_card_class_init (GvcMixerCardClass *klass) gobject_class->set_property = gvc_mixer_card_set_property; gobject_class->get_property = gvc_mixer_card_get_property; - g_object_class_install_property (gobject_class, - PROP_INDEX, - g_param_spec_ulong ("index", - "Index", - "The index for this card", - 0, G_MAXULONG, 0, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, - PROP_ID, - g_param_spec_ulong ("id", - "id", - "The id for this card", - 0, G_MAXULONG, 0, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, - PROP_PA_CONTEXT, - g_param_spec_pointer ("pa-context", - "PulseAudio context", - "The PulseAudio context for this card", - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, - PROP_NAME, - g_param_spec_string ("name", - "Name", - "Name to display for this card", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_ICON_NAME, - g_param_spec_string ("icon-name", - "Icon Name", - "Name of icon to display for this card", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_PROFILE, - g_param_spec_string ("profile", - "Profile", - "Name of current profile for this card", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_HUMAN_PROFILE, - g_param_spec_string ("human-profile", - "Profile (Human readable)", - "Name of current profile for this card in human readable form", - NULL, - G_PARAM_READABLE)); + obj_props[PROP_INDEX] = g_param_spec_ulong ("index", + "Index", + "The index for this card", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + obj_props[PROP_ID] = g_param_spec_ulong ("id", + "id", + "The id for this card", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + obj_props[PROP_PA_CONTEXT] = g_param_spec_pointer ("pa-context", + "PulseAudio context", + "The PulseAudio context for this card", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + obj_props[PROP_NAME] = g_param_spec_string ("name", + "Name", + "Name to display for this card", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_ICON_NAME] = g_param_spec_string ("icon-name", + "Icon Name", + "Name of icon to display for this card", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_PROFILE] = g_param_spec_string ("profile", + "Profile", + "Name of current profile for this card", + NULL, + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); + obj_props[PROP_HUMAN_PROFILE] = g_param_spec_string ("human-profile", + "Profile (Human readable)", + "Name of current profile for this card in human readable form", + NULL, + G_PARAM_READABLE|G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPS, obj_props); } static void diff --git a/subprojects/gvc/gvc-mixer-control.c b/subprojects/gvc/gvc-mixer-control.c index 6218a1b..b603b77 100644 --- a/subprojects/gvc/gvc-mixer-control.c +++ b/subprojects/gvc/gvc-mixer-control.c @@ -54,8 +54,10 @@ enum { PROP_0, - PROP_NAME + PROP_NAME, + N_PROPS }; +static GParamSpec *obj_props[N_PROPS] = { NULL, }; struct GvcMixerControlPrivate { @@ -1234,7 +1236,7 @@ match_stream_with_devices (GvcMixerControl *control, for (d = devices; d != NULL; d = d->next) { GvcMixerUIDevice *device; - gint device_stream_id; + guint device_stream_id; gchar *device_port_name; gchar *origin; gchar *description; @@ -1276,7 +1278,7 @@ match_stream_with_devices (GvcMixerControl *control, stream_id); g_object_set (G_OBJECT (device), - "stream-id", (gint)stream_id, + "stream-id", stream_id, NULL); in_possession = TRUE; } @@ -1322,7 +1324,6 @@ sync_devices (GvcMixerControl *control, const GList *stream_ports; const GList *n = NULL; gboolean is_output = !GVC_IS_MIXER_SOURCE (stream); - gint stream_port_count = 0; stream_ports = gvc_mixer_stream_get_ports (stream); @@ -1366,7 +1367,7 @@ sync_devices (GvcMixerControl *control, } g_object_set (G_OBJECT (device), - "stream-id", (gint)gvc_mixer_stream_get_id (stream), + "stream-id", gvc_mixer_stream_get_id (stream), "description", gvc_mixer_stream_get_description (stream), "origin", "", /*Leave it empty for these special cases*/ "port-name", NULL, @@ -1376,7 +1377,7 @@ sync_devices (GvcMixerControl *control, GObject *object; object = g_object_new (GVC_TYPE_MIXER_UI_DEVICE, - "stream-id", (gint)gvc_mixer_stream_get_id (stream), + "stream-id", gvc_mixer_stream_get_id (stream), "description", gvc_mixer_stream_get_description (stream), "origin", "", /* Leave it empty for these special cases */ "port-name", NULL, @@ -1402,7 +1403,6 @@ sync_devices (GvcMixerControl *control, GvcMixerStreamPort *stream_port; stream_port = n->data; - stream_port_count ++; if (match_stream_with_devices (control, stream_port, stream)) continue; @@ -1806,7 +1806,7 @@ update_sink_input (GvcMixerControl *control, set_application_id_from_proplist (stream, info->proplist); set_is_event_stream_from_proplist (stream, info->proplist); - set_icon_name_from_proplist (stream, info->proplist, "applications-multimedia"); + set_icon_name_from_proplist (stream, info->proplist, "application-x-executable"); gvc_mixer_stream_set_volume (stream, (guint)max_volume); gvc_mixer_stream_set_is_muted (stream, info->mute); gvc_mixer_stream_set_is_virtual (stream, info->client == PA_INVALID_INDEX); @@ -2874,7 +2874,7 @@ update_event_role_stream (GvcMixerControl *control, max_volume = pa_cvolume_max (&info->volume); gvc_mixer_stream_set_name (stream, _("System Sounds")); - gvc_mixer_stream_set_icon_name (stream, "emblem-system-symbolic"); + gvc_mixer_stream_set_icon_name (stream, "audio-x-generic"); gvc_mixer_stream_set_volume (stream, (guint)max_volume); gvc_mixer_stream_set_is_muted (stream, info->mute); @@ -3119,6 +3119,9 @@ remove_card (GvcMixerControl *control, g_object_get (G_OBJECT (device), "card", &card, NULL); + if (card == NULL) + continue; + if (gvc_mixer_card_get_index (card) == index) { g_signal_emit (G_OBJECT (control), signals[gvc_mixer_ui_device_is_output (device) ? OUTPUT_REMOVED : INPUT_REMOVED], @@ -3434,15 +3437,22 @@ gvc_mixer_new_pa_context (GvcMixerControl *self) } static void -remove_all_streams (GvcMixerControl *control, GHashTable *hash_table) +remove_all_items (GvcMixerControl *control, + GHashTable *hash_table, + void (*remove_item)(GvcMixerControl *control, guint index)) { GHashTableIter iter; gpointer key, value; g_hash_table_iter_init (&iter, hash_table); while (g_hash_table_iter_next (&iter, &key, &value)) { - remove_stream (control, value); - g_hash_table_iter_remove (&iter); + if (remove_item) { + remove_item (control, GPOINTER_TO_UINT (key)); + g_hash_table_remove (hash_table, key); + g_hash_table_iter_init (&iter, hash_table); + } else { + g_hash_table_iter_remove (&iter); + } } } @@ -3450,11 +3460,22 @@ static gboolean idle_reconnect (gpointer data) { GvcMixerControl *control = GVC_MIXER_CONTROL (data); - GHashTableIter iter; - gpointer key, value; g_return_val_if_fail (control, FALSE); + g_debug ("Reconnect: clean up all objects"); + + remove_all_items (control, control->priv->sinks, remove_sink); + remove_all_items (control, control->priv->sources, remove_source); + remove_all_items (control, control->priv->sink_inputs, remove_sink_input); + remove_all_items (control, control->priv->source_outputs, remove_source_output); + remove_all_items (control, control->priv->cards, remove_card); + remove_all_items (control, control->priv->ui_inputs, NULL); + remove_all_items (control, control->priv->ui_outputs, NULL); + remove_all_items (control, control->priv->clients, remove_client); + + g_debug ("Reconnect: make new connection"); + if (control->priv->pa_context) { pa_context_unref (control->priv->pa_context); control->priv->pa_context = NULL; @@ -3462,15 +3483,6 @@ idle_reconnect (gpointer data) gvc_mixer_new_pa_context (control); } - remove_all_streams (control, control->priv->sinks); - remove_all_streams (control, control->priv->sources); - remove_all_streams (control, control->priv->sink_inputs); - remove_all_streams (control, control->priv->source_outputs); - - g_hash_table_iter_init (&iter, control->priv->clients); - while (g_hash_table_iter_next (&iter, &key, &value)) - g_hash_table_iter_remove (&iter); - gvc_mixer_control_open (control); /* cannot fail */ control->priv->reconnect_id = 0; @@ -3628,7 +3640,7 @@ gvc_mixer_control_set_property (GObject *object, case PROP_NAME: g_free (self->priv->name); self->priv->name = g_value_dup_string (value); - g_object_notify (G_OBJECT (self), "name"); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_NAME]); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -3684,133 +3696,117 @@ gvc_mixer_control_class_init (GvcMixerControlClass *klass) object_class->set_property = gvc_mixer_control_set_property; object_class->get_property = gvc_mixer_control_get_property; - g_object_class_install_property (object_class, - PROP_NAME, - g_param_spec_string ("name", - "Name", - "Name to display for this mixer control", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); + obj_props[PROP_NAME] = g_param_spec_string ("name", + "Name", + "Name to display for this mixer control", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, N_PROPS, obj_props); signals [STATE_CHANGED] = g_signal_new ("state-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, state_changed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [STREAM_ADDED] = g_signal_new ("stream-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, stream_added), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [STREAM_REMOVED] = g_signal_new ("stream-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, stream_removed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [STREAM_CHANGED] = g_signal_new ("stream-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, stream_changed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [AUDIO_DEVICE_SELECTION_NEEDED] = g_signal_new ("audio-device-selection-needed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, - NULL, NULL, - g_cclosure_marshal_generic, + NULL, NULL, NULL, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_UINT); signals [CARD_ADDED] = g_signal_new ("card-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, card_added), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [CARD_REMOVED] = g_signal_new ("card-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, card_removed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [DEFAULT_SINK_CHANGED] = g_signal_new ("default-sink-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, default_sink_changed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [DEFAULT_SOURCE_CHANGED] = g_signal_new ("default-source-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, default_source_changed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [ACTIVE_OUTPUT_UPDATE] = g_signal_new ("active-output-update", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, active_output_update), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [ACTIVE_INPUT_UPDATE] = g_signal_new ("active-input-update", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, active_input_update), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [OUTPUT_ADDED] = g_signal_new ("output-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, output_added), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [INPUT_ADDED] = g_signal_new ("input-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, input_added), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [OUTPUT_REMOVED] = g_signal_new ("output-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, output_removed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); signals [INPUT_REMOVED] = g_signal_new ("input-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GvcMixerControlClass, input_removed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); } diff --git a/subprojects/gvc/gvc-mixer-event-role.c b/subprojects/gvc/gvc-mixer-event-role.c index 9f5e26a..272edb0 100644 --- a/subprojects/gvc/gvc-mixer-event-role.c +++ b/subprojects/gvc/gvc-mixer-event-role.c @@ -42,8 +42,10 @@ struct GvcMixerEventRolePrivate enum { PROP_0, - PROP_DEVICE + PROP_DEVICE, + N_PROPS }; +static GParamSpec *obj_props[N_PROPS] = { NULL, }; static void gvc_mixer_event_role_finalize (GObject *object); @@ -115,7 +117,7 @@ gvc_mixer_event_role_set_device (GvcMixerEventRole *role, g_free (role->priv->device); role->priv->device = g_strdup (device); - g_object_notify (G_OBJECT (role), "device"); + g_object_notify_by_pspec (G_OBJECT (role), obj_props[PROP_DEVICE]); return TRUE; } @@ -169,13 +171,12 @@ gvc_mixer_event_role_class_init (GvcMixerEventRoleClass *klass) stream_class->push_volume = gvc_mixer_event_role_push_volume; stream_class->change_is_muted = gvc_mixer_event_role_change_is_muted; - g_object_class_install_property (object_class, - PROP_DEVICE, - g_param_spec_string ("device", - "Device", - "Device", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + obj_props[PROP_DEVICE] = g_param_spec_string ("device", + "Device", + "Device", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, N_PROPS, obj_props); } static void diff --git a/subprojects/gvc/gvc-mixer-stream.c b/subprojects/gvc/gvc-mixer-stream.c index c324900..f9bcc40 100644 --- a/subprojects/gvc/gvc-mixer-stream.c +++ b/subprojects/gvc/gvc-mixer-stream.c @@ -83,7 +83,9 @@ enum PROP_CARD_INDEX, PROP_PORT, PROP_STATE, + N_PROPS }; +static GParamSpec *obj_props[N_PROPS] = { NULL, }; static void gvc_mixer_stream_finalize (GObject *object); @@ -198,7 +200,7 @@ gvc_mixer_stream_set_volume (GvcMixerStream *stream, if (!pa_cvolume_equal(gvc_channel_map_get_cvolume(stream->priv->channel_map), &cv)) { gvc_channel_map_volume_changed(stream->priv->channel_map, &cv, FALSE); - g_object_notify (G_OBJECT (stream), "volume"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_VOLUME]); return TRUE; } @@ -218,7 +220,7 @@ gvc_mixer_stream_set_decibel (GvcMixerStream *stream, if (!pa_cvolume_equal(gvc_channel_map_get_cvolume(stream->priv->channel_map), &cv)) { gvc_channel_map_volume_changed(stream->priv->channel_map, &cv, FALSE); - g_object_notify (G_OBJECT (stream), "volume"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_VOLUME]); } return TRUE; @@ -246,7 +248,7 @@ gvc_mixer_stream_set_is_muted (GvcMixerStream *stream, if (is_muted != stream->priv->is_muted) { stream->priv->is_muted = is_muted; - g_object_notify (G_OBJECT (stream), "is-muted"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_IS_MUTED]); } return TRUE; @@ -260,7 +262,7 @@ gvc_mixer_stream_set_can_decibel (GvcMixerStream *stream, if (can_decibel != stream->priv->can_decibel) { stream->priv->can_decibel = can_decibel; - g_object_notify (G_OBJECT (stream), "can-decibel"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_CAN_DECIBEL]); } return TRUE; @@ -288,7 +290,7 @@ gvc_mixer_stream_set_name (GvcMixerStream *stream, g_free (stream->priv->name); stream->priv->name = g_strdup (name); - g_object_notify (G_OBJECT (stream), "name"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_NAME]); return TRUE; } @@ -301,7 +303,7 @@ gvc_mixer_stream_set_description (GvcMixerStream *stream, g_free (stream->priv->description); stream->priv->description = g_strdup (description); - g_object_notify (G_OBJECT (stream), "description"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_DESCRIPTION]); return TRUE; } @@ -321,7 +323,7 @@ gvc_mixer_stream_set_is_event_stream (GvcMixerStream *stream, g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); stream->priv->is_event_stream = is_event_stream; - g_object_notify (G_OBJECT (stream), "is-event-stream"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_IS_EVENT_STREAM]); return TRUE; } @@ -341,7 +343,7 @@ gvc_mixer_stream_set_is_virtual (GvcMixerStream *stream, g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); stream->priv->is_virtual = is_virtual; - g_object_notify (G_OBJECT (stream), "is-virtual"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_IS_VIRTUAL]); return TRUE; } @@ -361,7 +363,7 @@ gvc_mixer_stream_set_application_id (GvcMixerStream *stream, g_free (stream->priv->application_id); stream->priv->application_id = g_strdup (application_id); - g_object_notify (G_OBJECT (stream), "application-id"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_APPLICATION_ID]); return TRUE; } @@ -374,7 +376,7 @@ on_channel_map_volume_changed (GvcChannelMap *channel_map, if (set == TRUE) gvc_mixer_stream_push_volume (stream); - g_object_notify (G_OBJECT (stream), "volume"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_VOLUME]); } static gboolean @@ -402,7 +404,7 @@ gvc_mixer_stream_set_channel_map (GvcMixerStream *stream, G_CALLBACK (on_channel_map_volume_changed), stream); - g_object_notify (G_OBJECT (stream), "channel-map"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_CHANNEL_MAP]); } return TRUE; @@ -452,7 +454,7 @@ gvc_mixer_stream_set_icon_name (GvcMixerStream *stream, g_free (stream->priv->icon_name); stream->priv->icon_name = g_strdup (icon_name); - g_object_notify (G_OBJECT (stream), "icon-name"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_ICON_NAME]); return TRUE; } @@ -465,7 +467,7 @@ gvc_mixer_stream_set_form_factor (GvcMixerStream *stream, g_free (stream->priv->form_factor); stream->priv->form_factor = g_strdup (form_factor); - g_object_notify (G_OBJECT (stream), "form-factor"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_FORM_FACTOR]); return TRUE; } @@ -478,7 +480,7 @@ gvc_mixer_stream_set_sysfs_path (GvcMixerStream *stream, g_free (stream->priv->sysfs_path); stream->priv->sysfs_path = g_strdup (sysfs_path); - g_object_notify (G_OBJECT (stream), "sysfs-path"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_SYSFS_PATH]); return TRUE; } @@ -558,7 +560,7 @@ gvc_mixer_stream_set_port (GvcMixerStream *stream, } } - g_object_notify (G_OBJECT (stream), "port"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_PORT]); return TRUE; } @@ -591,7 +593,7 @@ gvc_mixer_stream_set_state (GvcMixerStream *stream, if (stream->priv->state != state) { stream->priv->state = state; - g_object_notify (G_OBJECT (stream), "state"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_STATE]); } return TRUE; @@ -645,7 +647,7 @@ gvc_mixer_stream_set_card_index (GvcMixerStream *stream, g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE); stream->priv->card_index = card_index; - g_object_notify (G_OBJECT (stream), "card-index"); + g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_CARD_INDEX]); return TRUE; } @@ -897,140 +899,103 @@ gvc_mixer_stream_class_init (GvcMixerStreamClass *klass) klass->change_port = gvc_mixer_stream_real_change_port; klass->change_is_muted = gvc_mixer_stream_real_change_is_muted; - g_object_class_install_property (gobject_class, - PROP_INDEX, - g_param_spec_ulong ("index", - "Index", - "The index for this stream", - 0, G_MAXULONG, 0, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, - PROP_ID, - g_param_spec_ulong ("id", - "id", - "The id for this stream", - 0, G_MAXULONG, 0, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, - PROP_CHANNEL_MAP, - g_param_spec_object ("channel-map", - "channel map", - "The channel map for this stream", - GVC_TYPE_CHANNEL_MAP, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_PA_CONTEXT, - g_param_spec_pointer ("pa-context", - "PulseAudio context", - "The PulseAudio context for this stream", - G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, - PROP_VOLUME, - g_param_spec_ulong ("volume", - "Volume", - "The volume for this stream", - 0, G_MAXULONG, 0, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_DECIBEL, - g_param_spec_double ("decibel", - "Decibel", - "The decibel level for this stream", - -G_MAXDOUBLE, G_MAXDOUBLE, 0, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - - g_object_class_install_property (gobject_class, - PROP_NAME, - g_param_spec_string ("name", - "Name", - "Name to display for this stream", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_DESCRIPTION, - g_param_spec_string ("description", - "Description", - "Description to display for this stream", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_APPLICATION_ID, - g_param_spec_string ("application-id", + obj_props[PROP_INDEX] = g_param_spec_ulong ("index", + "Index", + "The index for this stream", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + obj_props[PROP_ID] = g_param_spec_ulong ("id", + "id", + "The id for this stream", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + obj_props[PROP_CHANNEL_MAP] = g_param_spec_object ("channel-map", + "channel map", + "The channel map for this stream", + GVC_TYPE_CHANNEL_MAP, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_PA_CONTEXT] = g_param_spec_pointer ("pa-context", + "PulseAudio context", + "The PulseAudio context for this stream", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS); + obj_props[PROP_VOLUME] = g_param_spec_ulong ("volume", + "Volume", + "The volume for this stream", + 0, G_MAXULONG, 0, + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); + obj_props[PROP_DECIBEL] = g_param_spec_double ("decibel", + "Decibel", + "The decibel level for this stream", + -G_MAXDOUBLE, G_MAXDOUBLE, 0, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_NAME] = g_param_spec_string ("name", + "Name", + "Name to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_DESCRIPTION] = g_param_spec_string ("description", + "Description", + "Description to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_APPLICATION_ID] = g_param_spec_string ("application-id", "Application identifier", "Application identifier for this stream", NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_ICON_NAME, - g_param_spec_string ("icon-name", - "Icon Name", - "Name of icon to display for this stream", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_FORM_FACTOR, - g_param_spec_string ("form-factor", - "Form Factor", - "Device form factor for this stream, as reported by PulseAudio", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_SYSFS_PATH, - g_param_spec_string ("sysfs-path", - "Sysfs path", - "Sysfs path for the device associated with this stream", - NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_IS_MUTED, - g_param_spec_boolean ("is-muted", - "is muted", - "Whether stream is muted", - FALSE, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_CAN_DECIBEL, - g_param_spec_boolean ("can-decibel", - "can decibel", - "Whether stream volume can be converted to decibel units", - FALSE, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_IS_EVENT_STREAM, - g_param_spec_boolean ("is-event-stream", - "is event stream", - "Whether stream's role is to play an event", - FALSE, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_IS_VIRTUAL, - g_param_spec_boolean ("is-virtual", - "is virtual stream", - "Whether the stream is virtual", - FALSE, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); - g_object_class_install_property (gobject_class, - PROP_PORT, - g_param_spec_string ("port", - "Port", - "The name of the current port for this stream", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_STATE, - g_param_spec_enum ("state", - "State", - "The current state of this stream", - GVC_TYPE_MIXER_STREAM_STATE, - GVC_STREAM_STATE_INVALID, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_CARD_INDEX, - g_param_spec_long ("card-index", - "Card index", - "The index of the card for this stream", - PA_INVALID_INDEX, G_MAXLONG, PA_INVALID_INDEX, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT)); + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_ICON_NAME] = g_param_spec_string ("icon-name", + "Icon Name", + "Name of icon to display for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_FORM_FACTOR] = g_param_spec_string ("form-factor", + "Form Factor", + "Device form factor for this stream, as reported by PulseAudio", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_SYSFS_PATH] = g_param_spec_string ("sysfs-path", + "Sysfs path", + "Sysfs path for the device associated with this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_IS_MUTED] = g_param_spec_boolean ("is-muted", + "is muted", + "Whether stream is muted", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_CAN_DECIBEL] = g_param_spec_boolean ("can-decibel", + "can decibel", + "Whether stream volume can be converted to decibel units", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_IS_EVENT_STREAM] = g_param_spec_boolean ("is-event-stream", + "is event stream", + "Whether stream's role is to play an event", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_IS_VIRTUAL] = g_param_spec_boolean ("is-virtual", + "is virtual stream", + "Whether the stream is virtual", + FALSE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + obj_props[PROP_PORT] = g_param_spec_string ("port", + "Port", + "The name of the current port for this stream", + NULL, + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); + obj_props[PROP_STATE] = g_param_spec_enum ("state", + "State", + "The current state of this stream", + GVC_TYPE_MIXER_STREAM_STATE, + GVC_STREAM_STATE_INVALID, + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); + obj_props[PROP_CARD_INDEX] = g_param_spec_long ("card-index", + "Card index", + "The index of the card for this stream", + PA_INVALID_INDEX, G_MAXLONG, PA_INVALID_INDEX, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPS, obj_props); } static void diff --git a/subprojects/gvc/gvc-mixer-ui-device.c b/subprojects/gvc/gvc-mixer-ui-device.c index f7dd33e..db1a694 100644 --- a/subprojects/gvc/gvc-mixer-ui-device.c +++ b/subprojects/gvc/gvc-mixer-ui-device.c @@ -55,7 +55,9 @@ enum PROP_UI_DEVICE_TYPE, PROP_PORT_AVAILABLE, PROP_ICON_NAME, + N_PROPS }; +static GParamSpec *obj_props[N_PROPS] = { NULL, }; static void gvc_mixer_ui_device_finalize (GObject *object); @@ -224,7 +226,6 @@ static void gvc_mixer_ui_device_class_init (GvcMixerUIDeviceClass *klass) { GObjectClass* object_class = G_OBJECT_CLASS (klass); - GParamSpec *pspec; object_class->constructor = gvc_mixer_ui_device_constructor; object_class->dispose = gvc_mixer_ui_device_dispose; @@ -232,62 +233,64 @@ gvc_mixer_ui_device_class_init (GvcMixerUIDeviceClass *klass) object_class->set_property = gvc_mixer_ui_device_set_property; object_class->get_property = gvc_mixer_ui_device_get_property; - pspec = g_param_spec_string ("description", + obj_props[PROP_DESC_LINE_1] = + g_param_spec_string ("description", "Description construct prop", "Set first line description", "no-name-set", - G_PARAM_READWRITE); - g_object_class_install_property (object_class, PROP_DESC_LINE_1, pspec); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - pspec = g_param_spec_string ("origin", + obj_props[PROP_DESC_LINE_2] = + g_param_spec_string ("origin", "origin construct prop", "Set second line description name", "no-name-set", - G_PARAM_READWRITE); - g_object_class_install_property (object_class, PROP_DESC_LINE_2, pspec); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - pspec = g_param_spec_pointer ("card", + obj_props[PROP_CARD] = + g_param_spec_pointer ("card", "Card from pulse", "Set/Get card", - G_PARAM_READWRITE); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_CARD, pspec); - - pspec = g_param_spec_string ("port-name", + obj_props[PROP_PORT_NAME] = + g_param_spec_string ("port-name", "port-name construct prop", "Set port-name", NULL, - G_PARAM_READWRITE); - g_object_class_install_property (object_class, PROP_PORT_NAME, pspec); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - pspec = g_param_spec_uint ("stream-id", + obj_props[PROP_STREAM_ID] = + g_param_spec_uint ("stream-id", "stream id assigned by gvc-stream", "Set/Get stream id", 0, G_MAXUINT, GVC_MIXER_UI_DEVICE_INVALID, - G_PARAM_READWRITE); - g_object_class_install_property (object_class, PROP_STREAM_ID, pspec); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - pspec = g_param_spec_uint ("type", + obj_props[PROP_UI_DEVICE_TYPE] = + g_param_spec_uint ("type", "ui-device type", "determine whether its an input and output", - 0, 1, 0, G_PARAM_READWRITE); - g_object_class_install_property (object_class, PROP_UI_DEVICE_TYPE, pspec); + 0, 1, 0, + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - pspec = g_param_spec_boolean ("port-available", + obj_props[PROP_PORT_AVAILABLE] = + g_param_spec_boolean ("port-available", "available", "determine whether this port is available", FALSE, - G_PARAM_READWRITE); - g_object_class_install_property (object_class, PROP_PORT_AVAILABLE, pspec); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); - pspec = g_param_spec_string ("icon-name", + obj_props[PROP_ICON_NAME] = + g_param_spec_string ("icon-name", "Icon Name", "Name of icon to display for this card", NULL, - G_PARAM_READWRITE|G_PARAM_CONSTRUCT); - g_object_class_install_property (object_class, PROP_ICON_NAME, pspec); + G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPS, obj_props); } /* Removes the part of the string that starts with skip_prefix @@ -650,7 +653,7 @@ gvc_mixer_ui_device_set_icon_name (GvcMixerUIDevice *device, g_free (device->priv->icon_name); device->priv->icon_name = g_strdup (icon_name); - g_object_notify (G_OBJECT (device), "icon-name"); + g_object_notify_by_pspec (G_OBJECT (device), obj_props[PROP_ICON_NAME]); } diff --git a/subprojects/shew/meson.build b/subprojects/shew/meson.build index ac0f627..58a2499 100644 --- a/subprojects/shew/meson.build +++ b/subprojects/shew/meson.build @@ -1,5 +1,5 @@ project('shew', 'c', - version: '43.6', + version: '43.9', meson_version: '>= 0.58.0', license: 'LGPLv2+', ) |