Compare commits
	
		
			76 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | be76b19300 | ||
|   | 376d696b8b | ||
|   | 695d61968d | ||
|   | d6d09fd3c8 | ||
|   | f1b1501f9b | ||
|   | cdbc99e992 | ||
|   | 69afe7785d | ||
|   | b99e304f1e | ||
|   | c29bd46e7a | ||
|   | 5fcf40b973 | ||
|   | a198dfe3d8 | ||
|   | 5b10d157fe | ||
|   | 5cc42b18b0 | ||
|   | cb4252e888 | ||
|   | 09d3cdb023 | ||
|   | 71515a8a11 | ||
|   | 11ca8dd54f | ||
|   | e00f22ebe6 | ||
|   | 13390543b0 | ||
|   | de95ced92c | ||
|   | f6a08472a0 | ||
|   | 9f7b101437 | ||
|   | 9c0707d4dc | ||
|   | 78a92fb6be | ||
|   | 01509cf1a5 | ||
|   | 61e9f51274 | ||
|   | 201bd9d42e | ||
|   | 8a78f08f6c | ||
|   | a5e54f9712 | ||
|   | 526834e39b | ||
|   | bdde2476d2 | ||
|   | 3171f9debe | ||
|   | 0e2aeac5f9 | ||
|   | 788fb5547c | ||
|   | c4d2c0ee64 | ||
|   | 977686a77a | ||
|   | 44b29f210c | ||
|   | 36c7d65ccf | ||
|   | b81d24fdb4 | ||
|   | bfdbee8115 | ||
|   | 4a17c8f4a9 | ||
|   | d4f67a7d42 | ||
|   | d5769ae409 | ||
|   | f356b61e5a | ||
|   | 398768dcbd | ||
|   | 272d5b6e4a | ||
|   | a479aa2594 | ||
|   | f48d620ac5 | ||
|   | 0684b42f67 | ||
|   | 190a31dd5f | ||
|   | cccfc7faca | ||
|   | 5e9e4f8c73 | ||
|   | b28e48094b | ||
|   | 01bad21704 | ||
|   | aab9a20b6a | ||
|   | 201c5b23f3 | ||
|   | b79e11bef8 | ||
|   | 81dfcb85ca | ||
|   | c8e69a2154 | ||
|   | 3ee50adad9 | ||
|   | d1386ee8e4 | ||
|   | 6b994602d5 | ||
|   | 00039bbb47 | ||
|   | 0195b2f7c0 | ||
|   | adc60f3212 | ||
|   | 579f59816f | ||
|   | 9e0df3c5c6 | ||
|   | c6b14ef97e | ||
|   | 59e535244f | ||
|   | 720b9dd3d2 | ||
|   | 60df5b4381 | ||
|   | 94a4dc4576 | ||
|   | dbda223858 | ||
|   | 822875d5c3 | ||
|   | b11b28b83b | ||
|   | ea0770ae22 | 
							
								
								
									
										38
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,41 @@ | ||||
| 3.28.1 | ||||
| ====== | ||||
| * Fix compose characters in shell entries [Carlos; #115] | ||||
| * Don't show authentication dialogs on lock screen [Florian; #179, #166] | ||||
| * Fix handling of UTC timezone in world clock [Florian; #150] | ||||
| * Fix keyboard navigation in overview when hovering windows [Florian; #50] | ||||
| * Misc. bug fixes [Florian; #127, #788908, #763886, !39] | ||||
|  | ||||
| Contributors: | ||||
|   Jeremy Bicha, Carlos Garnacho, Andy Holmes, Florian Müllner, Bastien Nocera | ||||
|  | ||||
| Translators: | ||||
|   Stas Solovey [ru], Daniel Șerbănescu [ro], Dušan Kazik [sk], | ||||
|   Rafael Fontenelle [pt_BR], Nathan Follens [nl], Dz Chen [zh_CN], | ||||
|   Matej Urbančič [sl], Hannie Dumoleyn [nl], Khaled Hosny [ar], | ||||
|   Guillaume Bernard [fr] | ||||
|  | ||||
| 3.28.0 | ||||
| ====== | ||||
|  | ||||
| Translators: | ||||
|   A S Alam [pa], gogo [hr], Chao-Hsiung Liao [zh_TW], Jordi Mas [ca], | ||||
|   Anders Jonsson [sv], Balázs Úr [hu] | ||||
|  | ||||
| 3.27.92 | ||||
| ======= | ||||
| * Misc. bug fixes [Florian; #64, #66, #72] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Christian Kellner, Florian Müllner | ||||
|  | ||||
| Translators: | ||||
|   Daniel Mustieles [es], Wolfgang Stöggl [de], Cheng-Chia Tseng [zh_TW], | ||||
|   Dušan Kazik [sk], Changwoo Ryu [ko], Furkan Ahmet Kara [tr], Balázs Úr [hu], | ||||
|   Trần Ngọc Quân [vi], Milo Casagrande [it], GNOME Translation Robot [gd, nl], | ||||
|   Marek Cernocky [cs], Aurimas Černius [lt], Alain Lojewski [fr], | ||||
|   Rūdolfs Mazurs [lv], Stas Solovey [ru], Alan Mortensen [da] | ||||
|  | ||||
| 3.27.91 | ||||
| ======= | ||||
| * Fix wrong bluetooth state when disabled by HW airplane mode [Mario; #789110] | ||||
|   | ||||
| @@ -1111,7 +1111,7 @@ StScrollBar { | ||||
|   .aggregate-menu { | ||||
|     min-width: 21em; | ||||
|     .popup-menu-icon { padding: 0 4px; } | ||||
|     .popup-sub-menu .popup-menu-item :first-child { | ||||
|     .popup-sub-menu .popup-menu-item > :first-child { | ||||
|       &:ltr { /* 12px spacing + 2*4px padding */ | ||||
|               padding-left: 20px; margin-left: 1.09em; } | ||||
|       &:rtl { /* 12px spacing + 2*4px padding */ | ||||
|   | ||||
| @@ -188,8 +188,7 @@ var InputMethod = new Lang.Class({ | ||||
|     vfunc_filter_key_event(event) { | ||||
|         if (!this._context || !this._enabled) | ||||
|             return false; | ||||
|         if (!this._currentSource || | ||||
|             this._currentSource.type == Keyboard.INPUT_SOURCE_TYPE_XKB) | ||||
|         if (!this._currentSource) | ||||
|             return false; | ||||
|  | ||||
|         let state = event.get_state(); | ||||
|   | ||||
| @@ -17,7 +17,7 @@ const Params = imports.misc.params; | ||||
| var SCROLL_TIME = 0.1; | ||||
|  | ||||
| // http://daringfireball.net/2010/07/improved_regex_for_matching_urls | ||||
| const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)'; | ||||
| const _balancedParens = '\\([^\\s()<>]+\\)'; | ||||
| const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]'; | ||||
| const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]'; | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,7 @@ const RENAMED_DESKTOP_IDS = { | ||||
|     'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop', | ||||
|     'empathy.desktop': 'org.gnome.Empathy.desktop', | ||||
|     'epiphany.desktop': 'org.gnome.Epiphany.desktop', | ||||
|     'evolution.desktop': 'org.gnome.Evolution.desktop', | ||||
|     'file-roller.desktop': 'org.gnome.FileRoller.desktop', | ||||
|     'gcalctool.desktop': 'org.gnome.Calculator.desktop', | ||||
|     'geary.desktop': 'org.gnome.Geary.desktop', | ||||
| @@ -34,6 +35,7 @@ const RENAMED_DESKTOP_IDS = { | ||||
|     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', | ||||
|     'gnome-software.desktop': 'org.gnome.Software.desktop', | ||||
|     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', | ||||
|     'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop', | ||||
|     'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop', | ||||
|     'gnomine.desktop': 'gnome-mines.desktop', | ||||
|     'gnotravex.desktop': 'gnome-tetravex.desktop', | ||||
|   | ||||
| @@ -765,57 +765,29 @@ var NetworkAgent = new Lang.Class({ | ||||
|         this._vpnCacheBuilt = true; | ||||
|         this._vpnBinaries = { }; | ||||
|  | ||||
|         try { | ||||
|             let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null); | ||||
|             let info; | ||||
|         NM.VpnPluginInfo.list_load().forEach(plugin => { | ||||
|             let service = plugin.get_service(); | ||||
|             let fileName = plugin.get_auth_dialog(); | ||||
|             let supportsHints = plugin.supports_hints(); | ||||
|             let externalUIMode = false; | ||||
|  | ||||
|             while ((info = fileEnum.next_file(null))) { | ||||
|                 let name = info.get_name(); | ||||
|                 if (name.substr(-5) != '.name') | ||||
|                     continue; | ||||
|  | ||||
|                 try { | ||||
|                     let keyfile = new GLib.KeyFile(); | ||||
|                     keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE); | ||||
|                     let service = keyfile.get_string('VPN Connection', 'service'); | ||||
|                     let binary = keyfile.get_string('GNOME', 'auth-dialog'); | ||||
|                     let externalUIMode = false; | ||||
|                     let hints = false; | ||||
|  | ||||
|                     try { | ||||
|                         externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode'); | ||||
|                     } catch(e) { } // ignore errors if key does not exist | ||||
|  | ||||
|                     try { | ||||
|                         hints = keyfile.get_boolean('GNOME', 'supports-hints'); | ||||
|                     } catch(e) { } // ignore errors if key does not exist | ||||
|  | ||||
|                     let path = binary; | ||||
|                     if (!GLib.path_is_absolute(path)) { | ||||
|                         path = GLib.build_filenamev([Config.LIBEXECDIR, path]); | ||||
|                     } | ||||
|  | ||||
|                     if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) { | ||||
|                         this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints }; | ||||
|                         try { | ||||
|                             let aliases = keyfile.get_string_list('VPN Connection', 'aliases'); | ||||
|  | ||||
|                             for (let alias of aliases) { | ||||
|                                 this._vpnBinaries[alias] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints }; | ||||
|                             } | ||||
|                         } catch(e) { } // ignore errors if key does not exist | ||||
|                     } else { | ||||
|                         throw new Error('VPN plugin at %s is not executable'.format(path)); | ||||
|                     } | ||||
|                 } catch(e) { | ||||
|                     log('Error \'%s\' while processing VPN keyfile \'%s\''. | ||||
|                         format(e.message, this._pluginDir.get_child(name).get_path())); | ||||
|                     continue; | ||||
|                 } | ||||
|             let prop = plugin.lookup_property('GNOME', 'supports-external-ui-mode'); | ||||
|             if (prop) { | ||||
|                 prop = prop.trim().toLowerCase(); | ||||
|                 externalUIMode = ['true', 'yes', 'on', '1'].includes(prop); | ||||
|             } | ||||
|         } catch(e) { | ||||
|             logError(e, 'error while enumerating VPN auth helpers'); | ||||
|         } | ||||
|  | ||||
|             if (GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) { | ||||
|                 let binary = { fileName, externalUIMode, supportsHints }; | ||||
|                 this._vpnBinaries[service] = binary; | ||||
|  | ||||
|                 plugin.get_aliases().forEach(alias => { | ||||
|                     this._vpnBinaries[alias] = binary; | ||||
|                 }); | ||||
|             } else { | ||||
|                 log('VPN plugin at %s is not executable'.format(fileName)); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| }); | ||||
| var Component = NetworkAgent; | ||||
|   | ||||
| @@ -16,6 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent; | ||||
| const Animation = imports.ui.animation; | ||||
| const Components = imports.ui.components; | ||||
| const Dialog = imports.ui.dialog; | ||||
| const Main = imports.ui.main; | ||||
| const ModalDialog = imports.ui.modalDialog; | ||||
| const ShellEntry = imports.ui.shellEntry; | ||||
| const UserWidget = imports.ui.userWidget; | ||||
| @@ -39,6 +40,10 @@ var AuthenticationDialog = new Lang.Class({ | ||||
|         this.userNames = userNames; | ||||
|         this._wasDismissed = false; | ||||
|  | ||||
|         this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { | ||||
|             this._group.visible = !Main.sessionMode.isLocked; | ||||
|         }); | ||||
|  | ||||
|         let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' }); | ||||
|         let title = _("Authentication Required"); | ||||
|  | ||||
| @@ -193,6 +198,12 @@ var AuthenticationDialog = new Lang.Class({ | ||||
|         this._session.initiate(); | ||||
|     }, | ||||
|  | ||||
|     close(timestamp) { | ||||
|         this.parent(timestamp); | ||||
|  | ||||
|         Main.sessionMode.disconnect(this._sessionUpdatedId); | ||||
|     }, | ||||
|  | ||||
|     _ensureOpen() { | ||||
|         // NOTE: ModalDialog.open() is safe to call if the dialog is | ||||
|         // already open - it just returns true without side-effects | ||||
| @@ -348,6 +359,7 @@ var AuthenticationAgent = new Lang.Class({ | ||||
|         this._native = new Shell.PolkitAuthenticationAgent(); | ||||
|         this._native.connect('initiate', this._onInitiate.bind(this)); | ||||
|         this._native.connect('cancel', this._onCancel.bind(this)); | ||||
|         this._sessionUpdatedId = 0; | ||||
|     }, | ||||
|  | ||||
|     enable() { | ||||
| @@ -367,6 +379,17 @@ var AuthenticationAgent = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames) { | ||||
|         // Don't pop up a dialog while locked | ||||
|         if (Main.sessionMode.isLocked) { | ||||
|             this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { | ||||
|                 Main.sessionMode.disconnect(this._sessionUpdatedId); | ||||
|                 this._sessionUpdatedId = 0; | ||||
|  | ||||
|                 this._onInitiate(nativeAgent, actionId, message, iconName, cookie, userNames); | ||||
|             }); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._currentDialog = new AuthenticationDialog(actionId, message, cookie, userNames); | ||||
|  | ||||
|         // We actually don't want to open the dialog until we know for | ||||
| @@ -396,6 +419,10 @@ var AuthenticationAgent = new Lang.Class({ | ||||
|         this._currentDialog.destroySession(); | ||||
|         this._currentDialog = null; | ||||
|  | ||||
|         if (this._sessionUpdatedId) | ||||
|             Main.sessionMode.disconnect(this._sessionUpdatedId); | ||||
|         this._sessionUpdatedId = 0; | ||||
|  | ||||
|         this._native.complete(dismissed); | ||||
|     }, | ||||
| }); | ||||
|   | ||||
| @@ -153,8 +153,10 @@ var WorldClocksSection = new Lang.Class({ | ||||
|         for (let i = 0; i < this._locations.length; i++) { | ||||
|             let l = this._locations[i].location; | ||||
|  | ||||
|             let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name() | ||||
|                                                                               : l.get_city_name(); | ||||
|             let label = new St.Label({ style_class: 'world-clocks-city', | ||||
|                                        text: l.get_city_name(), | ||||
|                                        text: name, | ||||
|                                        x_align: Clutter.ActorAlign.START, | ||||
|                                        x_expand: true }); | ||||
|  | ||||
|   | ||||
| @@ -256,6 +256,14 @@ function _getStylesheet(name) { | ||||
|     if (stylesheet.query_exists(null)) | ||||
|         return stylesheet; | ||||
|  | ||||
|     let dataDirs = GLib.get_system_data_dirs(); | ||||
|     for (let i = 0; i < dataDirs.length; i++) { | ||||
|         let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]); | ||||
|         let stylesheet = Gio.file_new_for_path(path); | ||||
|         if (stylesheet.query_exists(null)) | ||||
|             return stylesheet; | ||||
|     } | ||||
|  | ||||
|     stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name); | ||||
|     if (stylesheet.query_exists(null)) | ||||
|         return stylesheet; | ||||
|   | ||||
| @@ -502,6 +502,7 @@ var Message = new Lang.Class({ | ||||
|     _sync() { | ||||
|         let visible = this.actor.hover && this.canClose(); | ||||
|         this._closeButton.opacity = visible ? 255 : 0; | ||||
|         this._closeButton.reactive = visible; | ||||
|     }, | ||||
|  | ||||
|     _onClicked() { | ||||
|   | ||||
| @@ -100,21 +100,8 @@ var ModalDialog = new Lang.Class({ | ||||
|     setButtons(buttons) { | ||||
|         this.clearButtons(); | ||||
|  | ||||
|         for (let i = 0; i < buttons.length; i++) { | ||||
|             let buttonInfo = buttons[i]; | ||||
|  | ||||
|             let x_alignment; | ||||
|             if (buttons.length == 1) | ||||
|                 x_alignment = St.Align.END; | ||||
|             else if (i == 0) | ||||
|                 x_alignment = St.Align.START; | ||||
|             else if (i == buttons.length - 1) | ||||
|                 x_alignment = St.Align.END; | ||||
|             else | ||||
|                 x_alignment = St.Align.MIDDLE; | ||||
|  | ||||
|         for (let buttonInfo of buttons) | ||||
|             this.addButton(buttonInfo); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     addButton(buttonInfo) { | ||||
|   | ||||
| @@ -488,7 +488,8 @@ var Overview = new Lang.Class({ | ||||
|             return false; | ||||
|         if (this._inItemDrag || this._inWindowDrag) | ||||
|             return false; | ||||
|         if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT) | ||||
|         if (this._activationTime == 0 || | ||||
|             GLib.get_monotonic_time() / GLib.USEC_PER_SEC - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT) | ||||
|             return true; | ||||
|         return false; | ||||
|     }, | ||||
| @@ -547,7 +548,7 @@ var Overview = new Lang.Class({ | ||||
|         this.visible = true; | ||||
|         this.animationInProgress = true; | ||||
|         this.visibleTarget = true; | ||||
|         this._activationTime = Date.now() / 1000; | ||||
|         this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC; | ||||
|  | ||||
|         Meta.disable_unredirect_for_screen(global.screen); | ||||
|         this.viewSelector.show(); | ||||
|   | ||||
| @@ -394,8 +394,9 @@ var PopupImageMenuItem = new Lang.Class({ | ||||
|     _init(text, icon, params) { | ||||
|         this.parent(params); | ||||
|  | ||||
|         this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); | ||||
|         this.actor.add_child(this._icon, { align: St.Align.END }); | ||||
|         this._icon = new St.Icon({ style_class: 'popup-menu-icon', | ||||
|                                    x_align: Clutter.ActorAlign.END }); | ||||
|         this.actor.add_child(this._icon); | ||||
|         this.label = new St.Label({ text: text }); | ||||
|         this.actor.add_child(this.label); | ||||
|         this.actor.label_actor = this.label; | ||||
|   | ||||
| @@ -119,6 +119,9 @@ var RemoteMenuItemMapper = new Lang.Class({ | ||||
|         this._trackerItem = trackerItem; | ||||
|  | ||||
|         this.menuItem = new PopupMenu.PopupBaseMenuItem(); | ||||
|         this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); | ||||
|         this.menuItem.actor.add_child(this._icon); | ||||
|  | ||||
|         this._label = new St.Label(); | ||||
|         this.menuItem.actor.add_child(this._label); | ||||
|         this.menuItem.actor.label_actor = this._label; | ||||
| @@ -129,11 +132,13 @@ var RemoteMenuItemMapper = new Lang.Class({ | ||||
|  | ||||
|         this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); | ||||
|  | ||||
|         this._trackerItem.connect('notify::icon', this._updateIcon.bind(this)); | ||||
|         this._trackerItem.connect('notify::label', this._updateLabel.bind(this)); | ||||
|         this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this)); | ||||
|         this._trackerItem.connect('notify::role', this._updateRole.bind(this)); | ||||
|         this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this)); | ||||
|  | ||||
|         this._updateIcon(); | ||||
|         this._updateLabel(); | ||||
|         this._updateSensitivity(); | ||||
|         this._updateRole(); | ||||
| @@ -143,6 +148,11 @@ var RemoteMenuItemMapper = new Lang.Class({ | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     _updateIcon() { | ||||
|         this._icon.gicon = this._trackerItem.icon; | ||||
|         this._icon.visible = (this._icon.gicon != null); | ||||
|     }, | ||||
|  | ||||
|     _updateLabel() { | ||||
|         this._label.text = stripMnemonics(this._trackerItem.label); | ||||
|     }, | ||||
|   | ||||
| @@ -55,11 +55,11 @@ var EntryMenu = new Lang.Class({ | ||||
|  | ||||
|         if (v) { | ||||
|             this._makePasswordItem(); | ||||
|             this._entry.input_purpose = Gtk.InputPurpose.PASSWORD; | ||||
|             this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD; | ||||
|         } else { | ||||
|             this._passwordItem.destroy(); | ||||
|             this._passwordItem = null; | ||||
|             this._entry.input_purpose = Gtk.InputPurpose.FREE_FORM; | ||||
|             this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -17,10 +17,11 @@ const PanelMenu = imports.ui.panelMenu; | ||||
| const BoltClientInterface = '<node> \ | ||||
|   <interface name="org.freedesktop.bolt1.Manager"> \ | ||||
|     <property name="Probing" type="b" access="read"></property> \ | ||||
|     <property name="AuthMode" type="s" access="readwrite"></property> \ | ||||
|     <method name="EnrollDevice"> \ | ||||
|       <arg type="s" name="uid" direction="in"> </arg> \ | ||||
|       <arg type="u" name="policy" direction="in"> </arg> \ | ||||
|       <arg type="u" name="flags" direction="in"> </arg> \ | ||||
|       <arg type="s" name="policy" direction="in"> </arg> \ | ||||
|       <arg type="s" name="flags" direction="in"> </arg> \ | ||||
|       <arg name="device" direction="out" type="o"> </arg> \ | ||||
|     </method> \ | ||||
|     <signal name="DeviceAdded"> \ | ||||
| @@ -34,13 +35,17 @@ const BoltDeviceInterface = '<node> \ | ||||
|     <property name="Uid" type="s" access="read"></property> \ | ||||
|     <property name="Name" type="s" access="read"></property> \ | ||||
|     <property name="Vendor" type="s" access="read"></property> \ | ||||
|     <property name="Status" type="u" access="read"></property> \ | ||||
|     <property name="SysfsPath" type="s" access="read"></property> \ | ||||
|     <property name="Security" type="u" access="read"></property> \ | ||||
|     <property name="Type" type="s" access="read"></property> \ | ||||
|     <property name="Status" type="s" access="read"></property> \ | ||||
|     <property name="Parent" type="s" access="read"></property> \ | ||||
|     <property name="SysfsPath" type="s" access="read"></property> \ | ||||
|     <property name="Stored" type="b" access="read"></property> \ | ||||
|     <property name="Policy" type="u" access="read"></property> \ | ||||
|     <property name="Key" type="u" access="read"></property> \ | ||||
|     <property name="Policy" type="s" access="read"></property> \ | ||||
|     <property name="Key" type="s" access="read"></property> \ | ||||
|     <property name="Label" type="s" access="read"></property> \ | ||||
|     <property name="ConnectTime" type="t" access="read"></property> \ | ||||
|     <property name="AuthorizeTime" type="t" access="read"></property> \ | ||||
|     <property name="StoreTime" type="t" access="read"></property> \ | ||||
|   </interface> \ | ||||
| </node>'; | ||||
|  | ||||
| @@ -50,23 +55,28 @@ const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface); | ||||
| /*  */ | ||||
|  | ||||
| var Status = { | ||||
|     DISCONNECTED: 0, | ||||
|     CONNECTED: 1, | ||||
|     AUTHORIZING: 2, | ||||
|     AUTH_ERROR: 3, | ||||
|     AUTHORIZED: 4, | ||||
|     AUTHORIZED_SECURE: 5, | ||||
|     AUTHORIZED_NEWKY: 6 | ||||
|     DISCONNECTED: 'disconnected', | ||||
|     CONNECTED: 'connected', | ||||
|     AUTHORIZING: 'authorizing', | ||||
|     AUTH_ERROR: 'auth-error', | ||||
|     AUTHORIZED: 'authorized', | ||||
|     AUTHORIZED_SECURE: 'authorized-secure', | ||||
|     AUTHORIZED_NEWKEY: 'authorized-newkey' | ||||
| }; | ||||
|  | ||||
| var Policy = { | ||||
|     DEFAULT: 0, | ||||
|     MANUAL: 1, | ||||
|     AUTO:2 | ||||
|     DEFAULT: 'default', | ||||
|     MANUAL: 'manual', | ||||
|     AUTO: 'auto' | ||||
| }; | ||||
|  | ||||
| var AuthFlags = { | ||||
|     NONE: 0, | ||||
|     NONE: 'none', | ||||
| }; | ||||
|  | ||||
| var AuthMode = { | ||||
|     DISABLED: 'disabled', | ||||
|     ENABLED: 'enabled' | ||||
| }; | ||||
|  | ||||
| const BOLT_DBUS_NAME = 'org.freedesktop.bolt'; | ||||
| @@ -144,6 +154,10 @@ var Client = new Lang.Class({ | ||||
| 					     path); | ||||
| 	    callback(device, null); | ||||
| 	}); | ||||
|     }, | ||||
|  | ||||
|     get authMode () { | ||||
|         return this._proxy.AuthMode; | ||||
|     } | ||||
|  | ||||
| }); | ||||
| @@ -177,6 +191,14 @@ var AuthRobot = new Lang.Class({ | ||||
| 	if (dev.Status !== Status.CONNECTED) | ||||
| 	    return; | ||||
|  | ||||
|         /* check if authorization is enabled in the daemon. if not | ||||
|          * we won't even bother authorizing, because we will only | ||||
|          * get an error back. The exact contents of AuthMode might  | ||||
|          * change in the future, but must contain AuthMode.ENABLED | ||||
|          * if it is enabled. */ | ||||
|         if (!cli.authMode.split('|').includes(AuthMode.ENABLED)) | ||||
|             return; | ||||
|          | ||||
| 	/* check if we should enroll the device */ | ||||
| 	let res = [false]; | ||||
| 	this.emit('enroll-device', dev, res); | ||||
| @@ -332,7 +354,7 @@ var Indicator = new Lang.Class({ | ||||
|  | ||||
|     _onEnrollFailed(obj, device, error) { | ||||
| 	const title = _('Thunderbolt authorization error'); | ||||
| 	const body = _('Could not authorize the thunderbolt device: %s'.format(error.message)); | ||||
| 	const body = _('Could not authorize the Thunderbolt device: %s'.format(error.message)); | ||||
| 	this._notify(title, body); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -517,7 +517,7 @@ var ViewSelector = new Lang.Class({ | ||||
|  | ||||
|         let synthEvent = event.copy(); | ||||
|         synthEvent.set_source(this._text); | ||||
|         this._text.event(synthEvent, true); | ||||
|         this._text.event(synthEvent, false); | ||||
|     }, | ||||
|  | ||||
|     // the entry does not show the hint | ||||
| @@ -601,15 +601,6 @@ var ViewSelector = new Lang.Class({ | ||||
|                 // - cancel the search | ||||
|                 this.reset(); | ||||
|             } | ||||
|         } else if (!(global.stage.get_key_focus() instanceof Clutter.Text) && | ||||
|                    (event.type() == Clutter.EventType.KEY_PRESS || | ||||
|                     event.type() == Clutter.EventType.KEY_RELEASE)) { | ||||
|             let unichar = event.get_key_unicode(); | ||||
|  | ||||
|             if (GLib.unichar_isprint(unichar)) { | ||||
|                 this._text.grab_key_focus(); | ||||
|                 return this._text.event(event, false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return Clutter.EVENT_PROPAGATE; | ||||
|   | ||||
| @@ -660,7 +660,6 @@ var WindowOverlay = new Lang.Class({ | ||||
|         if (this._hidden) | ||||
|             return; | ||||
|  | ||||
|         this._windowClone.actor.grab_key_focus(); | ||||
|         this._animateVisible(); | ||||
|         this.emit('show-close-button'); | ||||
|     }, | ||||
| @@ -1852,7 +1851,12 @@ var Workspace = new Lang.Class({ | ||||
|  | ||||
|         this.actor.add_actor(clone.actor); | ||||
|  | ||||
|         overlay.connect('show-close-button', this._onShowOverlayClose.bind(this)); | ||||
|         overlay.connect('show-close-button', () => { | ||||
|             let focus = global.stage.key_focus; | ||||
|             if (focus == null || this.actor.contains(focus)) | ||||
|                 clone.actor.grab_key_focus(); | ||||
|             this._onShowOverlayClose(overlay); | ||||
|         }); | ||||
|  | ||||
|         if (this._windows.length == 0) | ||||
|             clone.setStackAbove(null); | ||||
|   | ||||
| @@ -275,8 +275,8 @@ var WorkspaceThumbnail = new Lang.Class({ | ||||
|  | ||||
|         this._createBackground(); | ||||
|  | ||||
|         let monitor = Main.layoutManager.primaryMonitor; | ||||
|         this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height); | ||||
|         let workArea = Main.layoutManager.getWorkAreaForMonitor(this.monitorIndex); | ||||
|         this.setPorthole(workArea.x, workArea.y, workArea.width, workArea.height); | ||||
|  | ||||
|         let windows = global.get_window_actors().filter(actor => { | ||||
|             let win = actor.meta_window; | ||||
| @@ -321,8 +321,6 @@ var WorkspaceThumbnail = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     setPorthole(x, y, width, height) { | ||||
|         this._portholeX = x; | ||||
|         this._portholeY = y; | ||||
|         this.actor.set_size(width, height); | ||||
|         this._contents.set_position(-x, -y); | ||||
|     }, | ||||
| @@ -675,11 +673,7 @@ var ThumbnailsBox = new Lang.Class({ | ||||
|         this._settings.connect('changed::dynamic-workspaces', | ||||
|             this._updateSwitcherVisibility.bind(this)); | ||||
|  | ||||
|         Main.layoutManager.connect('monitors-changed', () => { | ||||
|             this._destroyThumbnails(); | ||||
|             if (Main.overview.visible) | ||||
|                 this._createThumbnails(); | ||||
|         }); | ||||
|         Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this)); | ||||
|     }, | ||||
|  | ||||
|     _updateSwitcherVisibility() { | ||||
| @@ -872,6 +866,9 @@ var ThumbnailsBox = new Lang.Class({ | ||||
|             Main.overview.connect('windows-restacked', | ||||
|                                   this._syncStacking.bind(this)); | ||||
|  | ||||
|         this._workareasChangedId = | ||||
|             global.screen.connect('workareas-changed', this._rebuildThumbnails.bind(this)); | ||||
|  | ||||
|         this._targetScale = 0; | ||||
|         this._scale = 0; | ||||
|         this._pendingScaleUpdate = false; | ||||
| @@ -901,12 +898,24 @@ var ThumbnailsBox = new Lang.Class({ | ||||
|             this._syncStackingId = 0; | ||||
|         } | ||||
|  | ||||
|         if (this._workareasChangedId > 0) { | ||||
|             global.screen.disconnect(this._workareasChangedId); | ||||
|             this._workareasChangedId = 0; | ||||
|         } | ||||
|  | ||||
|         for (let w = 0; w < this._thumbnails.length; w++) | ||||
|             this._thumbnails[w].destroy(); | ||||
|         this._thumbnails = []; | ||||
|         this._porthole = null; | ||||
|     }, | ||||
|  | ||||
|     _rebuildThumbnails() { | ||||
|         this._destroyThumbnails(); | ||||
|  | ||||
|         if (Main.overview.visible) | ||||
|             this._createThumbnails(); | ||||
|     }, | ||||
|  | ||||
|     _workspacesChanged() { | ||||
|         let validThumbnails = | ||||
|             this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); | ||||
| @@ -1159,7 +1168,7 @@ var ThumbnailsBox = new Lang.Class({ | ||||
|     // The "porthole" is the portion of the screen that we show in the | ||||
|     // workspaces | ||||
|     _ensurePorthole() { | ||||
|         if (!Main.layoutManager.primaryMonitor) | ||||
|         if (!Main.layoutManager.primaryMonitor || !Main.overview.visible) | ||||
|             return false; | ||||
|  | ||||
|         if (!this._porthole) | ||||
|   | ||||
							
								
								
									
										10
									
								
								meson.build
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								meson.build
									
									
									
									
									
								
							| @@ -1,12 +1,12 @@ | ||||
| project('gnome-shell', 'c', | ||||
|   version: '3.27.91', | ||||
|   version: '3.28.1', | ||||
|   meson_version: '>= 0.42.0', | ||||
|   license: 'GPLv2+' | ||||
| ) | ||||
|  | ||||
| # We depend on a specific version of the libmutter API. The mutter variants of | ||||
| # the Cogl and Clutter libraries also use this API version. | ||||
| mutter_api_version = '1' | ||||
| mutter_api_version = '2' | ||||
|  | ||||
| clutter_pc = 'mutter-clutter-' + mutter_api_version | ||||
| cogl_pc = 'mutter-cogl-' + mutter_api_version | ||||
| @@ -18,12 +18,12 @@ ecal_req = '>= 3.5.3' | ||||
| eds_req = '>= 3.17.2' | ||||
| gcr_req = '>= 3.7.5' | ||||
| gdesktop_req = '>= 3.7.90' | ||||
| gio_req = '>= 2.53.0' | ||||
| gio_req = '>= 2.56.0' | ||||
| gi_req = '>= 1.49.1' | ||||
| gjs_req = '>= 1.47.0' | ||||
| gtk_req = '>= 3.15.0' | ||||
| json_glib_req = '>= 0.13.2' | ||||
| mutter_req = '>= 3.27.91' | ||||
| mutter_req = '>= 3.28.0' | ||||
| polkit_req = '>= 0.100' | ||||
| schemas_req = '>= 3.21.3' | ||||
| startup_req = '>= 0.11' | ||||
| @@ -189,3 +189,5 @@ subdir('tests') | ||||
| if get_option('gtk_doc') | ||||
|   subdir('docs/reference') | ||||
| endif | ||||
|  | ||||
| meson.add_install_script('meson/meson-postinstall.sh') | ||||
|   | ||||
							
								
								
									
										10
									
								
								meson/meson-postinstall.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								meson/meson-postinstall.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # Package managers set this so we don't need to run | ||||
| if [ -z "$DESTDIR" ]; then | ||||
|   echo Compiling GSettings schemas... | ||||
|   glib-compile-schemas ${MESON_INSTALL_PREFIX}/share/glib-2.0/schemas | ||||
|  | ||||
|   echo Updating desktop database... | ||||
|   update-desktop-database -q ${MESON_INSTALL_PREFIX}/share/applications | ||||
| fi | ||||
							
								
								
									
										124
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								po/de.po
									
									
									
									
									
								
							| @@ -10,7 +10,7 @@ | ||||
| # Mario Klug <mario@klug.me>, 2010. | ||||
| # Jakob Kramer <jakob.kramer@gmx.de>, 2010. | ||||
| # Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2010-2011. | ||||
| # Wolfgang Stöggl <c72578@yahoo.de>, 2012, 2014, 2017. | ||||
| # Wolfgang Stöggl <c72578@yahoo.de>, 2012, 2014, 2017-2018. | ||||
| # Christian Kirbach <christian.kirbach@gmail.com>, 2009-2013. | ||||
| # Tobias Endrigkeit <tobiasendrigkeit@outlook.com>, 2012-2013. | ||||
| # Benjamin Steinwender <b@stbe.at>, 2013-2014. | ||||
| @@ -21,18 +21,17 @@ | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: gnome-shell master\n" | ||||
| "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" | ||||
| "shell&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2018-01-17 18:05+0000\n" | ||||
| "PO-Revision-Date: 2018-01-19 22:18+0100\n" | ||||
| "Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n" | ||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||
| "POT-Creation-Date: 2018-02-20 23:03+0000\n" | ||||
| "PO-Revision-Date: 2018-02-23 15:54+0100\n" | ||||
| "Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n" | ||||
| "Language-Team: Deutsch <gnome-de@gnome.org>\n" | ||||
| "Language: de\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
| "X-Generator: Poedit 2.0.5\n" | ||||
| "X-Generator: Poedit 2.0.6\n" | ||||
|  | ||||
| #: data/50-gnome-shell-system.xml:6 | ||||
| msgid "System" | ||||
| @@ -374,20 +373,20 @@ msgctxt "button" | ||||
| msgid "Sign In" | ||||
| msgstr "Anmelden" | ||||
|  | ||||
| #: js/gdm/loginDialog.js:308 | ||||
| #: js/gdm/loginDialog.js:322 | ||||
| msgid "Choose Session" | ||||
| msgstr "Sitzung wählen" | ||||
|  | ||||
| #. translators: this message is shown below the user list on the | ||||
| #. login screen. It can be activated to reveal an entry for | ||||
| #. manually entering the username. | ||||
| #: js/gdm/loginDialog.js:458 | ||||
| #: js/gdm/loginDialog.js:468 | ||||
| msgid "Not listed?" | ||||
| msgstr "Nicht aufgeführt?" | ||||
|  | ||||
| #. Translators: this message is shown below the username entry field | ||||
| #. to clue the user in on how to login to the local network realm | ||||
| #: js/gdm/loginDialog.js:888 | ||||
| #: js/gdm/loginDialog.js:898 | ||||
| #, javascript-format | ||||
| msgid "(e.g., user or %s)" | ||||
| msgstr "(z.B. Benutzer oder %s)" | ||||
| @@ -395,12 +394,12 @@ msgstr "(z.B. Benutzer oder %s)" | ||||
| #. TTLS and PEAP are actually much more complicated, but this complication | ||||
| #. is not visible here since we only care about phase2 authentication | ||||
| #. (and don't even care of which one) | ||||
| #: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 | ||||
| #: js/gdm/loginDialog.js:903 js/ui/components/networkAgent.js:243 | ||||
| #: js/ui/components/networkAgent.js:261 | ||||
| msgid "Username: " | ||||
| msgstr "Benutzername: " | ||||
|  | ||||
| #: js/gdm/loginDialog.js:1236 | ||||
| #: js/gdm/loginDialog.js:1246 | ||||
| msgid "Login Window" | ||||
| msgstr "Anmeldefenster" | ||||
|  | ||||
| @@ -413,7 +412,7 @@ msgstr "Anmeldung fehlgeschlagen" | ||||
| #. as a cue to display our own message. | ||||
| #. Translators: this message is shown below the password entry field | ||||
| #. to indicate the user can swipe their finger instead | ||||
| #: js/gdm/util.js:478 | ||||
| #: js/gdm/util.js:483 | ||||
| msgid "(or swipe finger)" | ||||
| msgstr "(oder wischen Sie mit einem Finger)" | ||||
|  | ||||
| @@ -655,23 +654,23 @@ msgstr "Häufig" | ||||
| msgid "All" | ||||
| msgstr "Alle" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1918 | ||||
| #: js/ui/appDisplay.js:1919 | ||||
| msgid "New Window" | ||||
| msgstr "Neues Fenster" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1932 | ||||
| #: js/ui/appDisplay.js:1933 | ||||
| msgid "Launch using Dedicated Graphics Card" | ||||
| msgstr "Mit dedizierter Grafikkarte starten" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1959 js/ui/dash.js:285 | ||||
| #: js/ui/appDisplay.js:1960 js/ui/dash.js:285 | ||||
| msgid "Remove from Favorites" | ||||
| msgstr "Aus Favoriten entfernen" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1965 | ||||
| #: js/ui/appDisplay.js:1966 | ||||
| msgid "Add to Favorites" | ||||
| msgstr "Zu Favoriten hinzufügen" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1975 | ||||
| #: js/ui/appDisplay.js:1976 | ||||
| msgid "Show Details" | ||||
| msgstr "Details anzeigen" | ||||
|  | ||||
| @@ -718,7 +717,7 @@ msgid "Settings" | ||||
| msgstr "Einstellungen" | ||||
|  | ||||
| #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). | ||||
| #: js/ui/calendar.js:47 | ||||
| #: js/ui/calendar.js:44 | ||||
| msgctxt "calendar-no-work" | ||||
| msgid "06" | ||||
| msgstr "06" | ||||
| @@ -728,47 +727,70 @@ msgstr "06" | ||||
| #. * NOTE: These grid abbreviations are always shown together | ||||
| #. * and in order, e.g. "S M T W T F S". | ||||
| #. | ||||
| #: js/ui/calendar.js:76 | ||||
| #: js/ui/calendar.js:73 | ||||
| msgctxt "grid sunday" | ||||
| msgid "S" | ||||
| msgstr "S" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Monday | ||||
| #: js/ui/calendar.js:78 | ||||
| #: js/ui/calendar.js:75 | ||||
| msgctxt "grid monday" | ||||
| msgid "M" | ||||
| msgstr "M" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Tuesday | ||||
| #: js/ui/calendar.js:80 | ||||
| #: js/ui/calendar.js:77 | ||||
| msgctxt "grid tuesday" | ||||
| msgid "T" | ||||
| msgstr "D" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Wednesday | ||||
| #: js/ui/calendar.js:82 | ||||
| #: js/ui/calendar.js:79 | ||||
| msgctxt "grid wednesday" | ||||
| msgid "W" | ||||
| msgstr "M" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Thursday | ||||
| #: js/ui/calendar.js:84 | ||||
| #: js/ui/calendar.js:81 | ||||
| msgctxt "grid thursday" | ||||
| msgid "T" | ||||
| msgstr "D" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Friday | ||||
| #: js/ui/calendar.js:86 | ||||
| #: js/ui/calendar.js:83 | ||||
| msgctxt "grid friday" | ||||
| msgid "F" | ||||
| msgstr "F" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Saturday | ||||
| #: js/ui/calendar.js:88 | ||||
| #: js/ui/calendar.js:85 | ||||
| msgctxt "grid saturday" | ||||
| msgid "S" | ||||
| msgstr "S" | ||||
|  | ||||
| #. * | ||||
| #. * Translators: The header displaying just the month name | ||||
| #. * standalone, when this is a month of the current year. | ||||
| #. * "%OB" is the new format specifier introduced in glibc 2.27, | ||||
| #. * in most cases you should not change it. | ||||
| #. | ||||
| #: js/ui/calendar.js:382 | ||||
| msgid "%OB" | ||||
| msgstr "%OB" | ||||
|  | ||||
| #. * | ||||
| #. * Translators: The header displaying the month name and the year | ||||
| #. * number, when this is a month of a different year.  You can | ||||
| #. * reorder the format specifiers or add other modifications | ||||
| #. * according to the requirements of your language. | ||||
| #. * "%OB" is the new format specifier introduced in glibc 2.27, | ||||
| #. * in most cases you should not use the old "%B" here unless you | ||||
| #. * absolutely know what you are doing. | ||||
| #. | ||||
| #: js/ui/calendar.js:392 | ||||
| msgid "%OB %Y" | ||||
| msgstr "%OB %Y" | ||||
|  | ||||
| #: js/ui/calendar.js:449 | ||||
| msgid "Previous month" | ||||
| msgstr "Vorheriger Monat" | ||||
| @@ -1306,9 +1328,9 @@ msgstr "Ausschalten" | ||||
| msgid "Leave Off" | ||||
| msgstr "Ausgeschaltet lassen" | ||||
|  | ||||
| #: js/ui/keyboard.js:739 js/ui/status/keyboard.js:783 | ||||
| msgid "Keyboard" | ||||
| msgstr "Tastatur" | ||||
| #: js/ui/keyboard.js:198 | ||||
| msgid "Region & Language Settings" | ||||
| msgstr "Regions- und Spracheinstellungen" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:642 | ||||
| msgid "No extensions installed" | ||||
| @@ -1447,7 +1469,7 @@ msgctxt "System menu in the top bar" | ||||
| msgid "System" | ||||
| msgstr "System" | ||||
|  | ||||
| #: js/ui/panel.js:812 | ||||
| #: js/ui/panel.js:814 | ||||
| msgid "Top Bar" | ||||
| msgstr "Oberes Panel" | ||||
|  | ||||
| @@ -1514,11 +1536,11 @@ msgstr "GNOME muss den Bildschirm sperren" | ||||
| #. | ||||
| #. XXX: another option is to kick the user into the gdm login | ||||
| #. screen, where we're not affected by grabs | ||||
| #: js/ui/screenShield.js:836 js/ui/screenShield.js:1308 | ||||
| #: js/ui/screenShield.js:836 js/ui/screenShield.js:1311 | ||||
| msgid "Unable to lock" | ||||
| msgstr "Sperrung fehlgeschlagen" | ||||
|  | ||||
| #: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 | ||||
| #: js/ui/screenShield.js:837 js/ui/screenShield.js:1312 | ||||
| msgid "Lock was blocked by an application" | ||||
| msgstr "Sperrung wurde von einer Anwendung blockiert" | ||||
|  | ||||
| @@ -1633,6 +1655,10 @@ msgstr "An" | ||||
| msgid "Brightness" | ||||
| msgstr "Helligkeit" | ||||
|  | ||||
| #: js/ui/status/keyboard.js:783 | ||||
| msgid "Keyboard" | ||||
| msgstr "Tastatur" | ||||
|  | ||||
| #: js/ui/status/keyboard.js:806 | ||||
| msgid "Show Keyboard Layout" | ||||
| msgstr "Tastaturbelegung anzeigen" | ||||
| @@ -1963,6 +1989,32 @@ msgstr "In Bereitschaft versetzen" | ||||
| msgid "Power Off" | ||||
| msgstr "Ausschalten" | ||||
|  | ||||
| #: js/ui/status/thunderbolt.js:272 | ||||
| msgid "Thunderbolt" | ||||
| msgstr "Thunderbolt" | ||||
|  | ||||
| #. we are done | ||||
| #: js/ui/status/thunderbolt.js:330 | ||||
| msgid "Unknown Thunderbolt device" | ||||
| msgstr "Unbekanntes Thunderbolt-Gerät" | ||||
|  | ||||
| #: js/ui/status/thunderbolt.js:331 | ||||
| msgid "" | ||||
| "New device has been detected while you were away. Please disconnect and " | ||||
| "reconnect the device to start using it." | ||||
| msgstr "" | ||||
| "Ein neues Gerät ist in der Zwischenzeit erkannt worden. Bitte trennen Sie " | ||||
| "die Verbindung des Gerätes und schließen es wieder an, um es zu verwenden." | ||||
|  | ||||
| #: js/ui/status/thunderbolt.js:336 | ||||
| msgid "Thunderbolt authorization error" | ||||
| msgstr "Thunderbolt-Legitimierungsfehler" | ||||
|  | ||||
| #: js/ui/status/thunderbolt.js:337 | ||||
| #, javascript-format | ||||
| msgid "Could not authorize the thunderbolt device: %s" | ||||
| msgstr "Das Thunderbolt-Gerät %s konnte nicht legitimiert werden" | ||||
|  | ||||
| #: js/ui/status/volume.js:128 | ||||
| msgid "Volume changed" | ||||
| msgstr "Lautstärke geändert" | ||||
| @@ -2123,21 +2175,21 @@ msgstr "Evolution-Kalender" | ||||
| msgid "evolution" | ||||
| msgstr "evolution" | ||||
|  | ||||
| #: src/main.c:437 | ||||
| #: src/main.c:432 | ||||
| msgid "Print version" | ||||
| msgstr "Version ausgeben" | ||||
|  | ||||
| #: src/main.c:443 | ||||
| #: src/main.c:438 | ||||
| msgid "Mode used by GDM for login screen" | ||||
| msgstr "Der durch GDM im Anmeldefenster verwendete Modus" | ||||
|  | ||||
| #: src/main.c:449 | ||||
| #: src/main.c:444 | ||||
| msgid "Use a specific mode, e.g. “gdm” for login screen" | ||||
| msgstr "" | ||||
| "Verwenden Sie einen spezifischen Modus wie z.B. »gdm« für den " | ||||
| "Anmeldebildschirm" | ||||
|  | ||||
| #: src/main.c:455 | ||||
| #: src/main.c:450 | ||||
| msgid "List possible modes" | ||||
| msgstr "Die möglichen Modi auflisten" | ||||
|  | ||||
|   | ||||
							
								
								
									
										358
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
							
						
						
									
										358
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										78
									
								
								po/tr.po
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								po/tr.po
									
									
									
									
									
								
							| @@ -7,17 +7,17 @@ | ||||
| # Bayram Güçlü <byrmgcl@yandex.com.tr>, 2014. | ||||
| # sabri ünal <yakushabb@gmail.com>, 2014. | ||||
| # Gökhan Gurbetoğlu <ggurbet@gmail.com>, 2014. | ||||
| # Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017. | ||||
| # Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2013, 2014, 2015, 2016, 2017. | ||||
| # Emin Tufan Çetin <etcetin@gmail.com>, 2017, 2018. | ||||
| # Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017, 2018. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: gnome-shell\n" | ||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||
| "POT-Creation-Date: 2018-02-06 01:15+0000\n" | ||||
| "PO-Revision-Date: 2018-02-07 13:19+0300\n" | ||||
| "Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n" | ||||
| "POT-Creation-Date: 2018-02-20 23:03+0000\n" | ||||
| "PO-Revision-Date: 2018-02-24 16:57+0200\n" | ||||
| "Last-Translator: Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>\n" | ||||
| "Language-Team: Türkçe <gnome-turk@gnome.org>\n" | ||||
| "Language: tr\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| @@ -365,20 +365,20 @@ msgctxt "button" | ||||
| msgid "Sign In" | ||||
| msgstr "Giriş" | ||||
|  | ||||
| #: js/gdm/loginDialog.js:308 | ||||
| #: js/gdm/loginDialog.js:322 | ||||
| msgid "Choose Session" | ||||
| msgstr "Oturum Seç" | ||||
|  | ||||
| #. translators: this message is shown below the user list on the | ||||
| #. login screen. It can be activated to reveal an entry for | ||||
| #. manually entering the username. | ||||
| #: js/gdm/loginDialog.js:458 | ||||
| #: js/gdm/loginDialog.js:468 | ||||
| msgid "Not listed?" | ||||
| msgstr "Listede yok mu?" | ||||
|  | ||||
| #. Translators: this message is shown below the username entry field | ||||
| #. to clue the user in on how to login to the local network realm | ||||
| #: js/gdm/loginDialog.js:888 | ||||
| #: js/gdm/loginDialog.js:898 | ||||
| #, javascript-format | ||||
| msgid "(e.g., user or %s)" | ||||
| msgstr "(örneğin, kullanıcı veya %s)" | ||||
| @@ -386,12 +386,12 @@ msgstr "(örneğin, kullanıcı veya %s)" | ||||
| #. TTLS and PEAP are actually much more complicated, but this complication | ||||
| #. is not visible here since we only care about phase2 authentication | ||||
| #. (and don't even care of which one) | ||||
| #: js/gdm/loginDialog.js:893 js/ui/components/networkAgent.js:243 | ||||
| #: js/gdm/loginDialog.js:903 js/ui/components/networkAgent.js:243 | ||||
| #: js/ui/components/networkAgent.js:261 | ||||
| msgid "Username: " | ||||
| msgstr "Kullanıcı Adı: " | ||||
|  | ||||
| #: js/gdm/loginDialog.js:1236 | ||||
| #: js/gdm/loginDialog.js:1246 | ||||
| msgid "Login Window" | ||||
| msgstr "Oturum Açma Penceresi" | ||||
|  | ||||
| @@ -404,7 +404,7 @@ msgstr "Kimlik doğrulama hatası" | ||||
| #. as a cue to display our own message. | ||||
| #. Translators: this message is shown below the password entry field | ||||
| #. to indicate the user can swipe their finger instead | ||||
| #: js/gdm/util.js:478 | ||||
| #: js/gdm/util.js:483 | ||||
| msgid "(or swipe finger)" | ||||
| msgstr "(ya da parmak izi okut)" | ||||
|  | ||||
| @@ -639,23 +639,23 @@ msgstr "Sık Sık" | ||||
| msgid "All" | ||||
| msgstr "Tümü" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1918 | ||||
| #: js/ui/appDisplay.js:1919 | ||||
| msgid "New Window" | ||||
| msgstr "Yeni Pencere" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1932 | ||||
| #: js/ui/appDisplay.js:1933 | ||||
| msgid "Launch using Dedicated Graphics Card" | ||||
| msgstr "Adanmış Ekran Kartıyla Başlat" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1959 js/ui/dash.js:285 | ||||
| #: js/ui/appDisplay.js:1960 js/ui/dash.js:285 | ||||
| msgid "Remove from Favorites" | ||||
| msgstr "Sık Kullanılanlardan Çıkar" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1965 | ||||
| #: js/ui/appDisplay.js:1966 | ||||
| msgid "Add to Favorites" | ||||
| msgstr "Sık Kullanılanlara Ekle" | ||||
|  | ||||
| #: js/ui/appDisplay.js:1975 | ||||
| #: js/ui/appDisplay.js:1976 | ||||
| msgid "Show Details" | ||||
| msgstr "Ayrıntıları Göster" | ||||
|  | ||||
| @@ -702,7 +702,7 @@ msgid "Settings" | ||||
| msgstr "Ayarlar" | ||||
|  | ||||
| #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). | ||||
| #: js/ui/calendar.js:47 | ||||
| #: js/ui/calendar.js:44 | ||||
| msgctxt "calendar-no-work" | ||||
| msgid "06" | ||||
| msgstr "06" | ||||
| @@ -712,47 +712,70 @@ msgstr "06" | ||||
| #. * NOTE: These grid abbreviations are always shown together | ||||
| #. * and in order, e.g. "S M T W T F S". | ||||
| #. | ||||
| #: js/ui/calendar.js:76 | ||||
| #: js/ui/calendar.js:73 | ||||
| msgctxt "grid sunday" | ||||
| msgid "S" | ||||
| msgstr "P" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Monday | ||||
| #: js/ui/calendar.js:78 | ||||
| #: js/ui/calendar.js:75 | ||||
| msgctxt "grid monday" | ||||
| msgid "M" | ||||
| msgstr "P" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Tuesday | ||||
| #: js/ui/calendar.js:80 | ||||
| #: js/ui/calendar.js:77 | ||||
| msgctxt "grid tuesday" | ||||
| msgid "T" | ||||
| msgstr "S" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Wednesday | ||||
| #: js/ui/calendar.js:82 | ||||
| #: js/ui/calendar.js:79 | ||||
| msgctxt "grid wednesday" | ||||
| msgid "W" | ||||
| msgstr "Ç" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Thursday | ||||
| #: js/ui/calendar.js:84 | ||||
| #: js/ui/calendar.js:81 | ||||
| msgctxt "grid thursday" | ||||
| msgid "T" | ||||
| msgstr "P" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Friday | ||||
| #: js/ui/calendar.js:86 | ||||
| #: js/ui/calendar.js:83 | ||||
| msgctxt "grid friday" | ||||
| msgid "F" | ||||
| msgstr "C" | ||||
|  | ||||
| #. Translators: Calendar grid abbreviation for Saturday | ||||
| #: js/ui/calendar.js:88 | ||||
| #: js/ui/calendar.js:85 | ||||
| msgctxt "grid saturday" | ||||
| msgid "S" | ||||
| msgstr "C" | ||||
|  | ||||
| #. * | ||||
| #. * Translators: The header displaying just the month name | ||||
| #. * standalone, when this is a month of the current year. | ||||
| #. * "%OB" is the new format specifier introduced in glibc 2.27, | ||||
| #. * in most cases you should not change it. | ||||
| #. | ||||
| #: js/ui/calendar.js:382 | ||||
| msgid "%OB" | ||||
| msgstr "%OB" | ||||
|  | ||||
| #. * | ||||
| #. * Translators: The header displaying the month name and the year | ||||
| #. * number, when this is a month of a different year.  You can | ||||
| #. * reorder the format specifiers or add other modifications | ||||
| #. * according to the requirements of your language. | ||||
| #. * "%OB" is the new format specifier introduced in glibc 2.27, | ||||
| #. * in most cases you should not use the old "%B" here unless you | ||||
| #. * absolutely know what you are doing. | ||||
| #. | ||||
| #: js/ui/calendar.js:392 | ||||
| msgid "%OB %Y" | ||||
| msgstr "%OB %Y" | ||||
|  | ||||
| #: js/ui/calendar.js:449 | ||||
| msgid "Previous month" | ||||
| msgstr "Önceki ay" | ||||
| @@ -1217,12 +1240,10 @@ msgid "Allow" | ||||
| msgstr "İzin ver" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:33 | ||||
| #| msgid "Slow Keys" | ||||
| msgid "Slow Keys Turned On" | ||||
| msgstr "Yavaş Tuşlar Açık" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:34 | ||||
| #| msgid "Slow Keys" | ||||
| msgid "Slow Keys Turned Off" | ||||
| msgstr "Yavaş Tuşlar Kapalı" | ||||
|  | ||||
| @@ -1235,12 +1256,10 @@ msgstr "" | ||||
| "etkileyen Yavaş Tuşlar özelliğinin kısayoludur." | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:42 | ||||
| #| msgid "Sticky Keys" | ||||
| msgid "Sticky Keys Turned On" | ||||
| msgstr "Yapışkan Tuşlar Açık" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:43 | ||||
| #| msgid "Sticky Keys" | ||||
| msgid "Sticky Keys Turned Off" | ||||
| msgstr "Yapışkan Tuşlar Kapalı" | ||||
|  | ||||
| @@ -1283,7 +1302,6 @@ msgid "Leave Off" | ||||
| msgstr "Kapalı Bırak" | ||||
|  | ||||
| #: js/ui/keyboard.js:198 | ||||
| #| msgid "Date & Time Settings" | ||||
| msgid "Region & Language Settings" | ||||
| msgstr "Bölge ve Dil Ayarları" | ||||
|  | ||||
| @@ -1486,11 +1504,11 @@ msgstr "GNOME’un ekranı kilitlemesi gerekiyor" | ||||
| #. | ||||
| #. XXX: another option is to kick the user into the gdm login | ||||
| #. screen, where we're not affected by grabs | ||||
| #: js/ui/screenShield.js:836 js/ui/screenShield.js:1308 | ||||
| #: js/ui/screenShield.js:836 js/ui/screenShield.js:1311 | ||||
| msgid "Unable to lock" | ||||
| msgstr "Kilitlenemedi" | ||||
|  | ||||
| #: js/ui/screenShield.js:837 js/ui/screenShield.js:1309 | ||||
| #: js/ui/screenShield.js:837 js/ui/screenShield.js:1312 | ||||
| msgid "Lock was blocked by an application" | ||||
| msgstr "Kilitleme bir uygulama tarafından engellendi" | ||||
|  | ||||
|   | ||||
							
								
								
									
										569
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										569
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										550
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										550
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -200,6 +200,7 @@ gtk_menu_tracker_item_finalize (GObject *object) | ||||
|   GtkMenuTrackerItem *self = GTK_MENU_TRACKER_ITEM (object); | ||||
|  | ||||
|   g_free (self->action_namespace); | ||||
|   g_free (self->action_and_target); | ||||
|  | ||||
|   if (self->observable) | ||||
|     g_object_unref (self->observable); | ||||
|   | ||||
| @@ -73,8 +73,8 @@ struct _ShellGlobal { | ||||
|   ShellWM *wm; | ||||
|   GSettings *settings; | ||||
|   const char *datadir; | ||||
|   const char *imagedir; | ||||
|   const char *userdatadir; | ||||
|   char *imagedir; | ||||
|   char *userdatadir; | ||||
|   GFile *userdatadir_path; | ||||
|   GFile *runtime_state_path; | ||||
|  | ||||
| @@ -337,6 +337,10 @@ shell_global_finalize (GObject *object) | ||||
|   g_clear_object (&global->userdatadir_path); | ||||
|   g_clear_object (&global->runtime_state_path); | ||||
|  | ||||
|   g_free (global->session_mode); | ||||
|   g_free (global->imagedir); | ||||
|   g_free (global->userdatadir); | ||||
|  | ||||
|   G_OBJECT_CLASS(shell_global_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -308,9 +308,8 @@ st_entry_style_changed (StWidget *self) | ||||
|     } | ||||
|  | ||||
|   theme_node = st_widget_get_theme_node (self); | ||||
|   | ||||
|   st_theme_node_get_foreground_color (theme_node, &color); | ||||
|   clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color); | ||||
|  | ||||
|   _st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node); | ||||
|  | ||||
|   if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size)) | ||||
|     clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size)); | ||||
|   | ||||
| @@ -116,6 +116,7 @@ _st_set_text_from_style (ClutterText *text, | ||||
|   PangoAttrList *attribs = NULL; | ||||
|   const PangoFontDescription *font; | ||||
|   StTextAlign align; | ||||
|   gdouble spacing; | ||||
|  | ||||
|   st_theme_node_get_foreground_color (theme_node, &color); | ||||
|   clutter_text_set_color (text, &color); | ||||
| @@ -123,11 +124,11 @@ _st_set_text_from_style (ClutterText *text, | ||||
|   font = st_theme_node_get_font (theme_node); | ||||
|   clutter_text_set_font_description (text, (PangoFontDescription *) font); | ||||
|  | ||||
|   attribs = pango_attr_list_new (); | ||||
|  | ||||
|   decoration = st_theme_node_get_text_decoration (theme_node); | ||||
|   if (decoration) | ||||
|     { | ||||
|       attribs = pango_attr_list_new (); | ||||
|  | ||||
|       if (decoration & ST_TEXT_DECORATION_UNDERLINE) | ||||
|         { | ||||
|           PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); | ||||
| @@ -143,6 +144,13 @@ _st_set_text_from_style (ClutterText *text, | ||||
|        */ | ||||
|     } | ||||
|  | ||||
|   spacing = st_theme_node_get_letter_spacing (theme_node); | ||||
|   if (spacing) | ||||
|     { | ||||
|       PangoAttribute *letter_spacing = pango_attr_letter_spacing_new ((int)(.5 + spacing) * PANGO_SCALE); | ||||
|       pango_attr_list_insert (attribs, letter_spacing); | ||||
|     } | ||||
|  | ||||
|   clutter_text_set_attributes (text, attribs); | ||||
|  | ||||
|   if (attribs) | ||||
| @@ -414,11 +422,9 @@ _st_create_shadow_pipeline_from_actor (StShadow     *shadow_spec, | ||||
|                                        ClutterActor *actor) | ||||
| { | ||||
|   CoglPipeline *shadow_pipeline = NULL; | ||||
|   ClutterActorBox box; | ||||
|   float width, height; | ||||
|  | ||||
|   clutter_actor_get_allocation_box (actor, &box); | ||||
|   clutter_actor_box_get_size (&box, &width, &height); | ||||
|   clutter_actor_get_size (actor, &width, &height); | ||||
|  | ||||
|   if (width == 0 || height == 0) | ||||
|     return NULL; | ||||
| @@ -441,6 +447,7 @@ _st_create_shadow_pipeline_from_actor (StShadow     *shadow_spec, | ||||
|       CoglFramebuffer *fb; | ||||
|       CoglColor clear_color; | ||||
|       CoglError *catch_error = NULL; | ||||
|       float x, y; | ||||
|  | ||||
|       buffer = cogl_texture_new_with_size (width, | ||||
|                                            height, | ||||
| @@ -462,6 +469,7 @@ _st_create_shadow_pipeline_from_actor (StShadow     *shadow_spec, | ||||
|         } | ||||
|  | ||||
|       cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0); | ||||
|       clutter_actor_get_position (actor, &x, &y); | ||||
|  | ||||
|       /* XXX: There's no way to render a ClutterActor to an offscreen | ||||
|        * as it uses the implicit API. */ | ||||
| @@ -470,7 +478,7 @@ _st_create_shadow_pipeline_from_actor (StShadow     *shadow_spec, | ||||
|       G_GNUC_END_IGNORE_DEPRECATIONS; | ||||
|  | ||||
|       cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color); | ||||
|       cogl_framebuffer_translate (fb, -box.x1, -box.y1, 0); | ||||
|       cogl_framebuffer_translate (fb, -x, -y, 0); | ||||
|       cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0); | ||||
|  | ||||
|       clutter_actor_set_opacity_override (actor, 255); | ||||
|   | ||||
| @@ -2545,6 +2545,28 @@ st_theme_node_get_text_align(StThemeNode *node) | ||||
|   return ST_TEXT_ALIGN_LEFT; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * st_theme_node_get_letter_spacing: | ||||
|  * @node: a #StThemeNode | ||||
|  * | ||||
|  * Gets the value for the letter-spacing style property, in pixels. | ||||
|  * | ||||
|  * Return value: the value of the letter-spacing property, if | ||||
|  *   found, or zero if such property has not been found. | ||||
|  */ | ||||
| gdouble | ||||
| st_theme_node_get_letter_spacing (StThemeNode *node) | ||||
| { | ||||
|   gdouble spacing = 0.; | ||||
|  | ||||
|   g_return_val_if_fail (ST_IS_THEME_NODE (node), spacing); | ||||
|  | ||||
|   ensure_properties (node); | ||||
|  | ||||
|   st_theme_node_lookup_length (node, "letter-spacing", FALSE, &spacing); | ||||
|   return spacing; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| font_family_from_terms (CRTerm *term, | ||||
|                         char  **family) | ||||
|   | ||||
| @@ -223,6 +223,8 @@ StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node); | ||||
|  | ||||
| StTextAlign st_theme_node_get_text_align (StThemeNode *node); | ||||
|  | ||||
| double st_theme_node_get_letter_spacing (StThemeNode *node); | ||||
|  | ||||
| /* Font rule processing is pretty complicated, so we just hardcode it | ||||
|  * under the standard font/font-family/font-size/etc names. This means | ||||
|  * you can't have multiple separate styled fonts for a single item, | ||||
|   | ||||
| @@ -38,6 +38,10 @@ const tests = [ | ||||
|       output: [ { url: 'http://www.gnome.org:99/port', pos: 10 } ] }, | ||||
|     { input: 'This is an ftp://www.gnome.org/ test.', | ||||
|       output: [ { url: 'ftp://www.gnome.org/', pos: 11 } ] }, | ||||
|     { input: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)', | ||||
|       output: [ { url: 'https://www.gnome.org/(some_url,_with_very_unusual_characters)', pos: 0 } ] }, | ||||
|     { input: 'https://www.gnome.org/(some_url_with_unbalanced_parenthesis', | ||||
|       output: [ { url: 'https://www.gnome.org/', pos: 0 } ] }, | ||||
|  | ||||
|     { input: 'Visit http://www.gnome.org/ and http://developer.gnome.org', | ||||
|       output: [ { url: 'http://www.gnome.org/', pos: 6 }, | ||||
| @@ -68,4 +72,4 @@ for (let i = 0; i < tests.length; i++) { | ||||
| 	JsUnit.assertEquals('Test ' + i + ', match ' + j + ' position', | ||||
| 			    match[j].pos, tests[i].output[j].pos); | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user