Compare commits
	
		
			84 Commits
		
	
	
		
			3.31.92
			...
			wip/jimmac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 6393e90a5a | ||
|   | 4e5ca6d376 | ||
|   | 2fab75f448 | ||
|   | 22883f2fa2 | ||
|   | 5d9f80bc73 | ||
|   | f7d117488b | ||
|   | 244a329ee7 | ||
|   | 044572cb60 | ||
|   | 746875258d | ||
|   | 4892a87dfe | ||
|   | 8b9c8ddb1e | ||
|   | eb9000576c | ||
|   | 862aaf341e | ||
|   | a5c75ff58b | ||
|   | 4541fb9819 | ||
|   | 9f8edd980c | ||
|   | e5b9043435 | ||
|   | c0012c2ea4 | ||
|   | b77e4975f0 | ||
|   | e83f2344f6 | ||
|   | de6512be1a | ||
|   | 0b72ff1896 | ||
|   | fea0192772 | ||
|   | f81ac498fb | ||
|   | 5357e0a18c | ||
|   | d7632bbd3d | ||
|   | 1b5e91e4b3 | ||
|   | 727195c767 | ||
|   | 9158f55360 | ||
|   | 8146e9d527 | ||
|   | 4247251020 | ||
|   | 7eee0e0ed6 | ||
|   | 4f0851ca77 | ||
|   | 911ae49767 | ||
|   | 5af81d4057 | ||
|   | c435889baa | ||
|   | 49f79d9d5d | ||
|   | 1767cd0f6c | ||
|   | 3e0915521a | ||
|   | a298943fac | ||
|   | df9ddf96a5 | ||
|   | 4fa5d701d5 | ||
|   | b05683d586 | ||
|   | 2f3f3fbcdb | ||
|   | 611605a67f | ||
|   | 0427a782be | ||
|   | 32baff5906 | ||
|   | 0089143d06 | ||
|   | 05e55cee23 | ||
|   | 31e7f0340f | ||
|   | 6e317a54fd | ||
|   | 9c1f62c38c | ||
|   | 1341d5557f | ||
|   | b7d79a5f06 | ||
|   | 62233a4db4 | ||
|   | 4a7e2ddff5 | ||
|   | fb737ebde0 | ||
|   | bf77cb44e7 | ||
|   | c72e2bb4a9 | ||
|   | 68c182b1df | ||
|   | 348d303794 | ||
|   | ede0fd8660 | ||
|   | 187c2193e8 | ||
|   | 706bdd8059 | ||
|   | 436861edc8 | ||
|   | 9729a2e772 | ||
|   | 6b924c00c5 | ||
|   | b90f4d29a4 | ||
|   | 47915f8c11 | ||
|   | 5dfdeaa4ea | ||
|   | 98a2a81f2a | ||
|   | c4850027bc | ||
|   | d4202e7f38 | ||
|   | 4f65283f31 | ||
|   | d86d3bbe54 | ||
|   | 6f794738e8 | ||
|   | ef7a93bb07 | ||
|   | 5197a992a6 | ||
|   | 49d8540f6d | ||
|   | 6e1a1f1a57 | ||
|   | c73428247c | ||
|   | fc2caf5794 | ||
|   | b117826ada | ||
|   | 26b44b48ab | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -80,3 +80,4 @@ tests/run-test.sh | ||||
| *~ | ||||
| *.patch | ||||
| *.sw? | ||||
| .vscode | ||||
|   | ||||
| @@ -15,10 +15,8 @@ variables: | ||||
|         - merge_requests | ||||
|  | ||||
| check_commit_log: | ||||
|     image: registry.fedoraproject.org/fedora:latest | ||||
|     image: registry.gitlab.gnome.org/gnome/mutter/master:v1 | ||||
|     stage: review | ||||
|     before_script: | ||||
|         - dnf install -y git | ||||
|     script: | ||||
|         - ./.gitlab-ci/check-commit-log.sh | ||||
|     only: | ||||
|   | ||||
							
								
								
									
										14
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,17 @@ | ||||
| 3.32.0 | ||||
| ====== | ||||
| * Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439] | ||||
| * Fix test linker failure on Debian/Ubuntu [Iain; !442] | ||||
| * Avoid assertion when sizing fallback app icons from CSS [Florian; #1027] | ||||
| * Fix mis-sized menu arrows after texture cache changes [Florian; !452] | ||||
|  | ||||
| Contributors: | ||||
|   Carlos Garnacho, Iain Lane, Florian Müllner | ||||
|  | ||||
| Translators: | ||||
|   Gábor Kelemen [hu], Victor Ibragimov [tg], Ryuta Fujii [ja], Piotr Drąg [af, | ||||
|   tg], Mart Raudsepp [et] | ||||
|  | ||||
| 3.31.92 | ||||
| ======= | ||||
| * Fix visual glitch in submenus [Alex; #987] | ||||
|   | ||||
| @@ -9,9 +9,6 @@ | ||||
|     <method name="ShowOSD"> | ||||
|       <arg type="a{sv}" direction="in" name="params"/> | ||||
|     </method> | ||||
|     <method name="ShowMonitorLabels"> | ||||
|       <arg type="a{uv}" direction="in" name="params"/> | ||||
|     </method> | ||||
|     <method name="ShowMonitorLabels2"> | ||||
|       <arg type="a{sv}" direction="in" name="params"/> | ||||
|     </method> | ||||
|   | ||||
| @@ -16,12 +16,12 @@ $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), li | ||||
| $top_hilight: $borders_edge; | ||||
|  | ||||
| $warning_color: #f57900; | ||||
| $error_color: #cc0000; | ||||
| $error_color: #ff8080; | ||||
| $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%)); | ||||
| $destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); | ||||
|  | ||||
| $osd_fg_color: #eeeeec; | ||||
| $osd_bg_color: #2e3436; | ||||
| $osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 15%),0.3); | ||||
| $osd_borders_color: transparentize(black, 0.3); | ||||
| $osd_outer_borders_color: transparentize(white, 0.9); | ||||
|  | ||||
|   | ||||
| @@ -29,7 +29,7 @@ $panel-corner-radius: 6px; | ||||
| /* GLOBALS */ | ||||
| $font-size: 11; | ||||
| $font-family: Cantarell, Sans-Serif; | ||||
| $_bubble_bg_color: opacify($osd_bg_color,0.25); | ||||
| $_bubble_bg_color: $osd_bg_color; | ||||
| $_bubble_fg_color: $osd_fg_color; | ||||
| $_bubble_borders_color: transparentize($osd_fg_color,0.8); | ||||
|  | ||||
| @@ -184,7 +184,7 @@ StScrollBar { | ||||
| .modal-dialog { | ||||
|   border-radius: 9px; | ||||
|   color: $osd_fg_color; | ||||
|   background-color: transparentize(darken($osd_bg_color,10%),0.05); | ||||
|   background-color: $osd_bg_color; | ||||
|   border: 1px solid $_bubble_borders_color; | ||||
|   .modal-dialog-content-box { | ||||
|     padding: 24px; | ||||
| @@ -392,7 +392,7 @@ StScrollBar { | ||||
|  | ||||
|   .prompt-dialog-error-label { | ||||
|     font-size: 10pt; | ||||
|     color: $error_color; | ||||
|     color: $warning_color; | ||||
|     padding-bottom: 8px; | ||||
|   } | ||||
|  | ||||
| @@ -1031,6 +1031,11 @@ StScrollBar { | ||||
|             -st-icon-style: symbolic; | ||||
|           } | ||||
|  | ||||
|           .message-icon-bin > .fallback-window-icon { | ||||
|             width: 1.09em; | ||||
|             height: 1.09em; | ||||
|           } | ||||
|  | ||||
|           .message-secondary-bin { | ||||
|             padding: 0 0.82em;; | ||||
|           } | ||||
| @@ -1137,8 +1142,14 @@ StScrollBar { | ||||
|  | ||||
| .ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position | ||||
|  | ||||
| // Rubberband for select-area screenshots | ||||
| .select-area-rubberband { | ||||
|   background-color: transparentize($selected_bg_color,0.7); | ||||
|   border: 1px solid $selected_bg_color; | ||||
| } | ||||
|  | ||||
| // not really top bar only | ||||
| .popup-menu-arrow { width: 16px; height: 16px; } | ||||
| .popup-menu-arrow { icon-size: 1.09em; } | ||||
| .popup-menu-icon { icon-size: 1.09em; } | ||||
|  | ||||
| //close buttons | ||||
| @@ -1448,13 +1459,13 @@ StScrollBar { | ||||
|       height: 12px; | ||||
|       background-color: transparent; | ||||
|       border: 2px solid rgba(255, 255, 255, 0.4); | ||||
|       border-radius:12px; | ||||
|       border-radius: 12px; | ||||
|     } | ||||
|  | ||||
|     &:hover .page-indicator-icon { border-color: white; } | ||||
|     &:active .page-indicator-icon { border: none; margin: 2px; background-color:#fff; } | ||||
|     &:active .page-indicator-icon { border: none; margin: 2px; background-color: white; } | ||||
|     &:checked .page-indicator-icon, | ||||
|     &:checked:active { background-color: #fff;} | ||||
|     &:checked:active .page-indicator-icon { background-color: white;} | ||||
|   } | ||||
|  | ||||
|   .no-frequent-applications-label { @extend %status_text; } | ||||
|   | ||||
| @@ -111,7 +111,7 @@ | ||||
|   } | ||||
| } | ||||
|  | ||||
| @mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) { | ||||
| @mixin button($t, $c:opacify(lighten($osd_bg_color, 5%),1.0), $tc:$fg_color, $edge: $borders_edge) { | ||||
| // | ||||
| // Button drawing function | ||||
| // | ||||
| @@ -136,8 +136,7 @@ | ||||
|   // | ||||
|   // normal button | ||||
|   // | ||||
|     $_bg: if($c!=$osd_bg_color, transparentize($c, 0.5), | ||||
|                             $osd_bg_color); | ||||
|     $_bg: $c; | ||||
|  | ||||
|     color: $osd_fg_color; | ||||
|     background-color: $_bg; | ||||
| @@ -150,8 +149,7 @@ | ||||
|   // | ||||
|   // focused button | ||||
|   // | ||||
|     $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), | ||||
|                           lighten($osd_bg_color,3%)); | ||||
|     $_bg: lighten($c,3%); | ||||
|  | ||||
|     color: $osd_fg_color; | ||||
|     text-shadow: 0 1px black; | ||||
| @@ -163,8 +161,7 @@ | ||||
|   // | ||||
|   // active osd button | ||||
|   // | ||||
|     $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), | ||||
|                             lighten($osd_bg_color,3%)); | ||||
|     $_bg: lighten($c,3%); | ||||
|  | ||||
|     color: white; | ||||
|     border-color: $osd_borders_color; | ||||
|   | ||||
| @@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow { | ||||
|  | ||||
|         let button = new Gtk.Button({ valign: Gtk.Align.CENTER, | ||||
|                                       no_show_all: true }); | ||||
|         button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic', | ||||
|                                    icon_size: Gtk.IconSize.BUTTON, | ||||
|                                    visible: true })); | ||||
|         button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic', | ||||
|                                          icon_size: Gtk.IconSize.BUTTON, | ||||
|                                          visible: true })); | ||||
|         button.get_style_context().add_class('circular'); | ||||
|         hbox.add(button); | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,14 @@ var WeatherClient = class { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (this._permStore.g_name_owner == null) { | ||||
|                 // Failed to auto-start, likely because xdg-desktop-portal | ||||
|                 // isn't installed; don't restrict access to location service | ||||
|                 this._weatherAuthorized = true; | ||||
|                 this._updateAutoLocation(); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => { | ||||
|                 if (error) | ||||
|                     log('Error looking up permission: ' + error.message); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ const Scripting = imports.ui.scripting; | ||||
| // someone should be able to get an idea of how well the shell is performing | ||||
| // on a particular system. | ||||
|  | ||||
| let METRICS = { | ||||
| var METRICS = { | ||||
|     overviewLatencyFirst: | ||||
|     { description: "Time to first frame after triggering overview, first time", | ||||
|       units: "us" }, | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| const { Clutter, Gio, Gtk, Shell } = imports.gi; | ||||
| const { Clutter, Gio, Shell } = imports.gi; | ||||
| const Main = imports.ui.main; | ||||
| const Scripting = imports.ui.scripting; | ||||
|  | ||||
| let METRICS = { | ||||
| var METRICS = { | ||||
|     timeToDesktop: | ||||
|     { description: "Time from starting graphical.target to desktop showing", | ||||
|       units: "us" }, | ||||
| @@ -104,7 +104,10 @@ function *run() { | ||||
|     yield Scripting.waitLeisure(); | ||||
|     Scripting.scriptEvent('desktopShown'); | ||||
|  | ||||
|     Gtk.Settings.get_default().gtk_enable_animations = false; | ||||
|     let interfaceSettings = new Gio.Settings({ | ||||
|         schema_id: 'org.gnome.desktop.interface' | ||||
|     }); | ||||
|     interfaceSettings.set_boolean('enable-animations', false); | ||||
|  | ||||
|     Scripting.scriptEvent('overviewShowStart'); | ||||
|     Main.overview.show(); | ||||
| @@ -200,7 +203,7 @@ function *run() { | ||||
|  | ||||
|     yield Scripting.sleep(1000); | ||||
|  | ||||
|     Gtk.Settings.get_default().gtk_enable_animations = true; | ||||
|     interfaceSettings.set_boolean('enable-animations', true); | ||||
| } | ||||
|  | ||||
| let overviewShowStart; | ||||
|   | ||||
| @@ -619,9 +619,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup { | ||||
| var WindowCyclerPopup = GObject.registerClass( | ||||
| class WindowCyclerPopup extends CyclerPopup { | ||||
|     _init() { | ||||
|         super._init(); | ||||
|  | ||||
|         this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); | ||||
|         super._init(); | ||||
|     } | ||||
|  | ||||
|     _getWindows() { | ||||
|   | ||||
| @@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = { | ||||
|     'epiphany.desktop': 'org.gnome.Epiphany.desktop', | ||||
|     'evolution.desktop': 'org.gnome.Evolution.desktop', | ||||
|     'file-roller.desktop': 'org.gnome.FileRoller.desktop', | ||||
|     'five-or-more.desktop': 'org.gnome.five-or-more.desktop', | ||||
|     'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop', | ||||
|     'gcalctool.desktop': 'org.gnome.Calculator.desktop', | ||||
|     'geary.desktop': 'org.gnome.Geary.desktop', | ||||
|     'gedit.desktop': 'org.gnome.gedit.desktop', | ||||
|     'glchess.desktop': 'gnome-chess.desktop', | ||||
|     'glines.desktop': 'five-or-more.desktop', | ||||
|     'gnect.desktop': 'four-in-a-row.desktop', | ||||
|     'glchess.desktop': 'org.gnome.Chess.desktop', | ||||
|     'glines.desktop': 'org.gnome.five-or-more.desktop', | ||||
|     'gnect.desktop': 'org.gnome.Four-in-a-row.desktop', | ||||
|     'gnibbles.desktop': 'org.gnome.Nibbles.desktop', | ||||
|     'gnobots2.desktop': 'gnome-robots.desktop', | ||||
|     'gnobots2.desktop': 'org.gnome.Robots.desktop', | ||||
|     'gnome-boxes.desktop': 'org.gnome.Boxes.desktop', | ||||
|     'gnome-calculator.desktop': 'org.gnome.Calculator.desktop', | ||||
|     'gnome-chess.desktop': 'org.gnome.Chess.desktop', | ||||
|     'gnome-clocks.desktop': 'org.gnome.clocks.desktop', | ||||
|     'gnome-contacts.desktop': 'org.gnome.Contacts.desktop', | ||||
|     'gnome-documents.desktop': 'org.gnome.Documents.desktop', | ||||
|     'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop', | ||||
|     'gnome-klotski.desktop': 'org.gnome.Klotski.desktop', | ||||
|     'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop', | ||||
|     'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop', | ||||
|     'gnome-mines.desktop': 'org.gnome.Mines.desktop', | ||||
|     'gnome-music.desktop': 'org.gnome.Music.desktop', | ||||
|     'gnome-photos.desktop': 'org.gnome.Photos.desktop', | ||||
|     'gnome-robots.desktop': 'org.gnome.Robots.desktop', | ||||
|     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', | ||||
|     'gnome-software.desktop': 'org.gnome.Software.desktop', | ||||
|     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', | ||||
|     'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop', | ||||
|     'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop', | ||||
|     'gnome-weather.desktop': 'org.gnome.Weather.desktop', | ||||
|     'gnomine.desktop': 'gnome-mines.desktop', | ||||
|     'gnotravex.desktop': 'gnome-tetravex.desktop', | ||||
|     'gnotski.desktop': 'gnome-klotski.desktop', | ||||
|     'gtali.desktop': 'tali.desktop', | ||||
|     'gnomine.desktop': 'org.gnome.Mines.desktop', | ||||
|     'gnotravex.desktop': 'org.gnome.Tetravex.desktop', | ||||
|     'gnotski.desktop': 'org.gnome.Klotski.desktop', | ||||
|     'gtali.desktop': 'org.gnome.Tali.desktop', | ||||
|     'iagno.desktop': 'org.gnome.Reversi.desktop', | ||||
|     'nautilus.desktop': 'org.gnome.Nautilus.desktop', | ||||
|     'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop', | ||||
|     'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop', | ||||
|     'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop', | ||||
|     'polari.desktop': 'org.gnome.Polari.desktop', | ||||
|     'tali.desktop': 'org.gnome.Tali.desktop', | ||||
|     'totem.desktop': 'org.gnome.Totem.desktop', | ||||
|     'evince.desktop': 'org.gnome.Evince.desktop', | ||||
| }; | ||||
|   | ||||
| @@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15; | ||||
|  * placed.  The arrow position may be controlled via | ||||
|  * setArrowOrigin(). The arrow side might be temporarily flipped | ||||
|  * depending on the box size and source position to keep the box | ||||
|  * totally inside the monitor if possible. | ||||
|  * totally inside the monitor workarea if possible. | ||||
|  * | ||||
|  */ | ||||
| var BoxPointer = GObject.registerClass({ | ||||
| @@ -47,10 +47,6 @@ var BoxPointer = GObject.registerClass({ | ||||
|         this._border.connect('repaint', this._drawBorder.bind(this)); | ||||
|         this.add_actor(this._border); | ||||
|         this.bin.raise(this._border); | ||||
|         this._xOffset = 0; | ||||
|         this._yOffset = 0; | ||||
|         this._xPosition = 0; | ||||
|         this._yPosition = 0; | ||||
|         this._sourceAlignment = 0.5; | ||||
|         this._capturedEventId = 0; | ||||
|         this._muteInput(); | ||||
| @@ -118,23 +114,23 @@ var BoxPointer = GObject.registerClass({ | ||||
|         if (animate & PopupAnimation.SLIDE) { | ||||
|             switch (this._arrowSide) { | ||||
|                 case St.Side.TOP: | ||||
|                     this.yOffset = -rise; | ||||
|                     this.translation_y = -rise; | ||||
|                     break; | ||||
|                 case St.Side.BOTTOM: | ||||
|                     this.yOffset = rise; | ||||
|                     this.translation_y = rise; | ||||
|                     break; | ||||
|                 case St.Side.LEFT: | ||||
|                     this.xOffset = -rise; | ||||
|                     this.translation_x = -rise; | ||||
|                     break; | ||||
|                 case St.Side.RIGHT: | ||||
|                     this.xOffset = rise; | ||||
|                     this.translation_x = rise; | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         Tweener.addTween(this, { opacity: 255, | ||||
|                                  xOffset: 0, | ||||
|                                  yOffset: 0, | ||||
|                                  translation_x: 0, | ||||
|                                  translation_y: 0, | ||||
|                                  transition: 'linear', | ||||
|                                  onComplete: () => { | ||||
|                                      this._unmuteInput(); | ||||
| @@ -148,8 +144,8 @@ var BoxPointer = GObject.registerClass({ | ||||
|         if (!this.visible) | ||||
|             return; | ||||
|  | ||||
|         let xOffset = 0; | ||||
|         let yOffset = 0; | ||||
|         let translationX = 0; | ||||
|         let translationY = 0; | ||||
|         let themeNode = this.get_theme_node(); | ||||
|         let rise = themeNode.get_length('-arrow-rise'); | ||||
|         let fade = (animate & PopupAnimation.FADE); | ||||
| @@ -158,16 +154,16 @@ var BoxPointer = GObject.registerClass({ | ||||
|         if (animate & PopupAnimation.SLIDE) { | ||||
|             switch (this._arrowSide) { | ||||
|                 case St.Side.TOP: | ||||
|                     yOffset = rise; | ||||
|                     translationY = rise; | ||||
|                     break; | ||||
|                 case St.Side.BOTTOM: | ||||
|                     yOffset = -rise; | ||||
|                     translationY = -rise; | ||||
|                     break; | ||||
|                 case St.Side.LEFT: | ||||
|                     xOffset = rise; | ||||
|                     translationX = rise; | ||||
|                     break; | ||||
|                 case St.Side.RIGHT: | ||||
|                     xOffset = -rise; | ||||
|                     translationX = -rise; | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
| @@ -176,15 +172,15 @@ var BoxPointer = GObject.registerClass({ | ||||
|  | ||||
|         Tweener.removeTweens(this); | ||||
|         Tweener.addTween(this, { opacity: fade ? 0 : 255, | ||||
|                                  xOffset: xOffset, | ||||
|                                  yOffset: yOffset, | ||||
|                                  translation_x: translationX, | ||||
|                                  translation_y: translationY, | ||||
|                                  transition: 'linear', | ||||
|                                  time: animationTime, | ||||
|                                  onComplete: () => { | ||||
|                                      this.hide(); | ||||
|                                      this.opacity = 0; | ||||
|                                      this.xOffset = 0; | ||||
|                                      this.yOffset = 0; | ||||
|                                      this.translation_x = 0; | ||||
|                                      this.translation_y = 0; | ||||
|                                      if (onComplete) | ||||
|                                          onComplete(); | ||||
|                                  } | ||||
| @@ -477,11 +473,15 @@ var BoxPointer = GObject.registerClass({ | ||||
|     _reposition() { | ||||
|         let sourceActor = this._sourceActor; | ||||
|         let alignment = this._arrowAlignment; | ||||
|         let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor); | ||||
|  | ||||
|         this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor); | ||||
|         this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); | ||||
|  | ||||
|         // Position correctly relative to the sourceActor | ||||
|         let sourceNode = sourceActor.get_theme_node(); | ||||
|         let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); | ||||
|         let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor); | ||||
|         let sourceAllocation = this._sourceAllocation; | ||||
|         let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment; | ||||
|         let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment; | ||||
|         let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size(); | ||||
| @@ -489,7 +489,7 @@ var BoxPointer = GObject.registerClass({ | ||||
|         // We also want to keep it onscreen, and separated from the | ||||
|         // edge by the same distance as the main part of the box is | ||||
|         // separated from its sourceActor | ||||
|         let monitor = Main.layoutManager.findMonitorForActor(sourceActor); | ||||
|         let workarea = this._workArea; | ||||
|         let themeNode = this.get_theme_node(); | ||||
|         let borderWidth = themeNode.get_length('-arrow-border-width'); | ||||
|         let arrowBase = themeNode.get_length('-arrow-base'); | ||||
| @@ -539,8 +539,8 @@ var BoxPointer = GObject.registerClass({ | ||||
|         case St.Side.BOTTOM: | ||||
|             resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment); | ||||
|  | ||||
|             resX = Math.max(resX, monitor.x + padding); | ||||
|             resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth)); | ||||
|             resX = Math.max(resX, workarea.x + padding); | ||||
|             resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth)); | ||||
|  | ||||
|             arrowOrigin = sourceCenterX - resX; | ||||
|             if (arrowOrigin <= (x1 + (borderRadius + halfBase))) { | ||||
| @@ -558,8 +558,8 @@ var BoxPointer = GObject.registerClass({ | ||||
|         case St.Side.RIGHT: | ||||
|             resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment); | ||||
|  | ||||
|             resY = Math.max(resY, monitor.y + padding); | ||||
|             resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight)); | ||||
|             resY = Math.max(resY, workarea.y + padding); | ||||
|             resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight)); | ||||
|  | ||||
|             arrowOrigin = sourceCenterY - resY; | ||||
|             if (arrowOrigin <= (y1 + (borderRadius + halfBase))) { | ||||
| @@ -583,9 +583,9 @@ var BoxPointer = GObject.registerClass({ | ||||
|             parent = parent.get_parent(); | ||||
|         } | ||||
|  | ||||
|         this._xPosition = Math.floor(x); | ||||
|         this._yPosition = Math.floor(y); | ||||
|         this._shiftActor(); | ||||
|         // Actually set the position | ||||
|         this.x = Math.floor(x); | ||||
|         this.y = Math.floor(y); | ||||
|     } | ||||
|  | ||||
|     // @origin: Coordinate specifying middle of the arrow, along | ||||
| @@ -608,44 +608,30 @@ var BoxPointer = GObject.registerClass({ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     _shiftActor() { | ||||
|         // Since the position of the BoxPointer depends on the allocated size | ||||
|         // of the BoxPointer and the position of the source actor, trying | ||||
|         // to position the BoxPointer via the x/y properties will result in | ||||
|         // allocation loops and warnings. Instead we do the positioning via | ||||
|         // the anchor point, which is independent of allocation, and leave | ||||
|         // x == y == 0. | ||||
|         this.set_anchor_point(-(this._xPosition + this._xOffset), | ||||
|                               -(this._yPosition + this._yOffset)); | ||||
|     } | ||||
|  | ||||
|     _calculateArrowSide(arrowSide) { | ||||
|         let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor); | ||||
|         let sourceAllocation = this._sourceAllocation; | ||||
|         let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size(); | ||||
|         let monitorActor = this.sourceActor; | ||||
|         if (!monitorActor) | ||||
|             monitorActor = this; | ||||
|         let monitor = Main.layoutManager.findMonitorForActor(monitorActor); | ||||
|         let workarea = this._workArea; | ||||
|  | ||||
|         switch (arrowSide) { | ||||
|         case St.Side.TOP: | ||||
|             if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height && | ||||
|                 boxHeight < sourceAllocation.y1 - monitor.y) | ||||
|             if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height && | ||||
|                 boxHeight < sourceAllocation.y1 - workarea.y) | ||||
|                 return St.Side.BOTTOM; | ||||
|             break; | ||||
|         case St.Side.BOTTOM: | ||||
|             if (sourceAllocation.y1 - boxHeight < monitor.y && | ||||
|                 boxHeight < monitor.y + monitor.height - sourceAllocation.y2) | ||||
|             if (sourceAllocation.y1 - boxHeight < workarea.y && | ||||
|                 boxHeight < workarea.y + workarea.height - sourceAllocation.y2) | ||||
|                 return St.Side.TOP; | ||||
|             break; | ||||
|         case St.Side.LEFT: | ||||
|             if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width && | ||||
|                 boxWidth < sourceAllocation.x1 - monitor.x) | ||||
|             if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width && | ||||
|                 boxWidth < sourceAllocation.x1 - workarea.x) | ||||
|                 return St.Side.RIGHT; | ||||
|             break; | ||||
|         case St.Side.RIGHT: | ||||
|             if (sourceAllocation.x1 - boxWidth < monitor.x && | ||||
|                 boxWidth < monitor.x + monitor.width - sourceAllocation.x2) | ||||
|             if (sourceAllocation.x1 - boxWidth < workarea.x && | ||||
|                 boxWidth < workarea.x + workarea.width - sourceAllocation.x2) | ||||
|                 return St.Side.LEFT; | ||||
|             break; | ||||
|         } | ||||
| @@ -667,24 +653,6 @@ var BoxPointer = GObject.registerClass({ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     set xOffset(offset) { | ||||
|         this._xOffset = offset; | ||||
|         this._shiftActor(); | ||||
|     } | ||||
|  | ||||
|     get xOffset() { | ||||
|         return this._xOffset; | ||||
|     } | ||||
|  | ||||
|     set yOffset(offset) { | ||||
|         this._yOffset = offset; | ||||
|         this._shiftActor(); | ||||
|     } | ||||
|  | ||||
|     get yOffset() { | ||||
|         return this._yOffset; | ||||
|     } | ||||
|  | ||||
|     updateArrowSide(side) { | ||||
|         this._arrowSide = side; | ||||
|         this._border.queue_repaint(); | ||||
|   | ||||
| @@ -584,22 +584,18 @@ var Dash = class Dash { | ||||
|         let firstButton = iconChildren[0].child; | ||||
|         let firstIcon = firstButton._delegate.icon; | ||||
|  | ||||
|         let minHeight, natHeight; | ||||
|         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; | ||||
|  | ||||
|         // Enforce the current icon size during the size request | ||||
|         // Enforce valid spacings during the size request | ||||
|         firstIcon.icon.ensure_style(); | ||||
|         let [, currentHeight] = firstIcon.icon.get_size(); | ||||
|         firstIcon.icon.set_height(this.iconSize * scaleFactor); | ||||
|         [minHeight, natHeight] = firstButton.get_preferred_height(-1); | ||||
|         firstIcon.icon.set_height(currentHeight); | ||||
|         let [, iconHeight] = firstIcon.icon.get_preferred_height(-1); | ||||
|         let [, buttonHeight] = firstButton.get_preferred_height(-1); | ||||
|  | ||||
|         // Subtract icon padding and box spacing from the available height | ||||
|         availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) + | ||||
|         availHeight -= iconChildren.length * (buttonHeight - iconHeight) + | ||||
|                        (iconChildren.length - 1) * spacing; | ||||
|  | ||||
|         let availSize = availHeight / iconChildren.length; | ||||
|  | ||||
|         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; | ||||
|         let iconSizes = baseIconSizes.map(s => s * scaleFactor); | ||||
|  | ||||
|         let newIconSize = baseIconSizes[0]; | ||||
|   | ||||
| @@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection { | ||||
|         layout.attach(header, 0, 0, 2, 1); | ||||
|         this.actor.label_actor = header; | ||||
|  | ||||
|         let localOffset = GLib.DateTime.new_now_local().get_utc_offset(); | ||||
|  | ||||
|         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 name = l.get_city_name() || l.get_name(); | ||||
|             let label = new St.Label({ style_class: 'world-clocks-city', | ||||
|                                        text: name, | ||||
|                                        x_align: Clutter.ActorAlign.START, | ||||
| @@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection { | ||||
|  | ||||
|             let time = new St.Label({ style_class: 'world-clocks-time' }); | ||||
|  | ||||
|             let offset = l.get_timezone().get_offset() / 60.; | ||||
|             let otherOffset = this._getTimeAtLocation(l).get_utc_offset(); | ||||
|             let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR; | ||||
|             let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f'; | ||||
|             let prefix = (offset >= 0) ? '+' : '-'; | ||||
|             let tz = new St.Label({ style_class: 'world-clocks-timezone', | ||||
| @@ -182,11 +184,15 @@ var WorldClocksSection = class WorldClocksSection { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     _getTimeAtLocation(location) { | ||||
|         let tz = GLib.TimeZone.new(location.get_timezone().get_tzid()); | ||||
|         return GLib.DateTime.new_now(tz); | ||||
|     } | ||||
|  | ||||
|     _updateLabels() { | ||||
|         for (let i = 0; i < this._locations.length; i++) { | ||||
|             let l = this._locations[i]; | ||||
|             let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid()); | ||||
|             let now = GLib.DateTime.new_now(tz); | ||||
|             let now = this._getTimeAtLocation(l.location); | ||||
|             l.actor.text = Util.formatTime(now, { timeOnly: true }); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -306,6 +306,9 @@ var _Draggable = class _Draggable { | ||||
|      * for the draggable. | ||||
|      */ | ||||
|     startDrag(stageX, stageY, time, sequence, device) { | ||||
|         if (currentDraggable) | ||||
|             return; | ||||
|  | ||||
|         if (device == undefined) { | ||||
|             let event = Clutter.get_current_event(); | ||||
|  | ||||
| @@ -447,7 +450,8 @@ var _Draggable = class _Draggable { | ||||
|         let [stageX, stageY] = event.get_coords(); | ||||
|  | ||||
|         // See if the user has moved the mouse enough to trigger a drag | ||||
|         let threshold = St.Settings.get().drag_threshold; | ||||
|         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; | ||||
|         let threshold = St.Settings.get().drag_threshold * scaleFactor; | ||||
|         if (!currentDraggable && | ||||
|             (Math.abs(stageX - this._dragStartX) > threshold || | ||||
|              Math.abs(stageY - this._dragStartY) > threshold)) { | ||||
|   | ||||
| @@ -104,6 +104,7 @@ class BaseIcon extends St.Bin { | ||||
|     } | ||||
|  | ||||
|     vfunc_style_changed() { | ||||
|         super.vfunc_style_changed(); | ||||
|         let node = this.get_theme_node(); | ||||
|  | ||||
|         let size; | ||||
|   | ||||
| @@ -73,12 +73,9 @@ class AspectContainer extends St.Widget { | ||||
|                 box.x1 += Math.floor(diff / 2); | ||||
|                 box.x2 -= Math.ceil(diff / 2); | ||||
|             } else { | ||||
|                 /* Restrict vertically */ | ||||
|                 /* Restrict vertically, align to bottom */ | ||||
|                 let height = box.get_width() / this._ratio; | ||||
|                 let diff = box.get_height() - height; | ||||
|  | ||||
|                 box.y1 += Math.floor(diff / 2); | ||||
|                 box.y2 -= Math.floor(diff / 2); | ||||
|                 box.y1 = box.y2 - Math.floor(height); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -884,7 +881,7 @@ var EmojiSelection = class EmojiSelection { | ||||
|         this._pageIndicator.setReactive(false); | ||||
|  | ||||
|         let bottomRow = this._createBottomRow(); | ||||
|         this.actor.add(bottomRow, { x_fill: true, y_fill: false }); | ||||
|         this.actor.add(bottomRow, { expand: true, x_fill: false, y_fill: false }); | ||||
|  | ||||
|         this._emojiPager.setCurrentPage(0); | ||||
|     } | ||||
| @@ -973,7 +970,16 @@ var EmojiSelection = class EmojiSelection { | ||||
|         row.appendKey(key.actor); | ||||
|         row.layoutButtons(); | ||||
|  | ||||
|         return row; | ||||
|         let actor = new AspectContainer({ layout_manager: new Clutter.BinLayout(), | ||||
|                                           x_expand: true, y_expand: true }); | ||||
|         actor.add_child(row); | ||||
|         /* Regular keyboard layouts are 11.5×4 grids, optimize for that | ||||
|          * at the moment. Ideally this should be as wide as the current | ||||
|          * keymap. | ||||
|          */ | ||||
|         actor.setRatio(11.5, 1); | ||||
|  | ||||
|         return actor; | ||||
|     } | ||||
| }; | ||||
| Signals.addSignalMethods(EmojiSelection.prototype); | ||||
|   | ||||
| @@ -160,6 +160,19 @@ var Monitor = class Monitor { | ||||
|     } | ||||
| }; | ||||
|  | ||||
| const UiActor = GObject.registerClass( | ||||
| class UiActor extends St.Widget { | ||||
|     vfunc_get_preferred_width (forHeight) { | ||||
|         let width = global.stage.width; | ||||
|         return [width, width]; | ||||
|     } | ||||
|  | ||||
|     vfunc_get_preferred_height (forWidth) { | ||||
|         let height = global.stage.height; | ||||
|         return [height, height]; | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const defaultParams = { | ||||
|     trackFullscreen: false, | ||||
|     affectsStruts: false, | ||||
| @@ -200,12 +213,8 @@ var LayoutManager = GObject.registerClass({ | ||||
|         global.stage.no_clear_hint = true; | ||||
|  | ||||
|         // Set up stage hierarchy to group all UI actors under one container. | ||||
|         this.uiGroup = new St.Widget({ name: 'uiGroup' }); | ||||
|         this.uiGroup = new UiActor({ name: 'uiGroup' }); | ||||
|         this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT); | ||||
|         this.uiGroup.add_constraint(new Clutter.BindConstraint({ | ||||
|             source: global.stage, | ||||
|             coordinate: Clutter.BindCoordinate.ALL, | ||||
|         })); | ||||
|  | ||||
|         global.stage.remove_actor(global.window_group); | ||||
|         this.uiGroup.add_actor(global.window_group); | ||||
| @@ -243,7 +252,7 @@ var LayoutManager = GObject.registerClass({ | ||||
|  | ||||
|         // A dummy actor that tracks the mouse or text cursor, based on the | ||||
|         // position and size set in setDummyCursorGeometry. | ||||
|         this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false }); | ||||
|         this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); | ||||
|         this.uiGroup.add_actor(this.dummyCursor); | ||||
|  | ||||
|         global.stage.remove_actor(global.top_window_group); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const { Atspi, Clutter, Cogl, GDesktopEnums, | ||||
| const { Atspi, Clutter, GDesktopEnums, | ||||
|         Gio, GLib, GObject, Meta, Shell, St } = imports.gi; | ||||
| const Mainloop = imports.mainloop; | ||||
| const Signals = imports.signals; | ||||
| @@ -18,9 +18,6 @@ var NO_CHANGE = 0.0; | ||||
| var POINTER_REST_TIME = 1000; // milliseconds | ||||
|  | ||||
| // Settings | ||||
| const APPLICATIONS_SCHEMA       = 'org.gnome.desktop.a11y.applications'; | ||||
| const SHOW_KEY                  = 'screen-magnifier-enabled'; | ||||
|  | ||||
| const MAGNIFIER_SCHEMA          = 'org.gnome.desktop.a11y.magnifier'; | ||||
| const SCREEN_POSITION_KEY       = 'screen-position'; | ||||
| const MAG_FACTOR_KEY            = 'mag-factor'; | ||||
| @@ -56,22 +53,19 @@ var MouseSpriteContent = GObject.registerClass({ | ||||
|  | ||||
|     vfunc_get_preferred_size() { | ||||
|         if (!this._texture) | ||||
|             return [0, 0]; | ||||
|             return [false, 0, 0]; | ||||
|  | ||||
|         return [this._texture.get_width(), this._texture.get_height()]; | ||||
|         return [true, this._texture.get_width(), this._texture.get_height()]; | ||||
|     } | ||||
|  | ||||
|     vfunc_paint_content(actor, node) { | ||||
|         if (!this._texture) | ||||
|             return; | ||||
|  | ||||
|         let color = new Cogl.Color(); | ||||
|         color.init_from_4ub(0, 0, 0, 0); | ||||
|  | ||||
|         let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE); | ||||
|         let [minFilter, magFilter] = actor.get_content_scaling_filters(); | ||||
|         let textureNode = new Clutter.TextureNode(this._texture, | ||||
|                                                   color, | ||||
|                                                   Clutter.ScalingFilter.NEAREST, | ||||
|                                                   Clutter.ScalingFilter.NEAREST); | ||||
|                                                   color, minFilter, magFilter); | ||||
|         textureNode.set_name('MouseSpriteContent'); | ||||
|         node.add_child(textureNode); | ||||
|  | ||||
| @@ -86,8 +80,14 @@ var MouseSpriteContent = GObject.registerClass({ | ||||
|         if (this._texture == coglTexture) | ||||
|             return; | ||||
|  | ||||
|         let oldTexture = this._texture; | ||||
|         this._texture = coglTexture; | ||||
|         this.invalidate(); | ||||
|  | ||||
|         if (!oldTexture || !coglTexture || | ||||
|             oldTexture.get_width() != coglTexture.get_width() || | ||||
|             oldTexture.get_height() != coglTexture.get_height()) | ||||
|             this.invalidate_size(); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| @@ -102,7 +102,6 @@ var Magnifier = class Magnifier { | ||||
|  | ||||
|         this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE }); | ||||
|         this._mouseSprite.content = new MouseSpriteContent(); | ||||
|         this._updateSpriteTexture(); | ||||
|  | ||||
|         this._cursorRoot = new Clutter.Actor(); | ||||
|         this._cursorRoot.add_actor(this._mouseSprite); | ||||
| @@ -115,14 +114,16 @@ var Magnifier = class Magnifier { | ||||
|  | ||||
|         let aZoomRegion = new ZoomRegion(this, this._cursorRoot); | ||||
|         this._zoomRegions.push(aZoomRegion); | ||||
|         let showAtLaunch = this._settingsInit(aZoomRegion); | ||||
|         this._settingsInit(aZoomRegion); | ||||
|         aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse); | ||||
|  | ||||
|         cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this)); | ||||
|         St.Settings.get().connect('notify::magnifier-active', () => { | ||||
|             this.setActive(St.Settings.get().magnifier_active); | ||||
|         }); | ||||
|  | ||||
|         // Export to dbus. | ||||
|         magDBusService = new MagnifierDBus.ShellMagnifier(); | ||||
|         this.setActive(showAtLaunch); | ||||
|         this.setActive(St.Settings.get().magnifier_active); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -155,9 +156,15 @@ var Magnifier = class Magnifier { | ||||
|  | ||||
|         if (isActive != activate) { | ||||
|             if (activate) { | ||||
|                 this._updateMouseSprite(); | ||||
|                 this._cursorSpriteChangedId = | ||||
|                     this._cursorTracker.connect('cursor-changed', | ||||
|                                                 this._updateMouseSprite.bind(this)); | ||||
|                 Meta.disable_unredirect_for_display(global.display); | ||||
|                 this.startTrackingMouse(); | ||||
|             } else { | ||||
|                 this._cursorTracker.disconnect(this._cursorSpriteChangedId); | ||||
|                 this._mouseSprite.content.texture = null; | ||||
|                 Meta.enable_unredirect_for_display(global.display); | ||||
|                 this.stopTrackingMouse(); | ||||
|             } | ||||
| @@ -495,13 +502,8 @@ var Magnifier = class Magnifier { | ||||
|     } | ||||
|  | ||||
|     _settingsInit(zoomRegion) { | ||||
|         this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA }); | ||||
|         this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA }); | ||||
|  | ||||
|         this._appSettings.connect('changed::' + SHOW_KEY, () => { | ||||
|             this.setActive(this._appSettings.get_boolean(SHOW_KEY)); | ||||
|         }); | ||||
|  | ||||
|         this._settings.connect('changed::' + SCREEN_POSITION_KEY, | ||||
|                                this._updateScreenPosition.bind(this)); | ||||
|         this._settings.connect('changed::' + MAG_FACTOR_KEY, | ||||
| @@ -608,8 +610,6 @@ var Magnifier = class Magnifier { | ||||
|         let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY); | ||||
|         this.addCrosshairs(); | ||||
|         this.setCrosshairsVisible(showCrosshairs); | ||||
|  | ||||
|         return this._appSettings.get_boolean(SHOW_KEY); | ||||
|    } | ||||
|  | ||||
|     _updateScreenPosition() { | ||||
| @@ -756,13 +756,41 @@ var ZoomRegion = class ZoomRegion { | ||||
|  | ||||
|         this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID); | ||||
|         this._scrollContentsTimerId = 0; | ||||
|     } | ||||
|  | ||||
|         Main.layoutManager.connect('monitors-changed', | ||||
|                                    this._monitorsChanged.bind(this)); | ||||
|         this._focusCaretTracker.connect('caret-moved', | ||||
|                                     this._updateCaret.bind(this)); | ||||
|         this._focusCaretTracker.connect('focus-changed', | ||||
|                                     this._updateFocus.bind(this)); | ||||
|     _connectSignals() { | ||||
|         if (this._signalConnections) | ||||
|             return; | ||||
|  | ||||
|         this._signalConnections = []; | ||||
|         let id = Main.layoutManager.connect('monitors-changed', | ||||
|                                             this._monitorsChanged.bind(this)); | ||||
|         this._signalConnections.push([Main.layoutManager, id]); | ||||
|  | ||||
|         id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this)); | ||||
|         this._signalConnections.push([this._focusCaretTracker, id]); | ||||
|  | ||||
|         id = this._focusCaretTracker.connect('focus-changed', this._updateFocus.bind(this)); | ||||
|         this._signalConnections.push([this._focusCaretTracker, id]); | ||||
|     } | ||||
|  | ||||
|     _disconnectSignals() { | ||||
|         for (let [obj, id] of this._signalConnections) | ||||
|             obj.disconnect(id); | ||||
|  | ||||
|         delete this._signalConnections; | ||||
|     } | ||||
|  | ||||
|     _updateScreenPosition() { | ||||
|         if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE) | ||||
|             this._setViewPort({ | ||||
|                 x: this._viewPortX, | ||||
|                 y: this._viewPortY, | ||||
|                 width: this._viewPortWidth, | ||||
|                 height: this._viewPortHeight | ||||
|             }); | ||||
|         else | ||||
|             this.setScreenPosition(this._screenPosition); | ||||
|     } | ||||
|  | ||||
|     _updateFocus(caller, event) { | ||||
| @@ -810,10 +838,13 @@ var ZoomRegion = class ZoomRegion { | ||||
|             this._createActors(); | ||||
|             if (this._isMouseOverRegion()) | ||||
|                 this._magnifier.hideSystemCursor(); | ||||
|             this._updateScreenPosition(); | ||||
|             this._updateMagViewGeometry(); | ||||
|             this._updateCloneGeometry(); | ||||
|             this._updateMousePosition(); | ||||
|             this._connectSignals(); | ||||
|         } else { | ||||
|             this._disconnectSignals(); | ||||
|             this._destroyActors(); | ||||
|         } | ||||
|  | ||||
| @@ -1563,18 +1594,8 @@ var ZoomRegion = class ZoomRegion { | ||||
|     } | ||||
|  | ||||
|     _monitorsChanged() { | ||||
|         if (!this.isActive()) | ||||
|             return; | ||||
|  | ||||
|         this._background.set_size(global.screen_width, global.screen_height); | ||||
|  | ||||
|         if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE) | ||||
|             this._setViewPort({ x: this._viewPortX, | ||||
|                                 y: this._viewPortY, | ||||
|                                 width: this._viewPortWidth, | ||||
|                                 height: this._viewPortHeight }); | ||||
|         else | ||||
|             this.setScreenPosition(this._screenPosition); | ||||
|         this._updateScreenPosition(); | ||||
|     } | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -211,13 +211,6 @@ function _initializeUI() { | ||||
|  | ||||
|     _startDate = new Date(); | ||||
|  | ||||
|     let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); | ||||
|     if (perfModuleName) { | ||||
|         let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); | ||||
|         let module = eval('imports.perf.' + perfModuleName + ';'); | ||||
|         Scripting.runPerfScript(module, perfOutput); | ||||
|     } | ||||
|  | ||||
|     ExtensionDownloader.init(); | ||||
|     ExtensionSystem.init(); | ||||
|  | ||||
| @@ -239,6 +232,13 @@ function _initializeUI() { | ||||
|             Shell.Global.log_structured('GNOME Shell started at ' + _startDate, | ||||
|                                         ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]); | ||||
|         } | ||||
|  | ||||
|         let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); | ||||
|         if (perfModuleName) { | ||||
|             let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); | ||||
|             let module = eval('imports.perf.' + perfModuleName + ';'); | ||||
|             Scripting.runPerfScript(module, perfOutput); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -95,28 +95,6 @@ var OsdMonitorLabeler = class { | ||||
|  | ||||
|         this._reset(); | ||||
|  | ||||
|         for (let id in params) { | ||||
|             let monitor = this._monitorManager.get_monitor_for_output(id); | ||||
|             if (monitor == -1) | ||||
|                 continue; | ||||
|             this._monitorLabels.get(monitor).push(params[id].deep_unpack()); | ||||
|         } | ||||
|  | ||||
|         // In mirrored display setups, more than one physical outputs | ||||
|         // might be showing the same logical monitor. In that case, we | ||||
|         // join each output's labels on the same OSD widget. | ||||
|         for (let [monitor, labels] of this._monitorLabels.entries()) { | ||||
|             labels.sort(); | ||||
|             this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' '))); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     show2(client, params) { | ||||
|         if (!this._trackClient(client)) | ||||
|             return; | ||||
|  | ||||
|         this._reset(); | ||||
|  | ||||
|         for (let connector in params) { | ||||
|             let monitor = this._monitorManager.get_monitor_for_connector(connector); | ||||
|             if (monitor == -1) | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi; | ||||
| const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; | ||||
| const Cairo = imports.cairo; | ||||
| const Mainloop = imports.mainloop; | ||||
|  | ||||
| @@ -201,7 +201,6 @@ var AppMenuButton = GObject.registerClass({ | ||||
|         this._startingApps = []; | ||||
|  | ||||
|         this._menuManager = panel.menuManager; | ||||
|         this._gtkSettings = Gtk.Settings.get_default(); | ||||
|         this._targetApp = null; | ||||
|         this._busyNotifyId = 0; | ||||
|  | ||||
| @@ -809,6 +808,7 @@ class AggregateMenu extends PanelMenu.Button { | ||||
|         menuLayout.addSizeChild(this._location.menu.actor); | ||||
|         menuLayout.addSizeChild(this._rfkill.menu.actor); | ||||
|         menuLayout.addSizeChild(this._power.menu.actor); | ||||
|         menuLayout.addSizeChild(this._system.buttonGroup); | ||||
|     } | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -810,16 +810,8 @@ var ScreenShield = class { | ||||
|  | ||||
|         this._maybeCancelDialog(); | ||||
|  | ||||
|         if (this._longLightbox.actor.visible || | ||||
|             this._isActive) { | ||||
|             // We're either shown and active, or in the process of | ||||
|             // showing. | ||||
|             // The latter is a very unlikely condition (it requires | ||||
|             // idle-delay < 20), but in any case we have nothing | ||||
|             // to do at this point: either isActive is true, or | ||||
|             // it will soon be. | ||||
|             // isActive can also be true if the lightbox is hidden, | ||||
|             // in case the shield is down and the user hasn't unlocked yet | ||||
|         if (this._longLightbox.actor.visible) { | ||||
|             // We're in the process of showing. | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi; | ||||
| const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; | ||||
| const Signals = imports.signals; | ||||
|  | ||||
| const GrabHelper = imports.ui.grabHelper; | ||||
| @@ -227,8 +227,6 @@ var SelectArea = class { | ||||
|         this._lastY = 0; | ||||
|         this._result = null; | ||||
|  | ||||
|         this._initRubberbandColors(); | ||||
|  | ||||
|         this._group = new St.Widget({ visible: false, | ||||
|                                       reactive: true, | ||||
|                                       x: 0, | ||||
| @@ -248,10 +246,10 @@ var SelectArea = class { | ||||
|                                                       coordinate: Clutter.BindCoordinate.ALL }); | ||||
|         this._group.add_constraint(constraint); | ||||
|  | ||||
|         this._rubberband = new Clutter.Rectangle({ color: this._background, | ||||
|                                                    has_border: true, | ||||
|                                                    border_width: 1, | ||||
|                                                    border_color: this._border }); | ||||
|         this._rubberband = new St.Widget({ | ||||
|             style_class: 'select-area-rubberband', | ||||
|             visible: false | ||||
|         }); | ||||
|         this._group.add_actor(this._rubberband); | ||||
|     } | ||||
|  | ||||
| @@ -265,25 +263,6 @@ var SelectArea = class { | ||||
|         this._group.visible = true; | ||||
|     } | ||||
|  | ||||
|     _initRubberbandColors() { | ||||
|         function colorFromRGBA(rgba) { | ||||
|             return new Clutter.Color({ red: rgba.red * 255, | ||||
|                                        green: rgba.green * 255, | ||||
|                                        blue: rgba.blue * 255, | ||||
|                                        alpha: rgba.alpha * 255 }); | ||||
|         } | ||||
|  | ||||
|         let path = new Gtk.WidgetPath(); | ||||
|         path.append_type(Gtk.IconView); | ||||
|  | ||||
|         let context = new Gtk.StyleContext(); | ||||
|         context.set_path(path); | ||||
|         context.add_class('rubberband'); | ||||
|  | ||||
|         this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL)); | ||||
|         this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL)); | ||||
|     } | ||||
|  | ||||
|     _getGeometry() { | ||||
|         return { x: Math.min(this._startX, this._lastX), | ||||
|                  y: Math.min(this._startY, this._lastY), | ||||
| @@ -302,6 +281,7 @@ var SelectArea = class { | ||||
|  | ||||
|         this._rubberband.set_position(geometry.x, geometry.y); | ||||
|         this._rubberband.set_size(geometry.width, geometry.height); | ||||
|         this._rubberband.show(); | ||||
|  | ||||
|         return Clutter.EVENT_PROPAGATE; | ||||
|     } | ||||
|   | ||||
| @@ -37,16 +37,13 @@ const { loadInterfaceXML } = imports.misc.fileUtils; | ||||
|  * 'yield Scripting.sleep(500);' | ||||
|  */ | ||||
| function sleep(milliseconds) { | ||||
|     let cb; | ||||
|  | ||||
|     let id = Mainloop.timeout_add(milliseconds, () => { | ||||
|         if (cb) | ||||
|             cb(); | ||||
|         return GLib.SOURCE_REMOVE; | ||||
|     return new Promise(resolve => { | ||||
|         let id = Mainloop.timeout_add(milliseconds, () => { | ||||
|             resolve(); | ||||
|             return GLib.SOURCE_REMOVE; | ||||
|         }); | ||||
|         GLib.Source.set_name_by_id(id, '[gnome-shell] sleep'); | ||||
|     }); | ||||
|     GLib.Source.set_name_by_id(id, '[gnome-shell] sleep'); | ||||
|  | ||||
|     return callback => { cb = callback; }; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -57,14 +54,9 @@ function sleep(milliseconds) { | ||||
|  * 'yield Scripting.waitLeisure();' | ||||
|  */ | ||||
| function waitLeisure() { | ||||
|     let cb; | ||||
|  | ||||
|     global.run_at_leisure(() => { | ||||
|        if (cb) | ||||
|            cb(); | ||||
|     return new Promise(resolve => { | ||||
|         global.run_at_leisure(resolve); | ||||
|     }); | ||||
|  | ||||
|     return callback => { cb = callback; }; | ||||
| } | ||||
|  | ||||
| const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper'); | ||||
| @@ -82,25 +74,16 @@ function _getPerfHelper() { | ||||
| } | ||||
|  | ||||
| function _callRemote(obj, method, ...args) { | ||||
|     let cb; | ||||
|     let errcb; | ||||
|     return new Promise((resolve, reject) => { | ||||
|         args.push((result, excp) => { | ||||
|             if (excp) | ||||
|                 reject(excp); | ||||
|             else | ||||
|                 resolve(); | ||||
|         }); | ||||
|  | ||||
|     args.push((result, excp) => { | ||||
|          if (excp) { | ||||
|              if (errcb) | ||||
|                  errcb(excp); | ||||
|          } else { | ||||
|              if (cb) | ||||
|                  cb(); | ||||
|          } | ||||
|         method.apply(obj, args); | ||||
|     }); | ||||
|  | ||||
|     method.apply(obj, args); | ||||
|  | ||||
|     return (callback, error_callback) => { | ||||
|         cb = callback; | ||||
|         errcb = error_callback; | ||||
|     }; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -192,27 +175,6 @@ function collectStatistics() { | ||||
|     Shell.PerfLog.get_default().collect_statistics(); | ||||
| } | ||||
|  | ||||
| function _step(g, finish, onError) { | ||||
|     try { | ||||
|         let waitFunction = g.next(); | ||||
|         waitFunction(() => { | ||||
|                          _step(g, finish, onError); | ||||
|                      }, | ||||
|                      err => { | ||||
|                          if (onError) | ||||
|                              onError(err); | ||||
|                      }); | ||||
|     } catch (err) { | ||||
|         if (err instanceof StopIteration) { | ||||
|             if (finish) | ||||
|                 finish(); | ||||
|         } else { | ||||
|             if (onError) | ||||
|                 onError(err); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| function _collect(scriptModule, outputFile) { | ||||
|     let eventHandlers = {}; | ||||
|  | ||||
| @@ -348,23 +310,23 @@ function _collect(scriptModule, outputFile) { | ||||
|  * After running the script and collecting statistics from the | ||||
|  * event log, GNOME Shell will exit. | ||||
|  **/ | ||||
| function runPerfScript(scriptModule, outputFile) { | ||||
| async function runPerfScript(scriptModule, outputFile) { | ||||
|     Shell.PerfLog.get_default().set_enabled(true); | ||||
|  | ||||
|     let g = scriptModule.run(); | ||||
|     for (let step of scriptModule.run()) { | ||||
|         try { | ||||
|             await step; | ||||
|         } catch (err) { | ||||
|             log(`Script failed: ${err}\n${err.stack}`); | ||||
|             Meta.exit(Meta.ExitCode.ERROR); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     _step(g, | ||||
|           () => { | ||||
|               try { | ||||
|                   _collect(scriptModule, outputFile); | ||||
|               } catch (err) { | ||||
|                   log("Script failed: " + err + "\n" + err.stack); | ||||
|                   Meta.exit(Meta.ExitCode.ERROR); | ||||
|               } | ||||
|               Meta.exit(Meta.ExitCode.SUCCESS); | ||||
|           }, | ||||
|          err => { | ||||
|              log("Script failed: " + err + "\n" + err.stack); | ||||
|              Meta.exit(Meta.ExitCode.ERROR); | ||||
|          }); | ||||
|     try { | ||||
|         _collect(scriptModule, outputFile); | ||||
|     } catch (err) { | ||||
|         log(`Script failed: ${err}\n${err.stack}`); | ||||
|         Meta.exit(Meta.ExitCode.ERROR); | ||||
|     } | ||||
|     Meta.exit(Meta.ExitCode.SUCCESS); | ||||
| } | ||||
|   | ||||
| @@ -79,14 +79,17 @@ var GnomeShell = class { | ||||
|         for (let param in params) | ||||
|             params[param] = params[param].deep_unpack(); | ||||
|  | ||||
|         let { monitor: monitorIndex, | ||||
|         let { connector, | ||||
|               label, | ||||
|               level, | ||||
|               max_level: maxLevel, | ||||
|               icon: serializedIcon } = params; | ||||
|  | ||||
|         if (monitorIndex === undefined) | ||||
|             monitorIndex = -1; | ||||
|         let monitorIndex = -1; | ||||
|         if (connector) { | ||||
|             let monitorManager = Meta.MonitorManager.get(); | ||||
|             monitorIndex = monitorManager.get_monitor_for_connector(connector); | ||||
|         } | ||||
|  | ||||
|         let icon = null; | ||||
|         if (serializedIcon) | ||||
| @@ -203,16 +206,10 @@ var GnomeShell = class { | ||||
|         this._grabbers.delete(name); | ||||
|     } | ||||
|  | ||||
|     ShowMonitorLabelsAsync(params, invocation) { | ||||
|         let sender = invocation.get_sender(); | ||||
|         let [dict] = params; | ||||
|         Main.osdMonitorLabeler.show(sender, dict); | ||||
|     } | ||||
|  | ||||
|     ShowMonitorLabels2Async(params, invocation) { | ||||
|         let sender = invocation.get_sender(); | ||||
|         let [dict] = params; | ||||
|         Main.osdMonitorLabeler.show2(sender, dict); | ||||
|         Main.osdMonitorLabeler.show(sender, dict); | ||||
|     } | ||||
|  | ||||
|     HideMonitorLabelsAsync(params, invocation) { | ||||
|   | ||||
| @@ -1673,7 +1673,11 @@ var NMApplet = class extends PanelMenu.SystemIndicator { | ||||
|     _readDevices() { | ||||
|         let devices = this._client.get_devices() || [ ]; | ||||
|         for (let i = 0; i < devices.length; ++i) { | ||||
|             this._deviceAdded(this._client, devices[i], true); | ||||
|             try { | ||||
|                 this._deviceAdded(this._client, devices[i], true); | ||||
|             } catch (e) { | ||||
|                 log(`Failed to add device ${devices[i]}: ${e}`); | ||||
|             } | ||||
|         } | ||||
|         this._syncDeviceNames(); | ||||
|     } | ||||
|   | ||||
| @@ -236,6 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | ||||
|  | ||||
|         item = new PopupMenu.PopupBaseMenuItem({ reactive: false, | ||||
|                                                  can_focus: false }); | ||||
|         this.buttonGroup = item.actor; | ||||
|  | ||||
|         let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( | ||||
|             'gnome-control-center.desktop' | ||||
|   | ||||
| @@ -46,15 +46,14 @@ var Avatar = class { | ||||
|         if (iconFile) { | ||||
|             let file = Gio.File.new_for_path(iconFile); | ||||
|             this.actor.child = null; | ||||
|             this.actor.style = 'background-image: url("%s");'.format(iconFile); | ||||
|             this.actor.style = ` | ||||
|                 background-image: url("${iconFile}"); | ||||
|                 background-size: ${this._iconSize}px`; | ||||
|         } else { | ||||
|             this.actor.style = null; | ||||
|             this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic', | ||||
|                                              icon_size: this._iconSize }); | ||||
|         } | ||||
|  | ||||
|         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; | ||||
|         this.actor.set_size(this._iconSize * scaleFactor, this._iconSize * scaleFactor); | ||||
|     } | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -456,13 +456,28 @@ var TilePreview = class { | ||||
| }; | ||||
|  | ||||
| var TouchpadWorkspaceSwitchAction = class { | ||||
|     constructor(actor) { | ||||
|     constructor(actor, allowedModes) { | ||||
|         this._allowedModes = allowedModes; | ||||
|         this._dx = 0; | ||||
|         this._dy = 0; | ||||
|         this._enabled = true; | ||||
|         actor.connect('captured-event', this._handleEvent.bind(this)); | ||||
| 	this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'}); | ||||
|     } | ||||
|  | ||||
|     get enabled() { | ||||
|         return this._enabled; | ||||
|     } | ||||
|  | ||||
|     set enabled(enabled) { | ||||
|         if (this._enabled == enabled) | ||||
|             return; | ||||
|  | ||||
|         this._enabled = enabled; | ||||
|         if (!enabled) | ||||
|             this.emit('cancel'); | ||||
|     } | ||||
|  | ||||
|     _checkActivated() { | ||||
|         let dir; | ||||
|  | ||||
| @@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class { | ||||
|     } | ||||
|  | ||||
|     _handleEvent(actor, event) { | ||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; | ||||
|  | ||||
|         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         if (event.get_touchpad_gesture_finger_count() != 4) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         if ((allowedModes & Main.actionMode) == 0) | ||||
|         if ((this._allowedModes & Main.actionMode) == 0) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         if (!this._enabled) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { | ||||
| @@ -523,10 +539,11 @@ var WorkspaceSwitchAction = GObject.registerClass({ | ||||
|                'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] }, | ||||
|                'cancel':    { param_types: [] }}, | ||||
| }, class WorkspaceSwitchAction extends Clutter.SwipeAction { | ||||
|     _init() { | ||||
|     _init(allowedModes) { | ||||
|         super._init(); | ||||
|         this.set_n_touch_points(4); | ||||
|         this._swept = false; | ||||
|         this._allowedModes = allowedModes; | ||||
|  | ||||
|         global.display.connect('grab-op-begin', () => { | ||||
|             this.cancel(); | ||||
| @@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({ | ||||
|     } | ||||
|  | ||||
|     vfunc_gesture_prepare(actor) { | ||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; | ||||
|  | ||||
|         this._swept = false; | ||||
|  | ||||
|         if (!super.vfunc_gesture_prepare(actor)) | ||||
|             return false; | ||||
|  | ||||
|         return (allowedModes & Main.actionMode); | ||||
|         return (this._allowedModes & Main.actionMode); | ||||
|     } | ||||
|  | ||||
|     vfunc_gesture_progress(actor) { | ||||
| @@ -1043,14 +1058,15 @@ var WindowManager = class { | ||||
|         global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, | ||||
|                                                            false, -1, 1); | ||||
|  | ||||
|         let gesture = new WorkspaceSwitchAction(); | ||||
|         let allowedModes = Shell.ActionMode.NORMAL; | ||||
|         let gesture = new WorkspaceSwitchAction(allowedModes); | ||||
|         gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); | ||||
|         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); | ||||
|         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); | ||||
|         global.stage.add_action(gesture); | ||||
|  | ||||
|         // This is not a normal Clutter.GestureAction, doesn't need add_action() | ||||
|         gesture = new TouchpadWorkspaceSwitchAction(global.stage); | ||||
|         gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes); | ||||
|         gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); | ||||
|         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); | ||||
|         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); | ||||
| @@ -1202,6 +1218,10 @@ var WindowManager = class { | ||||
|             // Same for OR windows | ||||
|             if (window.is_override_redirect()) | ||||
|                 return; | ||||
|             // Sticky windows don't need moving, in fact moving would | ||||
|             // unstick them | ||||
|             if (window.on_all_workspaces) | ||||
|                 return; | ||||
|             // Windows on workspaces below pos don't need moving | ||||
|             let index = window.get_workspace().index(); | ||||
|             if (index < pos) | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||
|  | ||||
| const { Clutter, Gio, GObject, Meta, St } = imports.gi; | ||||
| const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi; | ||||
| const Signals = imports.signals; | ||||
|  | ||||
| const Main = imports.ui.main; | ||||
| const Tweener = imports.ui.tweener; | ||||
| const WindowManager = imports.ui.windowManager; | ||||
| const Workspace = imports.ui.workspace; | ||||
|  | ||||
| var WORKSPACE_SWITCH_TIME = 0.25; | ||||
| @@ -82,6 +83,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | ||||
|  | ||||
|         this._animating = false; // tweening | ||||
|         this._scrolling = false; // swipe-scrolling | ||||
|         this._gestureActive = false; // touch(pad) gestures | ||||
|         this._animatingScroll = false; // programatically updating the adjustment | ||||
|  | ||||
|         let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); | ||||
| @@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | ||||
|  | ||||
|         for (let w = 0; w < this._workspaces.length; w++) { | ||||
|             let workspace = this._workspaces[w]; | ||||
|             if (this._animating || this._scrolling) { | ||||
|             if (this._animating || this._scrolling || this._gestureActive) { | ||||
|                 workspace.actor.show(); | ||||
|             } else { | ||||
|                 if (this._inDrag) | ||||
| @@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | ||||
|     } | ||||
|  | ||||
|     _updateScrollAdjustment(index) { | ||||
|         if (this._scrolling) | ||||
|         if (this._scrolling || this._gestureActive) | ||||
|             return; | ||||
|  | ||||
|         this._animatingScroll = true; | ||||
| @@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase { | ||||
|         this._updateVisibility(); | ||||
|     } | ||||
|  | ||||
|     startTouchGesture() { | ||||
|         this._gestureActive = true; | ||||
|     } | ||||
|  | ||||
|     endTouchGesture() { | ||||
|         this._gestureActive = false; | ||||
|  | ||||
|         // Make sure title captions etc are shown as necessary | ||||
|         this._scrollToActive(); | ||||
|         this._updateVisibility(); | ||||
|     } | ||||
|  | ||||
|     // sync the workspaces' positions to the value of the scroll adjustment | ||||
|     // and change the active workspace if appropriate | ||||
|     _onScroll(adj) { | ||||
| @@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | ||||
|         let active = workspaceManager.get_active_workspace_index(); | ||||
|         let current = Math.round(adj.value); | ||||
|  | ||||
|         if (active != current) { | ||||
|         if (active != current && !this._gestureActive) { | ||||
|             if (!this._workspaces[current]) { | ||||
|                 // The current workspace was destroyed. This could happen | ||||
|                 // when you are on the last empty workspace, and consolidate | ||||
| @@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase { | ||||
|  | ||||
|     endSwipeScroll() { | ||||
|     } | ||||
|  | ||||
|     startTouchGesture() { | ||||
|     } | ||||
|  | ||||
|     endTouchGesture() { | ||||
|     } | ||||
| }; | ||||
|  | ||||
| var DelegateFocusNavigator = GObject.registerClass( | ||||
| @@ -430,23 +450,37 @@ var WorkspacesDisplay = class { | ||||
|                     return false; | ||||
|             } | ||||
|  | ||||
|             for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|                 this._workspacesViews[i].startSwipeScroll(); | ||||
|             this._startSwipeScroll(); | ||||
|             return true; | ||||
|         }); | ||||
|         panAction.connect('gesture-cancel', () => { | ||||
|             clickAction.release(); | ||||
|             for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|                 this._workspacesViews[i].endSwipeScroll(); | ||||
|             this._endSwipeScroll(); | ||||
|         }); | ||||
|         panAction.connect('gesture-end', () => { | ||||
|             clickAction.release(); | ||||
|             for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|                 this._workspacesViews[i].endSwipeScroll(); | ||||
|             this._endSwipeScroll(); | ||||
|         }); | ||||
|         Main.overview.addAction(panAction); | ||||
|         this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE); | ||||
|  | ||||
|         let allowedModes = Shell.ActionMode.OVERVIEW; | ||||
|         let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes); | ||||
|         switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this)); | ||||
|         switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this)); | ||||
|         switchGesture.connect('cancel', this._endTouchGesture.bind(this)); | ||||
|         Main.overview.addAction(switchGesture); | ||||
|         this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE); | ||||
|  | ||||
|         switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes); | ||||
|         switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this)); | ||||
|         switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this)); | ||||
|         switchGesture.connect('cancel', this._endTouchGesture.bind(this)); | ||||
|         this.actor.connect('notify::mapped', () => { | ||||
|             switchGesture.enabled = this.actor.mapped; | ||||
|         }); | ||||
|         switchGesture.enabled = this.actor.mapped; | ||||
|  | ||||
|         this._primaryIndex = Main.layoutManager.primaryIndex; | ||||
|  | ||||
|         this._workspacesViews = []; | ||||
| @@ -474,6 +508,47 @@ var WorkspacesDisplay = class { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     _startSwipeScroll() { | ||||
|         for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|             this._workspacesViews[i].startSwipeScroll(); | ||||
|     } | ||||
|  | ||||
|     _endSwipeScroll() { | ||||
|         for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|             this._workspacesViews[i].endSwipeScroll(); | ||||
|     } | ||||
|  | ||||
|     _startTouchGesture() { | ||||
|         for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|             this._workspacesViews[i].startTouchGesture(); | ||||
|     } | ||||
|  | ||||
|     _endTouchGesture() { | ||||
|         for (let i = 0; i < this._workspacesViews.length; i++) | ||||
|             this._workspacesViews[i].endTouchGesture(); | ||||
|     } | ||||
|  | ||||
|     _onSwitchWorkspaceMotion(action, xRel, yRel) { | ||||
|         // We don't have a way to hook into start of touchpad actions, | ||||
|         // luckily this is safe to call repeatedly. | ||||
|         this._startTouchGesture(); | ||||
|  | ||||
|         let workspaceManager = global.workspace_manager; | ||||
|         let active = workspaceManager.get_active_workspace_index(); | ||||
|         let adjustment = this._scrollAdjustment; | ||||
|         adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size; | ||||
|     } | ||||
|  | ||||
|     _onSwitchWorkspaceActivated(action, direction) { | ||||
|         let workspaceManager = global.workspace_manager; | ||||
|         let activeWorkspace = workspaceManager.get_active_workspace(); | ||||
|         let newWs = activeWorkspace.get_neighbor(direction); | ||||
|         if (newWs != activeWorkspace) | ||||
|             newWs.activate(global.get_current_time()); | ||||
|  | ||||
|         this._endTouchGesture(); | ||||
|     } | ||||
|  | ||||
|     navigateFocus(from, direction) { | ||||
|         return this._getPrimaryView().actor.navigate_focus(from, direction, false); | ||||
|     } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| project('gnome-shell', 'c', | ||||
|   version: '3.31.92', | ||||
|   version: '3.32.0', | ||||
|   meson_version: '>= 0.47.0', | ||||
|   license: 'GPLv2+' | ||||
| ) | ||||
| @@ -23,7 +23,7 @@ gi_req = '>= 1.49.1' | ||||
| gjs_req = '>= 1.54.0' | ||||
| gtk_req = '>= 3.15.0' | ||||
| json_glib_req = '>= 0.13.2' | ||||
| mutter_req = '>= 3.31.92' | ||||
| mutter_req = '>= 3.32.0' | ||||
| polkit_req = '>= 0.100' | ||||
| schemas_req = '>= 3.27.90' | ||||
| startup_req = '>= 0.11' | ||||
|   | ||||
							
								
								
									
										2
									
								
								po/af.po
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								po/af.po
									
									
									
									
									
								
							| @@ -330,7 +330,7 @@ msgstr "Netwerkaanmelding" | ||||
| #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! | ||||
| #: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 | ||||
| msgid "network-workgroup" | ||||
| msgstr "netwerk-werkgroep" | ||||
| msgstr "network-workgroup" | ||||
|  | ||||
| #: js/extensionPrefs/main.js:120 | ||||
| #, javascript-format | ||||
|   | ||||
							
								
								
									
										1043
									
								
								po/en_GB.po
									
									
									
									
									
								
							
							
						
						
									
										1043
									
								
								po/en_GB.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										143
									
								
								po/eo.po
									
									
									
									
									
								
							
							
						
						
									
										143
									
								
								po/eo.po
									
									
									
									
									
								
							| @@ -12,9 +12,9 @@ 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: 2019-02-21 18:43+0000\n" | ||||
| "PO-Revision-Date: 2019-02-22 13:19+0100\n" | ||||
| "Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n" | ||||
| "POT-Creation-Date: 2019-03-24 17:37+0000\n" | ||||
| "PO-Revision-Date: 2019-03-31 00:14+0100\n" | ||||
| "Last-Translator: Carmen Bianca Bakker <carmen@carmenbianca.eu>\n" | ||||
| "Language-Team: Esperanto <gnome-eo-list@gnome.org>\n" | ||||
| "Language: eo\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| @@ -185,8 +185,8 @@ msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon" | ||||
| msgid "" | ||||
| "Keybinding to open the “Show Applications” view of the Activities Overview." | ||||
| msgstr "" | ||||
| "Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la aktivecoj " | ||||
| "superrigardo." | ||||
| "Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-" | ||||
| "Superrigardo." | ||||
|  | ||||
| #: data/org.gnome.shell.gschema.xml.in:124 | ||||
| msgid "Keybinding to open the overview" | ||||
| @@ -194,7 +194,7 @@ msgstr "Klavkombino por malfermi la superrigardon" | ||||
|  | ||||
| #: data/org.gnome.shell.gschema.xml.in:125 | ||||
| msgid "Keybinding to open the Activities Overview." | ||||
| msgstr "Klavkombino por malfermi la aktivecoj superrigardon." | ||||
| msgstr "Klavkombino por malfermi la Aktivecoj-Superrigardon." | ||||
|  | ||||
| #: data/org.gnome.shell.gschema.xml.in:131 | ||||
| msgid "Keybinding to toggle the visibility of the notification list" | ||||
| @@ -334,11 +334,6 @@ msgstr "En musa reĝimo, prokrasti ŝanĝi fokuson ĝis la musmontrilo haltas" | ||||
| msgid "Network Login" | ||||
| msgstr "Reta saluto" | ||||
|  | ||||
| #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! | ||||
| #: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 | ||||
| msgid "network-workgroup" | ||||
| msgstr "network-workgroup" | ||||
|  | ||||
| #: js/extensionPrefs/main.js:116 | ||||
| msgid "Something’s gone wrong" | ||||
| msgstr "Io fiaskis" | ||||
| @@ -419,7 +414,7 @@ msgstr "Ĉu ne en listo?" | ||||
|  | ||||
| #. 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:880 | ||||
| #: js/gdm/loginDialog.js:884 | ||||
| #, javascript-format | ||||
| msgid "(e.g., user or %s)" | ||||
| msgstr "(ekzemple, uzanto aŭ %s)" | ||||
| @@ -427,12 +422,12 @@ msgstr "(ekzemple, uzanto aŭ %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:885 js/ui/components/networkAgent.js:243 | ||||
| #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 | ||||
| #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 | ||||
| msgid "Username: " | ||||
| msgstr "Uzantonomo: " | ||||
|  | ||||
| #: js/gdm/loginDialog.js:1223 | ||||
| #: js/gdm/loginDialog.js:1227 | ||||
| msgid "Login Window" | ||||
| msgstr "Salutfenestro" | ||||
|  | ||||
| @@ -993,7 +988,7 @@ msgstr "Portebla larĝkapacita retopasvorto" | ||||
| msgid "A password is required to connect to “%s”." | ||||
| msgstr "Pasvorto estas bezonata por konekti al “%s”." | ||||
|  | ||||
| #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 | ||||
| #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 | ||||
| msgid "Network Manager" | ||||
| msgstr "Retadministrilo" | ||||
|  | ||||
| @@ -1240,26 +1235,26 @@ msgid "Download and install “%s” from extensions.gnome.org?" | ||||
| msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?" | ||||
|  | ||||
| #. Translators: %s is an application name like "Settings" | ||||
| #: js/ui/inhibitShortcutsDialog.js:50 | ||||
| #: js/ui/inhibitShortcutsDialog.js:78 | ||||
| #, javascript-format | ||||
| msgid "%s wants to inhibit shortcuts" | ||||
| msgstr "%s volas malebligi klavkombinojn" | ||||
|  | ||||
| #: js/ui/inhibitShortcutsDialog.js:51 | ||||
| #: js/ui/inhibitShortcutsDialog.js:79 | ||||
| msgid "Application wants to inhibit shortcuts" | ||||
| msgstr "Aplikaĵo volas malebligi klavkombinojn" | ||||
|  | ||||
| #. Translators: %s is a keyboard shortcut like "Super+x" | ||||
| #: js/ui/inhibitShortcutsDialog.js:60 | ||||
| #: js/ui/inhibitShortcutsDialog.js:88 | ||||
| #, javascript-format | ||||
| msgid "You can restore shortcuts by pressing %s." | ||||
| msgstr "Vi povas restaŭri klavkombinojn per premi %s." | ||||
|  | ||||
| #: js/ui/inhibitShortcutsDialog.js:65 | ||||
| #: js/ui/inhibitShortcutsDialog.js:93 | ||||
| msgid "Deny" | ||||
| msgstr "Rifuzi" | ||||
|  | ||||
| #: js/ui/inhibitShortcutsDialog.js:71 | ||||
| #: js/ui/inhibitShortcutsDialog.js:100 | ||||
| msgid "Allow" | ||||
| msgstr "Akcepti" | ||||
|  | ||||
| @@ -1310,13 +1305,13 @@ msgid "Leave On" | ||||
| msgstr "Lasi ŝaltita" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | ||||
| #: js/ui/status/network.js:1264 | ||||
| #: js/ui/status/network.js:1263 | ||||
| msgid "Turn On" | ||||
| msgstr "Ŝalti" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 | ||||
| #: js/ui/status/network.js:128 js/ui/status/network.js:310 | ||||
| #: js/ui/status/network.js:1264 js/ui/status/network.js:1376 | ||||
| #: js/ui/status/network.js:1263 js/ui/status/network.js:1375 | ||||
| #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||
| #: js/ui/status/rfkill.js:106 | ||||
| msgid "Turn Off" | ||||
| @@ -1326,59 +1321,59 @@ msgstr "Malŝalti" | ||||
| msgid "Leave Off" | ||||
| msgstr "Lasi malŝaltita" | ||||
|  | ||||
| #: js/ui/keyboard.js:203 | ||||
| #: js/ui/keyboard.js:200 | ||||
| msgid "Region & Language Settings" | ||||
| msgstr "Regiono & lingvo agordoj" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:614 | ||||
| #: js/ui/lookingGlass.js:615 | ||||
| msgid "No extensions installed" | ||||
| msgstr "Neniu kromprogramo instalita" | ||||
|  | ||||
| #. Translators: argument is an extension UUID. | ||||
| #: js/ui/lookingGlass.js:668 | ||||
| #: js/ui/lookingGlass.js:669 | ||||
| #, javascript-format | ||||
| msgid "%s has not emitted any errors." | ||||
| msgstr "%s ne eligintaj ajnaj eraroj." | ||||
|  | ||||
| #: js/ui/lookingGlass.js:674 | ||||
| #: js/ui/lookingGlass.js:675 | ||||
| msgid "Hide Errors" | ||||
| msgstr "Kaŝi erarojn" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 | ||||
| #: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 | ||||
| msgid "Show Errors" | ||||
| msgstr "Montri erarojn" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:687 | ||||
| #: js/ui/lookingGlass.js:688 | ||||
| msgid "Enabled" | ||||
| msgstr "Enŝaltita" | ||||
|  | ||||
| #. translators: | ||||
| #. * The device has been disabled | ||||
| #: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 | ||||
| #: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 | ||||
| msgid "Disabled" | ||||
| msgstr "Elŝaltita" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:692 | ||||
| #: js/ui/lookingGlass.js:693 | ||||
| msgid "Error" | ||||
| msgstr "Eraro" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:694 | ||||
| #: js/ui/lookingGlass.js:695 | ||||
| msgid "Out of date" | ||||
| msgstr "Neaktuala" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:696 | ||||
| #: js/ui/lookingGlass.js:697 | ||||
| msgid "Downloading" | ||||
| msgstr "Elŝutante" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:720 | ||||
| #: js/ui/lookingGlass.js:721 | ||||
| msgid "View Source" | ||||
| msgstr "Montri fonton" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:729 | ||||
| #: js/ui/lookingGlass.js:730 | ||||
| msgid "Web Page" | ||||
| msgstr "Retpaĝo" | ||||
|  | ||||
| #: js/ui/messageTray.js:1474 | ||||
| #: js/ui/messageTray.js:1480 | ||||
| msgid "System Information" | ||||
| msgstr "Sisteminformoj" | ||||
|  | ||||
| @@ -1404,13 +1399,14 @@ msgstr "Malfari" | ||||
| msgid "Overview" | ||||
| msgstr "Superrigardo" | ||||
|  | ||||
| # Imperativo | ||||
| #. Translators: this is the text displayed | ||||
| #. in the search entry when no search is | ||||
| #. active; it should not exceed ~30 | ||||
| #. characters. | ||||
| #: js/ui/overview.js:226 | ||||
| msgid "Type to search…" | ||||
| msgstr "Tajpi por serĉi…" | ||||
| msgstr "Tajpu por serĉi…" | ||||
|  | ||||
| #: js/ui/padOsd.js:92 | ||||
| msgid "New shortcut…" | ||||
| @@ -1462,16 +1458,16 @@ msgstr "Ĉesi" | ||||
|  | ||||
| #. Translators: If there is no suitable word for "Activities" | ||||
| #. in your language, you can use the word for "Overview". | ||||
| #: js/ui/panel.js:466 | ||||
| #: js/ui/panel.js:471 | ||||
| msgid "Activities" | ||||
| msgstr "Aktivecoj" | ||||
|  | ||||
| #: js/ui/panel.js:741 | ||||
| #: js/ui/panel.js:746 | ||||
| msgctxt "System menu in the top bar" | ||||
| msgid "System" | ||||
| msgstr "Sistemo" | ||||
|  | ||||
| #: js/ui/panel.js:861 | ||||
| #: js/ui/panel.js:867 | ||||
| msgid "Top Bar" | ||||
| msgstr "Supra breto" | ||||
|  | ||||
| @@ -1520,7 +1516,7 @@ msgid_plural "%d new notifications" | ||||
| msgstr[0] "%d nova sciigo" | ||||
| msgstr[1] "%d novaj sciigoj" | ||||
|  | ||||
| #: js/ui/screenShield.js:449 js/ui/status/system.js:270 | ||||
| #: js/ui/screenShield.js:449 js/ui/status/system.js:271 | ||||
| msgid "Lock" | ||||
| msgstr "Ŝlosi" | ||||
|  | ||||
| @@ -1535,11 +1531,11 @@ msgstr "GNOME bezonas ŝlosi la ekranon" | ||||
| #. | ||||
| #. XXX: another option is to kick the user into the gdm login | ||||
| #. screen, where we're not affected by grabs | ||||
| #: js/ui/screenShield.js:834 js/ui/screenShield.js:1307 | ||||
| #: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 | ||||
| msgid "Unable to lock" | ||||
| msgstr "Ne eblas ŝlosi" | ||||
|  | ||||
| #: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 | ||||
| #: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 | ||||
| msgid "Lock was blocked by an application" | ||||
| msgstr "Ŝloso estis blokita de aplikaĵo" | ||||
|  | ||||
| @@ -1701,7 +1697,7 @@ msgid "<unknown>" | ||||
| msgstr "<nekonata>" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:416 js/ui/status/network.js:1293 | ||||
| #: js/ui/status/network.js:416 js/ui/status/network.js:1292 | ||||
| #, javascript-format | ||||
| msgid "%s Off" | ||||
| msgstr "%s malŝaltita" | ||||
| @@ -1727,7 +1723,7 @@ msgid "%s Disconnecting" | ||||
| msgstr "%s malkonektante" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:434 js/ui/status/network.js:1285 | ||||
| #: js/ui/status/network.js:434 js/ui/status/network.js:1284 | ||||
| #, javascript-format | ||||
| msgid "%s Connecting" | ||||
| msgstr "%s konektante" | ||||
| @@ -1767,7 +1763,7 @@ msgid "Mobile Broadband Settings" | ||||
| msgstr "Porteblaj larĝkapacitaj agordoj" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:553 js/ui/status/network.js:1290 | ||||
| #: js/ui/status/network.js:553 js/ui/status/network.js:1289 | ||||
| #, javascript-format | ||||
| msgid "%s Hardware Disabled" | ||||
| msgstr "%s aparataro malŝaltita" | ||||
| @@ -1832,72 +1828,72 @@ msgid "Wi-Fi Settings" | ||||
| msgstr "Vifio-agordoj" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:1281 | ||||
| #: js/ui/status/network.js:1280 | ||||
| #, javascript-format | ||||
| msgid "%s Hotspot Active" | ||||
| msgstr "%s retkaptejo aktiva" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:1296 | ||||
| #: js/ui/status/network.js:1295 | ||||
| #, javascript-format | ||||
| msgid "%s Not Connected" | ||||
| msgstr "%s nekonektita" | ||||
| msgstr "%s ne konektita" | ||||
|  | ||||
| #: js/ui/status/network.js:1393 | ||||
| #: js/ui/status/network.js:1392 | ||||
| msgid "connecting…" | ||||
| msgstr "konektante…" | ||||
|  | ||||
| #. Translators: this is for network connections that require some kind of key or password | ||||
| #: js/ui/status/network.js:1396 | ||||
| #: js/ui/status/network.js:1395 | ||||
| msgid "authentication required" | ||||
| msgstr "aŭtentigo necesas" | ||||
|  | ||||
| #: js/ui/status/network.js:1398 | ||||
| #: js/ui/status/network.js:1397 | ||||
| msgid "connection failed" | ||||
| msgstr "konekto malsukcesis" | ||||
|  | ||||
| #: js/ui/status/network.js:1448 | ||||
| #: js/ui/status/network.js:1447 | ||||
| msgid "VPN Settings" | ||||
| msgstr "VPR-agordoj" | ||||
|  | ||||
| #: js/ui/status/network.js:1465 | ||||
| #: js/ui/status/network.js:1464 | ||||
| msgid "VPN" | ||||
| msgstr "VPR" | ||||
|  | ||||
| #: js/ui/status/network.js:1475 | ||||
| #: js/ui/status/network.js:1474 | ||||
| msgid "VPN Off" | ||||
| msgstr "VPR malŝaltita" | ||||
|  | ||||
| #: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 | ||||
| #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 | ||||
| msgid "Network Settings" | ||||
| msgstr "Ret-agordoj" | ||||
|  | ||||
| #: js/ui/status/network.js:1565 | ||||
| #: js/ui/status/network.js:1564 | ||||
| #, javascript-format | ||||
| msgid "%s Wired Connection" | ||||
| msgid_plural "%s Wired Connections" | ||||
| msgstr[0] "%s drata konekto" | ||||
| msgstr[1] "%s drataj konektoj" | ||||
|  | ||||
| #: js/ui/status/network.js:1569 | ||||
| #: js/ui/status/network.js:1568 | ||||
| #, javascript-format | ||||
| msgid "%s Wi-Fi Connection" | ||||
| msgid_plural "%s Wi-Fi Connections" | ||||
| msgstr[0] "%s vifia konekto" | ||||
| msgstr[1] "%s vifiaj konektoj" | ||||
|  | ||||
| #: js/ui/status/network.js:1573 | ||||
| #: js/ui/status/network.js:1572 | ||||
| #, javascript-format | ||||
| msgid "%s Modem Connection" | ||||
| msgid_plural "%s Modem Connections" | ||||
| msgstr[0] "%s modema konekto" | ||||
| msgstr[1] "%s modemaj konektoj" | ||||
|  | ||||
| #: js/ui/status/network.js:1702 | ||||
| #: js/ui/status/network.js:1701 | ||||
| msgid "Connection failed" | ||||
| msgstr "Konekto malsukcesis" | ||||
|  | ||||
| #: js/ui/status/network.js:1703 | ||||
| #: js/ui/status/network.js:1702 | ||||
| msgid "Activation of network connection failed" | ||||
| msgstr "Aktivigo de reto-konekto malsukcesis" | ||||
|  | ||||
| @@ -1979,15 +1975,15 @@ msgstr "Adiaŭi" | ||||
| msgid "Account Settings" | ||||
| msgstr "Kontoagordoj" | ||||
|  | ||||
| #: js/ui/status/system.js:255 | ||||
| #: js/ui/status/system.js:256 | ||||
| msgid "Orientation Lock" | ||||
| msgstr "Orientiĝa ŝloso" | ||||
|  | ||||
| #: js/ui/status/system.js:281 | ||||
| #: js/ui/status/system.js:282 | ||||
| msgid "Suspend" | ||||
| msgstr "Dormeti" | ||||
|  | ||||
| #: js/ui/status/system.js:291 | ||||
| #: js/ui/status/system.js:292 | ||||
| msgid "Power Off" | ||||
| msgstr "Malŝalti" | ||||
|  | ||||
| @@ -2175,11 +2171,6 @@ msgstr "Movi al dekstra ekrano" | ||||
| msgid "Evolution Calendar" | ||||
| msgstr "Evolucio-kalendaro" | ||||
|  | ||||
| #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! | ||||
| #: src/calendar-server/evolution-calendar.desktop.in:6 | ||||
| msgid "evolution" | ||||
| msgstr "evolution" | ||||
|  | ||||
| #: src/main.c:408 | ||||
| msgid "Print version" | ||||
| msgstr "Presi version" | ||||
| @@ -2196,12 +2187,12 @@ msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano" | ||||
| msgid "List possible modes" | ||||
| msgstr "Listigi eblajn reĝimojn" | ||||
|  | ||||
| #: src/shell-app.c:260 | ||||
| #: src/shell-app.c:264 | ||||
| msgctxt "program" | ||||
| msgid "Unknown" | ||||
| msgstr "Nekonata" | ||||
|  | ||||
| #: src/shell-app.c:511 | ||||
| #: src/shell-app.c:515 | ||||
| #, c-format | ||||
| msgid "Failed to launch “%s”" | ||||
| msgstr "Malsukcesis lanĉi “%s”" | ||||
| @@ -2220,7 +2211,7 @@ msgstr "La uzanto malakceptis la aŭtentigan dialogon" | ||||
|  | ||||
| #. translators: | ||||
| #. * The number of sound outputs on a particular device | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1873 | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1871 | ||||
| #, c-format | ||||
| msgid "%u Output" | ||||
| msgid_plural "%u Outputs" | ||||
| @@ -2229,17 +2220,23 @@ msgstr[1] "%u eligoj" | ||||
|  | ||||
| #. translators: | ||||
| #. * The number of sound inputs on a particular device | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1883 | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1881 | ||||
| #, c-format | ||||
| msgid "%u Input" | ||||
| msgid_plural "%u Inputs" | ||||
| msgstr[0] "%u enigo" | ||||
| msgstr[1] "%u enigoj" | ||||
|  | ||||
| #: subprojects/gvc/gvc-mixer-control.c:2738 | ||||
| #: subprojects/gvc/gvc-mixer-control.c:2736 | ||||
| msgid "System Sounds" | ||||
| msgstr "Sistemsonoj" | ||||
|  | ||||
| #~ msgid "network-workgroup" | ||||
| #~ msgstr "network-workgroup" | ||||
|  | ||||
| #~ msgid "evolution" | ||||
| #~ msgstr "evolution" | ||||
|  | ||||
| #~ msgid "There was an error loading the preferences dialog for %s:" | ||||
| #~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:" | ||||
|  | ||||
|   | ||||
							
								
								
									
										114
									
								
								po/fr.po
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								po/fr.po
									
									
									
									
									
								
							| @@ -14,23 +14,23 @@ | ||||
| # Alain Lojewski <allomervan@gmail.com>, 2014-2018. | ||||
| # Erwan Georget <egeorget@opmbx.org>, 2016. | ||||
| # Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016. | ||||
| # Charles Monzat <charles.monzat@numericable.fr>, 2016-2018. | ||||
| # Julien Humbert <julroy67@gmail.com>, 2019. | ||||
| # Charles Monzat <charles.monzat@free.fr>, 2016-2019. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: gnome-shell master fr\n" | ||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||
| "POT-Creation-Date: 2019-02-28 03:16+0000\n" | ||||
| "PO-Revision-Date: 2019-02-28 08:29+0100\n" | ||||
| "Last-Translator: Julien Humbert <julroy67@gmail.com>\n" | ||||
| "Language-Team: français <gnomefr@traduc.org>\n" | ||||
| "POT-Creation-Date: 2019-03-13 20:47+0000\n" | ||||
| "PO-Revision-Date: 2019-03-17 19:15+0100\n" | ||||
| "Last-Translator: Charles Monzat <charles.monzat@free.fr>\n" | ||||
| "Language-Team: GNOME French Team <gnomefr@traduc.org>\n" | ||||
| "Language: fr\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.2.1\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n > 1)\n" | ||||
| "X-Generator: Gtranslator 3.32.0\n" | ||||
|  | ||||
| #: data/50-gnome-shell-system.xml:6 | ||||
| msgid "System" | ||||
| @@ -482,7 +482,7 @@ msgstr "Absent de la liste ?" | ||||
|  | ||||
| #. 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:880 | ||||
| #: js/gdm/loginDialog.js:884 | ||||
| #, javascript-format | ||||
| msgid "(e.g., user or %s)" | ||||
| msgstr "(par ex. utilisateur ou %s)" | ||||
| @@ -490,12 +490,12 @@ msgstr "(par ex. utilisateur ou %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:885 js/ui/components/networkAgent.js:243 | ||||
| #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243 | ||||
| #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 | ||||
| msgid "Username: " | ||||
| msgstr "Nom d’utilisateur : " | ||||
|  | ||||
| #: js/gdm/loginDialog.js:1223 | ||||
| #: js/gdm/loginDialog.js:1227 | ||||
| msgid "Login Window" | ||||
| msgstr "Fenêtre de connexion" | ||||
|  | ||||
| @@ -1075,7 +1075,7 @@ msgstr "Mot de passe de la connexion mobile" | ||||
| msgid "A password is required to connect to “%s”." | ||||
| msgstr "Un mot de passe est requis pour se connecter à « %s »." | ||||
|  | ||||
| #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 | ||||
| #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 | ||||
| msgid "Network Manager" | ||||
| msgstr "Gestionnaire de réseau" | ||||
|  | ||||
| @@ -1335,26 +1335,26 @@ msgid "Download and install “%s” from extensions.gnome.org?" | ||||
| msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?" | ||||
|  | ||||
| #. Translators: %s is an application name like "Settings" | ||||
| #: js/ui/inhibitShortcutsDialog.js:50 | ||||
| #: js/ui/inhibitShortcutsDialog.js:78 | ||||
| #, javascript-format | ||||
| msgid "%s wants to inhibit shortcuts" | ||||
| msgstr "%s veut neutraliser les raccourcis" | ||||
|  | ||||
| #: js/ui/inhibitShortcutsDialog.js:51 | ||||
| #: js/ui/inhibitShortcutsDialog.js:79 | ||||
| msgid "Application wants to inhibit shortcuts" | ||||
| msgstr "L’application veut neutraliser les raccourcis" | ||||
|  | ||||
| #. Translators: %s is a keyboard shortcut like "Super+x" | ||||
| #: js/ui/inhibitShortcutsDialog.js:60 | ||||
| #: js/ui/inhibitShortcutsDialog.js:88 | ||||
| #, javascript-format | ||||
| msgid "You can restore shortcuts by pressing %s." | ||||
| msgstr "Pour restaurer les raccourcis, appuyez sur %s." | ||||
|  | ||||
| #: js/ui/inhibitShortcutsDialog.js:65 | ||||
| #: js/ui/inhibitShortcutsDialog.js:93 | ||||
| msgid "Deny" | ||||
| msgstr "Refuser" | ||||
|  | ||||
| #: js/ui/inhibitShortcutsDialog.js:71 | ||||
| #: js/ui/inhibitShortcutsDialog.js:100 | ||||
| msgid "Allow" | ||||
| msgstr "Autoriser" | ||||
|  | ||||
| @@ -1407,13 +1407,13 @@ msgid "Leave On" | ||||
| msgstr "Laisser activé" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | ||||
| #: js/ui/status/network.js:1264 | ||||
| #: js/ui/status/network.js:1263 | ||||
| msgid "Turn On" | ||||
| msgstr "Activer" | ||||
|  | ||||
| #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 | ||||
| #: js/ui/status/network.js:128 js/ui/status/network.js:310 | ||||
| #: js/ui/status/network.js:1264 js/ui/status/network.js:1376 | ||||
| #: js/ui/status/network.js:1263 js/ui/status/network.js:1375 | ||||
| #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||
| #: js/ui/status/rfkill.js:106 | ||||
| msgid "Turn Off" | ||||
| @@ -1423,59 +1423,59 @@ msgstr "Éteindre" | ||||
| msgid "Leave Off" | ||||
| msgstr "Laisser éteint" | ||||
|  | ||||
| #: js/ui/keyboard.js:203 | ||||
| #: js/ui/keyboard.js:200 | ||||
| msgid "Region & Language Settings" | ||||
| msgstr "Paramètres de langue et région" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:614 | ||||
| #: js/ui/lookingGlass.js:615 | ||||
| msgid "No extensions installed" | ||||
| msgstr "Aucune extension installée" | ||||
|  | ||||
| #. Translators: argument is an extension UUID. | ||||
| #: js/ui/lookingGlass.js:668 | ||||
| #: js/ui/lookingGlass.js:669 | ||||
| #, javascript-format | ||||
| msgid "%s has not emitted any errors." | ||||
| msgstr "%s n’a émis aucune erreur." | ||||
|  | ||||
| #: js/ui/lookingGlass.js:674 | ||||
| #: js/ui/lookingGlass.js:675 | ||||
| msgid "Hide Errors" | ||||
| msgstr "Masquer les erreurs" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738 | ||||
| #: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739 | ||||
| msgid "Show Errors" | ||||
| msgstr "Afficher les erreurs" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:687 | ||||
| #: js/ui/lookingGlass.js:688 | ||||
| msgid "Enabled" | ||||
| msgstr "Activé" | ||||
|  | ||||
| #. translators: | ||||
| #. * The device has been disabled | ||||
| #: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866 | ||||
| #: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864 | ||||
| msgid "Disabled" | ||||
| msgstr "Désactivé" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:692 | ||||
| #: js/ui/lookingGlass.js:693 | ||||
| msgid "Error" | ||||
| msgstr "Erreur" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:694 | ||||
| #: js/ui/lookingGlass.js:695 | ||||
| msgid "Out of date" | ||||
| msgstr "Périmé" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:696 | ||||
| #: js/ui/lookingGlass.js:697 | ||||
| msgid "Downloading" | ||||
| msgstr "Téléchargement" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:720 | ||||
| #: js/ui/lookingGlass.js:721 | ||||
| msgid "View Source" | ||||
| msgstr "Afficher la source" | ||||
|  | ||||
| #: js/ui/lookingGlass.js:729 | ||||
| #: js/ui/lookingGlass.js:730 | ||||
| msgid "Web Page" | ||||
| msgstr "Page Web" | ||||
|  | ||||
| #: js/ui/messageTray.js:1474 | ||||
| #: js/ui/messageTray.js:1480 | ||||
| msgid "System Information" | ||||
| msgstr "Informations du système" | ||||
|  | ||||
| @@ -1559,16 +1559,16 @@ msgstr "Quitter" | ||||
|  | ||||
| #. Translators: If there is no suitable word for "Activities" | ||||
| #. in your language, you can use the word for "Overview". | ||||
| #: js/ui/panel.js:466 | ||||
| #: js/ui/panel.js:471 | ||||
| msgid "Activities" | ||||
| msgstr "Activités" | ||||
|  | ||||
| #: js/ui/panel.js:741 | ||||
| #: js/ui/panel.js:746 | ||||
| msgctxt "System menu in the top bar" | ||||
| msgid "System" | ||||
| msgstr "Système" | ||||
|  | ||||
| #: js/ui/panel.js:861 | ||||
| #: js/ui/panel.js:866 | ||||
| msgid "Top Bar" | ||||
| msgstr "Barre supérieure" | ||||
|  | ||||
| @@ -1800,7 +1800,7 @@ msgid "<unknown>" | ||||
| msgstr "<inconnu>" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:416 js/ui/status/network.js:1293 | ||||
| #: js/ui/status/network.js:416 js/ui/status/network.js:1292 | ||||
| #, javascript-format | ||||
| msgid "%s Off" | ||||
| msgstr "%s éteint" | ||||
| @@ -1826,7 +1826,7 @@ msgid "%s Disconnecting" | ||||
| msgstr "Déconnexion de %s en cours" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:434 js/ui/status/network.js:1285 | ||||
| #: js/ui/status/network.js:434 js/ui/status/network.js:1284 | ||||
| #, javascript-format | ||||
| msgid "%s Connecting" | ||||
| msgstr "Connexion de %s en cours" | ||||
| @@ -1866,7 +1866,7 @@ msgid "Mobile Broadband Settings" | ||||
| msgstr "Paramètres connexion mobile" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:553 js/ui/status/network.js:1290 | ||||
| #: js/ui/status/network.js:553 js/ui/status/network.js:1289 | ||||
| #, javascript-format | ||||
| msgid "%s Hardware Disabled" | ||||
| msgstr "Équipement %s désactivé" | ||||
| @@ -1931,72 +1931,72 @@ msgid "Wi-Fi Settings" | ||||
| msgstr "Paramètres Wi-Fi" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:1281 | ||||
| #: js/ui/status/network.js:1280 | ||||
| #, javascript-format | ||||
| msgid "%s Hotspot Active" | ||||
| msgstr "Point d’accès %s actif" | ||||
|  | ||||
| #. Translators: %s is a network identifier | ||||
| #: js/ui/status/network.js:1296 | ||||
| #: js/ui/status/network.js:1295 | ||||
| #, javascript-format | ||||
| msgid "%s Not Connected" | ||||
| msgstr "%s non connecté" | ||||
|  | ||||
| #: js/ui/status/network.js:1393 | ||||
| #: js/ui/status/network.js:1392 | ||||
| msgid "connecting…" | ||||
| msgstr "connexion…" | ||||
|  | ||||
| #. Translators: this is for network connections that require some kind of key or password | ||||
| #: js/ui/status/network.js:1396 | ||||
| #: js/ui/status/network.js:1395 | ||||
| msgid "authentication required" | ||||
| msgstr "authentification nécessaire" | ||||
|  | ||||
| #: js/ui/status/network.js:1398 | ||||
| #: js/ui/status/network.js:1397 | ||||
| msgid "connection failed" | ||||
| msgstr "échec de connexion" | ||||
|  | ||||
| #: js/ui/status/network.js:1448 | ||||
| #: js/ui/status/network.js:1447 | ||||
| msgid "VPN Settings" | ||||
| msgstr "Paramètres VPN" | ||||
|  | ||||
| #: js/ui/status/network.js:1465 | ||||
| #: js/ui/status/network.js:1464 | ||||
| msgid "VPN" | ||||
| msgstr "VPN" | ||||
|  | ||||
| #: js/ui/status/network.js:1475 | ||||
| #: js/ui/status/network.js:1474 | ||||
| msgid "VPN Off" | ||||
| msgstr "VPN désactivé" | ||||
|  | ||||
| #: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 | ||||
| #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 | ||||
| msgid "Network Settings" | ||||
| msgstr "Paramètres du réseau" | ||||
|  | ||||
| #: js/ui/status/network.js:1565 | ||||
| #: js/ui/status/network.js:1564 | ||||
| #, javascript-format | ||||
| msgid "%s Wired Connection" | ||||
| msgid_plural "%s Wired Connections" | ||||
| msgstr[0] "%s connexion filaire." | ||||
| msgstr[1] "%s connexions filaires." | ||||
|  | ||||
| #: js/ui/status/network.js:1569 | ||||
| #: js/ui/status/network.js:1568 | ||||
| #, javascript-format | ||||
| msgid "%s Wi-Fi Connection" | ||||
| msgid_plural "%s Wi-Fi Connections" | ||||
| msgstr[0] "%s connexion Wi-Fi." | ||||
| msgstr[1] "%s connexions Wi-Fi." | ||||
|  | ||||
| #: js/ui/status/network.js:1573 | ||||
| #: js/ui/status/network.js:1572 | ||||
| #, javascript-format | ||||
| msgid "%s Modem Connection" | ||||
| msgid_plural "%s Modem Connections" | ||||
| msgstr[0] "%s connexion à un modem." | ||||
| msgstr[1] "%s connexions à des modems." | ||||
|  | ||||
| #: js/ui/status/network.js:1702 | ||||
| #: js/ui/status/network.js:1701 | ||||
| msgid "Connection failed" | ||||
| msgstr "Échec de connexion" | ||||
|  | ||||
| #: js/ui/status/network.js:1703 | ||||
| #: js/ui/status/network.js:1702 | ||||
| msgid "Activation of network connection failed" | ||||
| msgstr "L’activation de la connexion réseau a échoué" | ||||
|  | ||||
| @@ -2049,7 +2049,7 @@ msgstr "%d∶%02d avant chargement complet (%d %%)" | ||||
| #: js/ui/status/power.js:117 js/ui/status/power.js:119 | ||||
| #, javascript-format | ||||
| msgid "%d %%" | ||||
| msgstr "%d %%" | ||||
| msgstr "%d %%" | ||||
|  | ||||
| #: js/ui/status/remoteAccess.js:42 | ||||
| msgid "Screen is Being Shared" | ||||
| @@ -2298,12 +2298,12 @@ msgstr "" | ||||
| msgid "List possible modes" | ||||
| msgstr "Lister les modes possibles" | ||||
|  | ||||
| #: src/shell-app.c:260 | ||||
| #: src/shell-app.c:264 | ||||
| msgctxt "program" | ||||
| msgid "Unknown" | ||||
| msgstr "Inconnu" | ||||
|  | ||||
| #: src/shell-app.c:511 | ||||
| #: src/shell-app.c:515 | ||||
| #, c-format | ||||
| msgid "Failed to launch “%s”" | ||||
| msgstr "Impossible de lancer « %s »" | ||||
| @@ -2322,7 +2322,7 @@ msgstr "La fenêtre d’authentification a été écartée par l’utilisateur" | ||||
|  | ||||
| #. translators: | ||||
| #. * The number of sound outputs on a particular device | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1873 | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1871 | ||||
| #, c-format | ||||
| msgid "%u Output" | ||||
| msgid_plural "%u Outputs" | ||||
| @@ -2331,14 +2331,14 @@ msgstr[1] "%u sorties" | ||||
|  | ||||
| #. translators: | ||||
| #. * The number of sound inputs on a particular device | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1883 | ||||
| #: subprojects/gvc/gvc-mixer-control.c:1881 | ||||
| #, c-format | ||||
| msgid "%u Input" | ||||
| msgid_plural "%u Inputs" | ||||
| msgstr[0] "%u entrée" | ||||
| msgstr[1] "%u entrées" | ||||
|  | ||||
| #: subprojects/gvc/gvc-mixer-control.c:2738 | ||||
| #: subprojects/gvc/gvc-mixer-control.c:2736 | ||||
| msgid "System Sounds" | ||||
| msgstr "Sons système" | ||||
|  | ||||
|   | ||||
							
								
								
									
										1007
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										1007
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -184,7 +184,7 @@ window_backed_app_get_icon (ShellApp *app, | ||||
|                             int       size) | ||||
| { | ||||
|   MetaWindow *window = NULL; | ||||
|   ClutterActor *actor; | ||||
|   StWidget *widget; | ||||
|   gint scale; | ||||
|   ShellGlobal *global; | ||||
|   StThemeContext *context; | ||||
| @@ -204,16 +204,20 @@ window_backed_app_get_icon (ShellApp *app, | ||||
|  | ||||
|   if (window == NULL) | ||||
|     { | ||||
|       ClutterActor *actor; | ||||
|  | ||||
|       actor = clutter_actor_new (); | ||||
|       g_object_set (actor, "opacity", 0, "width", (float) size, "height", (float) size, NULL); | ||||
|       return actor; | ||||
|     } | ||||
|  | ||||
|   actor = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (), | ||||
|                                                         G_OBJECT (window), | ||||
|                                                         "icon", | ||||
|                                                         size); | ||||
|   return actor; | ||||
|   widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (), | ||||
|                                                          G_OBJECT (window), | ||||
|                                                          "icon", | ||||
|                                                          size); | ||||
|   st_widget_add_style_class_name (widget, "fallback-app-icon"); | ||||
|  | ||||
|   return CLUTTER_ACTOR (widget); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -1179,13 +1183,26 @@ _shell_app_handle_startup_sequence (ShellApp            *app, | ||||
| gboolean | ||||
| shell_app_request_quit (ShellApp   *app) | ||||
| { | ||||
|   GActionGroup *group = NULL; | ||||
|   GSList *iter; | ||||
|  | ||||
|   if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING) | ||||
|     return FALSE; | ||||
|  | ||||
|   /* TODO - check for an XSMP connection; we could probably use that */ | ||||
|   /* First, check whether the app exports an explicit "quit" action | ||||
|    * that we can activate on the bus | ||||
|    */ | ||||
|   group = G_ACTION_GROUP (app->running_state->muxer); | ||||
|  | ||||
|   if (g_action_group_has_action (group, "app.quit") && | ||||
|       g_action_group_get_action_parameter_type (group, "app.quit") == NULL) | ||||
|     { | ||||
|       g_action_group_activate_action (group, "app.quit", NULL); | ||||
|  | ||||
|       return TRUE; | ||||
|     } | ||||
|  | ||||
|   /* Otherwise, fall back to closing all the app's windows */ | ||||
|   for (iter = app->running_state->windows; iter; iter = iter->next) | ||||
|     { | ||||
|       MetaWindow *win = iter->data; | ||||
|   | ||||
| @@ -17,15 +17,13 @@ | ||||
| #include <meta/meta-cursor-tracker.h> | ||||
| #include <meta/display.h> | ||||
| #include <meta/compositor-mutter.h> | ||||
| #include <st/st.h> | ||||
|  | ||||
| #include "shell-global.h" | ||||
| #include "shell-recorder-src.h" | ||||
| #include "shell-recorder.h" | ||||
| #include "shell-util.h" | ||||
|  | ||||
| #define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications" | ||||
| #define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled" | ||||
|  | ||||
| typedef enum { | ||||
|   RECORDER_STATE_CLOSED, | ||||
|   RECORDER_STATE_RECORDING | ||||
| @@ -58,7 +56,6 @@ struct _ShellRecorder { | ||||
|   int pointer_x; | ||||
|   int pointer_y; | ||||
|  | ||||
|   GSettings *a11y_settings; | ||||
|   gboolean draw_cursor; | ||||
|   MetaCursorTracker *cursor_tracker; | ||||
|   cairo_surface_t *cursor_image; | ||||
| @@ -213,8 +210,6 @@ shell_recorder_init (ShellRecorder *recorder) | ||||
|  | ||||
|   recorder->memory_target = get_memory_target(); | ||||
|  | ||||
|   recorder->a11y_settings = g_settings_new (A11Y_APPS_SCHEMA); | ||||
|  | ||||
|   recorder->state = RECORDER_STATE_CLOSED; | ||||
|   recorder->framerate = DEFAULT_FRAMES_PER_SECOND; | ||||
|   recorder->draw_cursor = TRUE; | ||||
| @@ -239,8 +234,6 @@ shell_recorder_finalize (GObject  *object) | ||||
|  | ||||
|   recorder_remove_redraw_timeout (recorder); | ||||
|  | ||||
|   g_clear_object (&recorder->a11y_settings); | ||||
|  | ||||
|   G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| @@ -465,9 +458,16 @@ recorder_record_frame (ShellRecorder *recorder, | ||||
|  | ||||
|   GST_BUFFER_PTS(buffer) = now; | ||||
|  | ||||
|   if (recorder->draw_cursor && | ||||
|       !g_settings_get_boolean (recorder->a11y_settings, MAGNIFIER_ACTIVE_KEY)) | ||||
|     recorder_draw_cursor (recorder, buffer); | ||||
|   if (recorder->draw_cursor) | ||||
|     { | ||||
|       StSettings *settings = st_settings_get (); | ||||
|       gboolean magnifier_active = FALSE; | ||||
|  | ||||
|       g_object_get (settings, "magnifier-active", &magnifier_active, NULL); | ||||
|  | ||||
|       if (magnifier_active) | ||||
|         recorder_draw_cursor (recorder, buffer); | ||||
|     } | ||||
|  | ||||
|   shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer); | ||||
|   gst_buffer_unref (buffer); | ||||
|   | ||||
| @@ -7,14 +7,12 @@ | ||||
| #include <meta/meta-plugin.h> | ||||
| #include <meta/meta-shaped-texture.h> | ||||
| #include <meta/meta-cursor-tracker.h> | ||||
| #include <st/st.h> | ||||
|  | ||||
| #include "shell-global.h" | ||||
| #include "shell-screenshot.h" | ||||
| #include "shell-util.h" | ||||
|  | ||||
| #define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications" | ||||
| #define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled" | ||||
|  | ||||
| typedef struct _ShellScreenshotPrivate  ShellScreenshotPrivate; | ||||
|  | ||||
| struct _ShellScreenshot | ||||
| @@ -202,6 +200,9 @@ write_screenshot_thread (GTask        *result, | ||||
|                                             cairo_image_surface_get_height (priv->image)); | ||||
|       creation_time = g_date_time_format (priv->datetime, "%c"); | ||||
|  | ||||
|       if (!creation_time) | ||||
|         creation_time = g_date_time_format (priv->datetime, "%FT%T%z"); | ||||
|  | ||||
|       if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL, | ||||
|                                      "tEXt::Software", "gnome-screenshot", | ||||
|                                      "tEXt::Creation Time", creation_time, | ||||
| @@ -268,9 +269,12 @@ should_draw_cursor_image (ShellScreenshotMode mode) | ||||
| { | ||||
|   if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ()) | ||||
|     { | ||||
|       g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA); | ||||
|       StSettings *settings = st_settings_get (); | ||||
|       gboolean magnifier_active = FALSE; | ||||
|  | ||||
|       if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) | ||||
|       g_object_get (settings, "magnifier-active", &magnifier_active, NULL); | ||||
|  | ||||
|       if (!magnifier_active) | ||||
|         return TRUE; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -126,6 +126,7 @@ libst = shared_library('st-1.0', | ||||
|   sources: st_gir_sources + st_non_gir_sources, | ||||
|   c_args: st_cflags, | ||||
|   dependencies: [clutter_dep, gtk_dep, croco_dep, x11_dep, m_dep], | ||||
|   build_rpath: mutter_typelibdir, | ||||
|   install_rpath: mutter_typelibdir, | ||||
|   install_dir: pkglibdir, | ||||
|   install: true | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
| #define KEY_DRAG_THRESHOLD    "drag-threshold" | ||||
| #define KEY_GTK_THEME         "gtk-theme" | ||||
| #define KEY_GTK_ICON_THEME    "icon-theme" | ||||
| #define KEY_MAGNIFIER_ACTIVE "screen-magnifier-enabled" | ||||
|  | ||||
| enum { | ||||
|   PROP_0, | ||||
| @@ -38,6 +39,7 @@ enum { | ||||
|   PROP_DRAG_THRESHOLD, | ||||
|   PROP_GTK_THEME, | ||||
|   PROP_GTK_ICON_THEME, | ||||
|   PROP_MAGNIFIER_ACTIVE, | ||||
|   N_PROPS | ||||
| }; | ||||
|  | ||||
| @@ -48,11 +50,13 @@ struct _StSettings | ||||
|   GObject parent_object; | ||||
|   GSettings *interface_settings; | ||||
|   GSettings *mouse_settings; | ||||
|   GSettings *a11y_settings; | ||||
|  | ||||
|   gchar *gtk_theme; | ||||
|   gchar *gtk_icon_theme; | ||||
|   gboolean enable_animations; | ||||
|   gboolean primary_paste; | ||||
|   gboolean magnifier_active; | ||||
|   gint drag_threshold; | ||||
| }; | ||||
|  | ||||
| @@ -105,6 +109,9 @@ st_settings_get_property (GObject    *object, | ||||
|     case PROP_GTK_ICON_THEME: | ||||
|       g_value_set_string (value, settings->gtk_icon_theme); | ||||
|       break; | ||||
|     case PROP_MAGNIFIER_ACTIVE: | ||||
|       g_value_set_boolean (value, settings->magnifier_active); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|     } | ||||
| @@ -144,6 +151,11 @@ st_settings_class_init (StSettingsClass *klass) | ||||
|                                                     "GTK+ Icon Theme", | ||||
|                                                     "", | ||||
|                                                     G_PARAM_READABLE); | ||||
|   props[PROP_MAGNIFIER_ACTIVE] = g_param_spec_boolean("magnifier-active", | ||||
|                                                       "Magnifier is active", | ||||
|                                                       "Weather the a11y magnifier is active", | ||||
|                                                       FALSE, | ||||
|                                                       G_PARAM_READABLE); | ||||
|  | ||||
|   g_object_class_install_properties (object_class, N_PROPS, props); | ||||
| } | ||||
| @@ -190,6 +202,18 @@ on_mouse_settings_changed (GSettings   *g_settings, | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_a11y_settings_changed (GSettings   *g_settings, | ||||
|                           const gchar *key, | ||||
|                           StSettings  *settings) | ||||
| { | ||||
|   if (g_str_equal (key, KEY_MAGNIFIER_ACTIVE)) | ||||
|     { | ||||
|       settings->magnifier_active = g_settings_get_boolean (g_settings, key); | ||||
|       g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_MAGNIFIER_ACTIVE]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| st_settings_init (StSettings *settings) | ||||
| { | ||||
| @@ -201,6 +225,10 @@ st_settings_init (StSettings *settings) | ||||
|   g_signal_connect (settings->interface_settings, "changed", | ||||
|                     G_CALLBACK (on_mouse_settings_changed), settings); | ||||
|  | ||||
|   settings->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.applications"); | ||||
|   g_signal_connect (settings->a11y_settings, "changed", | ||||
|                     G_CALLBACK (on_a11y_settings_changed), settings); | ||||
|  | ||||
|   settings->enable_animations = g_settings_get_boolean (settings->interface_settings, | ||||
|                                                         KEY_ENABLE_ANIMATIONS); | ||||
|   settings->primary_paste = g_settings_get_boolean (settings->interface_settings, | ||||
| @@ -211,6 +239,8 @@ st_settings_init (StSettings *settings) | ||||
|                                                     KEY_GTK_ICON_THEME); | ||||
|   settings->drag_threshold = g_settings_get_int (settings->mouse_settings, | ||||
|                                                  KEY_DRAG_THRESHOLD); | ||||
|   settings->magnifier_active = g_settings_get_boolean (settings->a11y_settings, | ||||
|                                                        KEY_MAGNIFIER_ACTIVE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -24,6 +24,8 @@ | ||||
| #ifndef __ST_SETTINGS_H__ | ||||
| #define __ST_SETTINGS_H__ | ||||
|  | ||||
| #include <glib-object.h> | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| #define ST_TYPE_SETTINGS (st_settings_get_type ()) | ||||
| @@ -31,4 +33,6 @@ G_DECLARE_FINAL_TYPE (StSettings, st_settings, ST, SETTINGS, GObject) | ||||
|  | ||||
| StSettings * st_settings_get (void); | ||||
|  | ||||
| G_END_DECLS | ||||
|  | ||||
| #endif /* __ST_SETTINGS_H__ */ | ||||
|   | ||||
| @@ -502,7 +502,7 @@ pixbuf_to_st_content_image (GdkPixbuf *pixbuf, | ||||
|     width *= paint_scale; | ||||
|  | ||||
|   if (height < 0) | ||||
|     height = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale); | ||||
|     height = ceilf (gdk_pixbuf_get_height (pixbuf) / resource_scale); | ||||
|   else | ||||
|     height *= paint_scale; | ||||
|  | ||||
| @@ -700,10 +700,14 @@ st_texture_cache_reset_texture (StTextureCachePropertyBind *bind, | ||||
|     { | ||||
|       g_autoptr(ClutterContent) image = NULL; | ||||
|       g_autoptr(GError) error = NULL; | ||||
|       int size = bind->size; | ||||
|  | ||||
|       if (size < 0) | ||||
|         clutter_actor_get_preferred_width (bind->actor, -1, NULL, (float *)&size); | ||||
|  | ||||
|       image = clutter_actor_get_content (bind->actor); | ||||
|       if (!image || !CLUTTER_IS_IMAGE (image)) | ||||
|         image = st_image_content_new_with_preferred_size (bind->size, bind->size); | ||||
|         image = st_image_content_new_with_preferred_size (size, size); | ||||
|       else | ||||
|         g_object_ref (image); | ||||
|  | ||||
| @@ -767,27 +771,30 @@ st_texture_cache_free_bind (gpointer data) | ||||
|  * If the source object is destroyed, the texture will continue to show the last | ||||
|  * value of the property. | ||||
|  * | ||||
|  * Return value: (transfer none): A new #ClutterActor | ||||
|  * Return value: (transfer none): A new #StWidget | ||||
|  */ | ||||
| ClutterActor * | ||||
| StWidget * | ||||
| st_texture_cache_bind_cairo_surface_property (StTextureCache    *cache, | ||||
|                                               GObject           *object, | ||||
|                                               const char        *property_name, | ||||
|                                               gint               size) | ||||
| { | ||||
|   ClutterActor *actor; | ||||
|   StWidget *widget; | ||||
|   gchar *notify_key; | ||||
|   StTextureCachePropertyBind *bind; | ||||
|  | ||||
|   actor = create_invisible_actor (); | ||||
|   clutter_actor_set_size (actor, size, size); | ||||
|   widget = g_object_new (ST_TYPE_WIDGET, | ||||
|                          "opacity", 0, | ||||
|                          "width", (float)size, | ||||
|                          "height", (float)size, | ||||
|                          NULL); | ||||
|  | ||||
|   bind = g_slice_new0 (StTextureCachePropertyBind); | ||||
|   bind->cache = cache; | ||||
|   bind->actor = actor; | ||||
|   bind->actor = CLUTTER_ACTOR (widget); | ||||
|   bind->size = size; | ||||
|   bind->source = object; | ||||
|   g_object_weak_ref (G_OBJECT (actor), st_texture_cache_bind_weak_notify, bind); | ||||
|   g_object_weak_ref (G_OBJECT (widget), st_texture_cache_bind_weak_notify, bind); | ||||
|   bind->weakref_active = TRUE; | ||||
|  | ||||
|   st_texture_cache_reset_texture (bind, property_name); | ||||
| @@ -797,7 +804,7 @@ st_texture_cache_bind_cairo_surface_property (StTextureCache    *cache, | ||||
|                                                   bind, (GClosureNotify)st_texture_cache_free_bind, 0); | ||||
|   g_free (notify_key); | ||||
|  | ||||
|   return actor; | ||||
|   return widget; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
|  | ||||
| #include <st/st-types.h> | ||||
| #include <st/st-theme-node.h> | ||||
| #include <st/st-widget.h> | ||||
|  | ||||
| #define ST_TYPE_TEXTURE_CACHE                 (st_texture_cache_get_type ()) | ||||
| G_DECLARE_FINAL_TYPE (StTextureCache, st_texture_cache, | ||||
| @@ -63,10 +64,10 @@ st_texture_cache_load_sliced_image (StTextureCache *cache, | ||||
|                                     GFunc           load_callback, | ||||
|                                     gpointer        user_data); | ||||
|  | ||||
| ClutterActor *st_texture_cache_bind_cairo_surface_property (StTextureCache    *cache, | ||||
|                                                             GObject           *object, | ||||
|                                                             const char        *property_name, | ||||
|                                                             gint               size); | ||||
| StWidget *st_texture_cache_bind_cairo_surface_property (StTextureCache    *cache, | ||||
|                                                         GObject           *object, | ||||
|                                                         const char        *property_name, | ||||
|                                                         gint               size); | ||||
|  | ||||
| ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache, | ||||
|                                            StThemeNode    *theme_node, | ||||
|   | ||||
| @@ -119,6 +119,10 @@ st_theme_node_transition_new (StThemeNode *from_node, | ||||
|   return transition; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * st_theme_node_transition_get_new_paint_state: (skip) | ||||
|  * | ||||
|  */ | ||||
| StThemeNodePaintState * | ||||
| st_theme_node_transition_get_new_paint_state (StThemeNodeTransition *transition) | ||||
| { | ||||
|   | ||||
| @@ -579,7 +579,11 @@ get_root_theme_node (ClutterStage *stage) | ||||
| StThemeNode * | ||||
| st_widget_get_theme_node (StWidget *widget) | ||||
| { | ||||
|   StWidgetPrivate *priv = st_widget_get_instance_private (widget); | ||||
|   StWidgetPrivate *priv; | ||||
|  | ||||
|   g_return_val_if_fail (ST_IS_WIDGET (widget), NULL); | ||||
|  | ||||
|   priv = st_widget_get_instance_private (widget); | ||||
|  | ||||
|   if (priv->theme_node == NULL) | ||||
|     { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user