Compare commits
	
		
			63 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					bb6d9734e4 | ||
| 
						 | 
					53be76c9e2 | ||
| 
						 | 
					be40de5a9b | ||
| 
						 | 
					7359e431d3 | ||
| 
						 | 
					8a5de327bb | ||
| 
						 | 
					1778adae0d | ||
| 
						 | 
					0d035a4e53 | ||
| 
						 | 
					46874eed05 | ||
| 
						 | 
					e95f3febd6 | ||
| 
						 | 
					0bdd1b6fc4 | ||
| 
						 | 
					8a22092632 | ||
| 
						 | 
					915415d919 | ||
| 
						 | 
					14d7897a93 | ||
| 
						 | 
					1398aa6562 | ||
| 
						 | 
					8fcd6c7153 | ||
| 
						 | 
					6ed5bc2f6c | ||
| 
						 | 
					5ec4c2e43e | ||
| 
						 | 
					6f8dd065a4 | ||
| 
						 | 
					02db21fc55 | ||
| 
						 | 
					8c28f9a77d | ||
| 
						 | 
					95b80eec01 | ||
| 
						 | 
					02c76695e5 | ||
| 
						 | 
					d5a1a888d9 | ||
| 
						 | 
					6c33aff6d1 | ||
| 
						 | 
					61f86cbc54 | ||
| 
						 | 
					4c5206954a | ||
| 
						 | 
					8fda3116f0 | ||
| 
						 | 
					7ac35c644e | ||
| 
						 | 
					29b04fcbf2 | ||
| 
						 | 
					55235c2552 | ||
| 
						 | 
					f250643385 | ||
| 
						 | 
					d008c6c5c5 | ||
| 
						 | 
					e2e02c9a2f | ||
| 
						 | 
					e56d7f5021 | ||
| 
						 | 
					e7d44bb349 | ||
| 
						 | 
					321730fcb9 | ||
| 
						 | 
					fe83cd91bb | ||
| 
						 | 
					0b08ee54bb | ||
| 
						 | 
					f6b4b96737 | ||
| 
						 | 
					b87455c089 | ||
| 
						 | 
					2c1a81f448 | ||
| 
						 | 
					b3736f45e6 | ||
| 
						 | 
					3c382c4bbe | ||
| 
						 | 
					5f3bad9c94 | ||
| 
						 | 
					6970f43e66 | ||
| 
						 | 
					9476aa598a | ||
| 
						 | 
					69725e5d41 | ||
| 
						 | 
					42dabef8c7 | ||
| 
						 | 
					e10a768ddb | ||
| 
						 | 
					a8f0787c91 | ||
| 
						 | 
					074129682b | ||
| 
						 | 
					c67460a1e3 | ||
| 
						 | 
					eab320dab5 | ||
| 
						 | 
					04c7cb6fbe | ||
| 
						 | 
					d4582491f5 | ||
| 
						 | 
					0641b1e279 | ||
| 
						 | 
					ae0450b68e | ||
| 
						 | 
					cb0a5de83b | ||
| 
						 | 
					2f5086efaf | ||
| 
						 | 
					68e580e394 | ||
| 
						 | 
					b143869d5d | ||
| 
						 | 
					6a477be874 | ||
| 
						 | 
					03bb8cdcbd | 
@@ -99,7 +99,6 @@
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <child name="keybindings" schema="org.gnome.shell.keybindings"/>
 | 
			
		||||
    <child name="keyboard" schema="org.gnome.shell.keyboard"/>
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
  <schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
 | 
			
		||||
@@ -183,17 +182,6 @@
 | 
			
		||||
    </key>
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
  <schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
 | 
			
		||||
          gettext-domain="@GETTEXT_PACKAGE@">
 | 
			
		||||
    <key name="keyboard-type" type="s">
 | 
			
		||||
      <default>'touch'</default>
 | 
			
		||||
      <summary>Which keyboard to use</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        The type of keyboard to use.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
  <schema id="org.gnome.shell.app-switcher"
 | 
			
		||||
          path="/org/gnome/shell/app-switcher/"
 | 
			
		||||
          gettext-domain="@GETTEXT_PACKAGE@">
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,10 @@ $cakeisalie: "This stylesheet is generated, DO NOT EDIT";
 | 
			
		||||
 | 
			
		||||
/* GLOBALS */
 | 
			
		||||
 | 
			
		||||
$panel-corner-radius: 6px;
 | 
			
		||||
$medium_radius: 9px;
 | 
			
		||||
 | 
			
		||||
$modal_radius: 9px;
 | 
			
		||||
$button_radius: 5px;
 | 
			
		||||
$panel-corner-radius: $button_radius + 1;
 | 
			
		||||
 | 
			
		||||
$_trough_color: transparentize($fg_color, 0.9);
 | 
			
		||||
$_bubble_borders_color: lighten($borders_color, if($variant=='light', 0%, 5%));
 | 
			
		||||
@@ -46,7 +48,7 @@ stage {
 | 
			
		||||
 | 
			
		||||
/* Buttons */
 | 
			
		||||
.button, %button {
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  border-radius: $button_radius;
 | 
			
		||||
  border-width: 1px;
 | 
			
		||||
  min-height: 22px;
 | 
			
		||||
  padding: 4px 32px;
 | 
			
		||||
@@ -68,21 +70,21 @@ stage {
 | 
			
		||||
  border-top: 1px solid $_bubble_borders_color;
 | 
			
		||||
 | 
			
		||||
  &:first-child {
 | 
			
		||||
    border-radius: 0px 0px 0px $medium_radius;
 | 
			
		||||
    border-radius: 0px 0px 0px $modal_radius;
 | 
			
		||||
  }
 | 
			
		||||
  &:last-child {
 | 
			
		||||
    border-right-width: 0px;
 | 
			
		||||
    border-radius: 0px 0px $medium_radius 0px;
 | 
			
		||||
    border-radius: 0px 0px $modal_radius 0px;
 | 
			
		||||
  }
 | 
			
		||||
  &:first-child:last-child {
 | 
			
		||||
    border-right-width: 0px;
 | 
			
		||||
    border-radius: 0px 0px $medium_radius $medium_radius;
 | 
			
		||||
    border-radius: 0px 0px $modal_radius $modal_radius;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Entries */
 | 
			
		||||
StEntry {
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  border-radius: $button_radius;
 | 
			
		||||
  padding: 4px;
 | 
			
		||||
  border-width: 1px;
 | 
			
		||||
  color: $fg_color;
 | 
			
		||||
@@ -146,8 +148,7 @@ StScrollBar {
 | 
			
		||||
  -slider-handle-radius: 8px;
 | 
			
		||||
  -slider-handle-border-width: 1px;
 | 
			
		||||
  -slider-handle-border-color: $borders_color;
 | 
			
		||||
  color: $bg_color; /* FIXME to match gtk, we'd need to style the border of the slider, not
 | 
			
		||||
     the whole widget */
 | 
			
		||||
  color: if($variant == 'light', lighten($bg_color, 10%), darken($bg_color,4%));
 | 
			
		||||
  &:hover { color: $_hover_bg_color; }
 | 
			
		||||
  &:active { color: $_active_bg_color; }
 | 
			
		||||
}
 | 
			
		||||
@@ -193,7 +194,7 @@ StScrollBar {
 | 
			
		||||
.flashspot { background-color: white; }
 | 
			
		||||
 | 
			
		||||
.modal-dialog {
 | 
			
		||||
  border-radius: 9px;
 | 
			
		||||
  border-radius: $modal_radius;
 | 
			
		||||
  @extend %bubble-panel;
 | 
			
		||||
  .modal-dialog-content-box {
 | 
			
		||||
    padding: 24px;
 | 
			
		||||
@@ -590,7 +591,7 @@ StScrollBar {
 | 
			
		||||
  }
 | 
			
		||||
  .popup-menu-boxpointer,
 | 
			
		||||
  .candidate-popup-boxpointer {
 | 
			
		||||
    -arrow-border-radius: $medium_radius;
 | 
			
		||||
    -arrow-border-radius: $button_radius+4;
 | 
			
		||||
    -arrow-background-color: $bg_color;
 | 
			
		||||
    -arrow-border-width: 1px;
 | 
			
		||||
    -arrow-border-color: if($variant=='light', transparentize(black, 0.6), $borders_color);
 | 
			
		||||
@@ -1156,11 +1157,6 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
  // a little unstructured mess:
 | 
			
		||||
 | 
			
		||||
  .system-switch-user-submenu-icon {
 | 
			
		||||
    icon-size: 16px;
 | 
			
		||||
    padding: 0 4px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #appMenu {
 | 
			
		||||
    spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg");
 | 
			
		||||
    spacing: 4px;
 | 
			
		||||
@@ -1524,7 +1520,7 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
  %icon_tile {
 | 
			
		||||
    color: $osd_fg_color;
 | 
			
		||||
    border-radius: $medium_radius;
 | 
			
		||||
    border-radius: $button_radius+4;
 | 
			
		||||
    padding: 6px;
 | 
			
		||||
    border: 1px solid transparent;
 | 
			
		||||
    transition-duration: 100ms;
 | 
			
		||||
@@ -1631,7 +1627,7 @@ StScrollBar {
 | 
			
		||||
    font-size: 11pt;
 | 
			
		||||
    width: 34em;
 | 
			
		||||
    margin: 5px;
 | 
			
		||||
    border-radius: $medium-radius;
 | 
			
		||||
    border-radius: $modal_radius;
 | 
			
		||||
    border: if($variant == 'light', none, $_bubble_borders_color);
 | 
			
		||||
    min-height: 64px;
 | 
			
		||||
    box-shadow: 0 1px 2px transparentize(black, 0.7);
 | 
			
		||||
@@ -1783,30 +1779,36 @@ StScrollBar {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .keyboard-key {
 | 
			
		||||
    background-color: #393f3f;
 | 
			
		||||
    $_key_bg: opacify(lighten($osd_bg_color, 9%), 1);
 | 
			
		||||
    background-color: $_key_bg;
 | 
			
		||||
    min-height: 1.2em;
 | 
			
		||||
    min-width: 1.2em;
 | 
			
		||||
    font-size: 16pt;
 | 
			
		||||
    border-radius: 3px;
 | 
			
		||||
    border: 1px solid #464d4d;
 | 
			
		||||
    color: #e5e5e5;
 | 
			
		||||
    border-radius: $button_radius;
 | 
			
		||||
    border: 1px solid $osd_outer_borders_color;
 | 
			
		||||
    color: $osd_fg_color;
 | 
			
		||||
    &:focus { @include button(focus); }
 | 
			
		||||
    &:hover,&:checked { @include button(hover); }
 | 
			
		||||
    &:active { @include button(active);}
 | 
			
		||||
    &:hover, &:checked { background-color: lighten($_key_bg, 3%); }
 | 
			
		||||
    &:active { background-color: darken($_key_bg, 2%); }
 | 
			
		||||
    &:grayed { //FIXME
 | 
			
		||||
      background-color: $osd_bg_color;
 | 
			
		||||
      color: $osd_fg_color;
 | 
			
		||||
      border-color: $osd_borders_color;
 | 
			
		||||
    }
 | 
			
		||||
    &.default-key {
 | 
			
		||||
      border-color: #2d3232;
 | 
			
		||||
      background-color: #1d2020;
 | 
			
		||||
      $_default_key_bg: opacify($osd_bg_color, 1);
 | 
			
		||||
      border-color: $osd_outer_borders_color;
 | 
			
		||||
      background-color: $_default_key_bg;
 | 
			
		||||
      background-size: 20px;
 | 
			
		||||
      &:hover, &:checked { background-color: lighten($_default_key_bg, 3%); }
 | 
			
		||||
      &:active { background-color: darken($_default_key_bg, 2%); }
 | 
			
		||||
    }
 | 
			
		||||
    &.enter-key {
 | 
			
		||||
      border-color: #005684;
 | 
			
		||||
      background-color: #006098;
 | 
			
		||||
      border-color: lighten($selected_bg_color, 5%);
 | 
			
		||||
      background-color: $selected_bg_color;
 | 
			
		||||
      background-image: url("resource:///org/gnome/shell/theme/key-enter.svg");
 | 
			
		||||
      &:hover, &:checked { background-color: lighten($selected_bg_color, 3%); }
 | 
			
		||||
      &:active { background-color: darken($selected_bg_color, 2%); }
 | 
			
		||||
    }
 | 
			
		||||
    &.shift-key-lowercase {
 | 
			
		||||
      background-image: url("resource:///org/gnome/shell/theme/key-shift.svg");
 | 
			
		||||
@@ -1845,8 +1847,8 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
.emoji-panel {
 | 
			
		||||
  .keyboard-key:latched {
 | 
			
		||||
    border-color: #005684;
 | 
			
		||||
    background-color: #006098;
 | 
			
		||||
    border-color: lighten($selected_bg_color, 5%);
 | 
			
		||||
    background-color: $selected_bg_color;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1910,7 +1912,7 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
  StEntry {
 | 
			
		||||
    @extend %search_entry;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    border-radius: $button_radius;
 | 
			
		||||
    @if $variant=='dark' {
 | 
			
		||||
      $_gdm_entry_bg: transparentize(lighten(desaturate(#241f31, 20%), 2%), 0.5);
 | 
			
		||||
      background-color: $_gdm_entry_bg;
 | 
			
		||||
 
 | 
			
		||||
@@ -168,13 +168,20 @@ var Application = class {
 | 
			
		||||
 | 
			
		||||
        copyButton.connect('clicked', w => {
 | 
			
		||||
            let clipboard = Gtk.Clipboard.get_default(w.get_display());
 | 
			
		||||
            let backticks = '```';
 | 
			
		||||
            clipboard.set_text(
 | 
			
		||||
                // markdown for pasting in gitlab issues
 | 
			
		||||
                `The settings of extension ${extension.uuid} had an error:\n${
 | 
			
		||||
                backticks}\n${exc}\n${backticks}\n\nStack trace:\n${
 | 
			
		||||
                backticks}\n${exc.stack}${backticks}\n`, -1
 | 
			
		||||
            );
 | 
			
		||||
            // markdown for pasting in gitlab issues
 | 
			
		||||
            let lines = [
 | 
			
		||||
                `The settings of extension ${extension.uuid} had an error:`,
 | 
			
		||||
                '```',
 | 
			
		||||
                `${exc}`,
 | 
			
		||||
                '```',
 | 
			
		||||
                '',
 | 
			
		||||
                'Stack trace:',
 | 
			
		||||
                '```',
 | 
			
		||||
                exc.stack.replace(/\n$/, ''), // stack without trailing newline
 | 
			
		||||
                '```',
 | 
			
		||||
                ''
 | 
			
		||||
            ];
 | 
			
		||||
            clipboard.set_text(lines.join('\n'), -1);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let spacing = new Gtk.SeparatorToolItem({ draw: false });
 | 
			
		||||
@@ -582,12 +589,12 @@ class ExtensionRow extends Gtk.ListBoxRow {
 | 
			
		||||
 | 
			
		||||
    _isEnabled() {
 | 
			
		||||
        let extensions = this._settings.get_strv('enabled-extensions');
 | 
			
		||||
        return extensions.indexOf(this.uuid) != -1;
 | 
			
		||||
        return extensions.includes(this.uuid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _enable() {
 | 
			
		||||
        let extensions = this._settings.get_strv('enabled-extensions');
 | 
			
		||||
        if (extensions.indexOf(this.uuid) != -1)
 | 
			
		||||
        if (extensions.includes(this.uuid))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        extensions.push(this.uuid);
 | 
			
		||||
@@ -611,12 +618,12 @@ function initEnvironment() {
 | 
			
		||||
    // Monkey-patch in a "global" object that fakes some Shell utilities
 | 
			
		||||
    // that ExtensionUtils depends on.
 | 
			
		||||
    window.global = {
 | 
			
		||||
        log() {
 | 
			
		||||
            print([].join.call(arguments, ', '));
 | 
			
		||||
        log(...args) {
 | 
			
		||||
            print(args.join(', '));
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        logError(s) {
 | 
			
		||||
            log('ERROR: ' + s);
 | 
			
		||||
            log(`ERROR: ${s}`);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
 | 
			
		||||
 
 | 
			
		||||
@@ -59,23 +59,23 @@ var AuthPrompt = class {
 | 
			
		||||
        this.smartcardDetected = this._userVerifier.smartcardDetected;
 | 
			
		||||
 | 
			
		||||
        this.connect('next', () => {
 | 
			
		||||
                this.updateSensitivity(false);
 | 
			
		||||
                this.startSpinning();
 | 
			
		||||
                if (this._queryingService) {
 | 
			
		||||
                    this._userVerifier.answerQuery(this._queryingService, this._entry.text);
 | 
			
		||||
                } else {
 | 
			
		||||
                    this._preemptiveAnswer = this._entry.text;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            this.updateSensitivity(false);
 | 
			
		||||
            this.startSpinning();
 | 
			
		||||
            if (this._queryingService) {
 | 
			
		||||
                this._userVerifier.answerQuery(this._queryingService, this._entry.text);
 | 
			
		||||
            } else {
 | 
			
		||||
                this._preemptiveAnswer = this._entry.text;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
 | 
			
		||||
                                        vertical: true });
 | 
			
		||||
        this.actor.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
        this.actor.connect('key-press-event', (actor, event) => {
 | 
			
		||||
                if (event.get_key_symbol() == Clutter.KEY_Escape)
 | 
			
		||||
                    this.cancel();
 | 
			
		||||
                return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
            });
 | 
			
		||||
            if (event.get_key_symbol() == Clutter.KEY_Escape)
 | 
			
		||||
                this.cancel();
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._userWell = new St.Bin({ x_fill: true,
 | 
			
		||||
                                      x_align: St.Align.START });
 | 
			
		||||
@@ -112,7 +112,7 @@ var AuthPrompt = class {
 | 
			
		||||
        this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
 | 
			
		||||
                                             vertical: false });
 | 
			
		||||
        this.actor.add(this._buttonBox,
 | 
			
		||||
                       { expand:  true,
 | 
			
		||||
                       { expand: true,
 | 
			
		||||
                         x_align: St.Align.MIDDLE,
 | 
			
		||||
                         y_align: St.Align.END });
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +138,7 @@ var AuthPrompt = class {
 | 
			
		||||
                                            reactive: true,
 | 
			
		||||
                                            can_focus: true,
 | 
			
		||||
                                            label: _("Cancel") });
 | 
			
		||||
        this.cancelButton.connect('clicked', () => { this.cancel(); });
 | 
			
		||||
        this.cancelButton.connect('clicked', () => this.cancel());
 | 
			
		||||
        this._buttonBox.add(this.cancelButton,
 | 
			
		||||
                            { expand: false,
 | 
			
		||||
                              x_fill: false,
 | 
			
		||||
@@ -157,7 +157,7 @@ var AuthPrompt = class {
 | 
			
		||||
                                          reactive: true,
 | 
			
		||||
                                          can_focus: true,
 | 
			
		||||
                                          label: _("Next") });
 | 
			
		||||
        this.nextButton.connect('clicked', () => { this.emit('next'); });
 | 
			
		||||
        this.nextButton.connect('clicked', () => this.emit('next'));
 | 
			
		||||
        this.nextButton.add_style_pseudo_class('default');
 | 
			
		||||
        this._buttonBox.add(this.nextButton,
 | 
			
		||||
                            { expand: false,
 | 
			
		||||
@@ -295,12 +295,11 @@ var AuthPrompt = class {
 | 
			
		||||
                                   time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
 | 
			
		||||
                                   delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
 | 
			
		||||
                                   transition: 'linear',
 | 
			
		||||
                                   onCompleteScope: this,
 | 
			
		||||
                                   onComplete() {
 | 
			
		||||
                                      if (wasSpinner) {
 | 
			
		||||
                                          if (this._spinner)
 | 
			
		||||
                                              this._spinner.stop();
 | 
			
		||||
                                      }
 | 
			
		||||
                                   onComplete: () => {
 | 
			
		||||
                                       if (wasSpinner) {
 | 
			
		||||
                                           if (this._spinner)
 | 
			
		||||
                                               this._spinner.stop();
 | 
			
		||||
                                       }
 | 
			
		||||
                                   }
 | 
			
		||||
                                 });
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,7 @@
 | 
			
		||||
 * replaced by something else.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const { GObject } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
var Task = class {
 | 
			
		||||
@@ -176,36 +177,36 @@ Signals.addSignalMethods(Batch.prototype);
 | 
			
		||||
 | 
			
		||||
var ConcurrentBatch = class extends Batch {
 | 
			
		||||
    process() {
 | 
			
		||||
       let hold = this.runTask();
 | 
			
		||||
        let hold = this.runTask();
 | 
			
		||||
 | 
			
		||||
       if (hold) {
 | 
			
		||||
           this.hold.acquireUntilAfter(hold);
 | 
			
		||||
       }
 | 
			
		||||
        if (hold) {
 | 
			
		||||
            this.hold.acquireUntilAfter(hold);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
       // Regardless of the state of the just run task,
 | 
			
		||||
       // fire off the next one, so all the tasks can run
 | 
			
		||||
       // concurrently.
 | 
			
		||||
       this.nextTask();
 | 
			
		||||
        // Regardless of the state of the just run task,
 | 
			
		||||
        // fire off the next one, so all the tasks can run
 | 
			
		||||
        // concurrently.
 | 
			
		||||
        this.nextTask();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ConcurrentBatch.prototype);
 | 
			
		||||
 | 
			
		||||
var ConsecutiveBatch = class extends Batch {
 | 
			
		||||
    process() {
 | 
			
		||||
       let hold = this.runTask();
 | 
			
		||||
        let hold = this.runTask();
 | 
			
		||||
 | 
			
		||||
       if (hold && hold.isAcquired()) {
 | 
			
		||||
           // This task is inhibiting the batch. Wait on it
 | 
			
		||||
           // before processing the next one.
 | 
			
		||||
           let signalId = hold.connect('release', () => {
 | 
			
		||||
               hold.disconnect(signalId);
 | 
			
		||||
               this.nextTask();
 | 
			
		||||
           });
 | 
			
		||||
           return;
 | 
			
		||||
       } else {
 | 
			
		||||
           // This task finished, process the next one
 | 
			
		||||
           this.nextTask();
 | 
			
		||||
       }
 | 
			
		||||
        if (hold && hold.isAcquired()) {
 | 
			
		||||
            // This task is inhibiting the batch. Wait on it
 | 
			
		||||
            // before processing the next one.
 | 
			
		||||
            let signalId = hold.connect('release', () => {
 | 
			
		||||
                hold.disconnect(signalId);
 | 
			
		||||
                this.nextTask();
 | 
			
		||||
            });
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
            // This task finished, process the next one
 | 
			
		||||
            this.nextTask();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ConsecutiveBatch.prototype);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,8 @@ function FprintManager() {
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        self.init(null);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        log('Failed to connect to Fprint service: ' + e.message);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        log(`Failed to connect to Fprint service: ${e.message}`);
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ var UserListItem = class {
 | 
			
		||||
    constructor(user) {
 | 
			
		||||
        this.user = user;
 | 
			
		||||
        this._userChangedId = this.user.connect('changed',
 | 
			
		||||
                                                 this._onUserChanged.bind(this));
 | 
			
		||||
                                                this._onUserChanged.bind(this));
 | 
			
		||||
 | 
			
		||||
        let layout = new St.BoxLayout({ vertical: true });
 | 
			
		||||
        this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
 | 
			
		||||
@@ -150,7 +150,7 @@ Signals.addSignalMethods(UserListItem.prototype);
 | 
			
		||||
 | 
			
		||||
var UserList = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
 | 
			
		||||
        this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view' });
 | 
			
		||||
        this.actor.set_policy(St.PolicyType.NEVER,
 | 
			
		||||
                              St.PolicyType.AUTOMATIC);
 | 
			
		||||
 | 
			
		||||
@@ -187,8 +187,6 @@ var UserList = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateStyle(isExpanded) {
 | 
			
		||||
        let tasks = [];
 | 
			
		||||
 | 
			
		||||
        if (isExpanded)
 | 
			
		||||
            this._box.add_style_pseudo_class('expanded');
 | 
			
		||||
        else
 | 
			
		||||
@@ -244,7 +242,7 @@ var UserList = class {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (user.locked)
 | 
			
		||||
           return;
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let userName = user.get_user_name();
 | 
			
		||||
 | 
			
		||||
@@ -261,7 +259,7 @@ var UserList = class {
 | 
			
		||||
        item.connect('activate', this._onItemActivated.bind(this));
 | 
			
		||||
 | 
			
		||||
        // Try to keep the focused item front-and-center
 | 
			
		||||
        item.actor.connect('key-focus-in', () => { this.scrollToItem(item); });
 | 
			
		||||
        item.actor.connect('key-focus-in', () => this.scrollToItem(item));
 | 
			
		||||
 | 
			
		||||
        this._moveFocusToItems();
 | 
			
		||||
 | 
			
		||||
@@ -319,17 +317,17 @@ var SessionMenuButton = class {
 | 
			
		||||
        this._menu.actor.hide();
 | 
			
		||||
 | 
			
		||||
        this._menu.connect('open-state-changed', (menu, isOpen) => {
 | 
			
		||||
             if (isOpen)
 | 
			
		||||
                 this._button.add_style_pseudo_class('active');
 | 
			
		||||
             else
 | 
			
		||||
                 this._button.remove_style_pseudo_class('active');
 | 
			
		||||
            if (isOpen)
 | 
			
		||||
                this._button.add_style_pseudo_class('active');
 | 
			
		||||
            else
 | 
			
		||||
                this._button.remove_style_pseudo_class('active');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager(this._button,
 | 
			
		||||
                                                       { actionMode: Shell.ActionMode.NONE });
 | 
			
		||||
        this._manager.addMenu(this._menu);
 | 
			
		||||
 | 
			
		||||
        this._button.connect('clicked', () => { this._menu.toggle(); });
 | 
			
		||||
        this._button.connect('clicked', () => this._menu.toggle());
 | 
			
		||||
 | 
			
		||||
        this._items = {};
 | 
			
		||||
        this._activeSessionId = null;
 | 
			
		||||
@@ -353,11 +351,11 @@ var SessionMenuButton = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setActiveSession(sessionId) {
 | 
			
		||||
         if (sessionId == this._activeSessionId)
 | 
			
		||||
             return;
 | 
			
		||||
        if (sessionId == this._activeSessionId)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
         this._activeSessionId = sessionId;
 | 
			
		||||
         this._updateOrnament();
 | 
			
		||||
        this._activeSessionId = sessionId;
 | 
			
		||||
        this._updateOrnament();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close() {
 | 
			
		||||
@@ -403,18 +401,18 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
        parentActor.add_child(this);
 | 
			
		||||
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default()
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default();
 | 
			
		||||
        this._gdmClient = new Gdm.Client();
 | 
			
		||||
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_KEY}`,
 | 
			
		||||
                               this._updateBanner.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_TEXT_KEY}`,
 | 
			
		||||
                               this._updateBanner.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${GdmUtil.DISABLE_USER_LIST_KEY}`,
 | 
			
		||||
                               this._updateDisableUserList.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${GdmUtil.LOGO_KEY}`,
 | 
			
		||||
                               this._updateLogo.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._textureCache = St.TextureCache.get_default();
 | 
			
		||||
@@ -575,19 +573,15 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
        // First find out what space the children require
 | 
			
		||||
        let bannerAllocation = null;
 | 
			
		||||
        let bannerHeight = 0;
 | 
			
		||||
        let bannerWidth = 0;
 | 
			
		||||
        if (this._bannerView.visible) {
 | 
			
		||||
            bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
 | 
			
		||||
            bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
 | 
			
		||||
            bannerWidth = bannerAllocation.x2 - bannerAllocation.x1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let authPromptAllocation = null;
 | 
			
		||||
        let authPromptHeight = 0;
 | 
			
		||||
        let authPromptWidth = 0;
 | 
			
		||||
        if (this._authPrompt.actor.visible) {
 | 
			
		||||
            authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
 | 
			
		||||
            authPromptHeight = authPromptAllocation.y2 - authPromptAllocation.y1;
 | 
			
		||||
            authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -619,64 +613,64 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
            let leftOverYSpace = bannerSpace - bannerHeight;
 | 
			
		||||
 | 
			
		||||
            if (leftOverYSpace > 0) {
 | 
			
		||||
                 // First figure out how much left over space is up top
 | 
			
		||||
                 let leftOverTopSpace = leftOverYSpace / 2;
 | 
			
		||||
                // First figure out how much left over space is up top
 | 
			
		||||
                let leftOverTopSpace = leftOverYSpace / 2;
 | 
			
		||||
 | 
			
		||||
                 // Then, shift the banner into the middle of that extra space
 | 
			
		||||
                 let yShift = Math.floor(leftOverTopSpace / 2);
 | 
			
		||||
                // Then, shift the banner into the middle of that extra space
 | 
			
		||||
                let yShift = Math.floor(leftOverTopSpace / 2);
 | 
			
		||||
 | 
			
		||||
                 bannerAllocation.y1 += yShift;
 | 
			
		||||
                 bannerAllocation.y2 += yShift;
 | 
			
		||||
                bannerAllocation.y1 += yShift;
 | 
			
		||||
                bannerAllocation.y2 += yShift;
 | 
			
		||||
            } else {
 | 
			
		||||
                 // Then figure out how much space there would be if we switched to a
 | 
			
		||||
                 // wide layout with banner on one side and authprompt on the other.
 | 
			
		||||
                 let leftOverXSpace = dialogWidth - authPromptWidth;
 | 
			
		||||
                // Then figure out how much space there would be if we switched to a
 | 
			
		||||
                // wide layout with banner on one side and authprompt on the other.
 | 
			
		||||
                let leftOverXSpace = dialogWidth - authPromptWidth;
 | 
			
		||||
 | 
			
		||||
                 // In a wide view, half of the available space goes to the banner,
 | 
			
		||||
                 // and the other half goes to the margins.
 | 
			
		||||
                 let wideBannerWidth = leftOverXSpace / 2;
 | 
			
		||||
                 let wideSpacing  = leftOverXSpace - wideBannerWidth;
 | 
			
		||||
                // In a wide view, half of the available space goes to the banner,
 | 
			
		||||
                // and the other half goes to the margins.
 | 
			
		||||
                let wideBannerWidth = leftOverXSpace / 2;
 | 
			
		||||
                let wideSpacing  = leftOverXSpace - wideBannerWidth;
 | 
			
		||||
 | 
			
		||||
                 // If we do go with a wide layout, we need there to be at least enough
 | 
			
		||||
                 // space for the banner and the auth prompt to be the same width,
 | 
			
		||||
                 // so it doesn't look unbalanced.
 | 
			
		||||
                 if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
 | 
			
		||||
                     let centerX = dialogBox.x1 + dialogWidth / 2;
 | 
			
		||||
                     let centerY = dialogBox.y1 + dialogHeight / 2;
 | 
			
		||||
                // If we do go with a wide layout, we need there to be at least enough
 | 
			
		||||
                // space for the banner and the auth prompt to be the same width,
 | 
			
		||||
                // so it doesn't look unbalanced.
 | 
			
		||||
                if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
 | 
			
		||||
                    let centerX = dialogBox.x1 + dialogWidth / 2;
 | 
			
		||||
                    let centerY = dialogBox.y1 + dialogHeight / 2;
 | 
			
		||||
 | 
			
		||||
                     // A small portion of the spacing goes down the center of the
 | 
			
		||||
                     // screen to help delimit the two columns of the wide view
 | 
			
		||||
                     let centerGap = wideSpacing / 8;
 | 
			
		||||
                    // A small portion of the spacing goes down the center of the
 | 
			
		||||
                    // screen to help delimit the two columns of the wide view
 | 
			
		||||
                    let centerGap = wideSpacing / 8;
 | 
			
		||||
 | 
			
		||||
                     // place the banner along the left edge of the center margin
 | 
			
		||||
                     bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
 | 
			
		||||
                     bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
 | 
			
		||||
                    // place the banner along the left edge of the center margin
 | 
			
		||||
                    bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
 | 
			
		||||
                    bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
 | 
			
		||||
 | 
			
		||||
                     // figure out how tall it would like to be and try to accommodate
 | 
			
		||||
                     // but don't let it get too close to the logo
 | 
			
		||||
                     let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
 | 
			
		||||
                    // figure out how tall it would like to be and try to accommodate
 | 
			
		||||
                    // but don't let it get too close to the logo
 | 
			
		||||
                    let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
 | 
			
		||||
 | 
			
		||||
                     let maxWideHeight = dialogHeight - 3 * logoHeight;
 | 
			
		||||
                     wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
 | 
			
		||||
                     bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
 | 
			
		||||
                     bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
 | 
			
		||||
                    let maxWideHeight = dialogHeight - 3 * logoHeight;
 | 
			
		||||
                    wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
 | 
			
		||||
                    bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
 | 
			
		||||
                    bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
 | 
			
		||||
 | 
			
		||||
                     // place the auth prompt along the right edge of the center margin
 | 
			
		||||
                     authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
 | 
			
		||||
                     authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
 | 
			
		||||
                 } else {
 | 
			
		||||
                     // If we aren't going to do a wide view, then we need to limit
 | 
			
		||||
                     // the height of the banner so it will present scrollbars
 | 
			
		||||
                    // place the auth prompt along the right edge of the center margin
 | 
			
		||||
                    authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
 | 
			
		||||
                    authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
 | 
			
		||||
                } else {
 | 
			
		||||
                    // If we aren't going to do a wide view, then we need to limit
 | 
			
		||||
                    // the height of the banner so it will present scrollbars
 | 
			
		||||
 | 
			
		||||
                     // First figure out how much space there is without the banner
 | 
			
		||||
                     leftOverYSpace += bannerHeight;
 | 
			
		||||
                    // First figure out how much space there is without the banner
 | 
			
		||||
                    leftOverYSpace += bannerHeight;
 | 
			
		||||
 | 
			
		||||
                     // Then figure out how much of that space is up top
 | 
			
		||||
                     let availableTopSpace = Math.floor(leftOverYSpace / 2);
 | 
			
		||||
                    // Then figure out how much of that space is up top
 | 
			
		||||
                    let availableTopSpace = Math.floor(leftOverYSpace / 2);
 | 
			
		||||
 | 
			
		||||
                     // Then give all of that space to the banner
 | 
			
		||||
                     bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
 | 
			
		||||
                 }
 | 
			
		||||
                    // Then give all of that space to the banner
 | 
			
		||||
                    bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else if (userSelectionAllocation) {
 | 
			
		||||
            // Grow the user list to fill the space
 | 
			
		||||
@@ -851,10 +845,10 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
    _shouldShowSessionMenuButton() {
 | 
			
		||||
        if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
 | 
			
		||||
            this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED)
 | 
			
		||||
          return false;
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        if (this._user && this._user.is_loaded && this._user.is_logged_in())
 | 
			
		||||
          return false;
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -919,7 +913,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: _FADE_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onUpdate() {
 | 
			
		||||
                           onUpdate: () => {
 | 
			
		||||
                               let children = Main.layoutManager.uiGroup.get_children();
 | 
			
		||||
 | 
			
		||||
                               for (let i = 0; i < children.length; i++) {
 | 
			
		||||
@@ -927,12 +921,10 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                                       children[i].opacity = this.opacity;
 | 
			
		||||
                               }
 | 
			
		||||
                           },
 | 
			
		||||
                           onUpdateScope: this,
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
 | 
			
		||||
                                   this._authPrompt.reset();
 | 
			
		||||
                           },
 | 
			
		||||
                           onCompleteScope: this });
 | 
			
		||||
                           } });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _gotGreeterSessionProxy(proxy) {
 | 
			
		||||
@@ -949,7 +941,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time: _FADE_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onUpdate() {
 | 
			
		||||
                           onUpdate: () => {
 | 
			
		||||
                               let children = Main.layoutManager.uiGroup.get_children();
 | 
			
		||||
 | 
			
		||||
                               for (let i = 0; i < children.length; i++) {
 | 
			
		||||
@@ -957,22 +949,20 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                                       children[i].opacity = this.opacity;
 | 
			
		||||
                               }
 | 
			
		||||
                           },
 | 
			
		||||
                           onUpdateScope: this,
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
 | 
			
		||||
                           },
 | 
			
		||||
                           onCompleteScope: this });
 | 
			
		||||
                           } });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSessionOpened(client, serviceName) {
 | 
			
		||||
        this._authPrompt.finish(() => { this._startSession(serviceName); });
 | 
			
		||||
        this._authPrompt.finish(() => this._startSession(serviceName));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _waitForItemForUser(userName) {
 | 
			
		||||
        let item = this._userList.getItemFromUserName(userName);
 | 
			
		||||
 | 
			
		||||
        if (item)
 | 
			
		||||
          return null;
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
        let hold = new Batch.Hold();
 | 
			
		||||
        let signalId = this._userList.connect('item-added',
 | 
			
		||||
@@ -983,7 +973,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                    hold.release();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        hold.connect('release', () => { this._userList.disconnect(signalId); });
 | 
			
		||||
        hold.connect('release', () => this._userList.disconnect(signalId));
 | 
			
		||||
 | 
			
		||||
        return hold;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1047,6 +1037,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                             return this._blockTimedLoginUntilIdle();
 | 
			
		||||
                         } else {
 | 
			
		||||
                             animationTime = delay;
 | 
			
		||||
                             return null;
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
@@ -1082,12 +1073,12 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        // Restart timed login on user interaction
 | 
			
		||||
        global.stage.connect('captured-event', (actor, event) => {
 | 
			
		||||
           if (event.type() == Clutter.EventType.KEY_PRESS ||
 | 
			
		||||
            if (event.type() == Clutter.EventType.KEY_PRESS ||
 | 
			
		||||
               event.type() == Clutter.EventType.BUTTON_PRESS) {
 | 
			
		||||
               this._startTimedLogin(userName, seconds);
 | 
			
		||||
           }
 | 
			
		||||
                this._startTimedLogin(userName, seconds);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ var Manager = class {
 | 
			
		||||
        this._aggregateProvider = Provider(Gio.DBus.system,
 | 
			
		||||
                                           'org.freedesktop.realmd',
 | 
			
		||||
                                           '/org/freedesktop/realmd',
 | 
			
		||||
                                           this._reloadRealms.bind(this))
 | 
			
		||||
                                           this._reloadRealms.bind(this));
 | 
			
		||||
        this._realms = {};
 | 
			
		||||
 | 
			
		||||
        this._signalId = this._aggregateProvider.connect('g-properties-changed',
 | 
			
		||||
@@ -36,10 +36,10 @@ var Manager = class {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < realmPaths.length; i++) {
 | 
			
		||||
            let realm = Realm(Gio.DBus.system,
 | 
			
		||||
                              'org.freedesktop.realmd',
 | 
			
		||||
                              realmPaths[i],
 | 
			
		||||
                              this._onRealmLoaded.bind(this));
 | 
			
		||||
            Realm(Gio.DBus.system,
 | 
			
		||||
                  'org.freedesktop.realmd',
 | 
			
		||||
                  realmPaths[i],
 | 
			
		||||
                  this._onRealmLoaded.bind(this));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -98,10 +98,10 @@ var Manager = class {
 | 
			
		||||
        Service(Gio.DBus.system,
 | 
			
		||||
                'org.freedesktop.realmd',
 | 
			
		||||
                '/org/freedesktop/realmd',
 | 
			
		||||
                service => { service.ReleaseRemote(); });
 | 
			
		||||
                service => service.ReleaseRemote());
 | 
			
		||||
        this._aggregateProvider.disconnect(this._signalId);
 | 
			
		||||
        this._realms = { };
 | 
			
		||||
        this._updateLoginFormat();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(Manager.prototype)
 | 
			
		||||
Signals.addSignalMethods(Manager.prototype);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ var LOGO_KEY = 'logo';
 | 
			
		||||
var DISABLE_USER_LIST_KEY = 'disable-user-list';
 | 
			
		||||
 | 
			
		||||
// Give user 48ms to read each character of a PAM message
 | 
			
		||||
var USER_READ_TIME = 48
 | 
			
		||||
var USER_READ_TIME = 48;
 | 
			
		||||
 | 
			
		||||
var MessageType = {
 | 
			
		||||
    NONE: 0,
 | 
			
		||||
@@ -342,7 +342,7 @@ var ShellUserVerifier = class {
 | 
			
		||||
        try {
 | 
			
		||||
            this._clearUserVerifier();
 | 
			
		||||
            this._userVerifier = client.open_reauthentication_channel_finish(result);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                return;
 | 
			
		||||
            if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
 | 
			
		||||
@@ -369,7 +369,7 @@ var ShellUserVerifier = class {
 | 
			
		||||
        try {
 | 
			
		||||
            this._clearUserVerifier();
 | 
			
		||||
            this._userVerifier = client.get_user_verifier_finish(result);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                return;
 | 
			
		||||
            this._reportInitError('Failed to obtain user verifier', e);
 | 
			
		||||
@@ -423,36 +423,31 @@ var ShellUserVerifier = class {
 | 
			
		||||
    _startService(serviceName) {
 | 
			
		||||
        this._hold.acquire();
 | 
			
		||||
        if (this._userName) {
 | 
			
		||||
           this._userVerifier.call_begin_verification_for_user(serviceName,
 | 
			
		||||
                                                               this._userName,
 | 
			
		||||
                                                               this._cancellable,
 | 
			
		||||
                                                               (obj, result) => {
 | 
			
		||||
               try {
 | 
			
		||||
                   obj.call_begin_verification_for_user_finish(result);
 | 
			
		||||
               } catch(e) {
 | 
			
		||||
                   if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                       return;
 | 
			
		||||
                   this._reportInitError('Failed to start verification for user', e);
 | 
			
		||||
                   return;
 | 
			
		||||
               }
 | 
			
		||||
            this._userVerifier.call_begin_verification_for_user(serviceName, this._userName, this._cancellable, (obj, result) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    obj.call_begin_verification_for_user_finish(result);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                        return;
 | 
			
		||||
                    this._reportInitError('Failed to start verification for user', e);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
               this._hold.release();
 | 
			
		||||
           });
 | 
			
		||||
                this._hold.release();
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
           this._userVerifier.call_begin_verification(serviceName,
 | 
			
		||||
                                                      this._cancellable,
 | 
			
		||||
                                                      (obj, result) => {
 | 
			
		||||
               try {
 | 
			
		||||
                   obj.call_begin_verification_finish(result);
 | 
			
		||||
               } catch(e) {
 | 
			
		||||
                   if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                       return;
 | 
			
		||||
                   this._reportInitError('Failed to start verification', e);
 | 
			
		||||
                   return;
 | 
			
		||||
               }
 | 
			
		||||
            this._userVerifier.call_begin_verification(serviceName, this._cancellable, (obj, result) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    obj.call_begin_verification_finish(result);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                        return;
 | 
			
		||||
                    this._reportInitError('Failed to start verification', e);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
               this._hold.release();
 | 
			
		||||
           });
 | 
			
		||||
                this._hold.release();
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function getCurrentExtension() {
 | 
			
		||||
    // Search for an occurrence of an extension stack frame
 | 
			
		||||
    // Start at 1 because 0 is the stack frame of this function
 | 
			
		||||
    for (let i = 1; i < stack.length; i++) {
 | 
			
		||||
        if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
 | 
			
		||||
        if (stack[i].includes('/gnome-shell/extensions/')) {
 | 
			
		||||
            extensionStackLine = stack[i];
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
@@ -162,8 +162,6 @@ function isOutOfDate(extension) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createExtensionObject(uuid, dir, type) {
 | 
			
		||||
    let info;
 | 
			
		||||
 | 
			
		||||
    let metadataFile = dir.get_child('metadata.json');
 | 
			
		||||
    if (!metadataFile.query_exists(null)) {
 | 
			
		||||
        throw new Error('Missing metadata.json');
 | 
			
		||||
@@ -175,25 +173,25 @@ function createExtensionObject(uuid, dir, type) {
 | 
			
		||||
        if (metadataContents instanceof Uint8Array)
 | 
			
		||||
            metadataContents = imports.byteArray.toString(metadataContents);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        throw new Error('Failed to load metadata.json: ' + e);
 | 
			
		||||
        throw new Error(`Failed to load metadata.json: ${e}`);
 | 
			
		||||
    }
 | 
			
		||||
    let meta;
 | 
			
		||||
    try {
 | 
			
		||||
        meta = JSON.parse(metadataContents);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        throw new Error('Failed to parse metadata.json: ' + e);
 | 
			
		||||
        throw new Error(`Failed to parse metadata.json: ${e}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
 | 
			
		||||
    for (let i = 0; i < requiredProperties.length; i++) {
 | 
			
		||||
        let prop = requiredProperties[i];
 | 
			
		||||
        if (!meta[prop]) {
 | 
			
		||||
            throw new Error('missing "' + prop + '" property in metadata.json');
 | 
			
		||||
            throw new Error(`missing "${prop}" property in metadata.json`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (uuid != meta.uuid) {
 | 
			
		||||
        throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
 | 
			
		||||
        throw new Error(`uuid "${meta.uuid}" from metadata.json does not match directory name "${uuid}"`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let extension = {};
 | 
			
		||||
@@ -237,7 +235,7 @@ var ExtensionFinder = class {
 | 
			
		||||
                                                       : ExtensionType.SYSTEM;
 | 
			
		||||
        try {
 | 
			
		||||
            extension = createExtensionObject(uuid, extensionDir, type);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logError(e, 'Could not load extension %s'.format(uuid));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function recursivelyDeleteDir(dir, deleteParent) {
 | 
			
		||||
    let children = dir.enumerate_children('standard::name,standard::type',
 | 
			
		||||
                                          Gio.FileQueryInfoFlags.NONE, null);
 | 
			
		||||
 | 
			
		||||
    let info, child;
 | 
			
		||||
    let info;
 | 
			
		||||
    while ((info = children.next_file(null)) != null) {
 | 
			
		||||
        let type = info.get_file_type();
 | 
			
		||||
        let child = dir.get_child(info.get_name());
 | 
			
		||||
@@ -57,7 +57,7 @@ function recursivelyMoveDir(srcDir, destDir) {
 | 
			
		||||
    if (!destDir.query_exists(null))
 | 
			
		||||
        destDir.make_directory_with_parents(null);
 | 
			
		||||
 | 
			
		||||
    let info, child;
 | 
			
		||||
    let info;
 | 
			
		||||
    while ((info = children.next_file(null)) != null) {
 | 
			
		||||
        let type = info.get_file_type();
 | 
			
		||||
        let srcChild = srcDir.get_child(info.get_name());
 | 
			
		||||
@@ -86,11 +86,11 @@ function loadInterfaceXML(iface) {
 | 
			
		||||
    try {
 | 
			
		||||
        let [ok, bytes] = f.load_contents(null);
 | 
			
		||||
        if (bytes instanceof Uint8Array)
 | 
			
		||||
            xml = imports.byteArray.toString(bytes)
 | 
			
		||||
            xml = imports.byteArray.toString(bytes);
 | 
			
		||||
        else
 | 
			
		||||
            xml = bytes.toString();
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        log('Failed to load D-Bus interface ' + iface);
 | 
			
		||||
        log(`Failed to load D-Bus interface ${iface}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return xml;
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ var HistoryManager = class {
 | 
			
		||||
        this._historyIndex = 0;
 | 
			
		||||
        if (this._key) {
 | 
			
		||||
            this._history = global.settings.get_strv(this._key);
 | 
			
		||||
            global.settings.connect('changed::' + this._key,
 | 
			
		||||
            global.settings.connect(`changed::${this._key}`,
 | 
			
		||||
                                    this._historyChanged.bind(this));
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -66,7 +66,7 @@ var HistoryManager = class {
 | 
			
		||||
            this._indexChanged();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this._historyIndex ? this._history[this._historyIndex -1] : null;
 | 
			
		||||
        return this._historyIndex ? this._history[this._historyIndex - 1] : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addItem(input) {
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ var IBusManager = class {
 | 
			
		||||
        this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
 | 
			
		||||
 | 
			
		||||
        this._panelService = null;
 | 
			
		||||
        this._engines = {};
 | 
			
		||||
        this._engines = new Map();
 | 
			
		||||
        this._ready = false;
 | 
			
		||||
        this._registerPropertiesId = 0;
 | 
			
		||||
        this._currentEngineName = null;
 | 
			
		||||
@@ -62,8 +62,8 @@ var IBusManager = class {
 | 
			
		||||
        try {
 | 
			
		||||
            Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
 | 
			
		||||
                               Gio.SubprocessFlags.NONE);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to launch ibus-daemon: ' + e.message);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to launch ibus-daemon: ${e.message}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -73,7 +73,7 @@ var IBusManager = class {
 | 
			
		||||
 | 
			
		||||
        this._panelService = null;
 | 
			
		||||
        this._candidatePopup.setPanelService(null);
 | 
			
		||||
        this._engines = {};
 | 
			
		||||
        this._engines.clear();
 | 
			
		||||
        this._ready = false;
 | 
			
		||||
        this._registerPropertiesId = 0;
 | 
			
		||||
        this._currentEngineName = null;
 | 
			
		||||
@@ -96,7 +96,7 @@ var IBusManager = class {
 | 
			
		||||
        if (enginesList) {
 | 
			
		||||
            for (let i = 0; i < enginesList.length; ++i) {
 | 
			
		||||
                let name = enginesList[i].get_name();
 | 
			
		||||
                this._engines[name] = enginesList[i];
 | 
			
		||||
                this._engines.set(name, enginesList[i]);
 | 
			
		||||
            }
 | 
			
		||||
            this._updateReadiness();
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -119,7 +119,7 @@ var IBusManager = class {
 | 
			
		||||
                if (!GLib.str_has_suffix(path, '/InputContext_1'))
 | 
			
		||||
                    this.emit ('focus-in');
 | 
			
		||||
            });
 | 
			
		||||
            this._panelService.connect('focus-out', () => { this.emit('focus-out'); });
 | 
			
		||||
            this._panelService.connect('focus-out', () => this.emit('focus-out'));
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                // IBus versions older than 1.5.10 have a bug which
 | 
			
		||||
@@ -138,7 +138,7 @@ var IBusManager = class {
 | 
			
		||||
                    engine = this._ibus.get_global_engine_async_finish(result);
 | 
			
		||||
                    if (!engine)
 | 
			
		||||
                        return;
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                this._engineChanged(this._ibus, engine.get_name());
 | 
			
		||||
@@ -150,8 +150,7 @@ var IBusManager = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateReadiness() {
 | 
			
		||||
        this._ready = (Object.keys(this._engines).length > 0 &&
 | 
			
		||||
                       this._panelService != null);
 | 
			
		||||
        this._ready = this._engines.size > 0 && this._panelService != null;
 | 
			
		||||
        this.emit('ready', this._ready);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -189,10 +188,10 @@ var IBusManager = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getEngineDesc(id) {
 | 
			
		||||
        if (!this._ready || !this._engines.hasOwnProperty(id))
 | 
			
		||||
        if (!this._ready || !this._engines.has(id))
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
        return this._engines[id];
 | 
			
		||||
        return this._engines.get(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setEngine(id, callback) {
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ class InputMethod extends Clutter.InputMethod {
 | 
			
		||||
        this._context = null;
 | 
			
		||||
        this._hints = 0;
 | 
			
		||||
        this._purpose = 0;
 | 
			
		||||
        this._preeditStr = ''
 | 
			
		||||
        this._preeditStr = '';
 | 
			
		||||
        this._preeditPos = 0;
 | 
			
		||||
        this._preeditVisible = false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -262,7 +262,7 @@ class InputMethod extends Clutter.InputMethod {
 | 
			
		||||
                                                      let retval = context.process_key_event_async_finish(res);
 | 
			
		||||
                                                      this.notify_key_event(event, retval);
 | 
			
		||||
                                                  } catch (e) {
 | 
			
		||||
                                                      log('Error processing key on IM: ' + e.message);
 | 
			
		||||
                                                      log(`Error processing key on IM: ${e.message}`);
 | 
			
		||||
                                                  }
 | 
			
		||||
                                              });
 | 
			
		||||
        return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,11 +46,11 @@ var IntrospectService = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _isIntrospectEnabled() {
 | 
			
		||||
       return this._settings.get_boolean(INTROSPECT_KEY);
 | 
			
		||||
        return this._settings.get_boolean(INTROSPECT_KEY);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _isSenderWhitelisted(sender) {
 | 
			
		||||
       return APP_WHITELIST.includes(sender);
 | 
			
		||||
        return APP_WHITELIST.includes(sender);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getSandboxedAppId(app) {
 | 
			
		||||
 
 | 
			
		||||
@@ -51,14 +51,14 @@ function getCompletions(text, commandHeader, globalCompletionList) {
 | 
			
		||||
// if we encounter anything that isn't a letter, '.', ')', or ']',
 | 
			
		||||
// we should stop parsing.
 | 
			
		||||
function isStopChar(c) {
 | 
			
		||||
    return !c.match(/[\w\.\)\]]/);
 | 
			
		||||
    return !c.match(/[\w.)\]]/);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Given the ending position of a quoted string, find where it starts
 | 
			
		||||
function findMatchingQuote(expr, offset) {
 | 
			
		||||
    let quoteChar = expr.charAt(offset);
 | 
			
		||||
    for (let i = offset - 1; i >= 0; --i) {
 | 
			
		||||
        if (expr.charAt(i) == quoteChar && expr.charAt(i-1) != '\\'){
 | 
			
		||||
        if (expr.charAt(i) == quoteChar && expr.charAt(i - 1) != '\\') {
 | 
			
		||||
            return i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -68,7 +68,7 @@ function findMatchingQuote(expr, offset) {
 | 
			
		||||
// Given the ending position of a regex, find where it starts
 | 
			
		||||
function findMatchingSlash(expr, offset) {
 | 
			
		||||
    for (let i = offset - 1; i >= 0; --i) {
 | 
			
		||||
        if (expr.charAt(i) == '/' && expr.charAt(i-1) != '\\'){
 | 
			
		||||
        if (expr.charAt(i) == '/' && expr.charAt(i - 1) != '\\') {
 | 
			
		||||
            return i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -81,7 +81,7 @@ function findMatchingSlash(expr, offset) {
 | 
			
		||||
// findMatchingBrace("[(])", 3) returns 1.
 | 
			
		||||
function findMatchingBrace(expr, offset) {
 | 
			
		||||
    let closeBrace = expr.charAt(offset);
 | 
			
		||||
    let openBrace = ({')': '(', ']': '['})[closeBrace];
 | 
			
		||||
    let openBrace = ({ ')': '(', ']': '[' })[closeBrace];
 | 
			
		||||
 | 
			
		||||
    function findTheBrace(expr, offset) {
 | 
			
		||||
        if (offset < 0) {
 | 
			
		||||
@@ -117,11 +117,11 @@ function getExpressionOffset(expr, offset) {
 | 
			
		||||
    while (offset >= 0) {
 | 
			
		||||
        let currChar = expr.charAt(offset);
 | 
			
		||||
 | 
			
		||||
        if (isStopChar(currChar)){
 | 
			
		||||
        if (isStopChar(currChar)) {
 | 
			
		||||
            return offset + 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (currChar.match(/[\)\]]/)) {
 | 
			
		||||
        if (currChar.match(/[)\]]/)) {
 | 
			
		||||
            offset = findMatchingBrace(expr, offset);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -159,7 +159,7 @@ function getPropertyNamesFromExpression(expr, commandHeader) {
 | 
			
		||||
    let obj = {};
 | 
			
		||||
    if (!isUnsafeExpression(expr)) {
 | 
			
		||||
        try {
 | 
			
		||||
                obj = eval(commandHeader + expr);
 | 
			
		||||
            obj = eval(commandHeader + expr);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            return [];
 | 
			
		||||
        }
 | 
			
		||||
@@ -168,7 +168,7 @@ function getPropertyNamesFromExpression(expr, commandHeader) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let propsUnique = {};
 | 
			
		||||
    if (typeof obj === 'object'){
 | 
			
		||||
    if (typeof obj === 'object') {
 | 
			
		||||
        let allProps = getAllProps(obj);
 | 
			
		||||
        // Get only things we are allowed to complete following a '.'
 | 
			
		||||
        allProps = allProps.filter( isValidPropertyName );
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ var KeyboardManager = class {
 | 
			
		||||
            this._currentKeymap.options == options)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._currentKeymap = {layouts, variants, options};
 | 
			
		||||
        this._currentKeymap = { layouts, variants, options };
 | 
			
		||||
        Meta.get_backend().set_keymap(layouts, variants, options);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -125,7 +125,7 @@ var KeyboardManager = class {
 | 
			
		||||
 | 
			
		||||
    _getLocaleLayout() {
 | 
			
		||||
        let locale = GLib.get_language_names()[0];
 | 
			
		||||
        if (locale.indexOf('_') == -1)
 | 
			
		||||
        if (!locale.includes('_'))
 | 
			
		||||
            locale = DEFAULT_LOCALE;
 | 
			
		||||
 | 
			
		||||
        let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ function canLock() {
 | 
			
		||||
 | 
			
		||||
        let version = result.deep_unpack()[0].deep_unpack();
 | 
			
		||||
        return haveSystemd() && versionCompare('3.5.91', version);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -185,7 +185,7 @@ var LoginManagerSystemd = class {
 | 
			
		||||
                    let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result);
 | 
			
		||||
                    fd = fdList.steal_fds()[0];
 | 
			
		||||
                    callback(new Gio.UnixInputStream({ fd: fd }));
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    logError(e, "Error getting systemd inhibitor");
 | 
			
		||||
                    callback(null);
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,33 +26,33 @@ function _getMobileProvidersDatabase() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// _findProviderForMccMnc:
 | 
			
		||||
// @operator_name: operator name
 | 
			
		||||
// @operator_code: operator code
 | 
			
		||||
// @operatorName: operator name
 | 
			
		||||
// @operatorCode: operator code
 | 
			
		||||
//
 | 
			
		||||
// Given an operator name string (which may not be a real operator name) and an
 | 
			
		||||
// operator code string, tries to find a proper operator name to display.
 | 
			
		||||
//
 | 
			
		||||
function _findProviderForMccMnc(operator_name, operator_code) {
 | 
			
		||||
    if (operator_name) {
 | 
			
		||||
        if (operator_name.length != 0 &&
 | 
			
		||||
            (operator_name.length > 6 || operator_name.length < 5)) {
 | 
			
		||||
function _findProviderForMccMnc(operatorName, operatorCode) {
 | 
			
		||||
    if (operatorName) {
 | 
			
		||||
        if (operatorName.length != 0 &&
 | 
			
		||||
            (operatorName.length > 6 || operatorName.length < 5)) {
 | 
			
		||||
            // this looks like a valid name, i.e. not an MCCMNC (that some
 | 
			
		||||
            // devices return when not yet connected
 | 
			
		||||
            return operator_name;
 | 
			
		||||
            return operatorName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (isNaN(parseInt(operator_name))) {
 | 
			
		||||
        if (isNaN(parseInt(operatorName))) {
 | 
			
		||||
            // name is definitely not a MCCMNC, so it may be a name
 | 
			
		||||
            // after all; return that
 | 
			
		||||
            return operator_name;
 | 
			
		||||
            return operatorName;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let needle;
 | 
			
		||||
    if ((!operator_name || operator_name.length == 0) && operator_code)
 | 
			
		||||
        needle = operator_code;
 | 
			
		||||
    else if (operator_name && (operator_name.length == 6 || operator_name.length == 5))
 | 
			
		||||
        needle = operator_name;
 | 
			
		||||
    if ((!operatorName || operatorName.length == 0) && operatorCode)
 | 
			
		||||
        needle = operatorCode;
 | 
			
		||||
    else if (operatorName && (operatorName.length == 6 || operatorName.length == 5))
 | 
			
		||||
        needle = operatorName;
 | 
			
		||||
    else // nothing to search
 | 
			
		||||
        return null;
 | 
			
		||||
 | 
			
		||||
@@ -173,7 +173,7 @@ var ModemCdma = class {
 | 
			
		||||
            } else {
 | 
			
		||||
                let [bandClass, band, sid] = result;
 | 
			
		||||
 | 
			
		||||
                this.operator_name = _findProviderForSid(sid)
 | 
			
		||||
                this.operator_name = _findProviderForSid(sid);
 | 
			
		||||
            }
 | 
			
		||||
            this.emit('notify::operator-name');
 | 
			
		||||
        });
 | 
			
		||||
@@ -230,17 +230,17 @@ var BroadbandModem = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _reloadOperatorName() {
 | 
			
		||||
        let new_name = "";
 | 
			
		||||
        let newName = "";
 | 
			
		||||
        if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
 | 
			
		||||
            new_name += this.operator_name_3gpp;
 | 
			
		||||
            newName += this.operator_name_3gpp;
 | 
			
		||||
 | 
			
		||||
        if (this.operator_name_cdma && this.operator_name_cdma.length > 0) {
 | 
			
		||||
            if (new_name != "")
 | 
			
		||||
                new_name += ", ";
 | 
			
		||||
            new_name += this.operator_name_cdma;
 | 
			
		||||
            if (newName != "")
 | 
			
		||||
                newName += ", ";
 | 
			
		||||
            newName += this.operator_name_cdma;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.operator_name = new_name;
 | 
			
		||||
        this.operator_name = newName;
 | 
			
		||||
        this.emit('notify::operator-name');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,54 +77,51 @@ var ObjectManager = class {
 | 
			
		||||
        let info = this._interfaceInfos[interfaceName];
 | 
			
		||||
 | 
			
		||||
        if (!info) {
 | 
			
		||||
           if (onFinished)
 | 
			
		||||
               onFinished();
 | 
			
		||||
           return;
 | 
			
		||||
            if (onFinished)
 | 
			
		||||
                onFinished();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let proxy = new Gio.DBusProxy({ g_connection: this._connection,
 | 
			
		||||
                                       g_name: this._serviceName,
 | 
			
		||||
                                       g_object_path: objectPath,
 | 
			
		||||
                                       g_interface_name: interfaceName,
 | 
			
		||||
                                       g_interface_info: info,
 | 
			
		||||
                                       g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 | 
			
		||||
                                        g_name: this._serviceName,
 | 
			
		||||
                                        g_object_path: objectPath,
 | 
			
		||||
                                        g_interface_name: interfaceName,
 | 
			
		||||
                                        g_interface_info: info,
 | 
			
		||||
                                        g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 | 
			
		||||
 | 
			
		||||
        proxy.init_async(GLib.PRIORITY_DEFAULT,
 | 
			
		||||
                         this._cancellable,
 | 
			
		||||
                         (initable, result) => {
 | 
			
		||||
               let error = null;
 | 
			
		||||
               try {
 | 
			
		||||
                   initable.init_finish(result);
 | 
			
		||||
               } catch(e) {
 | 
			
		||||
                   logError(e, 'could not initialize proxy for interface ' + interfaceName);
 | 
			
		||||
        proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable, (initable, result) => {
 | 
			
		||||
            try {
 | 
			
		||||
                initable.init_finish(result);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                logError(e, `could not initialize proxy for interface ${interfaceName}`);
 | 
			
		||||
 | 
			
		||||
                   if (onFinished)
 | 
			
		||||
                       onFinished();
 | 
			
		||||
                   return;
 | 
			
		||||
               }
 | 
			
		||||
                if (onFinished)
 | 
			
		||||
                    onFinished();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
               let isNewObject;
 | 
			
		||||
               if (!this._objects[objectPath]) {
 | 
			
		||||
                   this._objects[objectPath] = {};
 | 
			
		||||
                   isNewObject = true;
 | 
			
		||||
               } else {
 | 
			
		||||
                   isNewObject = false;
 | 
			
		||||
               }
 | 
			
		||||
            let isNewObject;
 | 
			
		||||
            if (!this._objects[objectPath]) {
 | 
			
		||||
                this._objects[objectPath] = {};
 | 
			
		||||
                isNewObject = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                isNewObject = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
               this._objects[objectPath][interfaceName] = proxy;
 | 
			
		||||
            this._objects[objectPath][interfaceName] = proxy;
 | 
			
		||||
 | 
			
		||||
               if (!this._interfaces[interfaceName])
 | 
			
		||||
                   this._interfaces[interfaceName] = [];
 | 
			
		||||
            if (!this._interfaces[interfaceName])
 | 
			
		||||
                this._interfaces[interfaceName] = [];
 | 
			
		||||
 | 
			
		||||
               this._interfaces[interfaceName].push(proxy);
 | 
			
		||||
            this._interfaces[interfaceName].push(proxy);
 | 
			
		||||
 | 
			
		||||
               if (isNewObject)
 | 
			
		||||
                   this.emit('object-added', objectPath);
 | 
			
		||||
            if (isNewObject)
 | 
			
		||||
                this.emit('object-added', objectPath);
 | 
			
		||||
 | 
			
		||||
               this.emit('interface-added', interfaceName, proxy);
 | 
			
		||||
            this.emit('interface-added', interfaceName, proxy);
 | 
			
		||||
 | 
			
		||||
               if (onFinished)
 | 
			
		||||
                   onFinished();
 | 
			
		||||
            if (onFinished)
 | 
			
		||||
                onFinished();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -155,11 +152,10 @@ var ObjectManager = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onManagerProxyLoaded(initable, result) {
 | 
			
		||||
        let error = null;
 | 
			
		||||
        try {
 | 
			
		||||
            initable.init_finish(result);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logError(e, 'could not initialize object manager for object ' + this._serviceName);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logError(e, `could not initialize object manager for object ${this._serviceName}`);
 | 
			
		||||
 | 
			
		||||
            this._tryToCompleteLoad();
 | 
			
		||||
            return;
 | 
			
		||||
@@ -197,7 +193,7 @@ var ObjectManager = class {
 | 
			
		||||
        this._managerProxy.GetManagedObjectsRemote((result, error) => {
 | 
			
		||||
            if (!result) {
 | 
			
		||||
                if (error) {
 | 
			
		||||
                   logError(error, 'could not get remote objects for service ' + this._serviceName + ' path ' + this._managerPath);
 | 
			
		||||
                    logError(error, `could not get remote objects for service ${this._serviceName} path ${this._managerPath}`);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this._tryToCompleteLoad();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
 | 
			
		||||
// parse:
 | 
			
		||||
// @params: caller-provided parameter object, or %null
 | 
			
		||||
// @defaults-provided defaults object
 | 
			
		||||
@@ -14,22 +16,14 @@
 | 
			
		||||
//
 | 
			
		||||
// Return value: a new object, containing the merged parameters from
 | 
			
		||||
// @params and @defaults
 | 
			
		||||
function parse(params, defaults, allowExtras) {
 | 
			
		||||
    let ret = {}, prop;
 | 
			
		||||
 | 
			
		||||
    if (!params)
 | 
			
		||||
        params = {};
 | 
			
		||||
 | 
			
		||||
    for (prop in params) {
 | 
			
		||||
        if (!(prop in defaults) && !allowExtras)
 | 
			
		||||
            throw new Error('Unrecognized parameter "' + prop + '"');
 | 
			
		||||
        ret[prop] = params[prop];
 | 
			
		||||
function parse(params = {}, defaults, allowExtras) {
 | 
			
		||||
    if (!allowExtras) {
 | 
			
		||||
        for (let prop in params)
 | 
			
		||||
            if (!(prop in defaults))
 | 
			
		||||
                throw new Error(`Unrecognized parameter "${prop}"`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (prop in defaults) {
 | 
			
		||||
        if (!(prop in params))
 | 
			
		||||
            ret[prop] = defaults[prop];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
    let defaultsCopy = {};
 | 
			
		||||
    Lang.copyProperties(defaults, defaultsCopy);
 | 
			
		||||
    return Object.assign(defaultsCopy, params);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,4 +12,4 @@ function PermissionStore(initCallback, cancellable) {
 | 
			
		||||
                                    'org.freedesktop.impl.portal.PermissionStore',
 | 
			
		||||
                                    '/org/freedesktop/impl/portal/PermissionStore',
 | 
			
		||||
                                    initCallback, cancellable);
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ var SmartcardManager = class {
 | 
			
		||||
        this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
 | 
			
		||||
                                                                name: "org.gnome.SettingsDaemon.Smartcard",
 | 
			
		||||
                                                                objectPath: '/org/gnome/SettingsDaemon/Smartcard',
 | 
			
		||||
                                                                knownInterfaces: [ SmartcardTokenIface ],
 | 
			
		||||
                                                                knownInterfaces: [SmartcardTokenIface],
 | 
			
		||||
                                                                onLoaded: this._onLoaded.bind(this) });
 | 
			
		||||
        this._insertedTokens = {};
 | 
			
		||||
        this._loginToken = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -83,48 +83,54 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
        this._canHaveSuspend = true;
 | 
			
		||||
 | 
			
		||||
        this._actions = new Map();
 | 
			
		||||
        this._actions.set(POWER_OFF_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the power-off action in search
 | 
			
		||||
                            name: C_("search-result", "Power Off"),
 | 
			
		||||
                            iconName: 'system-shutdown-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the power-off action, separated by semicolons
 | 
			
		||||
                            keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOCK_SCREEN_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the lock screen action in search
 | 
			
		||||
                            name: C_("search-result", "Lock Screen"),
 | 
			
		||||
                            iconName: 'system-lock-screen-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the lock screen action, separated by semicolons
 | 
			
		||||
                            keywords: _("lock screen").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOGOUT_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the logout action in search
 | 
			
		||||
                            name: C_("search-result", "Log Out"),
 | 
			
		||||
                            iconName: 'application-exit-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the logout action, separated by semicolons
 | 
			
		||||
                            keywords: _("logout;log out;sign off").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(SUSPEND_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the suspend action in search
 | 
			
		||||
                            name: C_("search-result", "Suspend"),
 | 
			
		||||
                            iconName: 'media-playback-pause-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
                            keywords: _("suspend;sleep").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(SWITCH_USER_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the switch user action in search
 | 
			
		||||
                            name: C_("search-result", "Switch User"),
 | 
			
		||||
                            iconName: 'system-switch-user-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the switch user action, separated by semicolons
 | 
			
		||||
                            keywords: _("switch user").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOCK_ORIENTATION_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the lock orientation action in search
 | 
			
		||||
                            name: C_("search-result", "Lock Orientation"),
 | 
			
		||||
                            iconName: '',
 | 
			
		||||
                            // Translators: A list of keywords that match the lock orientation action, separated by semicolons
 | 
			
		||||
                            keywords: _("lock orientation;screen;rotation").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(POWER_OFF_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the power-off action in search
 | 
			
		||||
            name: C_("search-result", "Power Off"),
 | 
			
		||||
            iconName: 'system-shutdown-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the power-off action, separated by semicolons
 | 
			
		||||
            keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(LOCK_SCREEN_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the lock screen action in search
 | 
			
		||||
            name: C_("search-result", "Lock Screen"),
 | 
			
		||||
            iconName: 'system-lock-screen-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the lock screen action, separated by semicolons
 | 
			
		||||
            keywords: _("lock screen").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(LOGOUT_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the logout action in search
 | 
			
		||||
            name: C_("search-result", "Log Out"),
 | 
			
		||||
            iconName: 'application-exit-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the logout action, separated by semicolons
 | 
			
		||||
            keywords: _("logout;log out;sign off").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(SUSPEND_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the suspend action in search
 | 
			
		||||
            name: C_("search-result", "Suspend"),
 | 
			
		||||
            iconName: 'media-playback-pause-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
            keywords: _("suspend;sleep").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(SWITCH_USER_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the switch user action in search
 | 
			
		||||
            name: C_("search-result", "Switch User"),
 | 
			
		||||
            iconName: 'system-switch-user-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the switch user action, separated by semicolons
 | 
			
		||||
            keywords: _("switch user").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the lock orientation action in search
 | 
			
		||||
            name: C_("search-result", "Lock Orientation"),
 | 
			
		||||
            iconName: '',
 | 
			
		||||
            // Translators: A list of keywords that match the lock orientation action, separated by semicolons
 | 
			
		||||
            keywords: _("lock orientation;screen;rotation").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
 | 
			
		||||
        this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
 | 
			
		||||
@@ -137,37 +143,39 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default();
 | 
			
		||||
 | 
			
		||||
        this._userManager.connect('notify::is-loaded',
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
        this._userManager.connect('notify::has-multiple-users',
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
        this._userManager.connect('user-added',
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
        this._userManager.connect('user-removed',
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
 | 
			
		||||
                                       () => { this._updateSwitchUser(); });
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
 | 
			
		||||
                                       () => { this._updateLogout(); });
 | 
			
		||||
        global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
 | 
			
		||||
                                () => { this._updateLogout(); });
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_USER_SWITCH_KEY}`,
 | 
			
		||||
                                       () => this._updateSwitchUser());
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
 | 
			
		||||
                                       () => this._updateLogout());
 | 
			
		||||
        global.settings.connect(`changed::${ALWAYS_SHOW_LOG_OUT_KEY}`,
 | 
			
		||||
                                () => this._updateLogout());
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
 | 
			
		||||
                                       () => { this._updateLockScreen(); });
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_LOCK_SCREEN_KEY}`,
 | 
			
		||||
                                       () => this._updateLockScreen());
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
 | 
			
		||||
                                       () => { this._updateHaveShutdown(); });
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
 | 
			
		||||
                                       () => this._updateHaveShutdown());
 | 
			
		||||
 | 
			
		||||
        this.forceUpdate();
 | 
			
		||||
 | 
			
		||||
        this._orientationSettings.connect('changed::orientation-lock',
 | 
			
		||||
                                          () => { this._updateOrientationLock();
 | 
			
		||||
                                                  this._updateOrientationLockIcon(); });
 | 
			
		||||
                                          () => {
 | 
			
		||||
                                              this._updateOrientationLock();
 | 
			
		||||
                                              this._updateOrientationLockIcon();
 | 
			
		||||
                                          });
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                   () => { this._updateOrientationLock(); });
 | 
			
		||||
                                   () => this._updateOrientationLock());
 | 
			
		||||
        Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
 | 
			
		||||
                                   Gio.BusNameWatcherFlags.NONE,
 | 
			
		||||
                                   () => { this._sensorProxyAppeared(); },
 | 
			
		||||
                                   () => this._sensorProxyAppeared(),
 | 
			
		||||
                                   () => {
 | 
			
		||||
                                       this._sensorProxy = null;
 | 
			
		||||
                                       this._updateOrientationLock();
 | 
			
		||||
@@ -175,7 +183,7 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
        this._updateOrientationLock();
 | 
			
		||||
        this._updateOrientationLockIcon();
 | 
			
		||||
 | 
			
		||||
        Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
 | 
			
		||||
        Main.sessionMode.connect('updated', () => this._sessionUpdated());
 | 
			
		||||
        this._sessionUpdated();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -215,7 +223,7 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                this._sensorProxy.connect('g-properties-changed',
 | 
			
		||||
                                          () => { this._updateOrientationLock(); });
 | 
			
		||||
                                          () => this._updateOrientationLock());
 | 
			
		||||
                this._updateOrientationLock();
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
@@ -257,11 +265,11 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    getMatchingActions(terms) {
 | 
			
		||||
        // terms is a list of strings
 | 
			
		||||
        terms = terms.map((term) => { return term.toLowerCase(); });
 | 
			
		||||
        terms = terms.map((term) => term.toLowerCase());
 | 
			
		||||
 | 
			
		||||
        let results = [];
 | 
			
		||||
 | 
			
		||||
        for (let [key, {available, keywords}] of this._actions)
 | 
			
		||||
        for (let [key, { available, keywords }] of this._actions)
 | 
			
		||||
            if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
 | 
			
		||||
                results.push(key);
 | 
			
		||||
 | 
			
		||||
@@ -278,24 +286,24 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    activateAction(id) {
 | 
			
		||||
        switch (id) {
 | 
			
		||||
            case POWER_OFF_ACTION_ID:
 | 
			
		||||
                this.activatePowerOff();
 | 
			
		||||
                break;
 | 
			
		||||
            case LOCK_SCREEN_ACTION_ID:
 | 
			
		||||
                this.activateLockScreen();
 | 
			
		||||
                break;
 | 
			
		||||
            case LOGOUT_ACTION_ID:
 | 
			
		||||
                this.activateLogout();
 | 
			
		||||
                break;
 | 
			
		||||
            case SUSPEND_ACTION_ID:
 | 
			
		||||
                this.activateSuspend();
 | 
			
		||||
                break;
 | 
			
		||||
            case SWITCH_USER_ACTION_ID:
 | 
			
		||||
                this.activateSwitchUser();
 | 
			
		||||
                break;
 | 
			
		||||
            case LOCK_ORIENTATION_ACTION_ID:
 | 
			
		||||
                this.activateLockOrientation();
 | 
			
		||||
                break;
 | 
			
		||||
        case POWER_OFF_ACTION_ID:
 | 
			
		||||
            this.activatePowerOff();
 | 
			
		||||
            break;
 | 
			
		||||
        case LOCK_SCREEN_ACTION_ID:
 | 
			
		||||
            this.activateLockScreen();
 | 
			
		||||
            break;
 | 
			
		||||
        case LOGOUT_ACTION_ID:
 | 
			
		||||
            this.activateLogout();
 | 
			
		||||
            break;
 | 
			
		||||
        case SUSPEND_ACTION_ID:
 | 
			
		||||
            this.activateSuspend();
 | 
			
		||||
            break;
 | 
			
		||||
        case SWITCH_USER_ACTION_ID:
 | 
			
		||||
            this.activateSwitchUser();
 | 
			
		||||
            break;
 | 
			
		||||
        case LOCK_ORIENTATION_ACTION_ID:
 | 
			
		||||
            this.activateLockOrientation();
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
 | 
			
		||||
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
 | 
			
		||||
 | 
			
		||||
const _urlRegexp = new RegExp(
 | 
			
		||||
    '(^|' + _leadingJunk + ')' +
 | 
			
		||||
    `(^|${_leadingJunk})` +
 | 
			
		||||
    '(' +
 | 
			
		||||
        '(?:' +
 | 
			
		||||
            '(?:http|https|ftp)://' +             // scheme://
 | 
			
		||||
@@ -29,12 +29,12 @@ const _urlRegexp = new RegExp(
 | 
			
		||||
        '(?:' +                                   // one or more:
 | 
			
		||||
            '[^\\s()<>]+' +                       // run of non-space non-()
 | 
			
		||||
            '|' +                                 // or
 | 
			
		||||
            _balancedParens +                     // balanced parens
 | 
			
		||||
            `${_balancedParens}` +                // balanced parens
 | 
			
		||||
        ')+' +
 | 
			
		||||
        '(?:' +                                   // end with:
 | 
			
		||||
            _balancedParens +                     // balanced parens
 | 
			
		||||
            `${_balancedParens}` +                // balanced parens
 | 
			
		||||
            '|' +                                 // or
 | 
			
		||||
            _notTrailingJunk +                    // last non-junk char
 | 
			
		||||
            `${_notTrailingJunk}` +               // last non-junk char
 | 
			
		||||
        ')' +
 | 
			
		||||
    ')', 'gi');
 | 
			
		||||
 | 
			
		||||
@@ -69,16 +69,16 @@ function spawn(argv) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// spawnCommandLine:
 | 
			
		||||
// @command_line: a command line
 | 
			
		||||
// @commandLine: a command line
 | 
			
		||||
//
 | 
			
		||||
// Runs @command_line in the background, handling any errors that
 | 
			
		||||
// Runs @commandLine in the background, handling any errors that
 | 
			
		||||
// occur when trying to parse or start the program.
 | 
			
		||||
function spawnCommandLine(command_line) {
 | 
			
		||||
function spawnCommandLine(commandLine) {
 | 
			
		||||
    try {
 | 
			
		||||
        let [success, argv] = GLib.shell_parse_argv(command_line);
 | 
			
		||||
        let [success, argv] = GLib.shell_parse_argv(commandLine);
 | 
			
		||||
        trySpawn(argv);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        _handleSpawnError(command_line, err);
 | 
			
		||||
        _handleSpawnError(commandLine, err);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -93,7 +93,7 @@ function spawnApp(argv) {
 | 
			
		||||
 | 
			
		||||
        let context = global.create_app_launch_context(0, -1);
 | 
			
		||||
        app.launch([], context);
 | 
			
		||||
    } catch(err) {
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        _handleSpawnError(argv[0], err);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -103,8 +103,7 @@ function spawnApp(argv) {
 | 
			
		||||
//
 | 
			
		||||
// Runs @argv in the background. If launching @argv fails,
 | 
			
		||||
// this will throw an error.
 | 
			
		||||
function trySpawn(argv)
 | 
			
		||||
{
 | 
			
		||||
function trySpawn(argv) {
 | 
			
		||||
    var success, pid;
 | 
			
		||||
    try {
 | 
			
		||||
        [success, pid] = GLib.spawn_async(null, argv, null,
 | 
			
		||||
@@ -135,19 +134,19 @@ function trySpawn(argv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// trySpawnCommandLine:
 | 
			
		||||
// @command_line: a command line
 | 
			
		||||
// @commandLine: a command line
 | 
			
		||||
//
 | 
			
		||||
// Runs @command_line in the background. If launching @command_line
 | 
			
		||||
// Runs @commandLine in the background. If launching @commandLine
 | 
			
		||||
// fails, this will throw an error.
 | 
			
		||||
function trySpawnCommandLine(command_line) {
 | 
			
		||||
function trySpawnCommandLine(commandLine) {
 | 
			
		||||
    let success, argv;
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        [success, argv] = GLib.shell_parse_argv(command_line);
 | 
			
		||||
        [success, argv] = GLib.shell_parse_argv(commandLine);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        // Replace "Error invoking GLib.shell_parse_argv: " with
 | 
			
		||||
        // something nicer
 | 
			
		||||
        err.message = err.message.replace(/[^:]*: /, _("Could not parse command:") + "\n");
 | 
			
		||||
        err.message = err.message.replace(/[^:]*: /, `${_("Could not parse command:")}\n`);
 | 
			
		||||
        throw err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -222,7 +221,7 @@ function formatTime(time, params) {
 | 
			
		||||
            /* Translators: Time in 24h format */
 | 
			
		||||
            format = N_("%H\u2236%M");
 | 
			
		||||
        // Show the word "Yesterday" and time if date is on yesterday
 | 
			
		||||
        else if (daysAgo <2)
 | 
			
		||||
        else if (daysAgo < 2)
 | 
			
		||||
            /* Translators: this is the word "Yesterday" followed by a
 | 
			
		||||
             time string in 24h format. i.e. "Yesterday, 14:30" */
 | 
			
		||||
            // xgettext:no-c-format
 | 
			
		||||
@@ -251,7 +250,7 @@ function formatTime(time, params) {
 | 
			
		||||
            /* Translators: Time in 12h format */
 | 
			
		||||
            format = N_("%l\u2236%M %p");
 | 
			
		||||
        // Show the word "Yesterday" and time if date is on yesterday
 | 
			
		||||
        else if (daysAgo <2)
 | 
			
		||||
        else if (daysAgo < 2)
 | 
			
		||||
            /* Translators: this is the word "Yesterday" followed by a
 | 
			
		||||
             time string in 12h format. i.e. "Yesterday, 2:30 pm" */
 | 
			
		||||
            // xgettext:no-c-format
 | 
			
		||||
@@ -289,7 +288,7 @@ function createTimeLabel(date, params) {
 | 
			
		||||
    let id = _desktopSettings.connect('changed::clock-format', () => {
 | 
			
		||||
        label.text = formatTime(date, params);
 | 
			
		||||
    });
 | 
			
		||||
    label.connect('destroy', () => { _desktopSettings.disconnect(id); });
 | 
			
		||||
    label.connect('destroy', () => _desktopSettings.disconnect(id));
 | 
			
		||||
    return label;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -346,7 +345,7 @@ function insertSorted(array, val, cmp) {
 | 
			
		||||
var CloseButton = GObject.registerClass(
 | 
			
		||||
class CloseButton extends St.Button {
 | 
			
		||||
    _init(boxpointer) {
 | 
			
		||||
        super._init({ style_class: 'notification-close'});
 | 
			
		||||
        super._init({ style_class: 'notification-close' });
 | 
			
		||||
 | 
			
		||||
        // This is a bit tricky. St.Bin has its own x-align/y-align properties
 | 
			
		||||
        // that compete with Clutter's properties. This should be fixed for
 | 
			
		||||
@@ -380,7 +379,7 @@ class CloseButton extends St.Button {
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
 | 
			
		||||
        let offY = this._computeBoxPointerOffset();
 | 
			
		||||
        this.translation_x = themeNode.get_length('-shell-close-overlap-x')
 | 
			
		||||
        this.translation_x = themeNode.get_length('-shell-close-overlap-x');
 | 
			
		||||
        this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -467,7 +466,7 @@ var AppSettingsMonitor = class {
 | 
			
		||||
        if (!this._settings || handler.id > 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        handler.id = this._settings.connect('changed::' + handler.key,
 | 
			
		||||
        handler.id = this._settings.connect(`changed::${handler.key}`,
 | 
			
		||||
                                            handler.callback);
 | 
			
		||||
        handler.callback(this._settings, handler.key);
 | 
			
		||||
    }
 | 
			
		||||
@@ -493,13 +492,13 @@ var AppSettingsMonitor = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setSettings(settings) {
 | 
			
		||||
        this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
 | 
			
		||||
        this._handlers.forEach((handler) => this._disconnectHandler(handler));
 | 
			
		||||
 | 
			
		||||
        let hadSettings = (this._settings != null);
 | 
			
		||||
        this._settings = settings;
 | 
			
		||||
        let haveSettings = (this._settings != null);
 | 
			
		||||
 | 
			
		||||
        this._handlers.forEach((handler) => { this._connectHandler(handler); });
 | 
			
		||||
        this._handlers.forEach((handler) => this._connectHandler(handler));
 | 
			
		||||
 | 
			
		||||
        if (hadSettings != haveSettings)
 | 
			
		||||
            this.emit('available-changed');
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ var WeatherClient = class {
 | 
			
		||||
        this._weatherAuthorized = false;
 | 
			
		||||
        this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
 | 
			
		||||
            if (error) {
 | 
			
		||||
                log('Failed to connect to permissionStore: ' + error.message);
 | 
			
		||||
                log(`Failed to connect to permissionStore: ${error.message}`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -40,7 +40,7 @@ var WeatherClient = class {
 | 
			
		||||
 | 
			
		||||
            this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
 | 
			
		||||
                if (error)
 | 
			
		||||
                    log('Error looking up permission: ' + error.message);
 | 
			
		||||
                    log(`Error looking up permission: ${error.message}`);
 | 
			
		||||
 | 
			
		||||
                let [perms, data] = error ? [{}, null] : res;
 | 
			
		||||
                let  params = ['gnome', 'geolocation', false, data, perms];
 | 
			
		||||
@@ -68,7 +68,7 @@ var WeatherClient = class {
 | 
			
		||||
 | 
			
		||||
        this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.desktop',
 | 
			
		||||
                                                          'org.gnome.Weather');
 | 
			
		||||
        this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); });
 | 
			
		||||
        this._weatherAppMon.connect('available-changed', () => this.emit('changed'));
 | 
			
		||||
        this._weatherAppMon.watchSetting('automatic-location',
 | 
			
		||||
                                         this._onAutomaticLocationChanged.bind(this));
 | 
			
		||||
        this._weatherAppMon.watchSetting('locations',
 | 
			
		||||
@@ -178,8 +178,8 @@ var WeatherClient = class {
 | 
			
		||||
            (o, res) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    this._gclueService = Geoclue.Simple.new_finish(res);
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                    log('Failed to connect to Geoclue2 service: ' + e.message);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    log(`Failed to connect to Geoclue2 service: ${e.message}`);
 | 
			
		||||
                    this._setLocation(this._mostRecentLocation);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ var METRICS = {
 | 
			
		||||
      units: "frames / s" },
 | 
			
		||||
    overviewLatencySubsequent:
 | 
			
		||||
    { description: "Time to first frame after triggering overview, second time",
 | 
			
		||||
      units: "us"},
 | 
			
		||||
      units: "us" },
 | 
			
		||||
    overviewFpsSubsequent:
 | 
			
		||||
    { description: "Frames rate when going to the overview, second time",
 | 
			
		||||
      units: "frames / s" },
 | 
			
		||||
@@ -52,7 +52,7 @@ var METRICS = {
 | 
			
		||||
      units: "us" },
 | 
			
		||||
    applicationsShowTimeSubsequent:
 | 
			
		||||
    { description: "Time to switch to applications view, second time",
 | 
			
		||||
      units: "us"}
 | 
			
		||||
      units: "us" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
let WINDOW_CONFIGS = [
 | 
			
		||||
@@ -136,7 +136,6 @@ let overviewFrames;
 | 
			
		||||
let overviewLatency;
 | 
			
		||||
let mallocUsedSize = 0;
 | 
			
		||||
let overviewShowCount = 0;
 | 
			
		||||
let firstOverviewUsedSize;
 | 
			
		||||
let haveSwapComplete = false;
 | 
			
		||||
let applicationsShowStart;
 | 
			
		||||
let applicationsShowCount = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ var METRICS = {
 | 
			
		||||
    geditStartTime:
 | 
			
		||||
    { description: "Time from gedit launch to window drawn",
 | 
			
		||||
      units: "us" },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function waitAndDraw(milliseconds) {
 | 
			
		||||
    let cb;
 | 
			
		||||
@@ -48,7 +48,7 @@ function waitAndDraw(milliseconds) {
 | 
			
		||||
            cb();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return callback => { cb = callback; };
 | 
			
		||||
    return callback => cb = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function waitSignal(object, signal) {
 | 
			
		||||
@@ -60,7 +60,7 @@ function waitSignal(object, signal) {
 | 
			
		||||
            cb();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return callback => { cb = callback; };
 | 
			
		||||
    return callback => cb = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function extractBootTimestamp() {
 | 
			
		||||
@@ -157,7 +157,7 @@ function *run() {
 | 
			
		||||
    Main.overview.hide();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.createTestWindow({ maximized: true,
 | 
			
		||||
                                       redraws: true});
 | 
			
		||||
                                       redraws: true });
 | 
			
		||||
    yield Scripting.waitTestWindows();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.sleep(1000);
 | 
			
		||||
@@ -269,11 +269,11 @@ function script_collectTimings(time) {
 | 
			
		||||
        if (len == 0)
 | 
			
		||||
            median = -1;
 | 
			
		||||
        else if (len % 2 == 1)
 | 
			
		||||
            median = times[(len - 1)/ 2];
 | 
			
		||||
            median = times[(len - 1) / 2];
 | 
			
		||||
        else
 | 
			
		||||
            median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
 | 
			
		||||
 | 
			
		||||
        METRICS[timing + 'RedrawTime'].value = median;
 | 
			
		||||
        METRICS[`${timing}RedrawTime`].value = median;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ const PortalHelperSecurityLevel = {
 | 
			
		||||
    INSECURE: 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const INACTIVITY_TIMEOUT = 30000; //ms
 | 
			
		||||
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
 | 
			
		||||
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
 | 
			
		||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
 | 
			
		||||
@@ -59,7 +58,7 @@ class PortalHeaderBar extends Gtk.HeaderBar {
 | 
			
		||||
                                             single_line_mode: true,
 | 
			
		||||
                                             ellipsize: Pango.EllipsizeMode.END,
 | 
			
		||||
                                             valign: Gtk.Align.BASELINE,
 | 
			
		||||
                                             selectable: true});
 | 
			
		||||
                                             selectable: true });
 | 
			
		||||
        this.subtitleLabel.get_style_context().add_class('subtitle');
 | 
			
		||||
        hbox.add(this.subtitleLabel);
 | 
			
		||||
 | 
			
		||||
@@ -265,7 +264,7 @@ class WebPortalHelper extends Gtk.Application {
 | 
			
		||||
        this._queue = [];
 | 
			
		||||
 | 
			
		||||
        let action = new Gio.SimpleAction({ name: 'quit' });
 | 
			
		||||
        action.connect('activate', () => { this.active_window.destroyWindow(); });
 | 
			
		||||
        action.connect('activate', () => this.active_window.destroyWindow());
 | 
			
		||||
        this.add_action(action);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,7 @@ class AccessDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this.addButton({ label: grantLabel,
 | 
			
		||||
                         action: () => {
 | 
			
		||||
                             this._sendResponse(DialogResponse.OK);
 | 
			
		||||
                         }});
 | 
			
		||||
                         } });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    open() {
 | 
			
		||||
@@ -135,7 +135,7 @@ var AccessDialogDBus = class {
 | 
			
		||||
        let [handle, appId, parentWindow, title, subtitle, body, options] = params;
 | 
			
		||||
        // We probably want to use parentWindow and global.display.focus_window
 | 
			
		||||
        // for this check in the future
 | 
			
		||||
        if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) {
 | 
			
		||||
        if (appId && `${appId}.desktop` != this._windowTracker.focus_app.id) {
 | 
			
		||||
            invocation.return_error_literal(Gio.DBusError,
 | 
			
		||||
                                            Gio.DBusError.ACCESS_DENIED,
 | 
			
		||||
                                            'Only the focused app is allowed to show a system access dialog');
 | 
			
		||||
@@ -146,7 +146,7 @@ var AccessDialogDBus = class {
 | 
			
		||||
                                      subtitle, body, options);
 | 
			
		||||
        dialog.open();
 | 
			
		||||
 | 
			
		||||
        dialog.connect('closed', () => { this._accessDialog = null; });
 | 
			
		||||
        dialog.connect('closed', () => this._accessDialog = null);
 | 
			
		||||
 | 
			
		||||
        this._accessDialog = dialog;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function _createWindowClone(window, size) {
 | 
			
		||||
                               // usual hack for the usual bug in ClutterBinLayout...
 | 
			
		||||
                               x_expand: true,
 | 
			
		||||
                               y_expand: true });
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getWindows(workspace) {
 | 
			
		||||
    // We ignore skip-taskbar windows in switchers, but if they are attached
 | 
			
		||||
@@ -395,7 +395,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: THUMBNAIL_FADE_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => { this.thumbnailsVisible = true; }
 | 
			
		||||
                           onComplete: () => this.thumbnailsVisible = true
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED);
 | 
			
		||||
@@ -459,7 +459,7 @@ class CyclerHighlight {
 | 
			
		||||
    _onDestroy() {
 | 
			
		||||
        this.window = null;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// We don't show an actual popup, so just provide what SwitcherPopup
 | 
			
		||||
// expects instead of inheriting from SwitcherList
 | 
			
		||||
@@ -663,14 +663,6 @@ class AppIcon extends St.BoxLayout {
 | 
			
		||||
    set_size(size) {
 | 
			
		||||
        this.icon = this.app.create_icon_texture(size);
 | 
			
		||||
        this._iconBin.child = this.icon;
 | 
			
		||||
        this._iconBin.set_size(size, size);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_width(forHeight) {
 | 
			
		||||
        let [minWidth, ] = super.vfunc_get_preferred_width(forHeight);
 | 
			
		||||
 | 
			
		||||
        minWidth = Math.max(minWidth, forHeight);
 | 
			
		||||
        return [minWidth, minWidth];
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -724,15 +716,16 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
 | 
			
		||||
    _setIconSize() {
 | 
			
		||||
        let j = 0;
 | 
			
		||||
        while(this._items.length > 1 && this._items[j].style_class != 'item-box') {
 | 
			
		||||
                j++;
 | 
			
		||||
        while (this._items.length > 1 && this._items[j].style_class != 'item-box') {
 | 
			
		||||
            j++;
 | 
			
		||||
        }
 | 
			
		||||
        let themeNode = this._items[j].get_theme_node();
 | 
			
		||||
        this._list.ensure_style();
 | 
			
		||||
 | 
			
		||||
        let iconPadding = themeNode.get_horizontal_padding();
 | 
			
		||||
        let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
 | 
			
		||||
        let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
 | 
			
		||||
        let iconSpacing = iconNaturalHeight + iconPadding + iconBorder;
 | 
			
		||||
        let [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
 | 
			
		||||
        let iconSpacing = labelNaturalHeight + iconPadding + iconBorder;
 | 
			
		||||
        let totalSpacing = this._list.spacing * (this._items.length - 1);
 | 
			
		||||
 | 
			
		||||
        // We just assume the whole screen here due to weirdness happing with the passed width
 | 
			
		||||
@@ -745,7 +738,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
        let iconSize = baseIconSizes[0];
 | 
			
		||||
 | 
			
		||||
        if (this._items.length > 1) {
 | 
			
		||||
            for(let i =  0; i < baseIconSizes.length; i++) {
 | 
			
		||||
            for (let i =  0; i < baseIconSizes.length; i++) {
 | 
			
		||||
                iconSize = baseIconSizes[i];
 | 
			
		||||
                let height = iconSizes[i] + iconSpacing;
 | 
			
		||||
                let w = height * this._items.length + totalSpacing;
 | 
			
		||||
@@ -756,7 +749,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
 | 
			
		||||
        this._iconSize = iconSize;
 | 
			
		||||
 | 
			
		||||
        for(let i = 0; i < this.icons.length; i++) {
 | 
			
		||||
        for (let i = 0; i < this.icons.length; i++) {
 | 
			
		||||
            if (this.icons[i].icon != null)
 | 
			
		||||
                break;
 | 
			
		||||
            this.icons[i].set_size(iconSize);
 | 
			
		||||
@@ -802,8 +795,9 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
                                                            return GLib.SOURCE_REMOVE;
 | 
			
		||||
                                                        });
 | 
			
		||||
            GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
 | 
			
		||||
        } else
 | 
			
		||||
           this._itemEntered(index);
 | 
			
		||||
        } else {
 | 
			
		||||
            this._itemEntered(index);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _enterItem(index) {
 | 
			
		||||
@@ -848,9 +842,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
                this._removeIcon(app);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let n = this._arrows.length;
 | 
			
		||||
        let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
 | 
			
		||||
        arrow.connect('repaint', () => { SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM); });
 | 
			
		||||
        arrow.connect('repaint', () => SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM));
 | 
			
		||||
        this.add_actor(arrow);
 | 
			
		||||
        this._arrows.push(arrow);
 | 
			
		||||
 | 
			
		||||
@@ -991,23 +984,23 @@ class WindowIcon extends St.BoxLayout {
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
 | 
			
		||||
        switch (mode) {
 | 
			
		||||
            case AppIconMode.THUMBNAIL_ONLY:
 | 
			
		||||
                size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
                this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
                break;
 | 
			
		||||
        case AppIconMode.THUMBNAIL_ONLY:
 | 
			
		||||
            size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
            this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
            case AppIconMode.BOTH:
 | 
			
		||||
                size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
                this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
        case AppIconMode.BOTH:
 | 
			
		||||
            size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
            this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
 | 
			
		||||
                if (this.app)
 | 
			
		||||
                    this._icon.add_actor(this._createAppIcon(this.app,
 | 
			
		||||
                                                             APP_ICON_SIZE_SMALL));
 | 
			
		||||
                break;
 | 
			
		||||
            if (this.app)
 | 
			
		||||
                this._icon.add_actor(this._createAppIcon(this.app,
 | 
			
		||||
                                                         APP_ICON_SIZE_SMALL));
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
            case AppIconMode.APP_ICON_ONLY:
 | 
			
		||||
                size = APP_ICON_SIZE;
 | 
			
		||||
                this._icon.add_actor(this._createAppIcon(this.app, size));
 | 
			
		||||
        case AppIconMode.APP_ICON_ONLY:
 | 
			
		||||
            size = APP_ICON_SIZE;
 | 
			
		||||
            this._icon.add_actor(this._createAppIcon(this.app, size));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._icon.set_size(size * scaleFactor, size * scaleFactor);
 | 
			
		||||
@@ -1044,7 +1037,7 @@ class WindowList extends SwitcherPopup.SwitcherList {
 | 
			
		||||
            this.icons.push(icon);
 | 
			
		||||
 | 
			
		||||
            icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => {
 | 
			
		||||
                this._removeWindow(window)
 | 
			
		||||
                this._removeWindow(window);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1080,7 +1073,7 @@ class WindowList extends SwitcherPopup.SwitcherList {
 | 
			
		||||
        childBox.y1 = childBox.y2 - this._label.height;
 | 
			
		||||
        this._label.allocate(childBox, flags);
 | 
			
		||||
 | 
			
		||||
        let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM)
 | 
			
		||||
        let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM);
 | 
			
		||||
        childBox.x1 = box.x1;
 | 
			
		||||
        childBox.x2 = box.x2;
 | 
			
		||||
        childBox.y1 = box.y1;
 | 
			
		||||
 
 | 
			
		||||
@@ -62,11 +62,11 @@ var Animation = class {
 | 
			
		||||
        if (!validResourceScale)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let texture_cache = St.TextureCache.get_default();
 | 
			
		||||
        let textureCache = St.TextureCache.get_default();
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        this._animations = texture_cache.load_sliced_image(file, width, height,
 | 
			
		||||
                                                           scaleFactor, resourceScale,
 | 
			
		||||
                                                           this._animationsLoaded.bind(this));
 | 
			
		||||
        this._animations = textureCache.load_sliced_image(file, width, height,
 | 
			
		||||
                                                          scaleFactor, resourceScale,
 | 
			
		||||
                                                          this._animationsLoaded.bind(this));
 | 
			
		||||
        this.actor.set_child(this._animations);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -123,7 +123,7 @@ var AnimatedIcon = class extends Animation {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var Spinner = class extends AnimatedIcon {
 | 
			
		||||
    constructor(size, animate=false) {
 | 
			
		||||
    constructor(size, animate = false) {
 | 
			
		||||
        let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
 | 
			
		||||
        super(file, size);
 | 
			
		||||
 | 
			
		||||
@@ -162,7 +162,7 @@ var Spinner = class extends AnimatedIcon {
 | 
			
		||||
                time: SPINNER_ANIMATION_TIME,
 | 
			
		||||
                transition: 'linear',
 | 
			
		||||
                onComplete: () => {
 | 
			
		||||
                    this.stop(false);
 | 
			
		||||
                    super.stop();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ const SystemActions = imports.misc.systemActions;
 | 
			
		||||
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
var MAX_APPLICATION_WORK_MILLIS = 75;
 | 
			
		||||
var MENU_POPUP_TIMEOUT = 600;
 | 
			
		||||
var MAX_COLUMNS = 6;
 | 
			
		||||
var MIN_COLUMNS = 4;
 | 
			
		||||
@@ -34,23 +33,9 @@ var FOLDER_SUBICON_FRACTION = .4;
 | 
			
		||||
 | 
			
		||||
var MIN_FREQUENT_APPS_COUNT = 3;
 | 
			
		||||
 | 
			
		||||
var INDICATORS_BASE_TIME = 0.25;
 | 
			
		||||
var INDICATORS_ANIMATION_DELAY = 0.125;
 | 
			
		||||
var INDICATORS_ANIMATION_MAX_TIME = 0.75;
 | 
			
		||||
 | 
			
		||||
var VIEWS_SWITCH_TIME = 0.4;
 | 
			
		||||
var VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
 | 
			
		||||
 | 
			
		||||
// Follow iconGrid animations approach and divide by 2 to animate out to
 | 
			
		||||
// not annoy the user when the user wants to quit appDisplay.
 | 
			
		||||
// Also, make sure we don't exceed iconGrid animation total time or
 | 
			
		||||
// views switch time.
 | 
			
		||||
var INDICATORS_BASE_TIME_OUT = 0.125;
 | 
			
		||||
var INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
 | 
			
		||||
var INDICATORS_ANIMATION_MAX_TIME_OUT =
 | 
			
		||||
    Math.min (VIEWS_SWITCH_TIME,
 | 
			
		||||
              IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
 | 
			
		||||
 | 
			
		||||
var PAGE_SWITCH_TIME = 0.3;
 | 
			
		||||
 | 
			
		||||
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
 | 
			
		||||
@@ -69,7 +54,7 @@ function _getCategories(info) {
 | 
			
		||||
 | 
			
		||||
function _listsIntersect(a, b) {
 | 
			
		||||
    for (let itemA of a)
 | 
			
		||||
        if (b.indexOf(itemA) >= 0)
 | 
			
		||||
        if (b.includes(itemA))
 | 
			
		||||
            return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
@@ -84,7 +69,7 @@ function _getFolderName(folder) {
 | 
			
		||||
        try {
 | 
			
		||||
            keyfile.load_from_data_dirs(path, GLib.KeyFileFlags.NONE);
 | 
			
		||||
            name = keyfile.get_locale_string('Desktop Entry', 'Name', null);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            return name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -109,7 +94,7 @@ class BaseAppView {
 | 
			
		||||
                                                padWithSpacing: true });
 | 
			
		||||
        params = Params.parse(params, { usePagination: false });
 | 
			
		||||
 | 
			
		||||
        if(params.usePagination)
 | 
			
		||||
        if (params.usePagination)
 | 
			
		||||
            this._grid = new IconGrid.PaginatedIconGrid(gridParams);
 | 
			
		||||
        else
 | 
			
		||||
            this._grid = new IconGrid.IconGrid(gridParams);
 | 
			
		||||
@@ -158,7 +143,7 @@ class BaseAppView {
 | 
			
		||||
 | 
			
		||||
    loadGrid() {
 | 
			
		||||
        this._allItems.sort(this._compareItems);
 | 
			
		||||
        this._allItems.forEach(item => { this._grid.addItem(item); });
 | 
			
		||||
        this._allItems.forEach(item => this._grid.addItem(item));
 | 
			
		||||
        this.emit('view-loaded');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -166,7 +151,7 @@ class BaseAppView {
 | 
			
		||||
        if (this._items[id])
 | 
			
		||||
            this._items[id].actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
 | 
			
		||||
        else
 | 
			
		||||
            log('No such application ' + id);
 | 
			
		||||
            log(`No such application ${id}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    selectApp(id) {
 | 
			
		||||
@@ -227,12 +212,12 @@ class BaseAppView {
 | 
			
		||||
        } else {
 | 
			
		||||
            params.opacity = 0;
 | 
			
		||||
            params.delay = 0;
 | 
			
		||||
            params.onComplete = () => { this.actor.hide(); };
 | 
			
		||||
            params.onComplete = () => this.actor.hide();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(this._grid, params);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
Signals.addSignalMethods(BaseAppView.prototype);
 | 
			
		||||
 | 
			
		||||
var AllView = class AllView extends BaseAppView {
 | 
			
		||||
@@ -246,7 +231,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
                                               reactive: true,
 | 
			
		||||
                                               y_align: St.Align.START });
 | 
			
		||||
        this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
 | 
			
		||||
                                     x_expand:true, y_expand:true });
 | 
			
		||||
                                     x_expand: true, y_expand: true });
 | 
			
		||||
        this.actor.add_actor(this._scrollView);
 | 
			
		||||
 | 
			
		||||
        this._scrollView.set_policy(St.PolicyType.NEVER,
 | 
			
		||||
@@ -300,7 +285,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
        this._availWidth = 0;
 | 
			
		||||
        this._availHeight = 0;
 | 
			
		||||
 | 
			
		||||
        Main.overview.connect('hidden', () => { this.goToPage(0); });
 | 
			
		||||
        Main.overview.connect('hidden', () => this.goToPage(0));
 | 
			
		||||
        this._grid.connect('space-opened', () => {
 | 
			
		||||
            let fadeEffect = this._scrollView.get_effect('fade');
 | 
			
		||||
            if (fadeEffect)
 | 
			
		||||
@@ -373,8 +358,8 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
    _loadApps() {
 | 
			
		||||
        this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {
 | 
			
		||||
            try {
 | 
			
		||||
                let id = appInfo.get_id(); // catch invalid file encodings
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                (appInfo.get_id()); // catch invalid file encodings
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            return appInfo.should_show();
 | 
			
		||||
@@ -447,7 +432,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               opacity: 0,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                                  this.opacity = 255;
 | 
			
		||||
                                   this.opacity = 255;
 | 
			
		||||
                               } });
 | 
			
		||||
 | 
			
		||||
        if (animationDirection == IconGrid.AnimationDirection.OUT)
 | 
			
		||||
@@ -546,7 +531,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onPanEnd(action) {
 | 
			
		||||
         if (this._displayingPopup)
 | 
			
		||||
        if (this._displayingPopup)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let pageHeight = this._grid.getPageHeight();
 | 
			
		||||
@@ -585,7 +570,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
            this._eventBlocker.reactive = isOpen;
 | 
			
		||||
            this._currentPopup = isOpen ? popup : null;
 | 
			
		||||
            this._updateIconOpacities(isOpen);
 | 
			
		||||
            if(!isOpen)
 | 
			
		||||
            if (!isOpen)
 | 
			
		||||
                this._closeSpaceForPopup();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -686,7 +671,7 @@ var FrequentView = class FrequentView extends BaseAppView {
 | 
			
		||||
        let mostUsed = this._usage.get_most_used();
 | 
			
		||||
        let hasUsefulData = this.hasUsefulData();
 | 
			
		||||
        this._noFrequentAppsLabel.visible = !hasUsefulData;
 | 
			
		||||
        if(!hasUsefulData)
 | 
			
		||||
        if (!hasUsefulData)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        // Allow dragging of the icon only if the Dash would accept a drop to
 | 
			
		||||
@@ -735,11 +720,11 @@ class ControlsBoxLayout extends Clutter.BoxLayout {
 | 
			
		||||
        let maxMinWidth = 0;
 | 
			
		||||
        let maxNaturalWidth = 0;
 | 
			
		||||
        for (let child = container.get_first_child();
 | 
			
		||||
             child;
 | 
			
		||||
             child = child.get_next_sibling()) {
 | 
			
		||||
             let [minWidth, natWidth] = child.get_preferred_width(forHeight);
 | 
			
		||||
             maxMinWidth = Math.max(maxMinWidth, minWidth);
 | 
			
		||||
             maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
 | 
			
		||||
            child;
 | 
			
		||||
            child = child.get_next_sibling()) {
 | 
			
		||||
            let [minWidth, natWidth] = child.get_preferred_width(forHeight);
 | 
			
		||||
            maxMinWidth = Math.max(maxMinWidth, minWidth);
 | 
			
		||||
            maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
 | 
			
		||||
        }
 | 
			
		||||
        let childrenCount = container.get_n_children();
 | 
			
		||||
        let totalSpacing = this.spacing * (childrenCount - 1);
 | 
			
		||||
@@ -802,7 +787,7 @@ var AppDisplay = class AppDisplay {
 | 
			
		||||
            // shown next, so make sure to restore their opacity
 | 
			
		||||
            // when they are hidden
 | 
			
		||||
            if (this._controls.mapped)
 | 
			
		||||
              return;
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            Tweener.removeTweens(this._controls);
 | 
			
		||||
            this._controls.opacity = 255;
 | 
			
		||||
@@ -867,14 +852,14 @@ var AppDisplay = class AppDisplay {
 | 
			
		||||
            this._controls.opacity = 0;
 | 
			
		||||
            finalOpacity = 255;
 | 
			
		||||
        } else {
 | 
			
		||||
            finalOpacity = 0
 | 
			
		||||
            finalOpacity = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(this._controls,
 | 
			
		||||
                         { time: IconGrid.ANIMATION_TIME_IN,
 | 
			
		||||
                           transition: 'easeInOutQuad',
 | 
			
		||||
                           opacity: finalOpacity,
 | 
			
		||||
                          });
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        currentView.animate(animationDirection, onComplete);
 | 
			
		||||
    }
 | 
			
		||||
@@ -910,7 +895,7 @@ var AppDisplay = class AppDisplay {
 | 
			
		||||
 | 
			
		||||
    _onAllocatedSizeChanged(actor, width, height) {
 | 
			
		||||
        let box = new Clutter.ActorBox();
 | 
			
		||||
        box.x1 = box.y1 =0;
 | 
			
		||||
        box.x1 = box.y1 = 0;
 | 
			
		||||
        box.x2 = width;
 | 
			
		||||
        box.y2 = height;
 | 
			
		||||
        box = this._viewStack.get_theme_node().get_content_box(box);
 | 
			
		||||
@@ -941,7 +926,7 @@ var AppSearchProvider = class AppSearchProvider {
 | 
			
		||||
                             'name': app.get_name(),
 | 
			
		||||
                             'createIcon'(size) {
 | 
			
		||||
                                 return app.create_icon_texture(size);
 | 
			
		||||
                           }
 | 
			
		||||
                             }
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                let name = this._systemActions.getName(id);
 | 
			
		||||
@@ -1165,7 +1150,7 @@ var FolderIcon = class FolderIcon {
 | 
			
		||||
        let excludedApps = this._folder.get_strv('excluded-apps');
 | 
			
		||||
        let appSys = Shell.AppSystem.get_default();
 | 
			
		||||
        let addAppId = appId => {
 | 
			
		||||
            if (excludedApps.indexOf(appId) >= 0)
 | 
			
		||||
            if (excludedApps.includes(appId))
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            let app = appSys.lookup_app(appId);
 | 
			
		||||
@@ -1266,7 +1251,7 @@ var FolderIcon = class FolderIcon {
 | 
			
		||||
    adaptToSize(width, height) {
 | 
			
		||||
        this._parentAvailableWidth = width;
 | 
			
		||||
        this._parentAvailableHeight = height;
 | 
			
		||||
        if(this._popup)
 | 
			
		||||
        if (this._popup)
 | 
			
		||||
            this.view.adaptToSize(width, height);
 | 
			
		||||
        this._popupInvalidated = true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1314,7 +1299,7 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
 | 
			
		||||
        global.focus_manager.add_group(this.actor);
 | 
			
		||||
 | 
			
		||||
        source.actor.connect('destroy', () => { this.actor.destroy(); });
 | 
			
		||||
        source.actor.connect('destroy', () => this.actor.destroy());
 | 
			
		||||
        this._grabHelper = new GrabHelper.GrabHelper(this.actor, {
 | 
			
		||||
            actionMode: Shell.ActionMode.POPUP
 | 
			
		||||
        });
 | 
			
		||||
@@ -1346,22 +1331,22 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
        let direction;
 | 
			
		||||
        let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR;
 | 
			
		||||
        switch (event.get_key_symbol()) {
 | 
			
		||||
            case Clutter.Down:
 | 
			
		||||
                direction = St.DirectionType.TAB_FORWARD;
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.Right:
 | 
			
		||||
                direction = isLtr ? St.DirectionType.TAB_FORWARD :
 | 
			
		||||
        case Clutter.Down:
 | 
			
		||||
            direction = St.DirectionType.TAB_FORWARD;
 | 
			
		||||
            break;
 | 
			
		||||
        case Clutter.Right:
 | 
			
		||||
            direction = isLtr ? St.DirectionType.TAB_FORWARD :
 | 
			
		||||
                                    St.DirectionType.TAB_BACKWARD;
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.Up:
 | 
			
		||||
                direction = St.DirectionType.TAB_BACKWARD;
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.Left:
 | 
			
		||||
                direction = isLtr ? St.DirectionType.TAB_BACKWARD :
 | 
			
		||||
            break;
 | 
			
		||||
        case Clutter.Up:
 | 
			
		||||
            direction = St.DirectionType.TAB_BACKWARD;
 | 
			
		||||
            break;
 | 
			
		||||
        case Clutter.Left:
 | 
			
		||||
            direction = isLtr ? St.DirectionType.TAB_BACKWARD :
 | 
			
		||||
                                    St.DirectionType.TAB_FORWARD;
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        }
 | 
			
		||||
        return actor.navigate_focus(null, direction, false);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1393,9 +1378,9 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
        this._boxPointer.open(BoxPointer.PopupAnimation.FADE |
 | 
			
		||||
                              BoxPointer.PopupAnimation.SLIDE,
 | 
			
		||||
                              () => {
 | 
			
		||||
                this._view.actor.opacity = 255;
 | 
			
		||||
                this._view.animate(IconGrid.AnimationDirection.IN);
 | 
			
		||||
            });
 | 
			
		||||
                                  this._view.actor.opacity = 255;
 | 
			
		||||
                                  this._view.animate(IconGrid.AnimationDirection.IN);
 | 
			
		||||
                              });
 | 
			
		||||
 | 
			
		||||
        this.emit('open-state-changed', true);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1491,7 +1476,7 @@ var AppIcon = class AppIcon {
 | 
			
		||||
                Main.overview.cancelledItemDrag(this);
 | 
			
		||||
            });
 | 
			
		||||
            this._draggable.connect('drag-end', () => {
 | 
			
		||||
               Main.overview.endItemDrag(this);
 | 
			
		||||
                Main.overview.endItemDrag(this);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1728,7 +1713,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
            let appInfo = this._source.app.get_app_info();
 | 
			
		||||
            let actions = appInfo.list_actions();
 | 
			
		||||
            if (this._source.app.can_open_new_window() &&
 | 
			
		||||
                actions.indexOf('new-window') == -1) {
 | 
			
		||||
                actions.includes('new-window')) {
 | 
			
		||||
                this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
 | 
			
		||||
                this._newWindowMenuItem.connect('activate', () => {
 | 
			
		||||
                    if (this._source.app.state == Shell.AppState.STOPPED)
 | 
			
		||||
@@ -1742,7 +1727,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
 | 
			
		||||
            if (discreteGpuAvailable &&
 | 
			
		||||
                this._source.app.state == Shell.AppState.STOPPED &&
 | 
			
		||||
                actions.indexOf('activate-discrete-gpu') == -1) {
 | 
			
		||||
                actions.includes('activate-discrete-gpu')) {
 | 
			
		||||
                this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
 | 
			
		||||
                this._onDiscreteGpuMenuItem.connect('activate', () => {
 | 
			
		||||
                    if (this._source.app.state == Shell.AppState.STOPPED)
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ class AppFavorites {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this.FAVORITE_APPS_KEY = 'favorite-apps';
 | 
			
		||||
        this._favorites = {};
 | 
			
		||||
        global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this));
 | 
			
		||||
        global.settings.connect(`changed::${this.FAVORITE_APPS_KEY}`, this._onFavsChanged.bind(this));
 | 
			
		||||
        this.reload();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -187,7 +187,7 @@ class AppFavorites {
 | 
			
		||||
                                   }
 | 
			
		||||
                                 });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
Signals.addSignalMethods(AppFavorites.prototype);
 | 
			
		||||
 | 
			
		||||
var appFavoritesInstance = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -54,28 +54,28 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDeviceLabel(device) {
 | 
			
		||||
        switch(device) {
 | 
			
		||||
            case AudioDevice.HEADPHONES:
 | 
			
		||||
                return _("Headphones");
 | 
			
		||||
            case AudioDevice.HEADSET:
 | 
			
		||||
                return _("Headset");
 | 
			
		||||
            case AudioDevice.MICROPHONE:
 | 
			
		||||
                return _("Microphone");
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        switch (device) {
 | 
			
		||||
        case AudioDevice.HEADPHONES:
 | 
			
		||||
            return _("Headphones");
 | 
			
		||||
        case AudioDevice.HEADSET:
 | 
			
		||||
            return _("Headset");
 | 
			
		||||
        case AudioDevice.MICROPHONE:
 | 
			
		||||
            return _("Microphone");
 | 
			
		||||
        default:
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDeviceIcon(device) {
 | 
			
		||||
        switch(device) {
 | 
			
		||||
            case AudioDevice.HEADPHONES:
 | 
			
		||||
                return 'audio-headphones-symbolic';
 | 
			
		||||
            case AudioDevice.HEADSET:
 | 
			
		||||
                return 'audio-headset-symbolic';
 | 
			
		||||
            case AudioDevice.MICROPHONE:
 | 
			
		||||
                return 'audio-input-microphone-symbolic';
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        switch (device) {
 | 
			
		||||
        case AudioDevice.HEADPHONES:
 | 
			
		||||
            return 'audio-headphones-symbolic';
 | 
			
		||||
        case AudioDevice.HEADSET:
 | 
			
		||||
            return 'audio-headset-symbolic';
 | 
			
		||||
        case AudioDevice.MICROPHONE:
 | 
			
		||||
            return 'audio-input-microphone-symbolic';
 | 
			
		||||
        default:
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -110,11 +110,11 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _openSettings() {
 | 
			
		||||
        let desktopFile = 'gnome-sound-panel.desktop'
 | 
			
		||||
        let desktopFile = 'gnome-sound-panel.desktop';
 | 
			
		||||
        let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
 | 
			
		||||
 | 
			
		||||
        if (!app) {
 | 
			
		||||
            log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
 | 
			
		||||
            log(`Settings panel for desktop file ${desktopFile} could not be loaded!`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -159,12 +159,12 @@ var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
 | 
			
		||||
 | 
			
		||||
        let [deviceNames] = params;
 | 
			
		||||
        let devices = 0;
 | 
			
		||||
        deviceNames.forEach(n => { devices |= AudioDevice[n.toUpperCase()]; });
 | 
			
		||||
        deviceNames.forEach(n => devices |= AudioDevice[n.toUpperCase()]);
 | 
			
		||||
 | 
			
		||||
        let dialog;
 | 
			
		||||
        try {
 | 
			
		||||
            dialog = new AudioDeviceSelectionDialog(devices);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            invocation.return_value(null);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,6 @@ const PRIMARY_COLOR_KEY = 'primary-color';
 | 
			
		||||
const SECONDARY_COLOR_KEY = 'secondary-color';
 | 
			
		||||
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
 | 
			
		||||
const BACKGROUND_STYLE_KEY = 'picture-options';
 | 
			
		||||
const PICTURE_OPACITY_KEY = 'picture-opacity';
 | 
			
		||||
const PICTURE_URI_KEY = 'picture-uri';
 | 
			
		||||
 | 
			
		||||
var FADE_ANIMATION_TIME = 1.0;
 | 
			
		||||
@@ -433,12 +432,12 @@ var Background = class Background {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
 | 
			
		||||
                                                      interval,
 | 
			
		||||
                                                      () => {
 | 
			
		||||
                                                          this._updateAnimationTimeoutId = 0;
 | 
			
		||||
                                                          this._updateAnimation();
 | 
			
		||||
                                                          return GLib.SOURCE_REMOVE;
 | 
			
		||||
                                                      });
 | 
			
		||||
                                                          interval,
 | 
			
		||||
                                                          () => {
 | 
			
		||||
                                                              this._updateAnimationTimeoutId = 0;
 | 
			
		||||
                                                              this._updateAnimation();
 | 
			
		||||
                                                              return GLib.SOURCE_REMOVE;
 | 
			
		||||
                                                          });
 | 
			
		||||
        GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -465,9 +464,9 @@ var Background = class Background {
 | 
			
		||||
 | 
			
		||||
        let cache = Meta.BackgroundImageCache.get_default();
 | 
			
		||||
        let image = cache.load(file);
 | 
			
		||||
        if (image.is_loaded())
 | 
			
		||||
        if (image.is_loaded()) {
 | 
			
		||||
            this._setLoaded();
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            let id = image.connect('loaded', () => {
 | 
			
		||||
                this._setLoaded();
 | 
			
		||||
                image.disconnect(id);
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ var BarLevel = class {
 | 
			
		||||
        this._barLevelWidth = 0;
 | 
			
		||||
 | 
			
		||||
        if (params == undefined)
 | 
			
		||||
            params = {}
 | 
			
		||||
            params = {};
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
 | 
			
		||||
                                          can_focus: params['canFocus'] || false,
 | 
			
		||||
@@ -105,7 +105,7 @@ var BarLevel = class {
 | 
			
		||||
            overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
 | 
			
		||||
 | 
			
		||||
        /* background bar */
 | 
			
		||||
        cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
        cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4));
 | 
			
		||||
        cr.lineTo(endX, (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
 | 
			
		||||
@@ -117,12 +117,12 @@ var BarLevel = class {
 | 
			
		||||
 | 
			
		||||
        /* normal progress bar */
 | 
			
		||||
        let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2);
 | 
			
		||||
        cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4, TAU * 3 / 4);
 | 
			
		||||
        cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (1 / 4), TAU * (3 / 4));
 | 
			
		||||
        cr.lineTo(x, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(x, (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
 | 
			
		||||
        if (this._value > 0)
 | 
			
		||||
          Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        cr.fillPreserve();
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
@@ -145,17 +145,17 @@ var BarLevel = class {
 | 
			
		||||
 | 
			
		||||
        /* end progress bar arc */
 | 
			
		||||
        if (this._value > 0) {
 | 
			
		||||
          if (this._value <= this._overdriveStart)
 | 
			
		||||
              Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
          else
 | 
			
		||||
              Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
          cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
          cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
          cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
          cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
          cr.fillPreserve();
 | 
			
		||||
          cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
          cr.stroke();
 | 
			
		||||
            if (this._value <= this._overdriveStart)
 | 
			
		||||
                Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
            else
 | 
			
		||||
                Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
            cr.arc(endX, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4));
 | 
			
		||||
            cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
            cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
            cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
            cr.fillPreserve();
 | 
			
		||||
            cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
            cr.stroke();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* draw overdrive separator */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, GObject, Shell, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
@@ -90,18 +90,18 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    this.translation_y = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    this.translation_y = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    this.translation_x = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    this.translation_x = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                this.translation_y = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                this.translation_y = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                this.translation_x = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                this.translation_x = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -130,18 +130,18 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    translationY = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    translationY = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    translationX = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    translationX = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                translationY = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                translationY = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                translationX = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                translationX = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -220,18 +220,18 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        childBox.x2 = availWidth - borderWidth;
 | 
			
		||||
        childBox.y2 = availHeight - borderWidth;
 | 
			
		||||
        switch (this._arrowSide) {
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                childBox.y1 += rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                childBox.y2 -= rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                childBox.x1 += rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                childBox.x2 -= rise;
 | 
			
		||||
                break;
 | 
			
		||||
        case St.Side.TOP:
 | 
			
		||||
            childBox.y1 += rise;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.BOTTOM:
 | 
			
		||||
            childBox.y2 -= rise;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.LEFT:
 | 
			
		||||
            childBox.x1 += rise;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.RIGHT:
 | 
			
		||||
            childBox.x2 -= rise;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        this.bin.allocate(childBox, flags);
 | 
			
		||||
 | 
			
		||||
@@ -264,7 +264,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        let borderRadius = themeNode.get_length('-arrow-border-radius');
 | 
			
		||||
 | 
			
		||||
        let halfBorder = borderWidth / 2;
 | 
			
		||||
        let halfBase = Math.floor(base/2);
 | 
			
		||||
        let halfBase = Math.floor(base / 2);
 | 
			
		||||
 | 
			
		||||
        let backgroundColor = themeNode.get_color('-arrow-background-color');
 | 
			
		||||
 | 
			
		||||
@@ -345,7 +345,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipTopRight) {
 | 
			
		||||
            cr.lineTo(x2 - borderRadius, y1);
 | 
			
		||||
            cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius,
 | 
			
		||||
                   3*Math.PI/2, Math.PI*2);
 | 
			
		||||
                   3 * Math.PI / 2, Math.PI * 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._arrowSide == St.Side.RIGHT && rise) {
 | 
			
		||||
@@ -366,7 +366,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipBottomRight) {
 | 
			
		||||
            cr.lineTo(x2, y2 - borderRadius);
 | 
			
		||||
            cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
 | 
			
		||||
                   0, Math.PI/2);
 | 
			
		||||
                   0, Math.PI / 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._arrowSide == St.Side.BOTTOM && rise) {
 | 
			
		||||
@@ -387,7 +387,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipBottomLeft) {
 | 
			
		||||
            cr.lineTo(x1 + borderRadius, y2);
 | 
			
		||||
            cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
 | 
			
		||||
                   Math.PI/2, Math.PI);
 | 
			
		||||
                   Math.PI / 2, Math.PI);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._arrowSide == St.Side.LEFT && rise) {
 | 
			
		||||
@@ -396,7 +396,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
                cr.lineTo(x1 - rise, y1);
 | 
			
		||||
                cr.lineTo(x1 + borderRadius, y1);
 | 
			
		||||
            } else if (skipBottomLeft) {
 | 
			
		||||
                cr.lineTo(x1 - rise, y2)
 | 
			
		||||
                cr.lineTo(x1 - rise, y2);
 | 
			
		||||
                cr.lineTo(x1 - rise, y2 - halfBase);
 | 
			
		||||
            } else {
 | 
			
		||||
                cr.lineTo(x1, this._arrowOrigin + halfBase);
 | 
			
		||||
@@ -408,7 +408,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipTopLeft) {
 | 
			
		||||
            cr.lineTo(x1, y1 + borderRadius);
 | 
			
		||||
            cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius,
 | 
			
		||||
                   Math.PI, 3*Math.PI/2);
 | 
			
		||||
                   Math.PI, 3 * Math.PI / 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, backgroundColor);
 | 
			
		||||
@@ -437,7 +437,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
                this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
 | 
			
		||||
                    this._sourceActor = null;
 | 
			
		||||
                    delete this._sourceActorDestroyId;
 | 
			
		||||
                })
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -513,7 +513,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        //     of the box to maintain the arrow's accuracy.
 | 
			
		||||
 | 
			
		||||
        let arrowOrigin;
 | 
			
		||||
        let halfBase = Math.floor(arrowBase/2);
 | 
			
		||||
        let halfBase = Math.floor(arrowBase / 2);
 | 
			
		||||
        let halfBorder = borderWidth / 2;
 | 
			
		||||
        let halfMargin = margin / 2;
 | 
			
		||||
        let [x1, y1] = [halfBorder, halfBorder];
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ var ELLIPSIS_CHAR = '\u2026';
 | 
			
		||||
 | 
			
		||||
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
 | 
			
		||||
 | 
			
		||||
var NC_ = (context, str) => context + '\u0004' + str;
 | 
			
		||||
var NC_ = (context, str) => `${context}\u0004${str}`;
 | 
			
		||||
 | 
			
		||||
function sameYear(dateA, dateB) {
 | 
			
		||||
    return (dateA.getYear() == dateB.getYear());
 | 
			
		||||
@@ -38,7 +38,7 @@ function isToday(date) {
 | 
			
		||||
function _isWorkDay(date) {
 | 
			
		||||
    /* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
 | 
			
		||||
    let days = C_('calendar-no-work', "06");
 | 
			
		||||
    return days.indexOf(date.getDay().toString()) == -1;
 | 
			
		||||
    return !days.includes(date.getDay().toString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _getBeginningOfDay(date) {
 | 
			
		||||
@@ -143,8 +143,7 @@ function _datesEqual(a, b) {
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _dateIntervalsOverlap(a0, a1, b0, b1)
 | 
			
		||||
{
 | 
			
		||||
function _dateIntervalsOverlap(a0, a1, b0, b1) {
 | 
			
		||||
    if (a1 <= b0)
 | 
			
		||||
        return false;
 | 
			
		||||
    else if (b1 <= a0)
 | 
			
		||||
@@ -168,7 +167,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
            try {
 | 
			
		||||
                this._dbusProxy.init_finish(result);
 | 
			
		||||
                loaded = true;
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
 | 
			
		||||
                    // Ignore timeouts and install signals as normal, because with high
 | 
			
		||||
                    // probability the service will appear later on, and we will get a
 | 
			
		||||
@@ -178,7 +177,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
                    // about the HasCalendars property and would cause an exception trying
 | 
			
		||||
                    // to read it)
 | 
			
		||||
                } else {
 | 
			
		||||
                    log('Error loading calendars: ' + e.message);
 | 
			
		||||
                    log(`Error loading calendars: ${e.message}`);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -263,7 +262,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
        if (!this._initialized)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (this._curRequestBegin && this._curRequestEnd){
 | 
			
		||||
        if (this._curRequestBegin && this._curRequestEnd) {
 | 
			
		||||
            this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
 | 
			
		||||
                                            this._curRequestEnd.getTime() / 1000,
 | 
			
		||||
                                            forceReload,
 | 
			
		||||
@@ -285,7 +284,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
 | 
			
		||||
    getEvents(begin, end) {
 | 
			
		||||
        let result = [];
 | 
			
		||||
        for(let n = 0; n < this._events.length; n++) {
 | 
			
		||||
        for (let n = 0; n < this._events.length; n++) {
 | 
			
		||||
            let event = this._events[n];
 | 
			
		||||
 | 
			
		||||
            if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
 | 
			
		||||
@@ -320,7 +319,7 @@ var Calendar = class Calendar {
 | 
			
		||||
        this._weekStart = Shell.util_get_week_start();
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, this._onSettingsChange.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${SHOW_WEEKDATE_KEY}`, this._onSettingsChange.bind(this));
 | 
			
		||||
        this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
@@ -402,8 +401,8 @@ var Calendar = class Calendar {
 | 
			
		||||
        this._topBox.add(this._backButton);
 | 
			
		||||
        this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._monthLabel = new St.Label({style_class: 'calendar-month-label',
 | 
			
		||||
                                         can_focus: true });
 | 
			
		||||
        this._monthLabel = new St.Label({ style_class: 'calendar-month-label',
 | 
			
		||||
                                          can_focus: true });
 | 
			
		||||
        this._topBox.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE });
 | 
			
		||||
 | 
			
		||||
        this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button',
 | 
			
		||||
@@ -466,8 +465,7 @@ var Calendar = class Calendar {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate();
 | 
			
		||||
                newDate = new Date(newDate.getFullYear() - 1, 11, day);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            newDate.setMonth(oldMonth - 1);
 | 
			
		||||
            if (newDate.getMonth() != oldMonth - 1) {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate();
 | 
			
		||||
@@ -490,8 +488,7 @@ var Calendar = class Calendar {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate();
 | 
			
		||||
                newDate = new Date(newDate.getFullYear() + 1, 0, day);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            newDate.setMonth(oldMonth + 1);
 | 
			
		||||
            if (newDate.getMonth() != oldMonth + 1) {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate();
 | 
			
		||||
@@ -546,8 +543,6 @@ var Calendar = class Calendar {
 | 
			
		||||
        this._calendarBegin = new Date(beginDate);
 | 
			
		||||
        this._markedAsToday = now;
 | 
			
		||||
 | 
			
		||||
        let year = beginDate.getYear();
 | 
			
		||||
 | 
			
		||||
        let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
 | 
			
		||||
        let startsOnWeekStart = daysToWeekStart == 0;
 | 
			
		||||
        let weekPadding = startsOnWeekStart ? 7 : 0;
 | 
			
		||||
@@ -559,7 +554,7 @@ var Calendar = class Calendar {
 | 
			
		||||
        let row = 2;
 | 
			
		||||
        // nRows here means 6 weeks + one header + one navbar
 | 
			
		||||
        let nRows = 8;
 | 
			
		||||
        while (row < 8) {
 | 
			
		||||
        while (row < nRows) {
 | 
			
		||||
            // xgettext:no-javascript-format
 | 
			
		||||
            let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
 | 
			
		||||
                                         can_focus: true });
 | 
			
		||||
@@ -585,12 +580,12 @@ var Calendar = class Calendar {
 | 
			
		||||
 | 
			
		||||
            // Hack used in lieu of border-collapse - see gnome-shell.css
 | 
			
		||||
            if (row == 2)
 | 
			
		||||
                styleClass = 'calendar-day-top ' + styleClass;
 | 
			
		||||
                styleClass = `calendar-day-top ${styleClass}`;
 | 
			
		||||
 | 
			
		||||
            let leftMost = rtl ? iter.getDay() == (this._weekStart + 6) % 7
 | 
			
		||||
                               : iter.getDay() == this._weekStart;
 | 
			
		||||
            if (leftMost)
 | 
			
		||||
                styleClass = 'calendar-day-left ' + styleClass;
 | 
			
		||||
                styleClass = `calendar-day-left ${styleClass}`;
 | 
			
		||||
 | 
			
		||||
            if (sameDay(now, iter))
 | 
			
		||||
                styleClass += ' calendar-today';
 | 
			
		||||
@@ -648,9 +643,9 @@ var Calendar = class Calendar {
 | 
			
		||||
                button.add_style_pseudo_class('selected');
 | 
			
		||||
                if (this._shouldDateGrabFocus)
 | 
			
		||||
                    button.grab_key_focus();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            } else {
 | 
			
		||||
                button.remove_style_pseudo_class('selected');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
@@ -1077,7 +1072,7 @@ var CalendarMessageList = class CalendarMessageList {
 | 
			
		||||
        this._clearButton.set_x_align(Clutter.ActorAlign.END);
 | 
			
		||||
        this._clearButton.connect('clicked', () => {
 | 
			
		||||
            let sections = [...this._sections.keys()];
 | 
			
		||||
            sections.forEach((s) => { s.clear(); });
 | 
			
		||||
            sections.forEach((s) => s.clear());
 | 
			
		||||
        });
 | 
			
		||||
        box.add_actor(this._clearButton);
 | 
			
		||||
 | 
			
		||||
@@ -1103,7 +1098,7 @@ var CalendarMessageList = class CalendarMessageList {
 | 
			
		||||
    _addSection(section) {
 | 
			
		||||
        let obj = {
 | 
			
		||||
            destroyId: 0,
 | 
			
		||||
            visibleId:  0,
 | 
			
		||||
            visibleId: 0,
 | 
			
		||||
            emptyChangedId: 0,
 | 
			
		||||
            canClearChangedId: 0,
 | 
			
		||||
            keyFocusId: 0
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,12 @@ const Dialog = imports.ui.dialog;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
 | 
			
		||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3
 | 
			
		||||
var DIALOG_TRANSITION_TIME = 0.15
 | 
			
		||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3;
 | 
			
		||||
var DIALOG_TRANSITION_TIME = 0.15;
 | 
			
		||||
var ALIVE_TIMEOUT = 5000;
 | 
			
		||||
 | 
			
		||||
var CloseDialog = GObject.registerClass({
 | 
			
		||||
    Implements: [ Meta.CloseDialog ],
 | 
			
		||||
    Implements: [Meta.CloseDialog],
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'window': GObject.ParamSpec.override('window', Meta.CloseDialog)
 | 
			
		||||
    },
 | 
			
		||||
@@ -56,12 +56,12 @@ var CloseDialog = GObject.registerClass({
 | 
			
		||||
        this._dialog.height = windowActor.height;
 | 
			
		||||
 | 
			
		||||
        this._dialog.addContent(this._createDialogContent());
 | 
			
		||||
        this._dialog.addButton({ label:   _('Force Quit'),
 | 
			
		||||
                                 action:  this._onClose.bind(this),
 | 
			
		||||
        this._dialog.addButton({ label: _('Force Quit'),
 | 
			
		||||
                                 action: this._onClose.bind(this),
 | 
			
		||||
                                 default: true });
 | 
			
		||||
        this._dialog.addButton({ label:  _('Wait'),
 | 
			
		||||
        this._dialog.addButton({ label: _('Wait'),
 | 
			
		||||
                                 action: this._onWait.bind(this),
 | 
			
		||||
                                 key:    Clutter.Escape });
 | 
			
		||||
                                 key: Clutter.Escape });
 | 
			
		||||
 | 
			
		||||
        global.focus_manager.add_group(this._dialog);
 | 
			
		||||
    }
 | 
			
		||||
@@ -165,7 +165,7 @@ var CloseDialog = GObject.registerClass({
 | 
			
		||||
        GLib.source_remove(this._timeoutId);
 | 
			
		||||
        this._timeoutId = 0;
 | 
			
		||||
 | 
			
		||||
        global.display.disconnect(this._windowFocusChangedId)
 | 
			
		||||
        global.display.disconnect(this._windowFocusChangedId);
 | 
			
		||||
        this._windowFocusChangedId = 0;
 | 
			
		||||
 | 
			
		||||
        global.stage.disconnect(this._keyFocusChangedId);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,13 @@ var ComponentManager = class {
 | 
			
		||||
        let newEnabledComponents = Main.sessionMode.components;
 | 
			
		||||
 | 
			
		||||
        newEnabledComponents.filter(
 | 
			
		||||
            name => this._enabledComponents.indexOf(name) == -1
 | 
			
		||||
            name => !this._enabledComponents.includes(name)
 | 
			
		||||
        ).forEach(name => {
 | 
			
		||||
            this._enableComponent(name);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._enabledComponents.filter(
 | 
			
		||||
            name => newEnabledComponents.indexOf(name) == -1
 | 
			
		||||
            name => !newEnabledComponents.includes(name)
 | 
			
		||||
        ).forEach(name => {
 | 
			
		||||
            this._disableComponent(name);
 | 
			
		||||
        });
 | 
			
		||||
@@ -37,8 +37,8 @@ var ComponentManager = class {
 | 
			
		||||
        if (component)
 | 
			
		||||
            return component;
 | 
			
		||||
 | 
			
		||||
	if (Main.sessionMode.isLocked)
 | 
			
		||||
	    return null;
 | 
			
		||||
        if (Main.sessionMode.isLocked)
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
        let constructor = this._importComponent(name);
 | 
			
		||||
        component = new constructor();
 | 
			
		||||
@@ -48,7 +48,7 @@ var ComponentManager = class {
 | 
			
		||||
 | 
			
		||||
    _enableComponent(name) {
 | 
			
		||||
        let component = this._ensureComponent(name);
 | 
			
		||||
	if (component)
 | 
			
		||||
        if (component)
 | 
			
		||||
            component.enable();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -109,25 +109,23 @@ var AutomountManager = class {
 | 
			
		||||
        // we force stop/eject in this case, so we don't have to pass a
 | 
			
		||||
        // mount operation object
 | 
			
		||||
        if (drive.can_stop()) {
 | 
			
		||||
            drive.stop
 | 
			
		||||
                (Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                 (drive, res) => {
 | 
			
		||||
                     try {
 | 
			
		||||
                         drive.stop_finish(res);
 | 
			
		||||
                     } catch (e) {
 | 
			
		||||
                         log("Unable to stop the drive after drive-eject-button " + e.toString());
 | 
			
		||||
                     }
 | 
			
		||||
                 });
 | 
			
		||||
            drive.stop(Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                (drive, res) => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        drive.stop_finish(res);
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        log(`Unable to stop the drive after drive-eject-button ${e.toString()}`);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
        } else if (drive.can_eject()) {
 | 
			
		||||
            drive.eject_with_operation 
 | 
			
		||||
                (Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                 (drive, res) => {
 | 
			
		||||
                     try {
 | 
			
		||||
                         drive.eject_with_operation_finish(res);
 | 
			
		||||
                     } catch (e) {
 | 
			
		||||
                         log("Unable to eject the drive after drive-eject-button " + e.toString());
 | 
			
		||||
                     }
 | 
			
		||||
                 });
 | 
			
		||||
            drive.eject_with_operation(Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                (drive, res) => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        drive.eject_with_operation_finish(res);
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        log(`Unable to eject the drive after drive-eject-button ${e.toString()}`);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -213,7 +211,7 @@ var AutomountManager = class {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
 | 
			
		||||
                    log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
 | 
			
		||||
                    log(`Unable to mount volume ${volume.get_name()}: ${e.toString()}`);
 | 
			
		||||
                this._closeOperation(volume);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ function isMountRootHidden(root) {
 | 
			
		||||
    let path = root.get_path();
 | 
			
		||||
 | 
			
		||||
    // skip any mounts in hidden directory hierarchies
 | 
			
		||||
    return (path.indexOf('/.') != -1);
 | 
			
		||||
    return (path.includes('/.'));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isMountNonLocal(mount) {
 | 
			
		||||
@@ -65,8 +65,7 @@ function startAppForMount(app, mount) {
 | 
			
		||||
        retval = app.launch(files, 
 | 
			
		||||
                            global.create_app_launch_context(0, -1));
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        log('Unable to launch the application ' + app.get_name()
 | 
			
		||||
            + ': ' + e.toString());
 | 
			
		||||
        log(`Unable to launch the application ${app.get_name()}: ${e}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return retval;
 | 
			
		||||
@@ -107,8 +106,7 @@ var ContentTypeDiscoverer = class {
 | 
			
		||||
        try {
 | 
			
		||||
            contentTypes = mount.guess_content_type_finish(res);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log('Unable to guess content types on added mount ' + mount.get_name()
 | 
			
		||||
                + ': ' + e.toString());
 | 
			
		||||
            log(`Unable to guess content types on added mount ${mount.get_name()}: ${e}`);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (contentTypes.length) {
 | 
			
		||||
@@ -192,15 +190,15 @@ var AutorunDispatcher = class {
 | 
			
		||||
 | 
			
		||||
    _getAutorunSettingForType(contentType) {
 | 
			
		||||
        let runApp = this._settings.get_strv(SETTING_START_APP);
 | 
			
		||||
        if (runApp.indexOf(contentType) != -1)
 | 
			
		||||
        if (runApp.includes(contentType))
 | 
			
		||||
            return AutorunSetting.RUN;
 | 
			
		||||
 | 
			
		||||
        let ignore = this._settings.get_strv(SETTING_IGNORE);
 | 
			
		||||
        if (ignore.indexOf(contentType) != -1)
 | 
			
		||||
        if (ignore.includes(contentType))
 | 
			
		||||
            return AutorunSetting.IGNORE;
 | 
			
		||||
 | 
			
		||||
        let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER);
 | 
			
		||||
        if (openFiles.indexOf(contentType) != -1)
 | 
			
		||||
        if (openFiles.includes(contentType))
 | 
			
		||||
            return AutorunSetting.FILES;
 | 
			
		||||
 | 
			
		||||
        return AutorunSetting.ASK;
 | 
			
		||||
 
 | 
			
		||||
@@ -162,7 +162,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        // NOTE: ModalDialog.open() is safe to call if the dialog is
 | 
			
		||||
        // already open - it just returns true without side-effects
 | 
			
		||||
        if (this.open())
 | 
			
		||||
          return true;
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        // The above fail if e.g. unable to get input grab
 | 
			
		||||
        //
 | 
			
		||||
@@ -172,7 +172,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        log('keyringPrompt: Failed to show modal dialog.' +
 | 
			
		||||
            ' Dismissing prompt request');
 | 
			
		||||
        this.prompt.cancel()
 | 
			
		||||
        this.prompt.cancel();
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -80,8 +80,9 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                        secret.valid = secret.value.length > 0;
 | 
			
		||||
                    this._updateOkButton();
 | 
			
		||||
                });
 | 
			
		||||
            } else
 | 
			
		||||
            } else {
 | 
			
		||||
                secret.valid = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (rtl) {
 | 
			
		||||
                layout.attach(secret.entry, 0, pos, 1, 1);
 | 
			
		||||
@@ -105,19 +106,19 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
 | 
			
		||||
            contentBox.messageBox.add(descriptionLabel,
 | 
			
		||||
                                      { y_fill:  true,
 | 
			
		||||
                                      { y_fill: true,
 | 
			
		||||
                                        y_align: St.Align.START,
 | 
			
		||||
                                        expand: true });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._okButton = { label:  _("Connect"),
 | 
			
		||||
        this._okButton = { label: _("Connect"),
 | 
			
		||||
                           action: this._onOk.bind(this),
 | 
			
		||||
                           default: true
 | 
			
		||||
                         };
 | 
			
		||||
 | 
			
		||||
        this.setButtons([{ label: _("Cancel"),
 | 
			
		||||
                           action: this.cancel.bind(this),
 | 
			
		||||
                           key:    Clutter.KEY_Escape,
 | 
			
		||||
                           key: Clutter.KEY_Escape,
 | 
			
		||||
                         },
 | 
			
		||||
                         this._okButton]);
 | 
			
		||||
 | 
			
		||||
@@ -176,24 +177,25 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        let value = secret.value;
 | 
			
		||||
        if (secret.wep_key_type == NM.WepKeyType.KEY) {
 | 
			
		||||
            if (value.length == 10 || value.length == 26) {
 | 
			
		||||
		for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                    if (!((value[i] >= 'a' && value[i] <= 'f')
 | 
			
		||||
                          || (value[i] >= 'A' && value[i] <= 'F')
 | 
			
		||||
                          || (value[i] >= '0' && value[i] <= '9')))
 | 
			
		||||
                        return false;
 | 
			
		||||
		}
 | 
			
		||||
	    } else if (value.length == 5 || value.length == 13) {
 | 
			
		||||
		for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                }
 | 
			
		||||
            } else if (value.length == 5 || value.length == 13) {
 | 
			
		||||
                for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                    if (!((value[i] >= 'a' && value[i] <= 'z')
 | 
			
		||||
                          || (value[i] >= 'A' && value[i] <= 'Z')))
 | 
			
		||||
                        return false;
 | 
			
		||||
                }
 | 
			
		||||
            } else
 | 
			
		||||
            } else {
 | 
			
		||||
                return false;
 | 
			
		||||
	} else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
 | 
			
		||||
	    if (value.length < 0 || value.length > 64)
 | 
			
		||||
	        return false;
 | 
			
		||||
	}
 | 
			
		||||
            }
 | 
			
		||||
        } else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
 | 
			
		||||
            if (value.length < 0 || value.length > 64)
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -214,7 +216,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                           validate: this._validateWpaPsk, password: true });
 | 
			
		||||
            break;
 | 
			
		||||
        case 'none': // static WEP
 | 
			
		||||
            secrets.push({ label: _("Key: "), key: 'wep-key' + wirelessSecuritySetting.wep_tx_keyidx,
 | 
			
		||||
            secrets.push({ label: _("Key: "), key: `wep-key${wirelessSecuritySetting.wep_tx_keyidx}`,
 | 
			
		||||
                           value: wirelessSecuritySetting.get_wep_key(wirelessSecuritySetting.wep_tx_keyidx) || '',
 | 
			
		||||
                           wep_key_type: wirelessSecuritySetting.wep_key_type,
 | 
			
		||||
                           validate: this._validateStaticWep, password: true });
 | 
			
		||||
@@ -230,13 +232,12 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            this._get8021xSecrets(secrets);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt);
 | 
			
		||||
            log(`Invalid wireless key management: ${wirelessSecuritySetting.key_mgmt}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _get8021xSecrets(secrets) {
 | 
			
		||||
        let ieee8021xSetting = this._connection.get_setting_802_1x();
 | 
			
		||||
        let phase2method;
 | 
			
		||||
 | 
			
		||||
        /* If hints were given we know exactly what we need to ask */
 | 
			
		||||
        if (this._settingName == "802-1x" && this._hints.length) {
 | 
			
		||||
@@ -273,7 +274,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                           value: ieee8021xSetting.private_key_password || '', password: true });
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log('Invalid EAP/IEEE802.1x method: ' + ieee8021xSetting.get_eap_method(0));
 | 
			
		||||
            log(`Invalid EAP/IEEE802.1x method: ${ieee8021xSetting.get_eap_method(0)}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -304,7 +305,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        let ssid;
 | 
			
		||||
 | 
			
		||||
        let content = { };
 | 
			
		||||
        content.secrets = [ ];
 | 
			
		||||
        content.secrets = [];
 | 
			
		||||
 | 
			
		||||
        switch (connectionType) {
 | 
			
		||||
        case '802-11-wireless':
 | 
			
		||||
@@ -327,7 +328,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            this._getPPPoESecrets(content.secrets);
 | 
			
		||||
            break;
 | 
			
		||||
        case 'gsm':
 | 
			
		||||
            if (this._hints.indexOf('pin') != -1) {
 | 
			
		||||
            if (this._hints.includes('pin')) {
 | 
			
		||||
                let gsmSetting = this._connection.get_setting_gsm();
 | 
			
		||||
                content.title = _("PIN code required");
 | 
			
		||||
                content.message = _("PIN code is needed for the mobile broadband device");
 | 
			
		||||
@@ -343,8 +344,8 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            this._getMobileSecrets(content.secrets, connectionType);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log('Invalid connection type: ' + connectionType);
 | 
			
		||||
        };
 | 
			
		||||
            log(`Invalid connection type: ${connectionType}`);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return content;
 | 
			
		||||
    }
 | 
			
		||||
@@ -359,16 +360,15 @@ var VPNRequestHandler = class {
 | 
			
		||||
        this._pluginOutBuffer = [];
 | 
			
		||||
        this._title = null;
 | 
			
		||||
        this._description = null;
 | 
			
		||||
        this._content = [ ];
 | 
			
		||||
        this._content = [];
 | 
			
		||||
        this._shellDialog = null;
 | 
			
		||||
 | 
			
		||||
        let connectionSetting = connection.get_setting_connection();
 | 
			
		||||
 | 
			
		||||
        let argv = [ authHelper.fileName,
 | 
			
		||||
                     '-u', connectionSetting.uuid,
 | 
			
		||||
                     '-n', connectionSetting.id,
 | 
			
		||||
                     '-s', serviceType
 | 
			
		||||
                   ];
 | 
			
		||||
        let argv = [authHelper.fileName,
 | 
			
		||||
                    '-u', connectionSetting.uuid,
 | 
			
		||||
                    '-n', connectionSetting.id,
 | 
			
		||||
                    '-s', serviceType];
 | 
			
		||||
        if (authHelper.externalUIMode)
 | 
			
		||||
            argv.push('--external-ui-mode');
 | 
			
		||||
        if (flags & NM.SecretAgentGetSecretsFlags.ALLOW_INTERACTION)
 | 
			
		||||
@@ -407,7 +407,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
                                                    this._vpnChildFinished.bind(this));
 | 
			
		||||
 | 
			
		||||
            this._writeConnection();
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logError(e, 'error while spawning VPN auth helper');
 | 
			
		||||
 | 
			
		||||
            this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
@@ -424,7 +424,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
        } else {
 | 
			
		||||
            try {
 | 
			
		||||
                this._stdin.write('QUIT\n\n', null);
 | 
			
		||||
            } catch(e) { /* ignore broken pipe errors */ }
 | 
			
		||||
            } catch (e) { /* ignore broken pipe errors */ }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.destroy();
 | 
			
		||||
@@ -459,8 +459,9 @@ var VPNRequestHandler = class {
 | 
			
		||||
                this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
 | 
			
		||||
            else
 | 
			
		||||
                this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
 | 
			
		||||
        } else
 | 
			
		||||
        } else {
 | 
			
		||||
            this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.destroy();
 | 
			
		||||
    }
 | 
			
		||||
@@ -473,7 +474,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
            if (line == '' && this._previousLine == '') {
 | 
			
		||||
                try {
 | 
			
		||||
                    this._stdin.write('QUIT\n\n', null);
 | 
			
		||||
                } catch(e) { /* ignore broken pipe errors */ }
 | 
			
		||||
                } catch (e) { /* ignore broken pipe errors */ }
 | 
			
		||||
            } else {
 | 
			
		||||
                this._agent.set_password(this._requestId, this._previousLine, line);
 | 
			
		||||
                this._previousLine = undefined;
 | 
			
		||||
@@ -561,7 +562,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
                    this._agent.set_password(this._requestId, groups[i], value);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            // No output is a valid case it means "both secrets are stored"
 | 
			
		||||
            if (data.length > 0) {
 | 
			
		||||
                logError(e, 'error while reading VPN plugin output keyfile');
 | 
			
		||||
@@ -587,15 +588,15 @@ var VPNRequestHandler = class {
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            vpnSetting.foreach_data_item((key, value) => {
 | 
			
		||||
                this._stdin.write('DATA_KEY=' + key + '\n', null);
 | 
			
		||||
                this._stdin.write('DATA_VAL=' + (value || '') + '\n\n', null);
 | 
			
		||||
                this._stdin.write(`DATA_KEY=${key}\n`, null);
 | 
			
		||||
                this._stdin.write(`DATA_VAL=${value || ''}\n\n`, null);
 | 
			
		||||
            });
 | 
			
		||||
            vpnSetting.foreach_secret((key, value) => {
 | 
			
		||||
                this._stdin.write('SECRET_KEY=' + key + '\n', null);
 | 
			
		||||
                this._stdin.write('SECRET_VAL=' + (value || '') + '\n\n', null);
 | 
			
		||||
                this._stdin.write(`SECRET_KEY=${key}\n`, null);
 | 
			
		||||
                this._stdin.write(`SECRET_VAL=${value || ''}\n\n`, null);
 | 
			
		||||
            });
 | 
			
		||||
            this._stdin.write('DONE\n\n', null);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logError(e, 'internal error while writing connection to helper');
 | 
			
		||||
 | 
			
		||||
            this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
@@ -619,9 +620,9 @@ var NetworkAgent = class {
 | 
			
		||||
        this._pluginDir = Gio.file_new_for_path(Config.VPNDIR);
 | 
			
		||||
        try {
 | 
			
		||||
            let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
 | 
			
		||||
            monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to create monitor for VPN plugin dir: ' + e.message);
 | 
			
		||||
            monitor.connect('changed', () => this._vpnCacheBuilt = false);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to create monitor for VPN plugin dir: ${e.message}`);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._native.connect('new-request', this._newRequest.bind(this));
 | 
			
		||||
@@ -632,7 +633,7 @@ var NetworkAgent = class {
 | 
			
		||||
            try {
 | 
			
		||||
                this._native.init_finish(res);
 | 
			
		||||
                this._initialized = true;
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                this._native = null;
 | 
			
		||||
                logError(e, 'error initializing the NetworkManager Agent');
 | 
			
		||||
            }
 | 
			
		||||
@@ -680,12 +681,13 @@ var NetworkAgent = class {
 | 
			
		||||
        let connectionSetting = connection.get_setting_connection();
 | 
			
		||||
        let connectionType = connectionSetting.get_connection_type();
 | 
			
		||||
        switch (connectionType) {
 | 
			
		||||
        case '802-11-wireless':
 | 
			
		||||
        case '802-11-wireless': {
 | 
			
		||||
            let wirelessSetting = connection.get_setting_wireless();
 | 
			
		||||
            let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
 | 
			
		||||
            title = _("Authentication required by wireless network");
 | 
			
		||||
            body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case '802-3-ethernet':
 | 
			
		||||
            title = _("Wired 802.1X authentication");
 | 
			
		||||
            body = _("A password is required to connect to “%s”.".format(connection.get_id()));
 | 
			
		||||
@@ -695,8 +697,7 @@ var NetworkAgent = class {
 | 
			
		||||
            body = _("A password is required to connect to “%s”.".format(connection.get_id()));
 | 
			
		||||
            break;
 | 
			
		||||
        case 'gsm':
 | 
			
		||||
            if (hints.indexOf('pin') != -1) {
 | 
			
		||||
                let gsmSetting = connection.get_setting_gsm();
 | 
			
		||||
            if (hints.includes('pin')) {
 | 
			
		||||
                title = _("PIN code required");
 | 
			
		||||
                body = _("PIN code is needed for the mobile broadband device");
 | 
			
		||||
                break;
 | 
			
		||||
@@ -708,7 +709,7 @@ var NetworkAgent = class {
 | 
			
		||||
            body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log('Invalid connection type: ' + connectionType);
 | 
			
		||||
            log(`Invalid connection type: ${connectionType}`);
 | 
			
		||||
            this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@
 | 
			
		||||
 | 
			
		||||
const { AccountsService, Clutter, Gio, GLib,
 | 
			
		||||
        GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Animation = imports.ui.animation;
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
@@ -39,19 +38,19 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this.contentLayout.add_actor(content);
 | 
			
		||||
 | 
			
		||||
        if (userNames.length > 1) {
 | 
			
		||||
            log('polkitAuthenticationAgent: Received ' + userNames.length +
 | 
			
		||||
                ' identities that can be used for authentication. Only ' +
 | 
			
		||||
            log(`polkitAuthenticationAgent: Received ${userNames.length} ` +
 | 
			
		||||
                'identities that can be used for authentication. Only ' +
 | 
			
		||||
                'considering one.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let userName = GLib.get_user_name();
 | 
			
		||||
        if (userNames.indexOf(userName) < 0)
 | 
			
		||||
        if (!userNames.includes(userName))
 | 
			
		||||
            userName = 'root';
 | 
			
		||||
        if (userNames.indexOf(userName) < 0)
 | 
			
		||||
        if (!userNames.includes(userName))
 | 
			
		||||
            userName = userNames[0];
 | 
			
		||||
 | 
			
		||||
        this._user = AccountsService.UserManager.get_default().get_user(userName);
 | 
			
		||||
        let userRealName = this._user.get_real_name()
 | 
			
		||||
        let userRealName = this._user.get_real_name();
 | 
			
		||||
        this._userLoadedId = this._user.connect('notify::is_loaded',
 | 
			
		||||
                                                this._onUserChanged.bind(this));
 | 
			
		||||
        this._userChangedId = this._user.connect('changed',
 | 
			
		||||
@@ -78,15 +77,15 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
                                                       styleClass: 'polkit-dialog-user-icon' });
 | 
			
		||||
            this._userAvatar.actor.hide();
 | 
			
		||||
            userBox.add(this._userAvatar.actor,
 | 
			
		||||
                        { x_fill:  true,
 | 
			
		||||
                          y_fill:  false,
 | 
			
		||||
                        { x_fill: true,
 | 
			
		||||
                          y_fill: false,
 | 
			
		||||
                          x_align: St.Align.END,
 | 
			
		||||
                          y_align: St.Align.START });
 | 
			
		||||
            let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-label',
 | 
			
		||||
                                            text: userRealName }));
 | 
			
		||||
            userBox.add(userLabel,
 | 
			
		||||
                        { x_fill:  true,
 | 
			
		||||
                          y_fill:  false,
 | 
			
		||||
                        { x_fill: true,
 | 
			
		||||
                          y_fill: false,
 | 
			
		||||
                          x_align: St.Align.END,
 | 
			
		||||
                          y_align: St.Align.MIDDLE });
 | 
			
		||||
        }
 | 
			
		||||
@@ -99,7 +98,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
 | 
			
		||||
        this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                             text: "",
 | 
			
		||||
                                             can_focus: true});
 | 
			
		||||
                                             can_focus: true });
 | 
			
		||||
        ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
 | 
			
		||||
        this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
 | 
			
		||||
        this._passwordBox.add(this._passwordEntry,
 | 
			
		||||
@@ -128,7 +127,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
         * gnome-shell.css sets the color to be transparent
 | 
			
		||||
         */
 | 
			
		||||
        this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
 | 
			
		||||
                                                text: 'abc'});
 | 
			
		||||
                                                text: 'abc' });
 | 
			
		||||
        this._nullMessageLabel.add_style_class_name('hidden');
 | 
			
		||||
        this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._nullMessageLabel.clutter_text.line_wrap = true;
 | 
			
		||||
@@ -138,7 +137,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this._cancelButton = this.addButton({ label: _("Cancel"),
 | 
			
		||||
                                              action: this.cancel.bind(this),
 | 
			
		||||
                                              key: Clutter.Escape });
 | 
			
		||||
        this._okButton = this.addButton({ label:  _("Authenticate"),
 | 
			
		||||
        this._okButton = this.addButton({ label: _("Authenticate"),
 | 
			
		||||
                                          action: this._onAuthenticateButtonPressed.bind(this),
 | 
			
		||||
                                          default: true });
 | 
			
		||||
 | 
			
		||||
@@ -181,9 +180,9 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
            //
 | 
			
		||||
            // We could add retrying if this turns out to be a problem
 | 
			
		||||
 | 
			
		||||
            log('polkitAuthenticationAgent: Failed to show modal dialog.' +
 | 
			
		||||
                ' Dismissing authentication request for action-id ' + this.actionId +
 | 
			
		||||
                ' cookie ' + this._cookie);
 | 
			
		||||
            log('polkitAuthenticationAgent: Failed to show modal dialog. ' +
 | 
			
		||||
                `Dismissing authentication request for action-id ${this.actionId} ` +
 | 
			
		||||
                `cookie ${this._cookie}`);
 | 
			
		||||
            this._emitDone(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -251,14 +250,14 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSessionRequest(session, request, echo_on) {
 | 
			
		||||
    _onSessionRequest(session, request, echoOn) {
 | 
			
		||||
        // Cheap localization trick
 | 
			
		||||
        if (request == 'Password:' || request == 'Password: ')
 | 
			
		||||
            this._passwordLabel.set_text(_("Password:"));
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordLabel.set_text(request);
 | 
			
		||||
 | 
			
		||||
        if (echo_on)
 | 
			
		||||
        if (echoOn)
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('');
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
@@ -343,7 +342,7 @@ var AuthenticationAgent = class {
 | 
			
		||||
    enable() {
 | 
			
		||||
        try {
 | 
			
		||||
            this._native.register();
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log('Failed to register AuthenticationAgent');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -351,7 +350,7 @@ var AuthenticationAgent = class {
 | 
			
		||||
    disable() {
 | 
			
		||||
        try {
 | 
			
		||||
            this._native.unregister();
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log('Failed to unregister AuthenticationAgent');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ var Tpl = null;
 | 
			
		||||
var Tp = null;
 | 
			
		||||
try {
 | 
			
		||||
    ({ TelepathyGLib: Tp, TelepathyLogger: Tpl } = imports.gi);
 | 
			
		||||
} catch(e) {
 | 
			
		||||
} catch (e) {
 | 
			
		||||
    log('Telepathy is not available, chat integration will be disabled.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -40,8 +40,6 @@ var NotificationDirection = {
 | 
			
		||||
    RECEIVED: 'chat-received'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var N_ = s => s;
 | 
			
		||||
 | 
			
		||||
function makeMessageFromTpMessage(tpMessage, direction) {
 | 
			
		||||
    let [text, flags] = tpMessage.to_text();
 | 
			
		||||
 | 
			
		||||
@@ -89,7 +87,7 @@ var TelepathyComponent = class {
 | 
			
		||||
        try {
 | 
			
		||||
            this._client.register();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
 | 
			
		||||
            throw new Error(`Could not register Telepathy client. Error: ${e}`);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
 | 
			
		||||
@@ -149,20 +147,20 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
            this._delegatedChannelsCb.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_observe_channels(account, conn, channels,
 | 
			
		||||
                                     dispatchOp, requests, context) {
 | 
			
		||||
    vfunc_observe_channels(...args) {
 | 
			
		||||
        let [account, conn, channels, dispatchOp, requests, context] = args;
 | 
			
		||||
        let len = channels.length;
 | 
			
		||||
        for (let i = 0; i < len; i++) {
 | 
			
		||||
            let channel = channels[i];
 | 
			
		||||
            let [targetHandle, targetHandleType] = channel.get_handle();
 | 
			
		||||
 | 
			
		||||
            if (channel.get_invalidated())
 | 
			
		||||
              continue;
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            /* Only observe contact text channels */
 | 
			
		||||
            if ((!(channel instanceof Tp.TextChannel)) ||
 | 
			
		||||
               targetHandleType != Tp.HandleType.CONTACT)
 | 
			
		||||
               continue;
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            this._createChatSource(account, conn, channel, channel.get_target_contact());
 | 
			
		||||
        }
 | 
			
		||||
@@ -182,8 +180,8 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_handle_channels(account, conn, channels, requests,
 | 
			
		||||
                                    user_action_time, context) {
 | 
			
		||||
    vfunc_handle_channels(...args) {
 | 
			
		||||
        let [account, conn, channels, requests, userActionTime, context] = args;
 | 
			
		||||
        this._handlingChannels(account, conn, channels, true);
 | 
			
		||||
        context.accept();
 | 
			
		||||
    }
 | 
			
		||||
@@ -200,7 +198,7 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (channel.get_invalidated())
 | 
			
		||||
              continue;
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            // 'notify' will be true when coming from an actual HandleChannels
 | 
			
		||||
            // call, and not when from a successful Claim call. The point is
 | 
			
		||||
@@ -222,8 +220,8 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_add_dispatch_operation(account, conn, channels,
 | 
			
		||||
                                           dispatchOp, context) {
 | 
			
		||||
    vfunc_add_dispatch_operation(...args) {
 | 
			
		||||
        let [account, conn, channels, dispatchOp, context] = args;
 | 
			
		||||
        let channel = channels[0];
 | 
			
		||||
        let chanType = channel.get_channel_type();
 | 
			
		||||
 | 
			
		||||
@@ -255,7 +253,7 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
                dispatchOp.claim_with_finish(result);
 | 
			
		||||
                this._handlingChannels(account, conn, [channel], false);
 | 
			
		||||
            } catch (err) {
 | 
			
		||||
                log('Failed to Claim channel: ' + err);
 | 
			
		||||
                log(`Failed to Claim channel: ${err}`);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -362,28 +360,28 @@ var ChatSource = class extends MessageTray.Source {
 | 
			
		||||
        let presenceType = this._contact.get_presence_type();
 | 
			
		||||
 | 
			
		||||
        switch (presenceType) {
 | 
			
		||||
            case Tp.ConnectionPresenceType.AVAILABLE:
 | 
			
		||||
                iconName = 'user-available';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.BUSY:
 | 
			
		||||
                iconName = 'user-busy';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.OFFLINE:
 | 
			
		||||
                iconName = 'user-offline';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.HIDDEN:
 | 
			
		||||
                iconName = 'user-invisible';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.AWAY:
 | 
			
		||||
                iconName = 'user-away';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.EXTENDED_AWAY:
 | 
			
		||||
                iconName = 'user-idle';
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                iconName = 'user-offline';
 | 
			
		||||
       }
 | 
			
		||||
       return new Gio.ThemedIcon({ name: iconName });
 | 
			
		||||
        case Tp.ConnectionPresenceType.AVAILABLE:
 | 
			
		||||
            iconName = 'user-available';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.BUSY:
 | 
			
		||||
            iconName = 'user-busy';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.OFFLINE:
 | 
			
		||||
            iconName = 'user-offline';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.HIDDEN:
 | 
			
		||||
            iconName = 'user-invisible';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.AWAY:
 | 
			
		||||
            iconName = 'user-away';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.EXTENDED_AWAY:
 | 
			
		||||
            iconName = 'user-idle';
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            iconName = 'user-offline';
 | 
			
		||||
        }
 | 
			
		||||
        return new Gio.ThemedIcon({ name: iconName });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateAvatarIcon() {
 | 
			
		||||
@@ -597,8 +595,8 @@ var ChatSource = class extends MessageTray.Source {
 | 
			
		||||
        // keep track of it with the ChatStateChanged signal but it is good
 | 
			
		||||
        // enough right now.
 | 
			
		||||
        if (state != this._chatState) {
 | 
			
		||||
          this._chatState = state;
 | 
			
		||||
          this._channel.set_chat_state_async(state, null);
 | 
			
		||||
            this._chatState = state;
 | 
			
		||||
            this._channel.set_chat_state_async(state, null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ const SwitcherPopup = imports.ui.switcherPopup;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
 | 
			
		||||
var POPUP_APPICON_SIZE = 96;
 | 
			
		||||
var POPUP_FADE_TIME = 0.1; // seconds
 | 
			
		||||
 | 
			
		||||
var SortGroup = {
 | 
			
		||||
    TOP:    0,
 | 
			
		||||
@@ -33,7 +32,7 @@ var CtrlAltTabManager = class CtrlAltTabManager {
 | 
			
		||||
        item.iconName = icon;
 | 
			
		||||
 | 
			
		||||
        this._items.push(item);
 | 
			
		||||
        root.connect('destroy', () => { this.removeGroup(root); });
 | 
			
		||||
        root.connect('destroy', () => this.removeGroup(root));
 | 
			
		||||
        if (root instanceof St.Widget)
 | 
			
		||||
            global.focus_manager.add_group(root);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ class DashItemContainer extends St.Widget {
 | 
			
		||||
                      x_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
 | 
			
		||||
        this._labelText = "";
 | 
			
		||||
        this.label = new St.Label({ style_class: 'dash-label'});
 | 
			
		||||
        this.label = new St.Label({ style_class: 'dash-label' });
 | 
			
		||||
        this.label.hide();
 | 
			
		||||
        Main.layoutManager.addChrome(this.label);
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
@@ -81,7 +81,7 @@ class DashItemContainer extends St.Widget {
 | 
			
		||||
        let itemHeight = this.allocation.y2 - this.allocation.y1;
 | 
			
		||||
 | 
			
		||||
        let labelHeight = this.label.get_height();
 | 
			
		||||
        let yOffset = Math.floor((itemHeight - labelHeight) / 2)
 | 
			
		||||
        let yOffset = Math.floor((itemHeight - labelHeight) / 2);
 | 
			
		||||
 | 
			
		||||
        let y = stageY + yOffset;
 | 
			
		||||
 | 
			
		||||
@@ -198,9 +198,9 @@ class ShowAppsIcon extends DashItemContainer {
 | 
			
		||||
                                            toggle_mode: true });
 | 
			
		||||
        this._iconActor = null;
 | 
			
		||||
        this.icon = new IconGrid.BaseIcon(_("Show Applications"),
 | 
			
		||||
                                           { setSizeManually: true,
 | 
			
		||||
                                             showLabel: false,
 | 
			
		||||
                                             createIcon: this._createIcon.bind(this) });
 | 
			
		||||
                                          { setSizeManually: true,
 | 
			
		||||
                                            showLabel: false,
 | 
			
		||||
                                            createIcon: this._createIcon.bind(this) });
 | 
			
		||||
        this.toggleButton.add_actor(this.icon);
 | 
			
		||||
        this.toggleButton._delegate = this;
 | 
			
		||||
 | 
			
		||||
@@ -321,14 +321,14 @@ class DashActor extends St.Widget {
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let adjustedForWidth = themeNode.adjust_for_width(forWidth);
 | 
			
		||||
        let [, showAppsButton] = this.get_children();
 | 
			
		||||
        let [minHeight, ] = showAppsButton.get_preferred_height(adjustedForWidth);
 | 
			
		||||
        [minHeight, ] = themeNode.adjust_preferred_height(minHeight, natHeight);
 | 
			
		||||
        let [minHeight] = showAppsButton.get_preferred_height(adjustedForWidth);
 | 
			
		||||
        [minHeight] = themeNode.adjust_preferred_height(minHeight, natHeight);
 | 
			
		||||
 | 
			
		||||
        return [minHeight, natHeight];
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ];
 | 
			
		||||
const baseIconSizes = [16, 22, 24, 32, 48, 64];
 | 
			
		||||
 | 
			
		||||
var Dash = class Dash {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -648,10 +648,10 @@ var Dash = class Dash {
 | 
			
		||||
        let running = this._appSystem.get_running();
 | 
			
		||||
 | 
			
		||||
        let children = this._box.get_children().filter(actor => {
 | 
			
		||||
                return actor.child &&
 | 
			
		||||
                       actor.child._delegate &&
 | 
			
		||||
                       actor.child._delegate.app;
 | 
			
		||||
            });
 | 
			
		||||
            return actor.child &&
 | 
			
		||||
                   actor.child._delegate &&
 | 
			
		||||
                   actor.child._delegate.app;
 | 
			
		||||
        });
 | 
			
		||||
        // Apps currently in the dash
 | 
			
		||||
        let oldApps = children.map(actor => actor.child._delegate.app);
 | 
			
		||||
        // Apps supposed to be in the dash
 | 
			
		||||
@@ -700,14 +700,14 @@ var Dash = class Dash {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // App removed at oldIndex
 | 
			
		||||
            if (oldApp && newApps.indexOf(oldApp) == -1) {
 | 
			
		||||
            if (oldApp && !newApps.includes(oldApp)) {
 | 
			
		||||
                removedActors.push(children[oldIndex]);
 | 
			
		||||
                oldIndex++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // App added at newIndex
 | 
			
		||||
            if (newApp && oldApps.indexOf(newApp) == -1) {
 | 
			
		||||
            if (newApp && !oldApps.includes(newApp)) {
 | 
			
		||||
                addedItems.push({ app: newApp,
 | 
			
		||||
                                  item: this._createAppItem(newApp),
 | 
			
		||||
                                  pos: newIndex });
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ var TodayButton = class TodayButton {
 | 
			
		||||
        this._calendar.connect('selected-date-changed', (calendar, date) => {
 | 
			
		||||
            // Make the button reactive only if the selected date is not the
 | 
			
		||||
            // current date.
 | 
			
		||||
            this.actor.reactive = !_isToday(date)
 | 
			
		||||
            this.actor.reactive = !_isToday(date);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -217,7 +217,7 @@ var WeatherSection = class WeatherSection {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let box = new St.BoxLayout({ style_class: 'weather-box',
 | 
			
		||||
                                      vertical: true });
 | 
			
		||||
                                     vertical: true });
 | 
			
		||||
 | 
			
		||||
        this.actor.child = box;
 | 
			
		||||
 | 
			
		||||
@@ -357,7 +357,7 @@ var MessagesIndicator = class MessagesIndicator {
 | 
			
		||||
        Main.messageTray.connect('queue-changed', this._updateCount.bind(this));
 | 
			
		||||
 | 
			
		||||
        let sources = Main.messageTray.getSources();
 | 
			
		||||
        sources.forEach(source => { this._onSourceAdded(null, source); });
 | 
			
		||||
        sources.forEach(source => this._onSourceAdded(null, source));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSourceAdded(tray, source) {
 | 
			
		||||
@@ -373,7 +373,7 @@ var MessagesIndicator = class MessagesIndicator {
 | 
			
		||||
 | 
			
		||||
    _updateCount() {
 | 
			
		||||
        let count = 0;
 | 
			
		||||
        this._sources.forEach(source => { count += source.unseenCount; });
 | 
			
		||||
        this._sources.forEach(source => count += source.unseenCount);
 | 
			
		||||
        count -= Main.messageTray.queueCount;
 | 
			
		||||
 | 
			
		||||
        this.actor.visible = (count > 0);
 | 
			
		||||
@@ -384,8 +384,8 @@ var IndicatorPad = GObject.registerClass(
 | 
			
		||||
class IndicatorPad extends St.Widget {
 | 
			
		||||
    _init(actor) {
 | 
			
		||||
        this._source = actor;
 | 
			
		||||
        this._source.connect('notify::visible', () => { this.queue_relayout(); });
 | 
			
		||||
        this._source.connect('notify::size', () => { this.queue_relayout(); });
 | 
			
		||||
        this._source.connect('notify::visible', () => this.queue_relayout());
 | 
			
		||||
        this._source.connect('notify::size', () => this.queue_relayout());
 | 
			
		||||
        super._init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -459,7 +459,6 @@ class CalendarColumnLayout extends Clutter.BoxLayout {
 | 
			
		||||
var DateMenuButton = GObject.registerClass(
 | 
			
		||||
class DateMenuButton extends PanelMenu.Button {
 | 
			
		||||
    _init() {
 | 
			
		||||
        let item;
 | 
			
		||||
        let hbox;
 | 
			
		||||
        let vbox;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,9 @@ class Dialog extends St.Widget {
 | 
			
		||||
 | 
			
		||||
    _createDialog() {
 | 
			
		||||
        this._dialog = new St.BoxLayout({ style_class: 'modal-dialog',
 | 
			
		||||
                                          x_align:     Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          y_align:     Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          vertical:    true });
 | 
			
		||||
                                          x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          y_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          vertical: true });
 | 
			
		||||
 | 
			
		||||
        // modal dialogs are fixed width and grow vertically; set the request
 | 
			
		||||
        // mode accordingly so wrapped labels are handled correctly during
 | 
			
		||||
@@ -38,13 +38,13 @@ class Dialog extends St.Widget {
 | 
			
		||||
        this.contentLayout = new St.BoxLayout({ vertical: true,
 | 
			
		||||
                                                style_class: "modal-dialog-content-box" });
 | 
			
		||||
        this._dialog.add(this.contentLayout,
 | 
			
		||||
                         { expand:  true,
 | 
			
		||||
                           x_fill:  true,
 | 
			
		||||
                           y_fill:  true,
 | 
			
		||||
                         { expand: true,
 | 
			
		||||
                           x_fill: true,
 | 
			
		||||
                           y_fill: true,
 | 
			
		||||
                           x_align: St.Align.MIDDLE,
 | 
			
		||||
                           y_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
        this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout({ homogeneous:true }) });
 | 
			
		||||
        this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout({ homogeneous: true }) });
 | 
			
		||||
        this._dialog.add(this.buttonLayout,
 | 
			
		||||
                         { x_align: St.Align.MIDDLE,
 | 
			
		||||
                           y_align: St.Align.START });
 | 
			
		||||
@@ -116,11 +116,11 @@ class Dialog extends St.Widget {
 | 
			
		||||
 | 
			
		||||
        let button = new St.Button({ style_class: 'modal-dialog-linked-button',
 | 
			
		||||
                                     button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
 | 
			
		||||
                                     reactive:    true,
 | 
			
		||||
                                     can_focus:   true,
 | 
			
		||||
                                     x_expand:    true,
 | 
			
		||||
                                     y_expand:    true,
 | 
			
		||||
                                     label:       label });
 | 
			
		||||
                                     reactive: true,
 | 
			
		||||
                                     can_focus: true,
 | 
			
		||||
                                     x_expand: true,
 | 
			
		||||
                                     y_expand: true,
 | 
			
		||||
                                     label: label });
 | 
			
		||||
        button.connect('clicked', action);
 | 
			
		||||
 | 
			
		||||
        buttonInfo['button'] = button;
 | 
			
		||||
@@ -214,7 +214,10 @@ var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set icon(icon) {
 | 
			
		||||
        Object.assign(this._icon, { gicon: icon, visible: icon != null });
 | 
			
		||||
        this._icon.set({
 | 
			
		||||
            gicon: icon,
 | 
			
		||||
            visible: icon != null
 | 
			
		||||
        });
 | 
			
		||||
        this.notify('icon');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +234,10 @@ var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setLabel(label, prop, value) {
 | 
			
		||||
        Object.assign(label, { text: value || '', visible: value != null });
 | 
			
		||||
        label.set({
 | 
			
		||||
            text: value || '',
 | 
			
		||||
            visible: value != null
 | 
			
		||||
        });
 | 
			
		||||
        this.notify(prop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								js/ui/dnd.js
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								js/ui/dnd.js
									
									
									
									
									
								
							@@ -434,14 +434,13 @@ var _Draggable = class _Draggable {
 | 
			
		||||
                                   scale_y: scale * origScale,
 | 
			
		||||
                                   time: SCALE_ANIMATION_TIME,
 | 
			
		||||
                                   transition: 'easeOutQuad',
 | 
			
		||||
                                   onUpdate() {
 | 
			
		||||
                                   onUpdate: () => {
 | 
			
		||||
                                       let currentScale = this._dragActor.scale_x / origScale;
 | 
			
		||||
                                       this._dragOffsetX = currentScale * origDragOffsetX;
 | 
			
		||||
                                       this._dragOffsetY = currentScale * origDragOffsetY;
 | 
			
		||||
                                       this._dragActor.set_position(this._dragX + this._dragOffsetX,
 | 
			
		||||
                                                                    this._dragY + this._dragOffsetY);
 | 
			
		||||
                                   },
 | 
			
		||||
                                   onUpdateScope: this });
 | 
			
		||||
                                   } });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -561,11 +560,11 @@ var _Draggable = class _Draggable {
 | 
			
		||||
            let dropFunc = dragMonitors[i].dragDrop;
 | 
			
		||||
            if (dropFunc)
 | 
			
		||||
                switch (dropFunc(dropEvent)) {
 | 
			
		||||
                    case DragDropResult.FAILURE:
 | 
			
		||||
                    case DragDropResult.SUCCESS:
 | 
			
		||||
                        return true;
 | 
			
		||||
                    case DragDropResult.CONTINUE:
 | 
			
		||||
                        continue;
 | 
			
		||||
                case DragDropResult.FAILURE:
 | 
			
		||||
                case DragDropResult.SUCCESS:
 | 
			
		||||
                    return true;
 | 
			
		||||
                case DragDropResult.CONTINUE:
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -588,8 +587,9 @@ var _Draggable = class _Draggable {
 | 
			
		||||
                        if (this._restoreOnSuccess) {
 | 
			
		||||
                            this._restoreDragActor(event.get_time());
 | 
			
		||||
                            return true;
 | 
			
		||||
                        } else
 | 
			
		||||
                        } else {
 | 
			
		||||
                            this._dragActor.destroy();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    this._dragState = DragState.INIT;
 | 
			
		||||
@@ -689,12 +689,12 @@ var _Draggable = class _Draggable {
 | 
			
		||||
        params['onCompleteParams'] = [this._dragActor, eventTime];
 | 
			
		||||
 | 
			
		||||
        // start the animation
 | 
			
		||||
        Tweener.addTween(this._dragActor, params)
 | 
			
		||||
        Tweener.addTween(this._dragActor, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _finishAnimation() {
 | 
			
		||||
        if (!this._animationInProgress)
 | 
			
		||||
            return
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._animationInProgress = false;
 | 
			
		||||
        if (!this._buttonDown)
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ var EdgeDragAction = GObject.registerClass({
 | 
			
		||||
        this._allowedModes = allowedModes;
 | 
			
		||||
        this.set_n_touch_points(1);
 | 
			
		||||
 | 
			
		||||
        global.display.connect('grab-op-begin', () => { this.cancel(); });
 | 
			
		||||
        global.display.connect('grab-op-begin', () => this.cancel());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getMonitorRect(x, y) {
 | 
			
		||||
 
 | 
			
		||||
@@ -29,13 +29,9 @@ const UserWidget = imports.ui.userWidget;
 | 
			
		||||
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
let _endSessionDialog = null;
 | 
			
		||||
 | 
			
		||||
const _ITEM_ICON_SIZE = 48;
 | 
			
		||||
const _DIALOG_ICON_SIZE = 48;
 | 
			
		||||
 | 
			
		||||
var GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
 | 
			
		||||
 | 
			
		||||
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
 | 
			
		||||
 | 
			
		||||
const logoutDialogContent = {
 | 
			
		||||
@@ -53,7 +49,7 @@ const logoutDialogContent = {
 | 
			
		||||
    },
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedLogout',
 | 
			
		||||
                       label:  C_("button", "Log Out") }],
 | 
			
		||||
                       label: C_("button", "Log Out") }],
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-logout-icon',
 | 
			
		||||
    showOtherSessions: false,
 | 
			
		||||
};
 | 
			
		||||
@@ -69,9 +65,9 @@ const shutdownDialogContent = {
 | 
			
		||||
    checkBoxText: C_("checkbox", "Install pending software updates"),
 | 
			
		||||
    showBatteryWarning: true,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label:  C_("button", "Restart") },
 | 
			
		||||
                       label: C_("button", "Restart") },
 | 
			
		||||
                     { signal: 'ConfirmedShutdown',
 | 
			
		||||
                       label:  C_("button", "Power Off") }],
 | 
			
		||||
                       label: C_("button", "Power Off") }],
 | 
			
		||||
    iconName: 'system-shutdown-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
@@ -86,7 +82,7 @@ const restartDialogContent = {
 | 
			
		||||
    },
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label:  C_("button", "Restart") }],
 | 
			
		||||
                       label: C_("button", "Restart") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
@@ -102,7 +98,7 @@ const restartUpdateDialogContent = {
 | 
			
		||||
    },
 | 
			
		||||
    showBatteryWarning: true,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label:  C_("button", "Restart & Install") }],
 | 
			
		||||
                       label: C_("button", "Restart & Install") }],
 | 
			
		||||
    unusedFutureButtonForTranslation: C_("button", "Install & Power Off"),
 | 
			
		||||
    unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
@@ -122,18 +118,18 @@ const restartUpgradeDialogContent = {
 | 
			
		||||
    disableTimer: true,
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label:  C_("button", "Restart & Install") }],
 | 
			
		||||
                       label: C_("button", "Restart & Install") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const DialogType = {
 | 
			
		||||
  LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
 | 
			
		||||
  SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
 | 
			
		||||
  RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
 | 
			
		||||
  UPDATE_RESTART: 3,
 | 
			
		||||
  UPGRADE_RESTART: 4
 | 
			
		||||
    LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
 | 
			
		||||
    SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
 | 
			
		||||
    RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
 | 
			
		||||
    UPDATE_RESTART: 3,
 | 
			
		||||
    UPGRADE_RESTART: 4
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const DialogContent = {
 | 
			
		||||
@@ -159,7 +155,7 @@ function findAppFromInhibitor(inhibitor) {
 | 
			
		||||
    let desktopFile;
 | 
			
		||||
    try {
 | 
			
		||||
        [desktopFile] = inhibitor.GetAppIdSync();
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        // XXX -- sometimes JIT inhibitors generated by gnome-session
 | 
			
		||||
        // get removed too soon. Don't fail in this case.
 | 
			
		||||
        log('gnome-session gave us a dead inhibitor: %s'.format(inhibitor.get_object_path()));
 | 
			
		||||
@@ -223,7 +219,7 @@ function init() {
 | 
			
		||||
    // This always returns the same singleton object
 | 
			
		||||
    // By instantiating it initially, we register the
 | 
			
		||||
    // bus object, etc.
 | 
			
		||||
    _endSessionDialog = new EndSessionDialog();
 | 
			
		||||
    (new EndSessionDialog());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var EndSessionDialog = GObject.registerClass(
 | 
			
		||||
@@ -235,14 +231,13 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._loginManager = LoginManager.getLoginManager();
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default();
 | 
			
		||||
        this._user = this._userManager.get_user(GLib.get_user_name());
 | 
			
		||||
        this._updatesPermission = null;
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
 | 
			
		||||
                                                  'org.freedesktop.PackageKit',
 | 
			
		||||
                                                  '/org/freedesktop/PackageKit',
 | 
			
		||||
                                                  (proxy, error) => {
 | 
			
		||||
                                                      if (error)
 | 
			
		||||
                                                          log(error.message);
 | 
			
		||||
                                                  });
 | 
			
		||||
                                                  this._onPkOfflineProxyCreated.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._powerProxy = new UPowerProxy(Gio.DBus.system,
 | 
			
		||||
                                           'org.freedesktop.UPower',
 | 
			
		||||
                                           '/org/freedesktop/UPower',
 | 
			
		||||
@@ -276,8 +271,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this._iconBin = new St.Bin();
 | 
			
		||||
        mainContentLayout.add(this._iconBin,
 | 
			
		||||
                              { x_fill:  true,
 | 
			
		||||
                                y_fill:  false,
 | 
			
		||||
                              { x_fill: true,
 | 
			
		||||
                                y_fill: false,
 | 
			
		||||
                                x_align: St.Align.END,
 | 
			
		||||
                                y_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
@@ -290,7 +285,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        messageLayout.add(this._subjectLabel,
 | 
			
		||||
                          { x_fill: false,
 | 
			
		||||
                            y_fill:  false,
 | 
			
		||||
                            y_fill: false,
 | 
			
		||||
                            x_align: St.Align.START,
 | 
			
		||||
                            y_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
@@ -299,7 +294,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._descriptionLabel.clutter_text.line_wrap = true;
 | 
			
		||||
 | 
			
		||||
        messageLayout.add(this._descriptionLabel,
 | 
			
		||||
                          { y_fill:  true,
 | 
			
		||||
                          { y_fill: true,
 | 
			
		||||
                            y_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
        this._checkBox = new CheckBox.CheckBox();
 | 
			
		||||
@@ -337,14 +332,31 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._inhibitorSection.add_actor(this._sessionHeader);
 | 
			
		||||
        this._inhibitorSection.add_actor(this._sessionList);
 | 
			
		||||
 | 
			
		||||
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
 | 
			
		||||
        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onPkOfflineProxyCreated(proxy, error) {
 | 
			
		||||
        if (error) {
 | 
			
		||||
            log(error.message);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Creating a D-Bus proxy won't propagate SERVICE_UNKNOWN or NAME_HAS_NO_OWNER
 | 
			
		||||
        // errors if PackageKit is not available, but the GIO implementation will make
 | 
			
		||||
        // sure in that case that the proxy's g-name-owner is set to null, so check that.
 | 
			
		||||
        if (this._pkOfflineProxy.g_name_owner === null) {
 | 
			
		||||
            this._pkOfflineProxy = null;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // It only makes sense to check for this permission if PackageKit is available.
 | 
			
		||||
        try {
 | 
			
		||||
            this._updatesPermission = Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
 | 
			
		||||
            this._updatesPermission = Polkit.Permission.new_sync(
 | 
			
		||||
                "org.freedesktop.packagekit.trigger-offline-update", null, null);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('No permission to trigger offline updates: %s'.format(e.toString()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
 | 
			
		||||
        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onDestroy() {
 | 
			
		||||
@@ -391,7 +403,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Use a different description when we are installing a system upgrade
 | 
			
		||||
        if (dialogContent.upgradeDescription) {
 | 
			
		||||
        // if the PackageKit proxy is available (i.e. PackageKit is available).
 | 
			
		||||
        if (this._pkOfflineProxy && dialogContent.upgradeDescription) {
 | 
			
		||||
            let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
 | 
			
		||||
            let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
 | 
			
		||||
 | 
			
		||||
@@ -428,8 +441,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _updateButtons() {
 | 
			
		||||
        let dialogContent = DialogContent[this._type];
 | 
			
		||||
        let buttons = [{ action: this.cancel.bind(this),
 | 
			
		||||
                         label:  _("Cancel"),
 | 
			
		||||
                         key:    Clutter.Escape }];
 | 
			
		||||
                         label: _("Cancel"),
 | 
			
		||||
                         key: Clutter.Escape }];
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < dialogContent.confirmButtons.length; i++) {
 | 
			
		||||
            let signal = dialogContent.confirmButtons[i].signal;
 | 
			
		||||
@@ -476,19 +489,19 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        // Trigger the offline update as requested
 | 
			
		||||
        if (this._checkBox.actor.checked) {
 | 
			
		||||
            switch (signal) {
 | 
			
		||||
                case "ConfirmedReboot":
 | 
			
		||||
                    this._triggerOfflineUpdateReboot(callback);
 | 
			
		||||
                    break;
 | 
			
		||||
                case "ConfirmedShutdown":
 | 
			
		||||
                    // To actually trigger the offline update, we need to
 | 
			
		||||
                    // reboot to do the upgrade. When the upgrade is complete,
 | 
			
		||||
                    // the computer will shut down automatically.
 | 
			
		||||
                    signal = "ConfirmedReboot";
 | 
			
		||||
                    this._triggerOfflineUpdateShutdown(callback);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    callback();
 | 
			
		||||
                    break;
 | 
			
		||||
            case "ConfirmedReboot":
 | 
			
		||||
                this._triggerOfflineUpdateReboot(callback);
 | 
			
		||||
                break;
 | 
			
		||||
            case "ConfirmedShutdown":
 | 
			
		||||
                // To actually trigger the offline update, we need to
 | 
			
		||||
                // reboot to do the upgrade. When the upgrade is complete,
 | 
			
		||||
                // the computer will shut down automatically.
 | 
			
		||||
                signal = "ConfirmedReboot";
 | 
			
		||||
                this._triggerOfflineUpdateShutdown(callback);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                callback();
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this._triggerOfflineUpdateCancel(callback);
 | 
			
		||||
@@ -500,6 +513,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _triggerOfflineUpdateReboot(callback) {
 | 
			
		||||
        // Handle this gracefully if PackageKit is not available.
 | 
			
		||||
        if (!this._pkOfflineProxy) {
 | 
			
		||||
            callback();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
 | 
			
		||||
            if (error)
 | 
			
		||||
                log(error.message);
 | 
			
		||||
@@ -509,6 +528,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _triggerOfflineUpdateShutdown(callback) {
 | 
			
		||||
        // Handle this gracefully if PackageKit is not available.
 | 
			
		||||
        if (!this._pkOfflineProxy) {
 | 
			
		||||
            callback();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
 | 
			
		||||
            if (error)
 | 
			
		||||
                log(error.message);
 | 
			
		||||
@@ -518,6 +543,12 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _triggerOfflineUpdateCancel(callback) {
 | 
			
		||||
        // Handle this gracefully if PackageKit is not available.
 | 
			
		||||
        if (!this._pkOfflineProxy) {
 | 
			
		||||
            callback();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy.CancelRemote((result, error) => {
 | 
			
		||||
            if (error)
 | 
			
		||||
                log(error.message);
 | 
			
		||||
@@ -585,7 +616,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onInhibitorLoaded(inhibitor) {
 | 
			
		||||
        if (this._applications.indexOf(inhibitor) < 0) {
 | 
			
		||||
        if (!this._applications.includes(inhibitor)) {
 | 
			
		||||
            // Stale inhibitor
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -637,7 +668,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._loginManager.listSessions(result => {
 | 
			
		||||
            let n = 0;
 | 
			
		||||
            for (let i = 0; i < result.length; i++) {
 | 
			
		||||
                let[id, uid, userName, seat, sessionPath] = result[i];
 | 
			
		||||
                let [id, uid, userName, seat, sessionPath] = result[i];
 | 
			
		||||
                let proxy = new LogindSession(Gio.DBus.system, 'org.freedesktop.login1', sessionPath);
 | 
			
		||||
 | 
			
		||||
                if (proxy.Class != 'user')
 | 
			
		||||
@@ -680,7 +711,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._totalSecondsToStayOpen = totalSecondsToStayOpen;
 | 
			
		||||
        this._type = type;
 | 
			
		||||
 | 
			
		||||
        if (this._type == DialogType.RESTART) {
 | 
			
		||||
        // Only consider updates and upgrades if PackageKit is available.
 | 
			
		||||
        if (this._pkOfflineProxy && this._type == DialogType.RESTART) {
 | 
			
		||||
            if (this._pkOfflineProxy.UpdateTriggered)
 | 
			
		||||
                this._type = DialogType.UPDATE_RESTART;
 | 
			
		||||
            else if (this._pkOfflineProxy.UpgradeTriggered)
 | 
			
		||||
@@ -712,8 +744,9 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        if (dialogContent.showOtherSessions)
 | 
			
		||||
            this._loadSessions();
 | 
			
		||||
 | 
			
		||||
        let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
 | 
			
		||||
        let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
 | 
			
		||||
        // Only consider updates and upgrades if PackageKit is available.
 | 
			
		||||
        let updateTriggered = this._pkOfflineProxy ? this._pkOfflineProxy.UpdateTriggered : false;
 | 
			
		||||
        let updatePrepared = this._pkOfflineProxy ? this._pkOfflineProxy.UpdatePrepared : false;
 | 
			
		||||
        let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
 | 
			
		||||
 | 
			
		||||
        _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
 | 
			
		||||
 
 | 
			
		||||
@@ -57,8 +57,8 @@ function _patchLayoutClass(layoutClass, styleProps) {
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _loggingFunc() {
 | 
			
		||||
    let fields = {'MESSAGE': [].join.call(arguments, ', ')};
 | 
			
		||||
function _loggingFunc(...args) {
 | 
			
		||||
    let fields = { 'MESSAGE': args.join(', ') };
 | 
			
		||||
    let domain = "GNOME Shell";
 | 
			
		||||
 | 
			
		||||
    // If the caller is an extension, add it as metadata
 | 
			
		||||
@@ -111,10 +111,10 @@ function init() {
 | 
			
		||||
        let base = origToString.call(this);
 | 
			
		||||
        try {
 | 
			
		||||
            if ('actor' in this && this.actor instanceof Clutter.Actor)
 | 
			
		||||
                return base.replace(/\]$/, ' delegate for ' + this.actor.toString().substring(1));
 | 
			
		||||
                return base.replace(/\]$/, ` delegate for ${this.actor.toString().substring(1)}`);
 | 
			
		||||
            else
 | 
			
		||||
                return base;
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            return base;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,18 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Soup, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Soup } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Config = imports.misc.config;
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
const ExtensionUtils = imports.misc.extensionUtils;
 | 
			
		||||
const ExtensionSystem = imports.ui.extensionSystem;
 | 
			
		||||
const FileUtils = imports.misc.fileUtils;
 | 
			
		||||
const ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
 | 
			
		||||
const _signals = ExtensionSystem._signals;
 | 
			
		||||
 | 
			
		||||
var REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
 | 
			
		||||
var REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
 | 
			
		||||
var REPOSITORY_URL_INFO     = REPOSITORY_URL_BASE + '/extension-info/';
 | 
			
		||||
var REPOSITORY_URL_UPDATE   = REPOSITORY_URL_BASE + '/update-info/';
 | 
			
		||||
var REPOSITORY_URL_DOWNLOAD = `${REPOSITORY_URL_BASE}/download-extension/%s.shell-extension.zip`;
 | 
			
		||||
var REPOSITORY_URL_INFO     = `${REPOSITORY_URL_BASE}/extension-info/`;
 | 
			
		||||
var REPOSITORY_URL_UPDATE   = `${REPOSITORY_URL_BASE}/update-info/`;
 | 
			
		||||
 | 
			
		||||
let _httpSession;
 | 
			
		||||
 | 
			
		||||
@@ -25,7 +24,7 @@ function installExtension(uuid, invocation) {
 | 
			
		||||
 | 
			
		||||
    _httpSession.queue_message(message, (session, message) => {
 | 
			
		||||
        if (message.status_code != Soup.KnownStatusCode.OK) {
 | 
			
		||||
            ExtensionSystem.logExtensionError(uuid, 'downloading info: ' + message.status_code);
 | 
			
		||||
            ExtensionSystem.logExtensionError(uuid, `downloading info: ${message.status_code}`);
 | 
			
		||||
            invocation.return_dbus_error('org.gnome.Shell.DownloadInfoError', message.status_code.toString());
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -34,7 +33,7 @@ function installExtension(uuid, invocation) {
 | 
			
		||||
        try {
 | 
			
		||||
            info = JSON.parse(message.response_body.data);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            ExtensionSystem.logExtensionError(uuid, 'parsing info: ' + e);
 | 
			
		||||
            ExtensionSystem.logExtensionError(uuid, `parsing info: ${e}`);
 | 
			
		||||
            invocation.return_dbus_error('org.gnome.Shell.ParseInfoError', e.toString());
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -128,7 +127,7 @@ function updateExtension(uuid) {
 | 
			
		||||
            try {
 | 
			
		||||
                extension = ExtensionUtils.createExtensionObject(uuid, extensionDir, ExtensionUtils.ExtensionType.PER_USER);
 | 
			
		||||
                ExtensionSystem.loadExtension(extension);
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                if (extension)
 | 
			
		||||
                    ExtensionSystem.unloadExtension(extension);
 | 
			
		||||
 | 
			
		||||
@@ -187,26 +186,21 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this.setButtons([{ label: _("Cancel"),
 | 
			
		||||
                           action: this._onCancelButtonPressed.bind(this),
 | 
			
		||||
                           key:    Clutter.Escape
 | 
			
		||||
                           key: Clutter.Escape
 | 
			
		||||
                         },
 | 
			
		||||
                         { label:  _("Install"),
 | 
			
		||||
                         { label: _("Install"),
 | 
			
		||||
                           action: this._onInstallButtonPressed.bind(this),
 | 
			
		||||
                           default: true
 | 
			
		||||
                         }]);
 | 
			
		||||
 | 
			
		||||
        let message = _("Download and install “%s” from extensions.gnome.org?").format(info.name);
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({
 | 
			
		||||
            title: _("Download and install “%s” from extensions.gnome.org?").format(info.name),
 | 
			
		||||
            icon: new Gio.FileIcon({
 | 
			
		||||
                file: Gio.File.new_for_uri(`${REPOSITORY_URL_BASE}${info.icon}`)
 | 
			
		||||
            })
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let box = new St.BoxLayout({ style_class: 'message-dialog-main-layout',
 | 
			
		||||
                                     vertical: false });
 | 
			
		||||
        this.contentLayout.add(box);
 | 
			
		||||
 | 
			
		||||
        let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(REPOSITORY_URL_BASE + info.icon) })
 | 
			
		||||
        let icon = new St.Icon({ gicon: gicon });
 | 
			
		||||
        box.add(icon);
 | 
			
		||||
 | 
			
		||||
        let label = new St.Label({ style_class: 'message-dialog-title headline',
 | 
			
		||||
                                   text: message });
 | 
			
		||||
        box.add(label);
 | 
			
		||||
        this.contentLayout.add(content);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onCancelButtonPressed(button, event) {
 | 
			
		||||
@@ -226,13 +220,13 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        function errback(code, message) {
 | 
			
		||||
            let msg = message ? message.toString() : '';
 | 
			
		||||
            log('Error while installing %s: %s (%s)'.format(uuid, code, msg));
 | 
			
		||||
            invocation.return_dbus_error('org.gnome.Shell.' + code, msg);
 | 
			
		||||
            invocation.return_dbus_error(`org.gnome.Shell.${code}`, msg);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function callback() {
 | 
			
		||||
            // Add extension to 'enabled-extensions' for the user, always...
 | 
			
		||||
            let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
 | 
			
		||||
            if (enabledExtensions.indexOf(uuid) == -1) {
 | 
			
		||||
            if (!enabledExtensions.includes(uuid)) {
 | 
			
		||||
                enabledExtensions.push(uuid);
 | 
			
		||||
                global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
 | 
			
		||||
            }
 | 
			
		||||
@@ -240,7 +234,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            try {
 | 
			
		||||
                let extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER);
 | 
			
		||||
                ExtensionSystem.loadExtension(extension);
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                uninstallExtension(uuid);
 | 
			
		||||
                errback('LoadExtensionError', e);
 | 
			
		||||
                return;
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,7 @@ function disableExtension(uuid) {
 | 
			
		||||
        let uuid = orderReversed[i];
 | 
			
		||||
        try {
 | 
			
		||||
            ExtensionUtils.extensions[uuid].stateObj.disable();
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logExtensionError(uuid, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -77,7 +77,7 @@ function disableExtension(uuid) {
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        extension.stateObj.disable();
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        logExtensionError(uuid, e);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -85,7 +85,7 @@ function disableExtension(uuid) {
 | 
			
		||||
        let uuid = order[i];
 | 
			
		||||
        try {
 | 
			
		||||
            ExtensionUtils.extensions[uuid].stateObj.enable();
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logExtensionError(uuid, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -111,7 +111,7 @@ function enableExtension(uuid) {
 | 
			
		||||
 | 
			
		||||
    extensionOrder.push(uuid);
 | 
			
		||||
 | 
			
		||||
    let stylesheetNames = [global.session_mode + '.css', 'stylesheet.css'];
 | 
			
		||||
    let stylesheetNames = [`${global.session_mode}.css`, 'stylesheet.css'];
 | 
			
		||||
    let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
 | 
			
		||||
    for (let i = 0; i < stylesheetNames.length; i++) {
 | 
			
		||||
        try {
 | 
			
		||||
@@ -132,7 +132,7 @@ function enableExtension(uuid) {
 | 
			
		||||
        extension.state = ExtensionState.ENABLED;
 | 
			
		||||
        _signals.emit('extension-state-changed', extension);
 | 
			
		||||
        return;
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        if (extension.stylesheet) {
 | 
			
		||||
            theme.unload_stylesheet(extension.stylesheet);
 | 
			
		||||
            delete extension.stylesheet;
 | 
			
		||||
@@ -147,7 +147,7 @@ function logExtensionError(uuid, error) {
 | 
			
		||||
    if (!extension)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    let message = '' + error;
 | 
			
		||||
    let message = `${error}`;
 | 
			
		||||
 | 
			
		||||
    extension.state = ExtensionState.ERROR;
 | 
			
		||||
    if (!extension.errors)
 | 
			
		||||
@@ -169,7 +169,7 @@ function loadExtension(extension) {
 | 
			
		||||
    if (checkVersion && ExtensionUtils.isOutOfDate(extension)) {
 | 
			
		||||
        extension.state = ExtensionState.OUT_OF_DATE;
 | 
			
		||||
    } else {
 | 
			
		||||
        let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
 | 
			
		||||
        let enabled = enabledExtensions.includes(extension.uuid);
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            if (!initExtension(extension.uuid))
 | 
			
		||||
                return;
 | 
			
		||||
@@ -208,7 +208,7 @@ function reloadExtension(oldExtension) {
 | 
			
		||||
    let newExtension;
 | 
			
		||||
    try {
 | 
			
		||||
        newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        logExtensionError(uuid, e);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -235,7 +235,7 @@ function initExtension(uuid) {
 | 
			
		||||
    ExtensionUtils.installImporter(extension);
 | 
			
		||||
    try {
 | 
			
		||||
        extensionModule = extension.imports.extension;
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        logExtensionError(uuid, e);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -243,7 +243,7 @@ function initExtension(uuid) {
 | 
			
		||||
    if (extensionModule.init) {
 | 
			
		||||
        try {
 | 
			
		||||
            extensionState = extensionModule.init(extension);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logExtensionError(uuid, e);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
@@ -313,9 +313,9 @@ function _onVersionValidationChanged() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _loadExtensions() {
 | 
			
		||||
    global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
 | 
			
		||||
    global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
 | 
			
		||||
    global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged);
 | 
			
		||||
    global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, onEnabledExtensionsChanged);
 | 
			
		||||
    global.settings.connect(`changed::${DISABLE_USER_EXTENSIONS_KEY}`, onEnabledExtensionsChanged);
 | 
			
		||||
    global.settings.connect(`changed::${EXTENSION_DISABLE_VERSION_CHECK_KEY}`, _onVersionValidationChanged);
 | 
			
		||||
 | 
			
		||||
    enabledExtensions = getEnabledExtensions();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,15 +49,15 @@ var FocusCaretTracker = class FocusCaretTracker {
 | 
			
		||||
            this._atspiInited = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	return this._atspiInited;
 | 
			
		||||
        return this._atspiInited;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    registerFocusListener() {
 | 
			
		||||
        if (!this._initAtspi() || this._focusListenerRegistered)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._atspiListener.register(STATECHANGED + ':focused');
 | 
			
		||||
        this._atspiListener.register(STATECHANGED + ':selected');
 | 
			
		||||
        this._atspiListener.register(`${STATECHANGED}:focused`);
 | 
			
		||||
        this._atspiListener.register(`${STATECHANGED}:selected`);
 | 
			
		||||
        this._focusListenerRegistered = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -73,8 +73,8 @@ var FocusCaretTracker = class FocusCaretTracker {
 | 
			
		||||
        if (!this._focusListenerRegistered)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._atspiListener.deregister(STATECHANGED + ':focused');
 | 
			
		||||
        this._atspiListener.deregister(STATECHANGED + ':selected');
 | 
			
		||||
        this._atspiListener.deregister(`${STATECHANGED}:focused`);
 | 
			
		||||
        this._atspiListener.deregister(`${STATECHANGED}:selected`);
 | 
			
		||||
        this._focusListenerRegistered = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,7 @@ var GrabHelper = class GrabHelper {
 | 
			
		||||
    _isWithinGrabbedActor(actor) {
 | 
			
		||||
        let currentActor = this.currentGrab.actor;
 | 
			
		||||
        while (actor) {
 | 
			
		||||
            if (this._actors.indexOf(actor) != -1)
 | 
			
		||||
            if (this._actors.includes(actor))
 | 
			
		||||
                return true;
 | 
			
		||||
            if (actor == currentActor)
 | 
			
		||||
                return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,8 @@ const Main = imports.ui.main;
 | 
			
		||||
 | 
			
		||||
var MAX_CANDIDATES_PER_PAGE = 16;
 | 
			
		||||
 | 
			
		||||
var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
 | 
			
		||||
                             '9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
 | 
			
		||||
var DEFAULT_INDEX_LABELS = ['1', '2', '3', '4', '5', '6', '7', '8',
 | 
			
		||||
                            '9', '0', 'a', 'b', 'c', 'd', 'e', 'f'];
 | 
			
		||||
 | 
			
		||||
var CandidateArea = class CandidateArea {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -37,14 +37,14 @@ var CandidateArea = class CandidateArea {
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('scroll-event', (actor, event) => {
 | 
			
		||||
            let direction = event.get_scroll_direction();
 | 
			
		||||
            switch(direction) {
 | 
			
		||||
            switch (direction) {
 | 
			
		||||
            case Clutter.ScrollDirection.UP:
 | 
			
		||||
                this.emit('cursor-up');
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.ScrollDirection.DOWN:
 | 
			
		||||
                this.emit('cursor-down');
 | 
			
		||||
                break;
 | 
			
		||||
            };
 | 
			
		||||
            }
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -181,7 +181,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
                let window = global.display.focus_window.get_compositor_private();
 | 
			
		||||
                this._setDummyCursorGeometry(window.x + x, window.y + y, w, h);
 | 
			
		||||
            });
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            // Only recent IBus versions have support for this signal
 | 
			
		||||
            // which is used for wayland clients. In order to work
 | 
			
		||||
            // with older IBus versions we can silently ignore the
 | 
			
		||||
@@ -235,7 +235,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
            let indexes = [];
 | 
			
		||||
            let indexLabel;
 | 
			
		||||
            for (let i = 0; (indexLabel = lookupTable.get_label(i)); ++i)
 | 
			
		||||
                 indexes.push(indexLabel.get_text());
 | 
			
		||||
                indexes.push(indexLabel.get_text());
 | 
			
		||||
 | 
			
		||||
            Main.keyboard.resetSuggestions();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,11 @@ var MIN_ICON_SIZE = 16;
 | 
			
		||||
var EXTRA_SPACE_ANIMATION_TIME = 0.25;
 | 
			
		||||
 | 
			
		||||
var ANIMATION_TIME_IN = 0.350;
 | 
			
		||||
var ANIMATION_TIME_OUT = 1/2 * ANIMATION_TIME_IN;
 | 
			
		||||
var ANIMATION_MAX_DELAY_FOR_ITEM = 2/3 * ANIMATION_TIME_IN;
 | 
			
		||||
var ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 * ANIMATION_MAX_DELAY_FOR_ITEM;
 | 
			
		||||
var ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2/3 * ANIMATION_TIME_OUT;
 | 
			
		||||
var ANIMATION_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN;
 | 
			
		||||
var ANIMATION_TIME_OUT = 1 / 2 * ANIMATION_TIME_IN;
 | 
			
		||||
var ANIMATION_MAX_DELAY_FOR_ITEM = 2 / 3 * ANIMATION_TIME_IN;
 | 
			
		||||
var ANIMATION_BASE_DELAY_FOR_ITEM = 1 / 4 * ANIMATION_MAX_DELAY_FOR_ITEM;
 | 
			
		||||
var ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2 / 3 * ANIMATION_TIME_OUT;
 | 
			
		||||
var ANIMATION_FADE_IN_TIME_FOR_ITEM = 1 / 4 * ANIMATION_TIME_IN;
 | 
			
		||||
 | 
			
		||||
var ANIMATION_BOUNCE_ICON_SCALE = 1.1;
 | 
			
		||||
 | 
			
		||||
@@ -141,7 +141,7 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
 | 
			
		||||
function clamp(value, min, max) {
 | 
			
		||||
    return Math.max(Math.min(value, max), min);
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function zoomOutActor(actor) {
 | 
			
		||||
    let actorClone = new Clutter.Clone({ source: actor,
 | 
			
		||||
@@ -179,8 +179,8 @@ function zoomOutActor(actor) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var IconGrid = GObject.registerClass({
 | 
			
		||||
    Signals: {'animation-done': {},
 | 
			
		||||
              'child-focused': { param_types: [Clutter.Actor.$gtype]} },
 | 
			
		||||
    Signals: { 'animation-done': {},
 | 
			
		||||
               'child-focused': { param_types: [Clutter.Actor.$gtype] } },
 | 
			
		||||
}, class IconGrid extends St.Widget {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        super._init({ style_class: 'icon-grid',
 | 
			
		||||
@@ -276,7 +276,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        if (forWidth < 0)
 | 
			
		||||
            nColumns = children.length;
 | 
			
		||||
        else
 | 
			
		||||
            [nColumns, ] = this._computeLayout(forWidth);
 | 
			
		||||
            [nColumns] = this._computeLayout(forWidth);
 | 
			
		||||
 | 
			
		||||
        let nRows;
 | 
			
		||||
        if (nColumns > 0)
 | 
			
		||||
@@ -311,15 +311,15 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        let [nColumns, usedWidth] = this._computeLayout(availWidth);
 | 
			
		||||
 | 
			
		||||
        let leftEmptySpace;
 | 
			
		||||
        switch(this._xAlign) {
 | 
			
		||||
            case St.Align.START:
 | 
			
		||||
                leftEmptySpace = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.MIDDLE:
 | 
			
		||||
                leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.END:
 | 
			
		||||
                leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        switch (this._xAlign) {
 | 
			
		||||
        case St.Align.START:
 | 
			
		||||
            leftEmptySpace = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.MIDDLE:
 | 
			
		||||
            leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.END:
 | 
			
		||||
            leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let animating = this._clonesAnimating.length > 0;
 | 
			
		||||
@@ -377,15 +377,15 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        for (let child = this.get_first_child();
 | 
			
		||||
             child != null;
 | 
			
		||||
             child = child.get_next_sibling()) {
 | 
			
		||||
            child != null;
 | 
			
		||||
            child = child.get_next_sibling()) {
 | 
			
		||||
 | 
			
		||||
            if (!child.visible || !child.opacity)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            let childVolume = child.get_transformed_paint_volume(this);
 | 
			
		||||
            if (!childVolume)
 | 
			
		||||
                return false
 | 
			
		||||
                return false;
 | 
			
		||||
 | 
			
		||||
            paintVolume.union(childVolume);
 | 
			
		||||
        }
 | 
			
		||||
@@ -402,7 +402,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _cancelAnimation() {
 | 
			
		||||
        this._clonesAnimating.forEach(clone => { clone.destroy(); });
 | 
			
		||||
        this._clonesAnimating.forEach(clone => clone.destroy());
 | 
			
		||||
        this._clonesAnimating = [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -445,24 +445,24 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            let bounceUpTime = ANIMATION_TIME_IN / 4;
 | 
			
		||||
            let isLastItem = index == actors.length - 1;
 | 
			
		||||
            Tweener.addTween(actor,
 | 
			
		||||
                            { time: bounceUpTime,
 | 
			
		||||
                              transition: 'easeInOutQuad',
 | 
			
		||||
                              delay: delay,
 | 
			
		||||
                              scale_x: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                              scale_y: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                              onComplete: () => {
 | 
			
		||||
                                  Tweener.addTween(actor,
 | 
			
		||||
                                                   { time: ANIMATION_TIME_IN - bounceUpTime,
 | 
			
		||||
                                                     transition: 'easeInOutQuad',
 | 
			
		||||
                                                     scale_x: 1,
 | 
			
		||||
                                                     scale_y: 1,
 | 
			
		||||
                                                     onComplete: () => {
 | 
			
		||||
                                                        if (isLastItem)
 | 
			
		||||
                                                            this._animationDone();
 | 
			
		||||
                                                    }
 | 
			
		||||
                                                   });
 | 
			
		||||
                              }
 | 
			
		||||
                            });
 | 
			
		||||
                             { time: bounceUpTime,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               delay: delay,
 | 
			
		||||
                               scale_x: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                               scale_y: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   Tweener.addTween(actor,
 | 
			
		||||
                                                    { time: ANIMATION_TIME_IN - bounceUpTime,
 | 
			
		||||
                                                      transition: 'easeInOutQuad',
 | 
			
		||||
                                                      scale_x: 1,
 | 
			
		||||
                                                      scale_y: 1,
 | 
			
		||||
                                                      onComplete: () => {
 | 
			
		||||
                                                          if (isLastItem)
 | 
			
		||||
                                                              this._animationDone();
 | 
			
		||||
                                                      }
 | 
			
		||||
                                                    });
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -504,7 +504,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            this._clonesAnimating.push(actorClone);
 | 
			
		||||
            Main.uiGroup.add_actor(actorClone);
 | 
			
		||||
 | 
			
		||||
            let [width, height,,] = this._getAllocatedChildSizeAndSpacing(actor);
 | 
			
		||||
            let [width, height] = this._getAllocatedChildSizeAndSpacing(actor);
 | 
			
		||||
            actorClone.set_size(width, height);
 | 
			
		||||
            let scaleX = sourceScaledWidth / width;
 | 
			
		||||
            let scaleY = sourceScaledHeight / height;
 | 
			
		||||
@@ -531,7 +531,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
                                   onComplete: () => {
 | 
			
		||||
                                       if (isLastItem)
 | 
			
		||||
                                           this._animationDone();
 | 
			
		||||
                                   }};
 | 
			
		||||
                                   } };
 | 
			
		||||
                fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               delay: delay,
 | 
			
		||||
@@ -553,7 +553,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
                                   onComplete: () => {
 | 
			
		||||
                                       if (isLastItem)
 | 
			
		||||
                                           this._animationDone();
 | 
			
		||||
                                   }};
 | 
			
		||||
                                   } };
 | 
			
		||||
                fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM,
 | 
			
		||||
@@ -710,8 +710,8 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        if (this._padWithSpacing) {
 | 
			
		||||
            // minRows + 1 because we want to put spacing before the first row, so it is like we have one more row
 | 
			
		||||
            // to divide the empty space
 | 
			
		||||
            maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows +1));
 | 
			
		||||
            maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns +1));
 | 
			
		||||
            maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows + 1));
 | 
			
		||||
            maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns + 1));
 | 
			
		||||
        } else {
 | 
			
		||||
            if (this._minRows <=  1)
 | 
			
		||||
                maxVSpacing = maxEmptyVArea;
 | 
			
		||||
@@ -743,11 +743,10 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        this._fixedHItemSize = this._hItemSize;
 | 
			
		||||
        this._fixedVItemSize = this._vItemSize;
 | 
			
		||||
        this._updateSpacingForSize(availWidth, availHeight);
 | 
			
		||||
        let spacing = this._getSpacing();
 | 
			
		||||
 | 
			
		||||
        if (this.columnsForWidth(availWidth) < this._minColumns || this.rowsForHeight(availHeight) < this._minRows) {
 | 
			
		||||
            let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth ;
 | 
			
		||||
            let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight ;
 | 
			
		||||
            let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth;
 | 
			
		||||
            let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight;
 | 
			
		||||
 | 
			
		||||
            let neededSpacePerItem = (neededWidth > neededHeight) ? Math.ceil(neededWidth / this._minColumns)
 | 
			
		||||
                                                                  : Math.ceil(neededHeight / this._minRows);
 | 
			
		||||
@@ -771,8 +770,8 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
    Signals: {'space-opened': {},
 | 
			
		||||
              'space-closed': {} },
 | 
			
		||||
    Signals: { 'space-opened': {},
 | 
			
		||||
               'space-closed': {} },
 | 
			
		||||
}, class PaginatedIconGrid extends IconGrid {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        super._init(params);
 | 
			
		||||
@@ -789,7 +788,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_allocate(box, flags) {
 | 
			
		||||
         if (this._childrenPerPage == 0)
 | 
			
		||||
        if (this._childrenPerPage == 0)
 | 
			
		||||
            log('computePages() must be called before allocate(); pagination will not work.');
 | 
			
		||||
 | 
			
		||||
        this.set_allocation(box, flags);
 | 
			
		||||
@@ -802,26 +801,24 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
        let children = this._getVisibleChildren();
 | 
			
		||||
        let availWidth = box.x2 - box.x1;
 | 
			
		||||
        let availHeight = box.y2 - box.y1;
 | 
			
		||||
        let spacing = this._getSpacing();
 | 
			
		||||
        let [nColumns, usedWidth] = this._computeLayout(availWidth);
 | 
			
		||||
 | 
			
		||||
        let leftEmptySpace;
 | 
			
		||||
        switch(this._xAlign) {
 | 
			
		||||
            case St.Align.START:
 | 
			
		||||
                leftEmptySpace = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.MIDDLE:
 | 
			
		||||
                leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.END:
 | 
			
		||||
                leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        switch (this._xAlign) {
 | 
			
		||||
        case St.Align.START:
 | 
			
		||||
            leftEmptySpace = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.MIDDLE:
 | 
			
		||||
            leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.END:
 | 
			
		||||
            leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let x = box.x1 + leftEmptySpace + this.leftPadding;
 | 
			
		||||
        let y = box.y1 + this.topPadding;
 | 
			
		||||
        let columnIndex = 0;
 | 
			
		||||
        let rowIndex = 0;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < children.length; i++) {
 | 
			
		||||
            let childBox = this._calculateChildBox(children[i], x, y, box);
 | 
			
		||||
@@ -831,15 +828,15 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
            columnIndex++;
 | 
			
		||||
            if (columnIndex == nColumns) {
 | 
			
		||||
                columnIndex = 0;
 | 
			
		||||
                rowIndex++;
 | 
			
		||||
            }
 | 
			
		||||
            if (columnIndex == 0) {
 | 
			
		||||
                y += this._getVItemSize() + spacing;
 | 
			
		||||
                if ((i + 1) % this._childrenPerPage == 0)
 | 
			
		||||
                    y +=  this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding;
 | 
			
		||||
                x = box.x1 + leftEmptySpace + this.leftPadding;
 | 
			
		||||
            } else
 | 
			
		||||
            } else {
 | 
			
		||||
                x += this._getHItemSize() + spacing;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -863,7 +860,6 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        if (this._rowLimit)
 | 
			
		||||
            nRows = Math.min(nRows, this._rowLimit);
 | 
			
		||||
 | 
			
		||||
        let spacing = this._getSpacing();
 | 
			
		||||
        // We want to contain the grid inside the parent box with padding
 | 
			
		||||
        this._rowsPerPage = this.rowsForHeight(availHeightPerPage);
 | 
			
		||||
        this._nPages = Math.ceil(nRows / this._rowsPerPage);
 | 
			
		||||
@@ -892,7 +888,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        if (!this._nPages)
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        let firstPageItem = pageNumber * this._childrenPerPage
 | 
			
		||||
        let firstPageItem = pageNumber * this._childrenPerPage;
 | 
			
		||||
        let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box();
 | 
			
		||||
        return childBox.y1 - this.topPadding;
 | 
			
		||||
    }
 | 
			
		||||
@@ -971,7 +967,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
                           transition: 'easeInOutQuad'
 | 
			
		||||
                         };
 | 
			
		||||
            if (i == (children.length - 1))
 | 
			
		||||
                params.onComplete = () => { this.emit('space-opened'); };
 | 
			
		||||
                params.onComplete = () => this.emit('space-opened');
 | 
			
		||||
            Tweener.addTween(children[i], params);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -989,7 +985,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
                             { translation_y: 0,
 | 
			
		||||
                               time: EXTRA_SPACE_ANIMATION_TIME,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               onComplete: () => { this.emit('space-closed'); }
 | 
			
		||||
                               onComplete: () => this.emit('space-closed')
 | 
			
		||||
                             });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@ var InhibitShortcutsDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_show() {
 | 
			
		||||
        if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) {
 | 
			
		||||
        if (this._app && APP_WHITELIST.includes(this._app.get_id())) {
 | 
			
		||||
            this._emitResponse(DialogResponse.ALLOW);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,29 +24,29 @@ const SHOW_KEYBOARD = 'screen-keyboard-enabled';
 | 
			
		||||
const KEY_SIZE = 2;
 | 
			
		||||
 | 
			
		||||
const defaultKeysPre = [
 | 
			
		||||
    [ [], [], [{ width: 1.5, level: 1, extraClassName: 'shift-key-lowercase' }], [{ label: '?123', width: 1.5, level: 2 }] ],
 | 
			
		||||
    [ [], [], [{ width: 1.5, level: 0, extraClassName: 'shift-key-uppercase' }], [{ label: '?123', width: 1.5, level: 2 }] ],
 | 
			
		||||
    [ [], [], [{ label: '=/<', width: 1.5, level: 3 }], [{ label: 'ABC', width: 1.5, level: 0 }] ],
 | 
			
		||||
    [ [], [], [{ label: '?123', width: 1.5, level: 2 }], [{ label: 'ABC', width: 1.5, level: 0 }] ],
 | 
			
		||||
    [[], [], [{ width: 1.5, level: 1, extraClassName: 'shift-key-lowercase' }], [{ label: '?123', width: 1.5, level: 2 }]],
 | 
			
		||||
    [[], [], [{ width: 1.5, level: 0, extraClassName: 'shift-key-uppercase' }], [{ label: '?123', width: 1.5, level: 2 }]],
 | 
			
		||||
    [[], [], [{ label: '=/<', width: 1.5, level: 3 }], [{ label: 'ABC', width: 1.5, level: 0 }]],
 | 
			
		||||
    [[], [], [{ label: '?123', width: 1.5, level: 2 }], [{ label: 'ABC', width: 1.5, level: 0 }]],
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const defaultKeysPost = [
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ label: '=/<', width: 3, level: 3, right: true }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ label: '?123', width: 3, level: 2, right: true }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ label: '=/<', width: 3, level: 3, right: true }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ label: '?123', width: 3, level: 2, right: true }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var AspectContainer = GObject.registerClass(
 | 
			
		||||
@@ -297,7 +297,7 @@ var Key = class Key {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _press(key) {
 | 
			
		||||
        this.emit('activated')
 | 
			
		||||
        this.emit('activated');
 | 
			
		||||
 | 
			
		||||
        if (key != this.key || this._extended_keys.length == 0) {
 | 
			
		||||
            this.emit('pressed', this._getKeyval(key), key);
 | 
			
		||||
@@ -405,9 +405,6 @@ var Key = class Key {
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
        button.connect('touch-event', (actor, event) => {
 | 
			
		||||
            let device = event.get_device();
 | 
			
		||||
            let sequence = event.get_event_sequence();
 | 
			
		||||
 | 
			
		||||
            // We only handle touch events here on wayland. On X11
 | 
			
		||||
            // we do get emulated pointer events, which already works
 | 
			
		||||
            // for single-touch cases. Besides, the X11 passive touch grab
 | 
			
		||||
@@ -683,7 +680,7 @@ var EmojiPager = class EmojiPager {
 | 
			
		||||
 | 
			
		||||
    _onPanEnd() {
 | 
			
		||||
        if (Math.abs(this._delta) < this.actor.width * PANEL_SWITCH_RELATIVE_DISTANCE) {
 | 
			
		||||
            this._onPanCancel()
 | 
			
		||||
            this._onPanCancel();
 | 
			
		||||
        } else {
 | 
			
		||||
            let value;
 | 
			
		||||
            if (this._delta > 0)
 | 
			
		||||
@@ -865,7 +862,7 @@ var EmojiSelection = class EmojiSelection {
 | 
			
		||||
                                        x_expand: true,
 | 
			
		||||
                                        y_expand: true,
 | 
			
		||||
                                        vertical: true });
 | 
			
		||||
        this.actor.connect('notify::mapped', () => { this._emojiPager.setCurrentPage(0); });
 | 
			
		||||
        this.actor.connect('notify::mapped', () => this._emojiPager.setCurrentPage(0));
 | 
			
		||||
 | 
			
		||||
        this._emojiPager = new EmojiPager(this._sections, 11, 3);
 | 
			
		||||
        this._emojiPager.connect('page-changed', (pager, section, page, nPages) => {
 | 
			
		||||
@@ -913,7 +910,6 @@ var EmojiSelection = class EmojiSelection {
 | 
			
		||||
            contents = imports.byteArray.toString(contents);
 | 
			
		||||
        let emoji = JSON.parse(contents);
 | 
			
		||||
 | 
			
		||||
        let pages = [];
 | 
			
		||||
        let variants = [];
 | 
			
		||||
        let currentKey = 0;
 | 
			
		||||
        let currentSection = null;
 | 
			
		||||
@@ -948,14 +944,14 @@ var EmojiSelection = class EmojiSelection {
 | 
			
		||||
 | 
			
		||||
        key = new Key('ABC', []);
 | 
			
		||||
        key.keyButton.add_style_class_name('default-key');
 | 
			
		||||
        key.connect('released', () => { this.emit('toggle'); });
 | 
			
		||||
        key.connect('released', () => this.emit('toggle'));
 | 
			
		||||
        row.appendKey(key.actor, 1.5);
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < this._sections.length; i++) {
 | 
			
		||||
            let section = this._sections[i];
 | 
			
		||||
 | 
			
		||||
            key = new Key(section.label, []);
 | 
			
		||||
            key.connect('released', () => { this._emojiPager.setCurrentSection(section, 0) });
 | 
			
		||||
            key.connect('released', () => this._emojiPager.setCurrentSection(section, 0));
 | 
			
		||||
            row.appendKey(key.actor);
 | 
			
		||||
 | 
			
		||||
            section.button = key;
 | 
			
		||||
@@ -1074,7 +1070,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
                let manager = Clutter.DeviceManager.get_default();
 | 
			
		||||
                let device = manager.get_device(deviceId);
 | 
			
		||||
 | 
			
		||||
                if (device.get_device_name().indexOf('XTEST') < 0) {
 | 
			
		||||
                if (!device.get_device_name().includes('XTEST')) {
 | 
			
		||||
                    this._lastDeviceId = deviceId;
 | 
			
		||||
                    this._syncEnabled();
 | 
			
		||||
                }
 | 
			
		||||
@@ -1175,7 +1171,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
 | 
			
		||||
        this._emojiSelection = new EmojiSelection();
 | 
			
		||||
        this._emojiSelection.connect('toggle', this._toggleEmoji.bind(this));
 | 
			
		||||
        this._emojiSelection.connect('hide', (selection) => { this.hide(); });
 | 
			
		||||
        this._emojiSelection.connect('hide', (selection) => this.hide());
 | 
			
		||||
        this._emojiSelection.connect('emoji-selected', (selection, emoji) => {
 | 
			
		||||
            this._keyboardController.commitString(emoji);
 | 
			
		||||
        });
 | 
			
		||||
@@ -1228,12 +1224,12 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!this._showIdleId) {
 | 
			
		||||
          this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
 | 
			
		||||
              this.show(Main.layoutManager.focusIndex);
 | 
			
		||||
              this._showIdleId = 0;
 | 
			
		||||
              return GLib.SOURCE_REMOVE;
 | 
			
		||||
          });
 | 
			
		||||
          GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
 | 
			
		||||
            this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
 | 
			
		||||
                this.show(Main.layoutManager.focusIndex);
 | 
			
		||||
                this._showIdleId = 0;
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
            GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1406,8 +1402,6 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDefaultKeysForRow(row, numRows, level) {
 | 
			
		||||
        let pre, post;
 | 
			
		||||
 | 
			
		||||
        /* The first 2 rows in defaultKeysPre/Post belong together with
 | 
			
		||||
         * the first 2 rows on each keymap. On keymaps that have more than
 | 
			
		||||
         * 4 rows, the last 2 default key rows must be respectively
 | 
			
		||||
@@ -1448,8 +1442,8 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        numOfVertSlots = rows.length;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < rows.length; ++i) {
 | 
			
		||||
            let keyboard_row = rows[i];
 | 
			
		||||
            let keys = keyboard_row.get_children();
 | 
			
		||||
            let keyboardRow = rows[i];
 | 
			
		||||
            let keys = keyboardRow.get_children();
 | 
			
		||||
 | 
			
		||||
            numOfHorizSlots = Math.max(numOfHorizSlots, keys.length);
 | 
			
		||||
        }
 | 
			
		||||
@@ -1646,8 +1640,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _windowSlideAnimationComplete(window, delta) {
 | 
			
		||||
        // Synchronize window and actor positions again.
 | 
			
		||||
        let windowActor = window.get_compositor_private();
 | 
			
		||||
        // Synchronize window positions again.
 | 
			
		||||
        let frameRect = window.get_frame_rect();
 | 
			
		||||
        frameRect.y += delta;
 | 
			
		||||
        window.move_frame(true, frameRect.x, frameRect.y);
 | 
			
		||||
@@ -1688,12 +1681,11 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._animFocusedWindow = window;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setCursorLocation(window, x, y , w, h) {
 | 
			
		||||
    setCursorLocation(window, x, y, w, h) {
 | 
			
		||||
        let monitor = Main.layoutManager.keyboardMonitor;
 | 
			
		||||
 | 
			
		||||
        if (window && monitor) {
 | 
			
		||||
            let keyboardHeight = Main.layoutManager.keyboardBox.height;
 | 
			
		||||
            let focusObscured = false;
 | 
			
		||||
 | 
			
		||||
            if (y + h >= monitor.y + monitor.height - keyboardHeight) {
 | 
			
		||||
                if (this._keyboardVisible)
 | 
			
		||||
@@ -1744,7 +1736,6 @@ var KeyboardController = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onContentPurposeHintsChanged(method) {
 | 
			
		||||
        let hints = method.content_hints;
 | 
			
		||||
        let purpose = method.content_purpose;
 | 
			
		||||
        let emojiVisible = false;
 | 
			
		||||
        let keypadVisible = false;
 | 
			
		||||
@@ -1759,13 +1750,13 @@ var KeyboardController = class {
 | 
			
		||||
            purpose == Clutter.InputContentPurpose.PHONE)
 | 
			
		||||
            keypadVisible = true;
 | 
			
		||||
 | 
			
		||||
        this.emit('emoji-visible', emojiVisible)
 | 
			
		||||
        this.emit('emoji-visible', emojiVisible);
 | 
			
		||||
        this.emit('keypad-visible', keypadVisible);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getGroups() {
 | 
			
		||||
        let inputSources = this._inputSourceManager.inputSources;
 | 
			
		||||
        let groups = []
 | 
			
		||||
        let groups = [];
 | 
			
		||||
 | 
			
		||||
        for (let i in inputSources) {
 | 
			
		||||
            let is = inputSources[i];
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ var HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
 | 
			
		||||
var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
 | 
			
		||||
 | 
			
		||||
function isPopupMetaWindow(actor) {
 | 
			
		||||
    switch(actor.meta_window.get_window_type()) {
 | 
			
		||||
    switch (actor.meta_window.get_window_type()) {
 | 
			
		||||
    case Meta.WindowType.DROPDOWN_MENU:
 | 
			
		||||
    case Meta.WindowType.POPUP_MENU:
 | 
			
		||||
    case Meta.WindowType.COMBO:
 | 
			
		||||
@@ -32,18 +32,20 @@ function isPopupMetaWindow(actor) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var MonitorConstraint = GObject.registerClass({
 | 
			
		||||
    Properties: {'primary': GObject.ParamSpec.boolean('primary', 
 | 
			
		||||
                                                      'Primary', 'Track primary monitor',
 | 
			
		||||
                                                      GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                      false),
 | 
			
		||||
                 'index': GObject.ParamSpec.int('index',
 | 
			
		||||
                                                'Monitor index', 'Track specific monitor',
 | 
			
		||||
                                                GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                -1, 64, -1),
 | 
			
		||||
                 'work-area': GObject.ParamSpec.boolean('work-area',
 | 
			
		||||
                                                        'Work-area', 'Track monitor\'s work-area',
 | 
			
		||||
                                                        GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                        false)},
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'primary': GObject.ParamSpec.boolean('primary',
 | 
			
		||||
                                             'Primary', 'Track primary monitor',
 | 
			
		||||
                                             GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                             false),
 | 
			
		||||
        'index': GObject.ParamSpec.int('index',
 | 
			
		||||
                                       'Monitor index', 'Track specific monitor',
 | 
			
		||||
                                       GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                       -1, 64, -1),
 | 
			
		||||
        'work-area': GObject.ParamSpec.boolean('work-area',
 | 
			
		||||
                                               'Work-area', 'Track monitor\'s work-area',
 | 
			
		||||
                                               GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                               false)
 | 
			
		||||
    },
 | 
			
		||||
}, class MonitorConstraint extends Clutter.Constraint {
 | 
			
		||||
    _init(props) {
 | 
			
		||||
        this._primary = false;
 | 
			
		||||
@@ -147,13 +149,13 @@ var MonitorConstraint = GObject.registerClass({
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var Monitor = class Monitor {
 | 
			
		||||
    constructor(index, geometry, geometry_scale) {
 | 
			
		||||
    constructor(index, geometry, geometryScale) {
 | 
			
		||||
        this.index = index;
 | 
			
		||||
        this.x = geometry.x;
 | 
			
		||||
        this.y = geometry.y;
 | 
			
		||||
        this.width = geometry.width;
 | 
			
		||||
        this.height = geometry.height;
 | 
			
		||||
        this.geometry_scale = geometry_scale;
 | 
			
		||||
        this.geometry_scale = geometryScale;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get inFullscreen() {
 | 
			
		||||
@@ -1067,7 +1069,7 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
                else
 | 
			
		||||
                    continue;
 | 
			
		||||
 | 
			
		||||
                let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1});
 | 
			
		||||
                let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1 });
 | 
			
		||||
                let strut = new Meta.Strut({ rect: strutRect, side: side });
 | 
			
		||||
                struts.push(strut);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,21 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, St } = imports.gi;
 | 
			
		||||
const { Gio } = imports.gi;
 | 
			
		||||
const Ripples = imports.ui.ripples;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
 | 
			
		||||
const LOCATE_POINTER_KEY = "locate-pointer";
 | 
			
		||||
const LOCATE_POINTER_SCHEMA = "org.gnome.desktop.interface"
 | 
			
		||||
const LOCATE_POINTER_SCHEMA = "org.gnome.desktop.interface";
 | 
			
		||||
 | 
			
		||||
var locatePointer = class {
 | 
			
		||||
var LocatePointer = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this._settings = new Gio.Settings({schema_id: LOCATE_POINTER_SCHEMA});
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: LOCATE_POINTER_SCHEMA });
 | 
			
		||||
        this._ripples = new Ripples.Ripples(0.5, 0.5, 'ripple-pointer-location');
 | 
			
		||||
        this._ripples.addTo(Main.uiGroup);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    show() {
 | 
			
		||||
        if (!this._settings.get_boolean("locate-pointer"))
 | 
			
		||||
        if (!this._settings.get_boolean(LOCATE_POINTER_KEY))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let [x, y, mods] = global.get_pointer();
 | 
			
		||||
 
 | 
			
		||||
@@ -68,10 +68,10 @@ var AutoComplete = class AutoComplete {
 | 
			
		||||
            if (commonPrefix.length > 0) {
 | 
			
		||||
                this.additionalCompletionText(commonPrefix, event.attrHead);
 | 
			
		||||
                this.emit('completion', { completion: commonPrefix, type: 'prefix' });
 | 
			
		||||
                this.emit('suggest', { completions: event.completions});
 | 
			
		||||
                this.emit('suggest', { completions: event.completions });
 | 
			
		||||
            }
 | 
			
		||||
        } else if (event.completions.length > 1 && event.tabType === 'double') {
 | 
			
		||||
            this.emit('suggest', { completions: event.completions});
 | 
			
		||||
            this.emit('suggest', { completions: event.completions });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -146,8 +146,8 @@ var Notebook = class Notebook {
 | 
			
		||||
        this.actor.add(scrollview, { expand: true });
 | 
			
		||||
 | 
			
		||||
        let vAdjust = scrollview.vscroll.adjustment;
 | 
			
		||||
        vAdjust.connect('changed', () => { this._onAdjustScopeChanged(tabData); });
 | 
			
		||||
        vAdjust.connect('notify::value', () => { this._onAdjustValueChanged(tabData); });
 | 
			
		||||
        vAdjust.connect('changed', () => this._onAdjustScopeChanged(tabData));
 | 
			
		||||
        vAdjust.connect('notify::value', () => this._onAdjustValueChanged(tabData));
 | 
			
		||||
 | 
			
		||||
        if (this._selectedIndex == -1)
 | 
			
		||||
            this.selectIndex(0);
 | 
			
		||||
@@ -185,9 +185,9 @@ var Notebook = class Notebook {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    selectChild(child) {
 | 
			
		||||
        if (child == null)
 | 
			
		||||
        if (child == null) {
 | 
			
		||||
            this.selectIndex(-1);
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            for (let i = 0; i < this._tabs.length; i++) {
 | 
			
		||||
                let tabData = this._tabs[i];
 | 
			
		||||
                if (tabData.child == child) {
 | 
			
		||||
@@ -242,7 +242,7 @@ function objectToString(o) {
 | 
			
		||||
        // special case this since the default is way, way too verbose
 | 
			
		||||
        return '<js function>';
 | 
			
		||||
    } else {
 | 
			
		||||
        return '' + o;
 | 
			
		||||
        return `${o}`;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -284,7 +284,7 @@ var Result = class Result {
 | 
			
		||||
        this.actor.add(cmdTxt);
 | 
			
		||||
        let box = new St.BoxLayout({});
 | 
			
		||||
        this.actor.add(box);
 | 
			
		||||
        let resultTxt = new St.Label({ text: 'r(' + index + ') = ' });
 | 
			
		||||
        let resultTxt = new St.Label({ text: `r(${index}) = ` });
 | 
			
		||||
        resultTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END;
 | 
			
		||||
        box.add(resultTxt);
 | 
			
		||||
        let objLink = new ObjLink(this._lookingGlass, o);
 | 
			
		||||
@@ -320,7 +320,7 @@ var WindowList = class WindowList {
 | 
			
		||||
            box.add(windowLink.actor, { x_align: St.Align.START, x_fill: false });
 | 
			
		||||
            let propsBox = new St.BoxLayout({ vertical: true, style: 'padding-left: 6px;' });
 | 
			
		||||
            box.add(propsBox);
 | 
			
		||||
            propsBox.add(new St.Label({ text: 'wmclass: ' + metaWindow.get_wm_class() }));
 | 
			
		||||
            propsBox.add(new St.Label({ text: `wmclass: ${metaWindow.get_wm_class()}` }));
 | 
			
		||||
            let app = tracker.get_window_app(metaWindow);
 | 
			
		||||
            if (app != null && !app.is_window_backed()) {
 | 
			
		||||
                let icon = app.create_icon_texture(22);
 | 
			
		||||
@@ -394,7 +394,6 @@ var ObjInspector = class ObjInspector {
 | 
			
		||||
 | 
			
		||||
            for (let i = 0; i < properties.length; i++) {
 | 
			
		||||
                let propName = properties[i];
 | 
			
		||||
                let valueStr;
 | 
			
		||||
                let link;
 | 
			
		||||
                try {
 | 
			
		||||
                    let prop = obj[propName];
 | 
			
		||||
@@ -403,8 +402,7 @@ var ObjInspector = class ObjInspector {
 | 
			
		||||
                    link = new St.Label({ text: '<error>' });
 | 
			
		||||
                }
 | 
			
		||||
                let hbox = new St.BoxLayout();
 | 
			
		||||
                let propText = propName + ': ' + valueStr;
 | 
			
		||||
                hbox.add(new St.Label({ text: propName + ': ' }));
 | 
			
		||||
                hbox.add(new St.Label({ text: `${propName}: ` }));
 | 
			
		||||
                hbox.add(link);
 | 
			
		||||
                this._container.add_actor(hbox);
 | 
			
		||||
            }
 | 
			
		||||
@@ -493,8 +491,13 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
        eventHandler.connect('button-press-event', this._onButtonPressEvent.bind(this));
 | 
			
		||||
        eventHandler.connect('scroll-event', this._onScrollEvent.bind(this));
 | 
			
		||||
        eventHandler.connect('motion-event', this._onMotionEvent.bind(this));
 | 
			
		||||
        Clutter.grab_pointer(eventHandler);
 | 
			
		||||
        Clutter.grab_keyboard(eventHandler);
 | 
			
		||||
 | 
			
		||||
        let dm = Clutter.DeviceManager.get_default();
 | 
			
		||||
        this._pointerDevice = dm.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
 | 
			
		||||
        this._keyboardDevice = dm.get_core_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
 | 
			
		||||
 | 
			
		||||
        this._pointerDevice.grab(eventHandler);
 | 
			
		||||
        this._keyboardDevice.grab(eventHandler);
 | 
			
		||||
 | 
			
		||||
        // this._target is the actor currently shown by the inspector.
 | 
			
		||||
        // this._pointerTarget is the actor directly under the pointer.
 | 
			
		||||
@@ -527,8 +530,8 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _close() {
 | 
			
		||||
        Clutter.ungrab_pointer();
 | 
			
		||||
        Clutter.ungrab_keyboard();
 | 
			
		||||
        this._pointerDevice.ungrab();
 | 
			
		||||
        this._keyboardDevice.ungrab();
 | 
			
		||||
        this._eventHandler.destroy();
 | 
			
		||||
        this._eventHandler = null;
 | 
			
		||||
        this.emit('closed');
 | 
			
		||||
@@ -551,7 +554,7 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    _onScrollEvent(actor, event) {
 | 
			
		||||
        switch (event.get_scroll_direction()) {
 | 
			
		||||
        case Clutter.ScrollDirection.UP:
 | 
			
		||||
        case Clutter.ScrollDirection.UP: {
 | 
			
		||||
            // select parent
 | 
			
		||||
            let parent = this._target.get_parent();
 | 
			
		||||
            if (parent != null) {
 | 
			
		||||
@@ -559,6 +562,7 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
                this._update(event);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        case Clutter.ScrollDirection.DOWN:
 | 
			
		||||
            // select child
 | 
			
		||||
@@ -598,9 +602,9 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
            this._target = target;
 | 
			
		||||
        this._pointerTarget = target;
 | 
			
		||||
 | 
			
		||||
        let position = '[inspect x: ' + stageX + ' y: ' + stageY + ']';
 | 
			
		||||
        let position = `[inspect x: ${stageX} y: ${stageY}]`;
 | 
			
		||||
        this._displayText.text = '';
 | 
			
		||||
        this._displayText.text = position + ' ' + this._target;
 | 
			
		||||
        this._displayText.text = `${position} ${this._target}`;
 | 
			
		||||
 | 
			
		||||
        this._lookingGlass.setBorderPaintTarget(this._target);
 | 
			
		||||
    }
 | 
			
		||||
@@ -612,7 +616,7 @@ var Extensions = class Extensions {
 | 
			
		||||
        this.actor = new St.BoxLayout({ vertical: true,
 | 
			
		||||
                                        name: 'lookingGlassExtensions' });
 | 
			
		||||
        this._noExtensions = new St.Label({ style_class: 'lg-extensions-none',
 | 
			
		||||
                                             text: _("No extensions installed") });
 | 
			
		||||
                                            text: _("No extensions installed") });
 | 
			
		||||
        this._numExtensions = 0;
 | 
			
		||||
        this._extensionsList = new St.BoxLayout({ vertical: true,
 | 
			
		||||
                                                  style_class: 'lg-extensions-list' });
 | 
			
		||||
@@ -684,17 +688,17 @@ var Extensions = class Extensions {
 | 
			
		||||
 | 
			
		||||
    _stateToString(extensionState) {
 | 
			
		||||
        switch (extensionState) {
 | 
			
		||||
            case ExtensionSystem.ExtensionState.ENABLED:
 | 
			
		||||
                return _("Enabled");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.DISABLED:
 | 
			
		||||
            case ExtensionSystem.ExtensionState.INITIALIZED:
 | 
			
		||||
                return _("Disabled");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.ERROR:
 | 
			
		||||
                return _("Error");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.OUT_OF_DATE:
 | 
			
		||||
                return _("Out of date");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.DOWNLOADING:
 | 
			
		||||
                return _("Downloading");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.ENABLED:
 | 
			
		||||
            return _("Enabled");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.DISABLED:
 | 
			
		||||
        case ExtensionSystem.ExtensionState.INITIALIZED:
 | 
			
		||||
            return _("Disabled");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.ERROR:
 | 
			
		||||
            return _("Error");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.OUT_OF_DATE:
 | 
			
		||||
            return _("Out of date");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.DOWNLOADING:
 | 
			
		||||
            return _("Downloading");
 | 
			
		||||
        }
 | 
			
		||||
        return 'Unknown'; // Not translated, shouldn't appear
 | 
			
		||||
    }
 | 
			
		||||
@@ -702,7 +706,7 @@ var Extensions = class Extensions {
 | 
			
		||||
    _createExtensionDisplay(extension) {
 | 
			
		||||
        let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true });
 | 
			
		||||
        let name = new St.Label({ style_class: 'lg-extension-name',
 | 
			
		||||
                                   text: extension.metadata.name });
 | 
			
		||||
                                  text: extension.metadata.name });
 | 
			
		||||
        box.add(name, { expand: true });
 | 
			
		||||
        let description = new St.Label({ style_class: 'lg-extension-description',
 | 
			
		||||
                                         text: extension.metadata.description || 'No description' });
 | 
			
		||||
@@ -710,7 +714,6 @@ var Extensions = class Extensions {
 | 
			
		||||
 | 
			
		||||
        let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' });
 | 
			
		||||
        box.add(metaBox);
 | 
			
		||||
        let stateString = this._stateToString(extension.state);
 | 
			
		||||
        let state = new St.Label({ style_class: 'lg-extension-state',
 | 
			
		||||
                                   text: this._stateToString(extension.state) });
 | 
			
		||||
        metaBox.add(state);
 | 
			
		||||
@@ -795,7 +798,7 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        inspectIcon.connect('button-press-event', () => {
 | 
			
		||||
            let inspector = new Inspector(this);
 | 
			
		||||
            inspector.connect('target', (i, target, stageX, stageY) => {
 | 
			
		||||
                this._pushResult('inspect(' + Math.round(stageX) + ', ' + Math.round(stageY) + ')', target);
 | 
			
		||||
                this._pushResult(`inspect(${Math.round(stageX)}, ${Math.round(stageY)})`, target);
 | 
			
		||||
            });
 | 
			
		||||
            inspector.connect('closed', () => {
 | 
			
		||||
                this.actor.show();
 | 
			
		||||
@@ -810,15 +813,15 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        toolbar.add_actor(gcIcon);
 | 
			
		||||
        gcIcon.reactive = true;
 | 
			
		||||
        gcIcon.connect('button-press-event', () => {
 | 
			
		||||
           gcIcon.icon_name = 'user-trash';
 | 
			
		||||
           System.gc();
 | 
			
		||||
           this._timeoutId = Mainloop.timeout_add(500, () => {
 | 
			
		||||
            gcIcon.icon_name = 'user-trash';
 | 
			
		||||
            System.gc();
 | 
			
		||||
            this._timeoutId = Mainloop.timeout_add(500, () => {
 | 
			
		||||
                gcIcon.icon_name = 'user-trash-full';
 | 
			
		||||
                this._timeoutId = 0;
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
           });
 | 
			
		||||
           GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
            });
 | 
			
		||||
            GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let notebook = new Notebook();
 | 
			
		||||
@@ -889,9 +892,11 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        let fontDesc = Pango.FontDescription.from_string(fontName);
 | 
			
		||||
        // We ignore everything but size and style; you'd be crazy to set your system-wide
 | 
			
		||||
        // monospace font to be bold/oblique/etc. Could easily be added here.
 | 
			
		||||
        this.actor.style =
 | 
			
		||||
            'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';'
 | 
			
		||||
            + 'font-family: "' + fontDesc.get_family() + '";';
 | 
			
		||||
        let size = fontDesc.get_size() / 1024.;
 | 
			
		||||
        let unit = fontDesc.get_size_is_absolute() ? 'px' : 'pt';
 | 
			
		||||
        this.actor.style = `
 | 
			
		||||
            font-size: ${size}${unit};
 | 
			
		||||
            font-family: "${fontDesc.get_family()}";`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setBorderPaintTarget(obj) {
 | 
			
		||||
@@ -977,7 +982,7 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        try {
 | 
			
		||||
            resultObj = Function(fullCmd)();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            resultObj = '<exception ' + e + '>';
 | 
			
		||||
            resultObj = `<exception ${e}>`;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pushResult(command, resultObj);
 | 
			
		||||
@@ -1004,7 +1009,7 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _queueResize() {
 | 
			
		||||
        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); });
 | 
			
		||||
        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => this._resize());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _resize() {
 | 
			
		||||
 
 | 
			
		||||
@@ -41,10 +41,8 @@ const CROSS_HAIRS_OPACITY_KEY   = 'cross-hairs-opacity';
 | 
			
		||||
const CROSS_HAIRS_LENGTH_KEY    = 'cross-hairs-length';
 | 
			
		||||
const CROSS_HAIRS_CLIP_KEY      = 'cross-hairs-clip';
 | 
			
		||||
 | 
			
		||||
let magDBusService = null;
 | 
			
		||||
 | 
			
		||||
var MouseSpriteContent = GObject.registerClass({
 | 
			
		||||
    Implements: [ Clutter.Content ],
 | 
			
		||||
    Implements: [Clutter.Content],
 | 
			
		||||
}, class MouseSpriteContent extends GObject.Object {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init();
 | 
			
		||||
@@ -122,7 +120,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Export to dbus.
 | 
			
		||||
        magDBusService = new MagnifierDBus.ShellMagnifier();
 | 
			
		||||
        (new MagnifierDBus.ShellMagnifier());
 | 
			
		||||
        this.setActive(St.Settings.get().magnifier_active);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -150,7 +148,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
    setActive(activate) {
 | 
			
		||||
        let isActive = this.isActive();
 | 
			
		||||
 | 
			
		||||
        this._zoomRegions.forEach ((zoomRegion, index, array) => {
 | 
			
		||||
        this._zoomRegions.forEach((zoomRegion, index, array) => {
 | 
			
		||||
            zoomRegion.setActive(activate);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -284,7 +282,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
     * @zoomRegion:     The zoomRegion to add.
 | 
			
		||||
     */
 | 
			
		||||
    addZoomRegion(zoomRegion) {
 | 
			
		||||
        if(zoomRegion) {
 | 
			
		||||
        if (zoomRegion) {
 | 
			
		||||
            this._zoomRegions.push(zoomRegion);
 | 
			
		||||
            if (!this.isTrackingMouse())
 | 
			
		||||
                this.startTrackingMouse();
 | 
			
		||||
@@ -349,8 +347,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
            if (!this._crossHairs)
 | 
			
		||||
                this.addCrosshairs();
 | 
			
		||||
            this._crossHairs.show();
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            if (this._crossHairs)
 | 
			
		||||
                this._crossHairs.hide();
 | 
			
		||||
        }
 | 
			
		||||
@@ -377,9 +374,9 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        if (this._crossHairs) {
 | 
			
		||||
            let clutterColor = this._crossHairs.getColor();
 | 
			
		||||
            return clutterColor.to_string();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        } else {
 | 
			
		||||
            return '#00000000';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -459,8 +456,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        if (clip) {
 | 
			
		||||
            if (this._crossHairs)
 | 
			
		||||
                this._crossHairs.setClip(CROSSHAIRS_CLIP_SIZE);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            // Setting no clipping on crosshairs means a zero sized clip
 | 
			
		||||
            // rectangle.
 | 
			
		||||
            if (this._crossHairs)
 | 
			
		||||
@@ -473,14 +469,14 @@ var Magnifier = class Magnifier {
 | 
			
		||||
     * Get whether the crosshairs are clipped by the mouse image.
 | 
			
		||||
     * @return:   Whether the crosshairs are clipped.
 | 
			
		||||
     */
 | 
			
		||||
     getCrosshairsClip() {
 | 
			
		||||
    getCrosshairsClip() {
 | 
			
		||||
        if (this._crossHairs) {
 | 
			
		||||
            let [clipWidth, clipHeight] = this._crossHairs.getClip();
 | 
			
		||||
            return (clipWidth > 0 && clipHeight > 0);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
     }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //// Private methods ////
 | 
			
		||||
 | 
			
		||||
@@ -504,61 +500,61 @@ var Magnifier = class Magnifier {
 | 
			
		||||
    _settingsInit(zoomRegion) {
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + SCREEN_POSITION_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${SCREEN_POSITION_KEY}`,
 | 
			
		||||
                               this._updateScreenPosition.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + MAG_FACTOR_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${MAG_FACTOR_KEY}`,
 | 
			
		||||
                               this._updateMagFactor.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + LENS_MODE_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${LENS_MODE_KEY}`,
 | 
			
		||||
                               this._updateLensMode.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + CLAMP_MODE_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${CLAMP_MODE_KEY}`,
 | 
			
		||||
                               this._updateClampMode.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + MOUSE_TRACKING_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${MOUSE_TRACKING_KEY}`,
 | 
			
		||||
                               this._updateMouseTrackingMode.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + FOCUS_TRACKING_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${FOCUS_TRACKING_KEY}`,
 | 
			
		||||
                               this._updateFocusTrackingMode.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + CARET_TRACKING_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${CARET_TRACKING_KEY}`,
 | 
			
		||||
                               this._updateCaretTrackingMode.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${INVERT_LIGHTNESS_KEY}`,
 | 
			
		||||
                               this._updateInvertLightness.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + COLOR_SATURATION_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${COLOR_SATURATION_KEY}`,
 | 
			
		||||
                               this._updateColorSaturation.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + BRIGHT_RED_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${BRIGHT_RED_KEY}`,
 | 
			
		||||
                               this._updateBrightness.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + BRIGHT_GREEN_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${BRIGHT_GREEN_KEY}`,
 | 
			
		||||
                               this._updateBrightness.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + BRIGHT_BLUE_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${BRIGHT_BLUE_KEY}`,
 | 
			
		||||
                               this._updateBrightness.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + CONTRAST_RED_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${CONTRAST_RED_KEY}`,
 | 
			
		||||
                               this._updateContrast.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + CONTRAST_GREEN_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${CONTRAST_GREEN_KEY}`,
 | 
			
		||||
                               this._updateContrast.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + CONTRAST_BLUE_KEY,
 | 
			
		||||
        this._settings.connect(`changed::${CONTRAST_BLUE_KEY}`,
 | 
			
		||||
                               this._updateContrast.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + SHOW_CROSS_HAIRS_KEY, () => {
 | 
			
		||||
        this._settings.connect(`changed::${SHOW_CROSS_HAIRS_KEY}`, () => {
 | 
			
		||||
            this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + CROSS_HAIRS_THICKNESS_KEY, () => {
 | 
			
		||||
        this._settings.connect(`changed::${CROSS_HAIRS_THICKNESS_KEY}`, () => {
 | 
			
		||||
            this.setCrosshairsThickness(this._settings.get_int(CROSS_HAIRS_THICKNESS_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + CROSS_HAIRS_COLOR_KEY, () => {
 | 
			
		||||
        this._settings.connect(`changed::${CROSS_HAIRS_COLOR_KEY}`, () => {
 | 
			
		||||
            this.setCrosshairsColor(this._settings.get_string(CROSS_HAIRS_COLOR_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + CROSS_HAIRS_OPACITY_KEY, () => {
 | 
			
		||||
        this._settings.connect(`changed::${CROSS_HAIRS_OPACITY_KEY}`, () => {
 | 
			
		||||
            this.setCrosshairsOpacity(this._settings.get_double(CROSS_HAIRS_OPACITY_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + CROSS_HAIRS_LENGTH_KEY, () => {
 | 
			
		||||
        this._settings.connect(`changed::${CROSS_HAIRS_LENGTH_KEY}`, () => {
 | 
			
		||||
            this.setCrosshairsLength(this._settings.get_int(CROSS_HAIRS_LENGTH_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + CROSS_HAIRS_CLIP_KEY, () => {
 | 
			
		||||
        this._settings.connect(`changed::${CROSS_HAIRS_CLIP_KEY}`, () => {
 | 
			
		||||
            this.setCrosshairsClip(this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -610,7 +606,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
 | 
			
		||||
        this.addCrosshairs();
 | 
			
		||||
        this.setCrosshairsVisible(showCrosshairs);
 | 
			
		||||
   }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateScreenPosition() {
 | 
			
		||||
        // Applies only to the first zoom region.
 | 
			
		||||
@@ -800,8 +796,8 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let extents;
 | 
			
		||||
        try {
 | 
			
		||||
            extents = component.get_extents(Atspi.CoordType.SCREEN);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to read extents of focused component: ' + e.message);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to read extents of focused component: ${e.message}`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -817,8 +813,8 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let extents;
 | 
			
		||||
        try {
 | 
			
		||||
            extents = text.get_character_extents(text.get_caret_offset(), 0);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to read extents of text caret: ' + e.message);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to read extents of text caret: ${e.message}`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1030,7 +1026,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        viewPort.x = 0;
 | 
			
		||||
        viewPort.y = 0;
 | 
			
		||||
        viewPort.width = global.screen_width;
 | 
			
		||||
        viewPort.height = global.screen_height/2;
 | 
			
		||||
        viewPort.height = global.screen_height / 2;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1042,9 +1038,9 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
    setBottomHalf() {
 | 
			
		||||
        let viewPort = {};
 | 
			
		||||
        viewPort.x = 0;
 | 
			
		||||
        viewPort.y = global.screen_height/2;
 | 
			
		||||
        viewPort.y = global.screen_height / 2;
 | 
			
		||||
        viewPort.width = global.screen_width;
 | 
			
		||||
        viewPort.height = global.screen_height/2;
 | 
			
		||||
        viewPort.height = global.screen_height / 2;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1057,7 +1053,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let viewPort = {};
 | 
			
		||||
        viewPort.x = 0;
 | 
			
		||||
        viewPort.y = 0;
 | 
			
		||||
        viewPort.width = global.screen_width/2;
 | 
			
		||||
        viewPort.width = global.screen_width / 2;
 | 
			
		||||
        viewPort.height = global.screen_height;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF;
 | 
			
		||||
@@ -1069,9 +1065,9 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
     */
 | 
			
		||||
    setRightHalf() {
 | 
			
		||||
        let viewPort = {};
 | 
			
		||||
        viewPort.x = global.screen_width/2;
 | 
			
		||||
        viewPort.x = global.screen_width / 2;
 | 
			
		||||
        viewPort.y = 0;
 | 
			
		||||
        viewPort.width = global.screen_width/2;
 | 
			
		||||
        viewPort.width = global.screen_width / 2;
 | 
			
		||||
        viewPort.height = global.screen_height;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF;
 | 
			
		||||
@@ -1103,21 +1099,21 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
     */
 | 
			
		||||
    setScreenPosition(inPosition) {
 | 
			
		||||
        switch (inPosition) {
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN:
 | 
			
		||||
                this.setFullScreenMode();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.TOP_HALF:
 | 
			
		||||
                this.setTopHalf();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF:
 | 
			
		||||
                this.setBottomHalf();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF:
 | 
			
		||||
                this.setLeftHalf();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF:
 | 
			
		||||
                this.setRightHalf();
 | 
			
		||||
                break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN:
 | 
			
		||||
            this.setFullScreenMode();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.TOP_HALF:
 | 
			
		||||
            this.setTopHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF:
 | 
			
		||||
            this.setBottomHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF:
 | 
			
		||||
            this.setLeftHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF:
 | 
			
		||||
            this.setRightHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1460,11 +1456,9 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
 | 
			
		||||
        if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PROPORTIONAL) {
 | 
			
		||||
            return this._centerFromPointProportional(xMouse, yMouse);
 | 
			
		||||
        }
 | 
			
		||||
        else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) {
 | 
			
		||||
        } else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) {
 | 
			
		||||
            return this._centerFromPointPush(xMouse, yMouse);
 | 
			
		||||
        }
 | 
			
		||||
        else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) {
 | 
			
		||||
        } else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) {
 | 
			
		||||
            return this._centerFromPointCentered(xMouse, yMouse);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1532,7 +1526,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let xProportion = (xPoint - halfScreenWidth) / halfScreenWidth;   // -1 ... 1
 | 
			
		||||
        let yProportion = (yPoint - halfScreenHeight) / halfScreenHeight; // -1 ... 1
 | 
			
		||||
        let xPos = xPoint - xProportion * (widthRoi / 2 - xPadding);
 | 
			
		||||
        let yPos = yPoint - yProportion * (heightRoi /2 - yPadding);
 | 
			
		||||
        let yPos = yPoint - yProportion * (heightRoi / 2 - yPadding);
 | 
			
		||||
 | 
			
		||||
        return [xPos, yPos];
 | 
			
		||||
    }
 | 
			
		||||
@@ -1634,7 +1628,7 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
        this.reCenter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   /**
 | 
			
		||||
    /**
 | 
			
		||||
    * addToZoomRegion
 | 
			
		||||
    * Either add the crosshairs actor to the given ZoomRegion, or, if it is
 | 
			
		||||
    * already part of some other ZoomRegion, create a clone of the crosshairs
 | 
			
		||||
@@ -1662,7 +1656,7 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
                container.raise_child(magnifiedMouse, crosshairsActor);
 | 
			
		||||
                let [xMouse, yMouse] = magnifiedMouse.get_position();
 | 
			
		||||
                let [crosshairsWidth, crosshairsHeight] = crosshairsActor.get_size();
 | 
			
		||||
                crosshairsActor.set_position(xMouse - crosshairsWidth / 2 , yMouse - crosshairsHeight / 2);
 | 
			
		||||
                crosshairsActor.set_position(xMouse - crosshairsWidth / 2, yMouse - crosshairsHeight / 2);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return crosshairsActor;
 | 
			
		||||
@@ -1778,13 +1772,12 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
            // mouse.
 | 
			
		||||
            this._clipSize = size;
 | 
			
		||||
            this.reCenter();
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
        } else {
 | 
			
		||||
            // Restore the missing chunk.
 | 
			
		||||
            this._clipSize = [0, 0];
 | 
			
		||||
            this.reCenter();
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * show:
 | 
			
		||||
@@ -1818,9 +1811,7 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
    reCenter(clipSize) {
 | 
			
		||||
        let [groupWidth, groupHeight] = this._actor.get_size();
 | 
			
		||||
        let leftLength = this._horizLeftHair.get_width();
 | 
			
		||||
        let rightLength = this._horizRightHair.get_width();
 | 
			
		||||
        let topLength = this._vertTopHair.get_height();
 | 
			
		||||
        let bottomLength = this._vertBottomHair.get_height();
 | 
			
		||||
        let thickness = this._horizLeftHair.get_height();
 | 
			
		||||
 | 
			
		||||
        // Deal with clip rectangle.
 | 
			
		||||
@@ -1927,8 +1918,8 @@ var MagShaderEffects = class MagShaderEffects {
 | 
			
		||||
        // a null first argument.
 | 
			
		||||
        let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
 | 
			
		||||
        this._brightnessContrast.set_enabled(
 | 
			
		||||
             cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
 | 
			
		||||
             bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
 | 
			
		||||
            cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
 | 
			
		||||
            bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -85,7 +85,7 @@ var ShellMagnifier = class ShellMagnifier {
 | 
			
		||||
        let ROI = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] };
 | 
			
		||||
        let viewBox = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] };
 | 
			
		||||
        let realZoomRegion = Main.magnifier.createZoomRegion(xMagFactor, yMagFactor, ROI, viewBox);
 | 
			
		||||
        let objectPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount;
 | 
			
		||||
        let objectPath = `${ZOOM_SERVICE_PATH}/zoomer${_zoomRegionInstanceCount}`;
 | 
			
		||||
        _zoomRegionInstanceCount++;
 | 
			
		||||
 | 
			
		||||
        let zoomRegionProxy = new ShellMagnifierZoomRegion(objectPath, realZoomRegion);
 | 
			
		||||
@@ -106,9 +106,9 @@ var ShellMagnifier = class ShellMagnifier {
 | 
			
		||||
        if (proxyAndZoomRegion && proxyAndZoomRegion.zoomRegion) {
 | 
			
		||||
            Main.magnifier.addZoomRegion(proxyAndZoomRegion.zoomRegion);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -179,74 +179,74 @@ var ShellMagnifier = class ShellMagnifier {
 | 
			
		||||
     * Set the crosswire size of all ZoomRegions.
 | 
			
		||||
     * @size:   The thickness of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
     setCrosswireSize(size) {
 | 
			
		||||
    setCrosswireSize(size) {
 | 
			
		||||
        Main.magnifier.setCrosshairsThickness(size);
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getCrosswireSize:
 | 
			
		||||
     * Get the crosswire size of all ZoomRegions.
 | 
			
		||||
     * @return:   The thickness of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
     getCrosswireSize() {
 | 
			
		||||
    getCrosswireSize() {
 | 
			
		||||
        return Main.magnifier.getCrosshairsThickness();
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireLength:
 | 
			
		||||
     * Set the crosswire length of all zoom-regions..
 | 
			
		||||
     * @size:   The length of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
     setCrosswireLength(length) {
 | 
			
		||||
    setCrosswireLength(length) {
 | 
			
		||||
        Main.magnifier.setCrosshairsLength(length);
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireSize:
 | 
			
		||||
     * Set the crosswire size of all zoom-regions.
 | 
			
		||||
     * @size:   The thickness of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
     getCrosswireLength() {
 | 
			
		||||
    getCrosswireLength() {
 | 
			
		||||
        return Main.magnifier.getCrosshairsLength();
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireClip:
 | 
			
		||||
     * Set if the crosswire will be clipped by the cursor image..
 | 
			
		||||
     * @clip:   Flag to indicate whether to clip the crosswire.
 | 
			
		||||
     */
 | 
			
		||||
     setCrosswireClip(clip) {
 | 
			
		||||
    setCrosswireClip(clip) {
 | 
			
		||||
        Main.magnifier.setCrosshairsClip(clip);
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getCrosswireClip:
 | 
			
		||||
     * Get the crosswire clip value.
 | 
			
		||||
     * @return:   Whether the crosswire is clipped by the cursor image.
 | 
			
		||||
     */
 | 
			
		||||
     getCrosswireClip() {
 | 
			
		||||
    getCrosswireClip() {
 | 
			
		||||
        return Main.magnifier.getCrosshairsClip();
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireColor:
 | 
			
		||||
     * Set the crosswire color of all ZoomRegions.
 | 
			
		||||
     * @color:   Unsigned int of the form rrggbbaa.
 | 
			
		||||
     */
 | 
			
		||||
     setCrosswireColor(color) {
 | 
			
		||||
    setCrosswireColor(color) {
 | 
			
		||||
        Main.magnifier.setCrosshairsColor('#%08x'.format(color));
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getCrosswireClip:
 | 
			
		||||
     * Get the crosswire color of all ZoomRegions.
 | 
			
		||||
     * @return:   The crosswire color as an unsigned int in the form rrggbbaa.
 | 
			
		||||
     */
 | 
			
		||||
     getCrosswireColor() {
 | 
			
		||||
    getCrosswireColor() {
 | 
			
		||||
        let colorString = Main.magnifier.getCrosshairsColor();
 | 
			
		||||
        // Drop the leading '#'.
 | 
			
		||||
        return parseInt(colorString.slice(1), 16);
 | 
			
		||||
     }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,6 @@ let _cssStylesheet = null;
 | 
			
		||||
let _a11ySettings = null;
 | 
			
		||||
let _themeResource = null;
 | 
			
		||||
let _oskResource = null;
 | 
			
		||||
let pointerA11yTimeout = null;
 | 
			
		||||
 | 
			
		||||
function _sessionUpdated() {
 | 
			
		||||
    if (sessionMode.isPrimary)
 | 
			
		||||
@@ -140,12 +139,12 @@ function start() {
 | 
			
		||||
 | 
			
		||||
function _initializeUI() {
 | 
			
		||||
    // Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
 | 
			
		||||
    // also initialize ShellAppSystem first.  ShellAppSystem
 | 
			
		||||
    // also initialize ShellAppSystem first. ShellAppSystem
 | 
			
		||||
    // needs to load all the .desktop files, and ShellWindowTracker
 | 
			
		||||
    // will use those to associate with windows.  Right now
 | 
			
		||||
    // will use those to associate with windows. Right now
 | 
			
		||||
    // the Monitor doesn't listen for installed app changes
 | 
			
		||||
    // and recalculate application associations, so to avoid
 | 
			
		||||
    // races for now we initialize it here.  It's better to
 | 
			
		||||
    // races for now we initialize it here. It's better to
 | 
			
		||||
    // be predictable anyways.
 | 
			
		||||
    Shell.WindowTracker.get_default();
 | 
			
		||||
    Shell.AppUsage.get_default();
 | 
			
		||||
@@ -157,8 +156,8 @@ function _initializeUI() {
 | 
			
		||||
    // Setup the stage hierarchy early
 | 
			
		||||
    layoutManager = new Layout.LayoutManager();
 | 
			
		||||
 | 
			
		||||
    // Various parts of the codebase still refers to Main.uiGroup
 | 
			
		||||
    // instead using the layoutManager.  This keeps that code
 | 
			
		||||
    // Various parts of the codebase still refer to Main.uiGroup
 | 
			
		||||
    // instead of using the layoutManager. This keeps that code
 | 
			
		||||
    // working until it's updated.
 | 
			
		||||
    uiGroup = layoutManager.uiGroup;
 | 
			
		||||
 | 
			
		||||
@@ -172,7 +171,7 @@ function _initializeUI() {
 | 
			
		||||
    kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog();
 | 
			
		||||
    wm = new WindowManager.WindowManager();
 | 
			
		||||
    magnifier = new Magnifier.Magnifier();
 | 
			
		||||
    locatePointer = new LocatePointer.locatePointer();
 | 
			
		||||
    locatePointer = new LocatePointer.LocatePointer();
 | 
			
		||||
 | 
			
		||||
    if (LoginManager.canLock())
 | 
			
		||||
        screenShield = new ScreenShield.ScreenShield();
 | 
			
		||||
@@ -192,7 +191,7 @@ function _initializeUI() {
 | 
			
		||||
    layoutManager.init();
 | 
			
		||||
    overview.init();
 | 
			
		||||
 | 
			
		||||
    pointerA11yTimeout = new PointerA11yTimeout.PointerA11yTimeout();
 | 
			
		||||
    (new PointerA11yTimeout.PointerA11yTimeout());
 | 
			
		||||
 | 
			
		||||
    _a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
 | 
			
		||||
 | 
			
		||||
@@ -255,7 +254,7 @@ function _initializeUI() {
 | 
			
		||||
        let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
 | 
			
		||||
        if (perfModuleName) {
 | 
			
		||||
            let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
 | 
			
		||||
            let module = eval('imports.perf.' + perfModuleName + ';');
 | 
			
		||||
            let module = eval(`imports.perf.${perfModuleName};`);
 | 
			
		||||
            Scripting.runPerfScript(module, perfOutput);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
@@ -322,7 +321,7 @@ function getThemeStylesheet() {
 | 
			
		||||
/**
 | 
			
		||||
 * setThemeStylesheet:
 | 
			
		||||
 * @cssStylesheet: A file path that contains the theme CSS,
 | 
			
		||||
 *                  set it to null to use the default
 | 
			
		||||
 *                 set it to null to use the default
 | 
			
		||||
 *
 | 
			
		||||
 * Set the theme CSS file that the shell will load
 | 
			
		||||
 */
 | 
			
		||||
@@ -391,9 +390,9 @@ function notify(msg, details) {
 | 
			
		||||
function notifyError(msg, details) {
 | 
			
		||||
    // Also print to stderr so it's logged somewhere
 | 
			
		||||
    if (details)
 | 
			
		||||
        log('error: ' + msg + ': ' + details);
 | 
			
		||||
        log(`error: ${msg}: ${details}`);
 | 
			
		||||
    else
 | 
			
		||||
        log('error: ' + msg);
 | 
			
		||||
        log(`error: ${msg}`);
 | 
			
		||||
 | 
			
		||||
    notify(msg, details);
 | 
			
		||||
}
 | 
			
		||||
@@ -422,15 +421,15 @@ function _findModal(actor) {
 | 
			
		||||
 *
 | 
			
		||||
 * @params may be used to provide the following parameters:
 | 
			
		||||
 *  - timestamp: used to associate the call with a specific user initiated
 | 
			
		||||
 *               event.  If not provided then the value of
 | 
			
		||||
 *               event. If not provided then the value of
 | 
			
		||||
 *               global.get_current_time() is assumed.
 | 
			
		||||
 *
 | 
			
		||||
 *  - options: Meta.ModalOptions flags to indicate that the pointer is
 | 
			
		||||
 *             already grabbed
 | 
			
		||||
 *
 | 
			
		||||
 *  - actionMode: used to set the current Shell.ActionMode to filter
 | 
			
		||||
 *                    global keybindings; the default of NONE will filter
 | 
			
		||||
 *                    out all keybindings
 | 
			
		||||
 *                global keybindings; the default of NONE will filter
 | 
			
		||||
 *                out all keybindings
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: true iff we successfully acquired a grab or already had one
 | 
			
		||||
 */
 | 
			
		||||
@@ -476,15 +475,15 @@ function pushModal(actor, params) {
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * popModal:
 | 
			
		||||
 * @actor: #ClutterActor passed to original invocation of pushModal().
 | 
			
		||||
 * @actor: #ClutterActor passed to original invocation of pushModal()
 | 
			
		||||
 * @timestamp: optional timestamp
 | 
			
		||||
 *
 | 
			
		||||
 * Reverse the effect of pushModal().  If this invocation is undoing
 | 
			
		||||
 * Reverse the effect of pushModal(). If this invocation is undoing
 | 
			
		||||
 * the topmost invocation, then the focus will be restored to the
 | 
			
		||||
 * previous focus at the time when pushModal() was invoked.
 | 
			
		||||
 *
 | 
			
		||||
 * @timestamp is optionally used to associate the call with a specific user
 | 
			
		||||
 * initiated event.  If not provided then the value of
 | 
			
		||||
 * initiated event. If not provided then the value of
 | 
			
		||||
 * global.get_current_time() is assumed.
 | 
			
		||||
 */
 | 
			
		||||
function popModal(actor, timestamp) {
 | 
			
		||||
@@ -646,7 +645,7 @@ function _queueBeforeRedraw(workId) {
 | 
			
		||||
 *
 | 
			
		||||
 * This function sets up a callback to be invoked when either the
 | 
			
		||||
 * given actor is mapped, or after some period of time when the machine
 | 
			
		||||
 * is idle.  This is useful if your actor isn't always visible on the
 | 
			
		||||
 * is idle. This is useful if your actor isn't always visible on the
 | 
			
		||||
 * screen (for example, all actors in the overview), and you don't want
 | 
			
		||||
 * to consume resources updating if the actor isn't actually going to be
 | 
			
		||||
 * displaying to the user.
 | 
			
		||||
@@ -659,11 +658,11 @@ function _queueBeforeRedraw(workId) {
 | 
			
		||||
 */
 | 
			
		||||
function initializeDeferredWork(actor, callback, props) {
 | 
			
		||||
    // Turn into a string so we can use as an object property
 | 
			
		||||
    let workId = '' + (++_deferredWorkSequence);
 | 
			
		||||
    let workId = `${(++_deferredWorkSequence)}`;
 | 
			
		||||
    _deferredWorkData[workId] = { 'actor': actor,
 | 
			
		||||
                                  'callback': callback };
 | 
			
		||||
    actor.connect('notify::mapped', () => {
 | 
			
		||||
        if (!(actor.mapped && _deferredWorkQueue.indexOf(workId) >= 0))
 | 
			
		||||
        if (!(actor.mapped && _deferredWorkQueue.includes(workId)))
 | 
			
		||||
            return;
 | 
			
		||||
        _queueBeforeRedraw(workId);
 | 
			
		||||
    });
 | 
			
		||||
@@ -682,7 +681,7 @@ function initializeDeferredWork(actor, callback, props) {
 | 
			
		||||
 * @workId: work identifier
 | 
			
		||||
 *
 | 
			
		||||
 * Ensure that the work identified by @workId will be
 | 
			
		||||
 * run on map or timeout.  You should call this function
 | 
			
		||||
 * run on map or timeout. You should call this function
 | 
			
		||||
 * for example when data being displayed by the actor has
 | 
			
		||||
 * changed.
 | 
			
		||||
 */
 | 
			
		||||
@@ -693,7 +692,7 @@ function queueDeferredWork(workId) {
 | 
			
		||||
        logError(new Error(message), message);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (_deferredWorkQueue.indexOf(workId) < 0)
 | 
			
		||||
    if (!_deferredWorkQueue.includes(workId))
 | 
			
		||||
        _deferredWorkQueue.push(workId);
 | 
			
		||||
    if (data.actor.mapped) {
 | 
			
		||||
        _queueBeforeRedraw(workId);
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ var URLHighlighter = class URLHighlighter {
 | 
			
		||||
            let urlId = this._findUrlAtPos(event);
 | 
			
		||||
            if (urlId != -1) {
 | 
			
		||||
                let url = this._urls[urlId].url;
 | 
			
		||||
                if (url.indexOf(':') == -1)
 | 
			
		||||
                if (!url.includes(':'))
 | 
			
		||||
                    url = 'http://' + url;
 | 
			
		||||
 | 
			
		||||
                Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
 | 
			
		||||
@@ -135,18 +135,18 @@ var URLHighlighter = class URLHighlighter {
 | 
			
		||||
        let success;
 | 
			
		||||
        let [x, y] = event.get_coords();
 | 
			
		||||
        [success, x, y] = this.actor.transform_stage_point(x, y);
 | 
			
		||||
        let find_pos = -1;
 | 
			
		||||
        let findPos = -1;
 | 
			
		||||
        for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
 | 
			
		||||
            let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
 | 
			
		||||
            if (py > y || py + line_height < y || x < px)
 | 
			
		||||
            let [success, px, py, lineHeight] = this.actor.clutter_text.position_to_coords(i);
 | 
			
		||||
            if (py > y || py + lineHeight < y || x < px)
 | 
			
		||||
                continue;
 | 
			
		||||
            find_pos = i;
 | 
			
		||||
            findPos = i;
 | 
			
		||||
        }
 | 
			
		||||
        if (find_pos != -1) {
 | 
			
		||||
        if (findPos != -1) {
 | 
			
		||||
            for (let i = 0; i < this._urls.length; i++)
 | 
			
		||||
            if (find_pos >= this._urls[i].pos &&
 | 
			
		||||
                this._urls[i].pos + this._urls[i].url.length > find_pos)
 | 
			
		||||
                return i;
 | 
			
		||||
                if (findPos >= this._urls[i].pos &&
 | 
			
		||||
                    this._urls[i].pos + this._urls[i].url.length > findPos)
 | 
			
		||||
                    return i;
 | 
			
		||||
        }
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
@@ -197,12 +197,14 @@ class ScaleLayout extends Clutter.BinLayout {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var LabelExpanderLayout = GObject.registerClass({
 | 
			
		||||
    Properties: { 'expansion': GObject.ParamSpec.double('expansion',
 | 
			
		||||
                                                        'Expansion',
 | 
			
		||||
                                                        'Expansion of the layout, between 0 (collapsed) ' +
 | 
			
		||||
                                                        'and 1 (fully expanded',
 | 
			
		||||
                                                         GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                         0, 1, 0)},
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'expansion': GObject.ParamSpec.double('expansion',
 | 
			
		||||
                                              'Expansion',
 | 
			
		||||
                                              'Expansion of the layout, between 0 (collapsed) ' +
 | 
			
		||||
                                              'and 1 (fully expanded',
 | 
			
		||||
                                              GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                              0, 1, 0)
 | 
			
		||||
    },
 | 
			
		||||
}, class LabelExpanderLayout extends Clutter.LayoutManager {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        this._expansion = 0;
 | 
			
		||||
@@ -467,11 +469,10 @@ var Message = class Message {
 | 
			
		||||
                             { scale_y: 0,
 | 
			
		||||
                               time: MessageTray.ANIMATION_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               onCompleteScope: this,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   this._actionBin.hide();
 | 
			
		||||
                                   this.expanded = false;
 | 
			
		||||
                               }});
 | 
			
		||||
                               } });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._bodyStack.layout_manager.expansion = 0;
 | 
			
		||||
            this._actionBin.scale_y = 0;
 | 
			
		||||
@@ -626,7 +627,7 @@ var MessageListSection = class MessageListSection {
 | 
			
		||||
                                              onComplete() {
 | 
			
		||||
                                                  obj.container.destroy();
 | 
			
		||||
                                                  global.sync_pointer();
 | 
			
		||||
                                              }});
 | 
			
		||||
                                              } });
 | 
			
		||||
        } else {
 | 
			
		||||
            obj.container.destroy();
 | 
			
		||||
            global.sync_pointer();
 | 
			
		||||
@@ -656,7 +657,7 @@ var MessageListSection = class MessageListSection {
 | 
			
		||||
                                   transition: 'easeOutQuad',
 | 
			
		||||
                                   onComplete() {
 | 
			
		||||
                                       message.close();
 | 
			
		||||
                                   }});
 | 
			
		||||
                                   } });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -218,17 +218,17 @@ class NotificationApplicationPolicy extends NotificationPolicy {
 | 
			
		||||
 | 
			
		||||
        this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application',
 | 
			
		||||
                                            path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
 | 
			
		||||
                                            path: `/org/gnome/desktop/notifications/application/${this._canonicalId}/` });
 | 
			
		||||
 | 
			
		||||
        this._masterSettings.connect('changed', this._changed.bind(this));
 | 
			
		||||
        this._settings.connect('changed', this._changed.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    store() {
 | 
			
		||||
        this._settings.set_string('application-id', this.id + '.desktop');
 | 
			
		||||
        this._settings.set_string('application-id', `${this.id}.desktop`);
 | 
			
		||||
 | 
			
		||||
        let apps = this._masterSettings.get_strv('application-children');
 | 
			
		||||
        if (apps.indexOf(this._canonicalId) < 0) {
 | 
			
		||||
        if (!apps.includes(this._canonicalId)) {
 | 
			
		||||
            apps.push(this._canonicalId);
 | 
			
		||||
            this._masterSettings.set_strv('application-children', apps);
 | 
			
		||||
        }
 | 
			
		||||
@@ -248,7 +248,7 @@ class NotificationApplicationPolicy extends NotificationPolicy {
 | 
			
		||||
    _canonicalizeId(id) {
 | 
			
		||||
        // Keys are restricted to lowercase alphanumeric characters and dash,
 | 
			
		||||
        // and two dashes cannot be in succession
 | 
			
		||||
        return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
 | 
			
		||||
        return id.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get enable() {
 | 
			
		||||
@@ -590,11 +590,11 @@ class SourceActor extends St.Widget {
 | 
			
		||||
        });
 | 
			
		||||
        this._actorDestroyed = false;
 | 
			
		||||
 | 
			
		||||
        let scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        this._iconBin = new St.Bin({ x_fill: true,
 | 
			
		||||
                                     x_expand: true,
 | 
			
		||||
                                     height: size * scale_factor,
 | 
			
		||||
                                     width: size * scale_factor });
 | 
			
		||||
                                     height: size * scaleFactor,
 | 
			
		||||
                                     width: size * scaleFactor });
 | 
			
		||||
 | 
			
		||||
        this.add_actor(this._iconBin);
 | 
			
		||||
 | 
			
		||||
@@ -772,7 +772,7 @@ var Source = class Source {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pushNotification(notification) {
 | 
			
		||||
        if (this.notifications.indexOf(notification) >= 0)
 | 
			
		||||
        if (this.notifications.includes(notification))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
 | 
			
		||||
@@ -988,7 +988,7 @@ var MessageTray = class MessageTray {
 | 
			
		||||
 | 
			
		||||
    add(source) {
 | 
			
		||||
        if (this.contains(source)) {
 | 
			
		||||
            log('Trying to re-add source ' + source.title);
 | 
			
		||||
            log(`Trying to re-add source ${source.title}`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1069,7 +1069,7 @@ var MessageTray = class MessageTray {
 | 
			
		||||
            // If a new notification is updated while it is being hidden,
 | 
			
		||||
            // we stop hiding it and show it again.
 | 
			
		||||
            this._updateShowingNotification();
 | 
			
		||||
        } else if (this._notificationQueue.indexOf(notification) < 0) {
 | 
			
		||||
        } else if (!this._notificationQueue.includes(notification)) {
 | 
			
		||||
            // If the queue is "full", we skip banner mode and just show a small
 | 
			
		||||
            // indicator in the panel; however do make an exception for CRITICAL
 | 
			
		||||
            // notifications, as only banner mode allows expansion.
 | 
			
		||||
@@ -1167,7 +1167,7 @@ var MessageTray = class MessageTray {
 | 
			
		||||
            x > this._notificationLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) {
 | 
			
		||||
            this._notificationLeftMouseX = -1;
 | 
			
		||||
            this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000,
 | 
			
		||||
                                                             this._onNotificationLeftTimeout.bind(this));
 | 
			
		||||
                                                                   this._onNotificationLeftTimeout.bind(this));
 | 
			
		||||
            GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout');
 | 
			
		||||
        } else {
 | 
			
		||||
            this._notificationLeftTimeoutId = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Atk, Clutter, GObject, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
const Layout = imports.ui.layout;
 | 
			
		||||
@@ -22,11 +21,13 @@ var State = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var ModalDialog = GObject.registerClass({
 | 
			
		||||
    Properties: { 'state': GObject.ParamSpec.int('state', 'Dialog state', 'state',
 | 
			
		||||
                                                 GObject.ParamFlags.READABLE,
 | 
			
		||||
                                                 Math.min(...Object.values(State)),
 | 
			
		||||
                                                 Math.max(...Object.values(State)),
 | 
			
		||||
                                                 State.CLOSED) },
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'state': GObject.ParamSpec.int('state', 'Dialog state', 'state',
 | 
			
		||||
                                       GObject.ParamFlags.READABLE,
 | 
			
		||||
                                       Math.min(...Object.values(State)),
 | 
			
		||||
                                       Math.max(...Object.values(State)),
 | 
			
		||||
                                       State.CLOSED)
 | 
			
		||||
    },
 | 
			
		||||
    Signals: { 'opened': {}, 'closed': {} }
 | 
			
		||||
}, class ModalDialog extends St.Widget {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
@@ -180,7 +181,7 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
                               time: OPEN_AND_CLOSE_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               onComplete: this._closeComplete.bind(this)
 | 
			
		||||
                             })
 | 
			
		||||
                             });
 | 
			
		||||
        else
 | 
			
		||||
            this._closeComplete();
 | 
			
		||||
    }
 | 
			
		||||
@@ -249,7 +250,7 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        this.popModal(timestamp);
 | 
			
		||||
        Tweener.addTween(this.dialogLayout,
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time:    FADE_OUT_DIALOG_TIME,
 | 
			
		||||
                           time: FADE_OUT_DIALOG_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this._setState(State.FADED_OUT);
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,7 @@ var MprisPlayer = class MprisPlayer {
 | 
			
		||||
        // so prefer activating the app via .desktop file if possible
 | 
			
		||||
        let app = null;
 | 
			
		||||
        if (this._mprisProxy.DesktopEntry) {
 | 
			
		||||
            let desktopId = this._mprisProxy.DesktopEntry + '.desktop';
 | 
			
		||||
            let desktopId = `${this._mprisProxy.DesktopEntry}.desktop`;
 | 
			
		||||
            app = Shell.AppSystem.get_default().lookup_app(desktopId);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -76,13 +76,13 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
    _fallbackIconForNotificationData(hints) {
 | 
			
		||||
        let stockIcon;
 | 
			
		||||
        switch (hints.urgency) {
 | 
			
		||||
            case Urgency.LOW:
 | 
			
		||||
            case Urgency.NORMAL:
 | 
			
		||||
                stockIcon = 'dialog-information';
 | 
			
		||||
                break;
 | 
			
		||||
            case Urgency.CRITICAL:
 | 
			
		||||
                stockIcon = 'dialog-error';
 | 
			
		||||
                break;
 | 
			
		||||
        case Urgency.LOW:
 | 
			
		||||
        case Urgency.NORMAL:
 | 
			
		||||
            stockIcon = 'dialog-information';
 | 
			
		||||
            break;
 | 
			
		||||
        case Urgency.CRITICAL:
 | 
			
		||||
            stockIcon = 'dialog-error';
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        return new Gio.ThemedIcon({ name: stockIcon });
 | 
			
		||||
    }
 | 
			
		||||
@@ -170,11 +170,11 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
            // Ignore replacesId since we already sent back a
 | 
			
		||||
            // NotificationClosed for that id.
 | 
			
		||||
            id = this._nextNotificationId++;
 | 
			
		||||
            let idle_id = Mainloop.idle_add(() => {
 | 
			
		||||
            let idleId = Mainloop.idle_add(() => {
 | 
			
		||||
                this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
            GLib.Source.set_name_by_id(idle_id, '[gnome-shell] this._emitNotificationClosed');
 | 
			
		||||
            GLib.Source.set_name_by_id(idleId, '[gnome-shell] this._emitNotificationClosed');
 | 
			
		||||
            return invocation.return_value(GLib.Variant.new('(u)', [id]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +231,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
            // There's already a pending call to GetConnectionUnixProcessID,
 | 
			
		||||
            // which will see the new notification data when it finishes,
 | 
			
		||||
            // so we don't have to do anything.
 | 
			
		||||
            return invocation.return_value(GLib.Variant.new('(u)', [id]));;
 | 
			
		||||
            return invocation.return_value(GLib.Variant.new('(u)', [id]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => {
 | 
			
		||||
@@ -270,15 +270,15 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
                delete this._notifications[ndata.id];
 | 
			
		||||
                let notificationClosedReason;
 | 
			
		||||
                switch (reason) {
 | 
			
		||||
                    case MessageTray.NotificationDestroyedReason.EXPIRED:
 | 
			
		||||
                        notificationClosedReason = NotificationClosedReason.EXPIRED;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case MessageTray.NotificationDestroyedReason.DISMISSED:
 | 
			
		||||
                        notificationClosedReason = NotificationClosedReason.DISMISSED;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED:
 | 
			
		||||
                        notificationClosedReason = NotificationClosedReason.APP_CLOSED;
 | 
			
		||||
                        break;
 | 
			
		||||
                case MessageTray.NotificationDestroyedReason.EXPIRED:
 | 
			
		||||
                    notificationClosedReason = NotificationClosedReason.EXPIRED;
 | 
			
		||||
                    break;
 | 
			
		||||
                case MessageTray.NotificationDestroyedReason.DISMISSED:
 | 
			
		||||
                    notificationClosedReason = NotificationClosedReason.DISMISSED;
 | 
			
		||||
                    break;
 | 
			
		||||
                case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED:
 | 
			
		||||
                    notificationClosedReason = NotificationClosedReason.APP_CLOSED;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                this._emitNotificationClosed(ndata.id, notificationClosedReason);
 | 
			
		||||
            });
 | 
			
		||||
@@ -309,7 +309,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
 | 
			
		||||
        if (actions.length) {
 | 
			
		||||
            for (let i = 0; i < actions.length - 1; i += 2) {
 | 
			
		||||
                let [actionId, label] = [actions[i], actions[i+1]];
 | 
			
		||||
                let [actionId, label] = [actions[i], actions[i + 1]];
 | 
			
		||||
                if (actionId == 'default')
 | 
			
		||||
                    hasDefaultAction = true;
 | 
			
		||||
                else
 | 
			
		||||
@@ -330,15 +330,15 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (hints.urgency) {
 | 
			
		||||
            case Urgency.LOW:
 | 
			
		||||
                notification.setUrgency(MessageTray.Urgency.LOW);
 | 
			
		||||
                break;
 | 
			
		||||
            case Urgency.NORMAL:
 | 
			
		||||
                notification.setUrgency(MessageTray.Urgency.NORMAL);
 | 
			
		||||
                break;
 | 
			
		||||
            case Urgency.CRITICAL:
 | 
			
		||||
                notification.setUrgency(MessageTray.Urgency.CRITICAL);
 | 
			
		||||
                break;
 | 
			
		||||
        case Urgency.LOW:
 | 
			
		||||
            notification.setUrgency(MessageTray.Urgency.LOW);
 | 
			
		||||
            break;
 | 
			
		||||
        case Urgency.NORMAL:
 | 
			
		||||
            notification.setUrgency(MessageTray.Urgency.NORMAL);
 | 
			
		||||
            break;
 | 
			
		||||
        case Urgency.CRITICAL:
 | 
			
		||||
            notification.setUrgency(MessageTray.Urgency.CRITICAL);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        notification.setResident(!!hints.resident);
 | 
			
		||||
        // 'transient' is a reserved keyword in JS, so we have to retrieve the value
 | 
			
		||||
@@ -437,7 +437,7 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
 | 
			
		||||
 | 
			
		||||
    _createPolicy() {
 | 
			
		||||
        if (this.app && this.app.get_app_info()) {
 | 
			
		||||
            let id = this.app.get_id().replace(/\.desktop$/,'');
 | 
			
		||||
            let id = this.app.get_id().replace(/\.desktop$/, '');
 | 
			
		||||
            return new MessageTray.NotificationApplicationPolicy(id);
 | 
			
		||||
        } else {
 | 
			
		||||
            return new MessageTray.NotificationGenericPolicy();
 | 
			
		||||
@@ -474,7 +474,7 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
 | 
			
		||||
            return app;
 | 
			
		||||
 | 
			
		||||
        if (appId) {
 | 
			
		||||
            app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
 | 
			
		||||
            app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
 | 
			
		||||
            if (app != null)
 | 
			
		||||
                return app;
 | 
			
		||||
        }
 | 
			
		||||
@@ -573,7 +573,7 @@ class GtkNotificationDaemonNotification extends MessageTray.Notification {
 | 
			
		||||
 | 
			
		||||
        this.update(title.unpack(), body ? body.unpack() : null,
 | 
			
		||||
                    { gicon: gicon ? Gio.icon_deserialize(gicon) : null,
 | 
			
		||||
                      datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null });
 | 
			
		||||
                      datetime: time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _activateAction(namespacedActionId, target) {
 | 
			
		||||
@@ -610,7 +610,7 @@ function objectPathFromAppId(appId) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getPlatformData() {
 | 
			
		||||
    let startupId = GLib.Variant.new('s', '_TIME' + global.get_current_time());
 | 
			
		||||
    let startupId = GLib.Variant.new('s', `_TIME${global.get_current_time()}`);
 | 
			
		||||
    return { "desktop-startup-id": startupId };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -623,7 +623,7 @@ class GtkNotificationDaemonAppSource extends MessageTray.Source {
 | 
			
		||||
        if (!GLib.Variant.is_object_path(objectPath))
 | 
			
		||||
            throw new InvalidAppError();
 | 
			
		||||
 | 
			
		||||
        let app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
 | 
			
		||||
        let app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
 | 
			
		||||
        if (!app)
 | 
			
		||||
            throw new InvalidAppError();
 | 
			
		||||
 | 
			
		||||
@@ -759,7 +759,7 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
 | 
			
		||||
                let source;
 | 
			
		||||
                try {
 | 
			
		||||
                    source = this._ensureAppSource(appId);
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    if (e instanceof InvalidAppError)
 | 
			
		||||
                        return;
 | 
			
		||||
                    throw e;
 | 
			
		||||
@@ -793,7 +793,7 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
 | 
			
		||||
        let source;
 | 
			
		||||
        try {
 | 
			
		||||
            source = this._ensureAppSource(appId);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            if (e instanceof InvalidAppError) {
 | 
			
		||||
                invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId));
 | 
			
		||||
                return;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ const { Clutter, Gio, Meta, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
 | 
			
		||||
var FADE_TIME = 0.1;
 | 
			
		||||
 | 
			
		||||
var OsdMonitorLabel = class {
 | 
			
		||||
    constructor(monitor, label) {
 | 
			
		||||
        this._actor = new St.Widget({ x_expand: true,
 | 
			
		||||
@@ -53,7 +51,7 @@ var OsdMonitorLabeler = class {
 | 
			
		||||
        this._osdLabels = [];
 | 
			
		||||
        this._monitorLabels = null;
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                    this._reset.bind(this));
 | 
			
		||||
                                   this._reset.bind(this));
 | 
			
		||||
        this._reset();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ var LevelBar = class extends BarLevel.BarLevel {
 | 
			
		||||
 | 
			
		||||
        this.actor.accessible_name = _("Volume");
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('notify::width', () => { this.level = this.level; });
 | 
			
		||||
        this.actor.connect('notify::width', () => this.level = this.level);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get level() {
 | 
			
		||||
@@ -195,8 +195,8 @@ var OsdWindow = class {
 | 
			
		||||
                           time: FADE_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                              this._reset();
 | 
			
		||||
                              Meta.enable_unredirect_for_display(global.display);
 | 
			
		||||
                               this._reset();
 | 
			
		||||
                               Meta.enable_unredirect_for_display(global.display);
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
        return GLib.SOURCE_REMOVE;
 | 
			
		||||
@@ -231,7 +231,7 @@ var OsdWindowManager = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this._osdWindows = [];
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                    this._monitorsChanged.bind(this));
 | 
			
		||||
                                   this._monitorsChanged.bind(this));
 | 
			
		||||
        this._monitorsChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -424,12 +424,12 @@ var Overview = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fadeInDesktop() {
 | 
			
		||||
            this._desktopFade.opacity = 0;
 | 
			
		||||
            this._desktopFade.show();
 | 
			
		||||
            Tweener.addTween(this._desktopFade,
 | 
			
		||||
                             { opacity: 255,
 | 
			
		||||
                               time: ANIMATION_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad' });
 | 
			
		||||
        this._desktopFade.opacity = 0;
 | 
			
		||||
        this._desktopFade.show();
 | 
			
		||||
        Tweener.addTween(this._desktopFade,
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad' });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fadeOutDesktop() {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ function getRtlSlideDirection(direction, actor) {
 | 
			
		||||
            SlideDirection.RIGHT : SlideDirection.LEFT;
 | 
			
		||||
 | 
			
		||||
    return direction;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var SlideDirection = {
 | 
			
		||||
    LEFT: 0,
 | 
			
		||||
@@ -133,7 +133,7 @@ var SlidingControl = class {
 | 
			
		||||
 | 
			
		||||
    getVisibleWidth() {
 | 
			
		||||
        let child = this.actor.get_first_child();
 | 
			
		||||
        let [, , natWidth, ] = child.get_preferred_size();
 | 
			
		||||
        let [, , natWidth] = child.get_preferred_size();
 | 
			
		||||
        return natWidth;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -410,7 +410,7 @@ var ControlsManager = class {
 | 
			
		||||
                                     x_expand: true, y_expand: true,
 | 
			
		||||
                                     clip_to_allocation: true });
 | 
			
		||||
        this._group = new St.BoxLayout({ name: 'overview-group',
 | 
			
		||||
                                        x_expand: true, y_expand: true });
 | 
			
		||||
                                         x_expand: true, y_expand: true });
 | 
			
		||||
        this.actor.add_actor(this._group);
 | 
			
		||||
 | 
			
		||||
        this.actor.add_actor(this._dashSlider.actor);
 | 
			
		||||
 
 | 
			
		||||
@@ -121,7 +121,7 @@ var ActionComboBox = class {
 | 
			
		||||
        this.actor.set_child(box);
 | 
			
		||||
 | 
			
		||||
        this._label = new St.Label({ style_class: 'combo-box-label' });
 | 
			
		||||
        box.add_child(this._label)
 | 
			
		||||
        box.add_child(this._label);
 | 
			
		||||
 | 
			
		||||
        let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
 | 
			
		||||
                                  icon_name: 'pan-down-symbolic',
 | 
			
		||||
@@ -186,7 +186,7 @@ var ActionComboBox = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setButtonActionsActive(active) {
 | 
			
		||||
        this._buttonItems.forEach(item => { item.setSensitive(active); });
 | 
			
		||||
        this._buttonItems.forEach(item => item.setSensitive(active));
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ActionComboBox.prototype);
 | 
			
		||||
@@ -208,7 +208,7 @@ var ActionEditor = class {
 | 
			
		||||
 | 
			
		||||
        this._doneButton = new St.Button({ label: _("Done"),
 | 
			
		||||
                                           style_class: 'button',
 | 
			
		||||
                                           x_expand: false});
 | 
			
		||||
                                           x_expand: false });
 | 
			
		||||
        this._doneButton.connect('clicked', this._onEditingDone.bind(this));
 | 
			
		||||
        this.actor.add_actor(this._doneButton);
 | 
			
		||||
    }
 | 
			
		||||
@@ -275,21 +275,23 @@ var ActionEditor = class {
 | 
			
		||||
Signals.addSignalMethods(ActionEditor.prototype);
 | 
			
		||||
 | 
			
		||||
var PadDiagram = GObject.registerClass({
 | 
			
		||||
    Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed',
 | 
			
		||||
                                                           'left-handed', 'Left handed',
 | 
			
		||||
                                                           GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                                           GObject.ParamFlags.CONSTRUCT_ONLY,
 | 
			
		||||
                                                           false),
 | 
			
		||||
                  'image': GObject.ParamSpec.string('image', 'image', 'Image',
 | 
			
		||||
                                                    GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                                    GObject.ParamFlags.CONSTRUCT_ONLY,
 | 
			
		||||
                                                    null),
 | 
			
		||||
                  'editor-actor': GObject.ParamSpec.object('editor-actor',
 | 
			
		||||
                                                           'editor-actor',
 | 
			
		||||
                                                           'Editor actor',
 | 
			
		||||
                                                           GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                                           GObject.ParamFlags.CONSTRUCT_ONLY,
 | 
			
		||||
                                                           Clutter.Actor.$gtype) },
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'left-handed': GObject.ParamSpec.boolean('left-handed',
 | 
			
		||||
                                                 'left-handed', 'Left handed',
 | 
			
		||||
                                                 GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                                 GObject.ParamFlags.CONSTRUCT_ONLY,
 | 
			
		||||
                                                 false),
 | 
			
		||||
        'image': GObject.ParamSpec.string('image', 'image', 'Image',
 | 
			
		||||
                                          GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                          GObject.ParamFlags.CONSTRUCT_ONLY,
 | 
			
		||||
                                          null),
 | 
			
		||||
        'editor-actor': GObject.ParamSpec.object('editor-actor',
 | 
			
		||||
                                                 'editor-actor',
 | 
			
		||||
                                                 'Editor actor',
 | 
			
		||||
                                                 GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                                 GObject.ParamFlags.CONSTRUCT_ONLY,
 | 
			
		||||
                                                 Clutter.Actor.$gtype)
 | 
			
		||||
    },
 | 
			
		||||
}, class PadDiagram extends St.DrawingArea {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
 | 
			
		||||
@@ -340,7 +342,7 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
 | 
			
		||||
                '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
 | 
			
		||||
                'xmlns:xi="http://www.w3.org/2001/XInclude" ' +
 | 
			
		||||
                'width="' + this._imageWidth + '" height="' + this._imageHeight + '"> ' +
 | 
			
		||||
                `width="${this._imageWidth}" height="${this._imageHeight}"> ` +
 | 
			
		||||
                '<style type="text/css">');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -355,10 +357,10 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < this._activeButtons.length; i++) {
 | 
			
		||||
            let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
 | 
			
		||||
            css += ('.' + ch + ' { ' +
 | 
			
		||||
	            '  stroke: ' + ACTIVE_COLOR + ' !important; ' +
 | 
			
		||||
                    '  fill: ' + ACTIVE_COLOR + ' !important; ' +
 | 
			
		||||
                    '} ');
 | 
			
		||||
            css += `.${ch} {
 | 
			
		||||
                stroke: ${ACTIVE_COLOR} !important;
 | 
			
		||||
                fill: ${ACTIVE_COLOR} !important;
 | 
			
		||||
            }`;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return css;
 | 
			
		||||
@@ -440,11 +442,11 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        let cr = this.get_context();
 | 
			
		||||
 | 
			
		||||
        cr.save();
 | 
			
		||||
        cr.translate(width/2, height/2);
 | 
			
		||||
        cr.translate(width / 2, height / 2);
 | 
			
		||||
        cr.scale(this._scale, this._scale);
 | 
			
		||||
        if (this._leftHanded)
 | 
			
		||||
            cr.rotate(Math.PI);
 | 
			
		||||
        cr.translate(-dimensions.width/2, -dimensions.height/2);
 | 
			
		||||
        cr.translate(-dimensions.width / 2, -dimensions.height / 2);
 | 
			
		||||
        this._handle.render_cairo(cr);
 | 
			
		||||
        cr.restore();
 | 
			
		||||
        cr.$dispose();
 | 
			
		||||
@@ -457,7 +459,7 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        // I miss Cairo.Matrix
 | 
			
		||||
        let dimensions = this._handle.get_dimensions();
 | 
			
		||||
        x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
 | 
			
		||||
        y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;;
 | 
			
		||||
        y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;
 | 
			
		||||
        return [Math.round(x), Math.round(y)];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -468,12 +470,12 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        let leaderPos, leaderSize, pos;
 | 
			
		||||
        let found, direction;
 | 
			
		||||
 | 
			
		||||
        [found, pos] = this._handle.get_position_sub('#' + labelName);
 | 
			
		||||
        [found, pos] = this._handle.get_position_sub(`#${labelName}`);
 | 
			
		||||
        if (!found)
 | 
			
		||||
            return [false];
 | 
			
		||||
 | 
			
		||||
        [found, leaderPos] = this._handle.get_position_sub('#' + leaderName);
 | 
			
		||||
        [found, leaderSize] = this._handle.get_dimensions_sub('#' + leaderName);
 | 
			
		||||
        [found, leaderPos] = this._handle.get_position_sub(`#${leaderName}`);
 | 
			
		||||
        [found, leaderSize] = this._handle.get_dimensions_sub(`#${leaderName}`);
 | 
			
		||||
        if (!found)
 | 
			
		||||
            return [false];
 | 
			
		||||
 | 
			
		||||
@@ -488,15 +490,15 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
            pos.y = this._imageHeight - pos.y;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let [x, y] = this._transformPoint(pos.x, pos.y)
 | 
			
		||||
        let [x, y] = this._transformPoint(pos.x, pos.y);
 | 
			
		||||
 | 
			
		||||
        return [true, x, y, direction];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getButtonLabelCoords(button) {
 | 
			
		||||
        let ch = String.fromCharCode('A'.charCodeAt() + button);
 | 
			
		||||
        let labelName = 'Label' + ch;
 | 
			
		||||
        let leaderName = 'Leader' + ch;
 | 
			
		||||
        let labelName = `Label${ch}`;
 | 
			
		||||
        let leaderName = `Leader${ch}`;
 | 
			
		||||
 | 
			
		||||
        return this._getItemLabelCoords(labelName, leaderName);
 | 
			
		||||
    }
 | 
			
		||||
@@ -504,8 +506,8 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
    getRingLabelCoords(number, dir) {
 | 
			
		||||
        let numStr = number > 0 ? (number + 1).toString() : '';
 | 
			
		||||
        let dirStr = dir == CW ? 'CW' : 'CCW';
 | 
			
		||||
        let labelName = 'LabelRing' + numStr + dirStr;
 | 
			
		||||
        let leaderName = 'LeaderRing' + numStr + dirStr;
 | 
			
		||||
        let labelName = `LabelRing${numStr}${dirStr}`;
 | 
			
		||||
        let leaderName = `LeaderRing${numStr}${dirStr}`;
 | 
			
		||||
 | 
			
		||||
        return this._getItemLabelCoords(labelName, leaderName);
 | 
			
		||||
    }
 | 
			
		||||
@@ -513,8 +515,8 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
    getStripLabelCoords(number, dir) {
 | 
			
		||||
        let numStr = number > 0 ? (number + 1).toString() : '';
 | 
			
		||||
        let dirStr = dir == UP ? 'Up' : 'Down';
 | 
			
		||||
        let labelName = 'LabelStrip' + numStr + dirStr;
 | 
			
		||||
        let leaderName = 'LeaderStrip' + numStr + dirStr;
 | 
			
		||||
        let labelName = `LabelStrip${numStr}${dirStr}`;
 | 
			
		||||
        let leaderName = `LeaderStrip${numStr}${dirStr}`;
 | 
			
		||||
 | 
			
		||||
        return this._getItemLabelCoords(labelName, leaderName);
 | 
			
		||||
    }
 | 
			
		||||
@@ -611,7 +613,7 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
var PadOsd = class {
 | 
			
		||||
    constructor(padDevice, settings, imagePath, editionMode, monitorIndex) {
 | 
			
		||||
        this.padDevice = padDevice;
 | 
			
		||||
        this._groupPads = [ padDevice ];
 | 
			
		||||
        this._groupPads = [padDevice];
 | 
			
		||||
        this._settings = settings;
 | 
			
		||||
        this._imagePath = imagePath;
 | 
			
		||||
        this._editionMode = editionMode;
 | 
			
		||||
@@ -630,7 +632,7 @@ var PadOsd = class {
 | 
			
		||||
            // If the device is being removed, destroy the padOsd.
 | 
			
		||||
            if (device == this.padDevice) {
 | 
			
		||||
                this.destroy();
 | 
			
		||||
            } else if (this._groupPads.indexOf(device) != -1) {
 | 
			
		||||
            } else if (this._groupPads.includes(device)) {
 | 
			
		||||
                // Or update the pad chooser if the device belongs to
 | 
			
		||||
                // the same group.
 | 
			
		||||
                this._groupPads.splice(this._groupPads.indexOf(device), 1);
 | 
			
		||||
@@ -714,9 +716,9 @@ var PadOsd = class {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(),
 | 
			
		||||
                                         x_expand: true,
 | 
			
		||||
                                         x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                         y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
                                        x_expand: true,
 | 
			
		||||
                                        x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                        y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this.actor.add_actor(buttonBox);
 | 
			
		||||
        this._editButton = new St.Button({ label: _("Edit…"),
 | 
			
		||||
                                           style_class: 'button',
 | 
			
		||||
@@ -734,7 +736,7 @@ var PadOsd = class {
 | 
			
		||||
    _updatePadChooser() {
 | 
			
		||||
        if (this._groupPads.length > 1) {
 | 
			
		||||
            if (this._padChooser == null) {
 | 
			
		||||
                this._padChooser = new PadChooser(this.padDevice, this._groupPads)
 | 
			
		||||
                this._padChooser = new PadChooser(this.padDevice, this._groupPads);
 | 
			
		||||
                this._padChooser.connect('pad-selected', (chooser, pad) => {
 | 
			
		||||
                    this._requestForOtherPad(pad);
 | 
			
		||||
                });
 | 
			
		||||
@@ -749,8 +751,7 @@ var PadOsd = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _requestForOtherPad(pad) {
 | 
			
		||||
        if (pad == this.padDevice ||
 | 
			
		||||
            this._groupPads.indexOf(pad) == -1)
 | 
			
		||||
        if (pad == this.padDevice || !this._groupPads.includes(pad))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let editionMode = this._editionMode;
 | 
			
		||||
@@ -801,7 +802,7 @@ var PadOsd = class {
 | 
			
		||||
 | 
			
		||||
        // If the event comes from another pad in the same group,
 | 
			
		||||
        // show the OSD for it.
 | 
			
		||||
        if (this._groupPads.indexOf(event.get_source_device()) != -1) {
 | 
			
		||||
        if (this._groupPads.includes(event.get_source_device())) {
 | 
			
		||||
            this._requestForOtherPad(event.get_source_device());
 | 
			
		||||
            return Clutter.EVENT_STOP;
 | 
			
		||||
        }
 | 
			
		||||
@@ -865,7 +866,7 @@ var PadOsd = class {
 | 
			
		||||
            if (this._followUpActionEdition(str))
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            this._padDiagram.stopEdition(false, str ? str : _("None"))
 | 
			
		||||
            this._padDiagram.stopEdition(false, str ? str : _("None"));
 | 
			
		||||
            this._editedAction = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -888,7 +889,7 @@ var PadOsd = class {
 | 
			
		||||
 | 
			
		||||
    _startButtonActionEdition(button) {
 | 
			
		||||
        let ch = String.fromCharCode('A'.charCodeAt() + button);
 | 
			
		||||
        let key = 'button' + ch;
 | 
			
		||||
        let key = `button${ch}`;
 | 
			
		||||
        this._startActionEdition(key, Meta.PadActionType.BUTTON, button);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ function _premultiply(color) {
 | 
			
		||||
                               green: _norm(color.green * color.alpha),
 | 
			
		||||
                               blue: _norm(color.blue * color.alpha),
 | 
			
		||||
                               alpha: color.alpha });
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _unpremultiply(color) {
 | 
			
		||||
    if (color.alpha == 0)
 | 
			
		||||
@@ -62,7 +62,7 @@ function _unpremultiply(color) {
 | 
			
		||||
    let blue = Math.min((color.blue * 255 + 127) / color.alpha, 255);
 | 
			
		||||
    return new Clutter.Color({ red: red, green: green,
 | 
			
		||||
                               blue: blue, alpha: color.alpha });
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
    constructor(sourceActor) {
 | 
			
		||||
@@ -189,7 +189,7 @@ class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
 * have an active startup notification, we switch modes to display that.
 | 
			
		||||
 */
 | 
			
		||||
var AppMenuButton = GObject.registerClass({
 | 
			
		||||
    Signals: {'changed': {}},
 | 
			
		||||
    Signals: { 'changed': {} },
 | 
			
		||||
}, class AppMenuButton extends PanelMenu.Button {
 | 
			
		||||
    _init(panel) {
 | 
			
		||||
        super._init(0.0, null, true);
 | 
			
		||||
@@ -283,10 +283,9 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time: Overview.ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this.hide();
 | 
			
		||||
                           },
 | 
			
		||||
                           onCompleteScope: this });
 | 
			
		||||
                           } });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onStyleChanged(actor) {
 | 
			
		||||
@@ -328,8 +327,7 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time: SPINNER_ANIMATION_TIME,
 | 
			
		||||
                           transition: "easeOutQuad",
 | 
			
		||||
                           onCompleteScope: this,
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this._spinner.stop();
 | 
			
		||||
                               this._spinner.actor.opacity = 255;
 | 
			
		||||
                               this._spinner.actor.hide();
 | 
			
		||||
@@ -864,7 +862,7 @@ class Panel extends St.Widget {
 | 
			
		||||
 | 
			
		||||
        Main.sessionMode.connect('updated', this._updatePanel.bind(this));
 | 
			
		||||
 | 
			
		||||
        global.display.connect('workareas-changed', () => { this.queue_relayout(); });
 | 
			
		||||
        global.display.connect('workareas-changed', () => this.queue_relayout());
 | 
			
		||||
        this._updatePanel();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1056,9 +1054,9 @@ class Panel extends St.Widget {
 | 
			
		||||
        this._updateBox(panel.center, this._centerBox);
 | 
			
		||||
        this._updateBox(panel.right, this._rightBox);
 | 
			
		||||
 | 
			
		||||
        if (panel.left.indexOf('dateMenu') != -1)
 | 
			
		||||
        if (panel.left.includes('dateMenu'))
 | 
			
		||||
            Main.messageTray.bannerAlignment = Clutter.ActorAlign.START;
 | 
			
		||||
        else if (panel.right.indexOf('dateMenu') != -1)
 | 
			
		||||
        else if (panel.right.includes('dateMenu'))
 | 
			
		||||
            Main.messageTray.bannerAlignment = Clutter.ActorAlign.END;
 | 
			
		||||
        // Default to center if there is no dateMenu
 | 
			
		||||
        else
 | 
			
		||||
@@ -1139,7 +1137,7 @@ class Panel extends St.Widget {
 | 
			
		||||
 | 
			
		||||
    addToStatusArea(role, indicator, position, box) {
 | 
			
		||||
        if (this.statusArea[role])
 | 
			
		||||
            throw new Error('Extension point conflict: there is already a status indicator for role ' + role);
 | 
			
		||||
            throw new Error(`Extension point conflict: there is already a status indicator for role ${role}`);
 | 
			
		||||
 | 
			
		||||
        if (!(indicator instanceof PanelMenu.Button))
 | 
			
		||||
            throw new TypeError('Status indicator must be an instance of PanelMenu.Button');
 | 
			
		||||
@@ -1189,7 +1187,7 @@ class Panel extends St.Widget {
 | 
			
		||||
 | 
			
		||||
    _getDraggableWindowForPosition(stageX) {
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let workspace = workspaceManager.get_active_workspace()
 | 
			
		||||
        let workspace = workspaceManager.get_active_workspace();
 | 
			
		||||
        let allWindowsByStacking = global.display.sort_windows_by_stacking(
 | 
			
		||||
            workspace.list_windows()
 | 
			
		||||
        ).reverse();
 | 
			
		||||
@@ -1200,7 +1198,7 @@ class Panel extends St.Widget {
 | 
			
		||||
                   metaWindow.showing_on_its_workspace() &&
 | 
			
		||||
                   metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
 | 
			
		||||
                   metaWindow.maximized_vertically &&
 | 
			
		||||
                   stageX > rect.x && stageX < rect.x + rect.width
 | 
			
		||||
                   stageX > rect.x && stageX < rect.x + rect.width;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								js/ui/panel.js.
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								js/ui/panel.js.
									
									
									
									
									
										Normal file
									
								
							@@ -91,7 +91,7 @@ class ButtonBox extends St.Widget {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var Button = GObject.registerClass({
 | 
			
		||||
    Signals: {'menu-set': {} },
 | 
			
		||||
    Signals: { 'menu-set': {} },
 | 
			
		||||
}, class PanelMenuButton extends ButtonBox {
 | 
			
		||||
    _init(menuAlignment, nameText, dontCreateMenu) {
 | 
			
		||||
        super._init({ reactive: true,
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,6 @@ const Tweener = imports.ui.tweener;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Cairo = imports.cairo;
 | 
			
		||||
 | 
			
		||||
const ANIMATION_STEPS = 36.;
 | 
			
		||||
 | 
			
		||||
var PieTimer = GObject.registerClass(
 | 
			
		||||
class PieTimer extends St.DrawingArea {
 | 
			
		||||
    _init() {
 | 
			
		||||
@@ -68,10 +66,8 @@ class PieTimer extends St.DrawingArea {
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: duration / 1000,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onUpdateScope: this,
 | 
			
		||||
                           onUpdate() { this.queue_repaint() },
 | 
			
		||||
                           onCompleteScope: this,
 | 
			
		||||
                           onComplete() { this.stop(); }
 | 
			
		||||
                           onUpdate: () => this.queue_repaint(),
 | 
			
		||||
                           onComplete: () => this.stop()
 | 
			
		||||
                          });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -92,13 +88,13 @@ var PointerA11yTimeout = class PointerA11yTimeout {
 | 
			
		||||
            let [x, y, mods] = global.get_pointer();
 | 
			
		||||
            pieTimer.start(x, y, timeout);
 | 
			
		||||
            if (type == Clutter.PointerA11yTimeoutType.GESTURE)
 | 
			
		||||
              global.display.set_cursor(Meta.Cursor.CROSSHAIR);
 | 
			
		||||
                global.display.set_cursor(Meta.Cursor.CROSSHAIR);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        manager.connect('ptr-a11y-timeout-stopped', (manager, device, type) => {
 | 
			
		||||
            pieTimer.stop();
 | 
			
		||||
            if (type == Clutter.PointerA11yTimeoutType.GESTURE)
 | 
			
		||||
              global.display.set_cursor(Meta.Cursor.DEFAULT);
 | 
			
		||||
                global.display.set_cursor(Meta.Cursor.DEFAULT);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -28,18 +28,18 @@ function isPopupMenuItemVisible(child) {
 | 
			
		||||
function arrowIcon(side) {
 | 
			
		||||
    let iconName;
 | 
			
		||||
    switch (side) {
 | 
			
		||||
        case St.Side.TOP:
 | 
			
		||||
            iconName = 'pan-up-symbolic';
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.RIGHT:
 | 
			
		||||
            iconName = 'pan-end-symbolic';
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.BOTTOM:
 | 
			
		||||
            iconName = 'pan-down-symbolic';
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.LEFT:
 | 
			
		||||
            iconName = 'pan-start-symbolic';
 | 
			
		||||
            break;
 | 
			
		||||
    case St.Side.TOP:
 | 
			
		||||
        iconName = 'pan-up-symbolic';
 | 
			
		||||
        break;
 | 
			
		||||
    case St.Side.RIGHT:
 | 
			
		||||
        iconName = 'pan-end-symbolic';
 | 
			
		||||
        break;
 | 
			
		||||
    case St.Side.BOTTOM:
 | 
			
		||||
        iconName = 'pan-down-symbolic';
 | 
			
		||||
        break;
 | 
			
		||||
    case St.Side.LEFT:
 | 
			
		||||
        iconName = 'pan-start-symbolic';
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
 | 
			
		||||
@@ -261,7 +261,7 @@ class PopupMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
 | 
			
		||||
        this.label = new St.Label({ text: text });
 | 
			
		||||
        this.add_child(this.label);
 | 
			
		||||
        this.label_actor = this.label
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -315,8 +315,7 @@ class Switch extends St.Bin {
 | 
			
		||||
 | 
			
		||||
var PopupSwitchMenuItem = GObject.registerClass({
 | 
			
		||||
    Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
 | 
			
		||||
},
 | 
			
		||||
class PopupSwitchMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
}, class PopupSwitchMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
    _init(text, active, params) {
 | 
			
		||||
        super._init(params);
 | 
			
		||||
 | 
			
		||||
@@ -502,7 +501,7 @@ var PopupMenuBase = class {
 | 
			
		||||
            let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
 | 
			
		||||
 | 
			
		||||
            if (!app) {
 | 
			
		||||
                log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
 | 
			
		||||
                log(`Settings panel for desktop file ${desktopFile} could not be loaded!`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -637,28 +636,28 @@ var PopupMenuBase = class {
 | 
			
		||||
        let i = 0;
 | 
			
		||||
 | 
			
		||||
        while (i < items.length && position > 0) {
 | 
			
		||||
                if (items[i] != menuItem)
 | 
			
		||||
                        position--;
 | 
			
		||||
                i++;
 | 
			
		||||
            if (items[i] != menuItem)
 | 
			
		||||
                position--;
 | 
			
		||||
            i++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (i < items.length) {
 | 
			
		||||
                if (items[i] != menuItem)
 | 
			
		||||
                        this.box.set_child_below_sibling(menuItem.actor, items[i].actor);
 | 
			
		||||
            if (items[i] != menuItem)
 | 
			
		||||
                this.box.set_child_below_sibling(menuItem.actor, items[i].actor);
 | 
			
		||||
        } else {
 | 
			
		||||
                this.box.set_child_above_sibling(menuItem.actor, null);
 | 
			
		||||
            this.box.set_child_above_sibling(menuItem.actor, null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addMenuItem(menuItem, position) {
 | 
			
		||||
        let before_item = null;
 | 
			
		||||
        let beforeItem = null;
 | 
			
		||||
        if (position == undefined) {
 | 
			
		||||
            this.box.add(menuItem.actor);
 | 
			
		||||
        } else {
 | 
			
		||||
            let items = this._getMenuItems();
 | 
			
		||||
            if (position < items.length) {
 | 
			
		||||
                before_item = items[position].actor;
 | 
			
		||||
                this.box.insert_child_below(menuItem.actor, before_item);
 | 
			
		||||
                beforeItem = items[position].actor;
 | 
			
		||||
                this.box.insert_child_below(menuItem.actor, beforeItem);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.box.add(menuItem.actor);
 | 
			
		||||
            }
 | 
			
		||||
@@ -688,10 +687,10 @@ var PopupMenuBase = class {
 | 
			
		||||
                this.length--;
 | 
			
		||||
            });
 | 
			
		||||
        } else if (menuItem instanceof PopupSubMenuMenuItem) {
 | 
			
		||||
            if (before_item == null)
 | 
			
		||||
            if (beforeItem == null)
 | 
			
		||||
                this.box.add(menuItem.menu.actor);
 | 
			
		||||
            else
 | 
			
		||||
                this.box.insert_child_below(menuItem.menu.actor, before_item);
 | 
			
		||||
                this.box.insert_child_below(menuItem.menu.actor, beforeItem);
 | 
			
		||||
 | 
			
		||||
            this._connectItemSignals(menuItem);
 | 
			
		||||
            let subMenuActiveChangeId = menuItem.menu.connect('active-changed', this._subMenuActiveChanged.bind(this));
 | 
			
		||||
@@ -816,18 +815,18 @@ var PopupMenu = class extends PopupMenuBase {
 | 
			
		||||
 | 
			
		||||
        let navKey;
 | 
			
		||||
        switch (this._boxPointer.arrowSide) {
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                navKey = Clutter.KEY_Down;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                navKey = Clutter.KEY_Up;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                navKey = Clutter.KEY_Right;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                navKey = Clutter.KEY_Left;
 | 
			
		||||
                break;
 | 
			
		||||
        case St.Side.TOP:
 | 
			
		||||
            navKey = Clutter.KEY_Down;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.BOTTOM:
 | 
			
		||||
            navKey = Clutter.KEY_Up;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.LEFT:
 | 
			
		||||
            navKey = Clutter.KEY_Right;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.RIGHT:
 | 
			
		||||
            navKey = Clutter.KEY_Left;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let state = event.get_state();
 | 
			
		||||
@@ -852,8 +851,9 @@ var PopupMenu = class extends PopupMenuBase {
 | 
			
		||||
                this.toggle();
 | 
			
		||||
            this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
 | 
			
		||||
            return Clutter.EVENT_STOP;
 | 
			
		||||
        } else
 | 
			
		||||
        } else {
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setArrowOrigin(origin) {
 | 
			
		||||
@@ -920,9 +920,16 @@ var PopupDummyMenu = class {
 | 
			
		||||
        return this.getSensitive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    open() { this.emit('open-state-changed', true); }
 | 
			
		||||
    close() { this.emit('open-state-changed', false); }
 | 
			
		||||
    open() {
 | 
			
		||||
        this.emit('open-state-changed', true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close() {
 | 
			
		||||
        this.emit('open-state-changed', false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    toggle() {}
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
        this.emit('destroy');
 | 
			
		||||
    }
 | 
			
		||||
@@ -1008,12 +1015,10 @@ var PopupSubMenu = class extends PopupMenuBase {
 | 
			
		||||
                             { _arrowRotation: targetAngle,
 | 
			
		||||
                               height: naturalHeight,
 | 
			
		||||
                               time: 0.25,
 | 
			
		||||
                               onUpdateScope: this,
 | 
			
		||||
                               onUpdate() {
 | 
			
		||||
                               onUpdate: () => {
 | 
			
		||||
                                   this._arrow.rotation_angle_z = this.actor._arrowRotation;
 | 
			
		||||
                               },
 | 
			
		||||
                               onCompleteScope: this,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   this.actor.set_height(-1);
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
@@ -1041,12 +1046,10 @@ var PopupSubMenu = class extends PopupMenuBase {
 | 
			
		||||
                             { _arrowRotation: 0,
 | 
			
		||||
                               height: 0,
 | 
			
		||||
                               time: 0.25,
 | 
			
		||||
                               onUpdateScope: this,
 | 
			
		||||
                               onUpdate() {
 | 
			
		||||
                               onUpdate: () => {
 | 
			
		||||
                                   this._arrow.rotation_angle_z = this.actor._arrowRotation;
 | 
			
		||||
                               },
 | 
			
		||||
                               onCompleteScope: this,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   this.actor.hide();
 | 
			
		||||
                                   this.actor.set_height(-1);
 | 
			
		||||
                               },
 | 
			
		||||
@@ -1089,8 +1092,13 @@ var PopupMenuSection = class extends PopupMenuBase {
 | 
			
		||||
 | 
			
		||||
    // deliberately ignore any attempt to open() or close(), but emit the
 | 
			
		||||
    // corresponding signal so children can still pick it up
 | 
			
		||||
    open() { this.emit('open-state-changed', true); }
 | 
			
		||||
    close() { this.emit('open-state-changed', false); }
 | 
			
		||||
    open() {
 | 
			
		||||
        this.emit('open-state-changed', true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close() {
 | 
			
		||||
        this.emit('open-state-changed', false);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var PopupSubMenuMenuItem = GObject.registerClass(
 | 
			
		||||
@@ -1126,7 +1134,7 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
 | 
			
		||||
        this.menu = new PopupSubMenu(this, this._triangle);
 | 
			
		||||
        this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
 | 
			
		||||
        this.connect('destroy', () => { this.menu.destroy(); });
 | 
			
		||||
        this.connect('destroy', () => this.menu.destroy());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setParent(parent) {
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,7 @@ function loadRemoteSearchProviders(searchSettings, callback) {
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            keyfile.load_from_file(path, 0);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -92,14 +92,14 @@ function loadRemoteSearchProviders(searchSettings, callback) {
 | 
			
		||||
                if (!appInfo.should_show())
 | 
			
		||||
                    return;
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                log('Ignoring search provider ' + path + ': missing DesktopId');
 | 
			
		||||
                log(`Ignoring search provider ${path}: missing DesktopId`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let autoStart = true;
 | 
			
		||||
            try {
 | 
			
		||||
                autoStart = keyfile.get_boolean(group, 'AutoStart');
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                // ignore error
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -118,13 +118,13 @@ function loadRemoteSearchProviders(searchSettings, callback) {
 | 
			
		||||
            remoteProvider.defaultEnabled = true;
 | 
			
		||||
            try {
 | 
			
		||||
                remoteProvider.defaultEnabled = !keyfile.get_boolean(group, 'DefaultDisabled');
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                // ignore error
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            objectPaths[objectPath] = remoteProvider;
 | 
			
		||||
            loadedProviders.push(remoteProvider);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log('Failed to add search provider %s: %s'.format(path, e.toString()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -146,10 +146,10 @@ function loadRemoteSearchProviders(searchSettings, callback) {
 | 
			
		||||
 | 
			
		||||
        if (provider.defaultEnabled) {
 | 
			
		||||
            let disabled = searchSettings.get_strv('disabled');
 | 
			
		||||
            return disabled.indexOf(appId) == -1;
 | 
			
		||||
            return !disabled.includes(appId);
 | 
			
		||||
        } else {
 | 
			
		||||
            let enabled = searchSettings.get_strv('enabled');
 | 
			
		||||
            return enabled.indexOf(appId) != -1;
 | 
			
		||||
            return enabled.includes(appId);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@@ -191,18 +191,18 @@ var RemoteSearchProvider = class {
 | 
			
		||||
        if (!proxyInfo)
 | 
			
		||||
            proxyInfo = SearchProviderProxyInfo;
 | 
			
		||||
 | 
			
		||||
        let g_flags = Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES;
 | 
			
		||||
        let gFlags = Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES;
 | 
			
		||||
        if (autoStart)
 | 
			
		||||
            g_flags |= Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION;
 | 
			
		||||
            gFlags |= Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION;
 | 
			
		||||
        else
 | 
			
		||||
            g_flags |= Gio.DBusProxyFlags.DO_NOT_AUTO_START;
 | 
			
		||||
            gFlags |= Gio.DBusProxyFlags.DO_NOT_AUTO_START;
 | 
			
		||||
 | 
			
		||||
        this.proxy = new Gio.DBusProxy({ g_bus_type: Gio.BusType.SESSION,
 | 
			
		||||
                                         g_name: dbusName,
 | 
			
		||||
                                         g_object_path: dbusPath,
 | 
			
		||||
                                         g_interface_info: proxyInfo,
 | 
			
		||||
                                         g_interface_name: proxyInfo.name,
 | 
			
		||||
                                         g_flags });
 | 
			
		||||
                                         gFlags });
 | 
			
		||||
        this.proxy.init_async(GLib.PRIORITY_DEFAULT, null, null);
 | 
			
		||||
 | 
			
		||||
        this.appInfo = appInfo;
 | 
			
		||||
@@ -313,7 +313,7 @@ var RemoteSearchProvider = class {
 | 
			
		||||
    launchSearch(terms) {
 | 
			
		||||
        // the provider is not compatible with the new version of the interface, launch
 | 
			
		||||
        // the app itself but warn so we can catch the error in logs
 | 
			
		||||
        log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch');
 | 
			
		||||
        log(`Search provider ${this.appInfo.get_id()} does not implement LaunchSearch`);
 | 
			
		||||
        this.appInfo.launch([], global.create_app_launch_context(0, -1));
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, St } = imports.gi;
 | 
			
		||||
const { St } = imports.gi;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
 | 
			
		||||
// Shamelessly copied from the layout "hotcorner" ripples implementation
 | 
			
		||||
@@ -56,15 +56,13 @@ var Ripples = class Ripples {
 | 
			
		||||
                                   delay: delay,
 | 
			
		||||
                                   time: time,
 | 
			
		||||
                                   transition: 'linear',
 | 
			
		||||
                                   onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
 | 
			
		||||
                                   onComplete() { ripple.visible = false; } });
 | 
			
		||||
                                   onUpdate: () => ripple.opacity = 255 * Math.sqrt(ripple._opacity),
 | 
			
		||||
                                   onComplete: () => ripple.visible = false });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addTo(stage) {
 | 
			
		||||
        if (this._stage !== undefined) {
 | 
			
		||||
        if (this._stage !== undefined)
 | 
			
		||||
            throw new Error('Ripples already added');
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._stage = stage;
 | 
			
		||||
        this._stage.add_actor(this._ripple1);
 | 
			
		||||
@@ -73,10 +71,8 @@ var Ripples = class Ripples {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    playAnimation(x, y) {
 | 
			
		||||
        if (this._stage === undefined) {
 | 
			
		||||
        if (this._stage === undefined)
 | 
			
		||||
            throw new Error('Ripples not added');
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._x = x;
 | 
			
		||||
        this._y = y;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
@@ -10,8 +9,6 @@ const Tweener = imports.ui.tweener;
 | 
			
		||||
const Util = imports.misc.util;
 | 
			
		||||
const History = imports.misc.history;
 | 
			
		||||
 | 
			
		||||
var MAX_FILE_DELETED_BEFORE_INVALID = 10;
 | 
			
		||||
 | 
			
		||||
const HISTORY_KEY = 'command-history';
 | 
			
		||||
 | 
			
		||||
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
 | 
			
		||||
@@ -36,30 +33,26 @@ class RunDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        });
 | 
			
		||||
        this._enableInternalCommands = global.settings.get_boolean('development-tools');
 | 
			
		||||
 | 
			
		||||
        this._internalCommands = { 'lg': () => {
 | 
			
		||||
                                       Main.createLookingGlass().open();
 | 
			
		||||
                                   },
 | 
			
		||||
        this._internalCommands = {
 | 
			
		||||
            'lg': () => Main.createLookingGlass().open(),
 | 
			
		||||
 | 
			
		||||
                                   'r': this._restart.bind(this),
 | 
			
		||||
            'r': this._restart.bind(this),
 | 
			
		||||
 | 
			
		||||
                                   // Developer brain backwards compatibility
 | 
			
		||||
                                   'restart': this._restart.bind(this),
 | 
			
		||||
            // Developer brain backwards compatibility
 | 
			
		||||
            'restart': this._restart.bind(this),
 | 
			
		||||
 | 
			
		||||
                                   'debugexit': () => {
 | 
			
		||||
                                       Meta.quit(Meta.ExitCode.ERROR);
 | 
			
		||||
                                   },
 | 
			
		||||
            'debugexit': () => Meta.quit(Meta.ExitCode.ERROR),
 | 
			
		||||
 | 
			
		||||
                                   // rt is short for "reload theme"
 | 
			
		||||
                                   'rt': () => {
 | 
			
		||||
                                       Main.reloadThemeResource();
 | 
			
		||||
                                       Main.loadTheme();
 | 
			
		||||
                                   },
 | 
			
		||||
 | 
			
		||||
                                   'check_cloexec_fds': () => {
 | 
			
		||||
                                       Shell.util_check_cloexec_fds();
 | 
			
		||||
                                   },
 | 
			
		||||
                                 };
 | 
			
		||||
            // rt is short for "reload theme"
 | 
			
		||||
            'rt': () => {
 | 
			
		||||
                Main.reloadThemeResource();
 | 
			
		||||
                Main.loadTheme();
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            'check_cloexec_fds': () => {
 | 
			
		||||
                Shell.util_check_cloexec_fds();
 | 
			
		||||
            },
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let label = new St.Label({ style_class: 'run-dialog-label',
 | 
			
		||||
                                   text: _("Enter a Command") });
 | 
			
		||||
@@ -169,9 +162,8 @@ class RunDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) &&
 | 
			
		||||
                    !e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY))
 | 
			
		||||
                    log(e);
 | 
			
		||||
            } finally {
 | 
			
		||||
                return results;
 | 
			
		||||
            }
 | 
			
		||||
            return results;
 | 
			
		||||
        });
 | 
			
		||||
        let results = someResults.reduce((a, b) => a.concat(b), []);
 | 
			
		||||
 | 
			
		||||
@@ -183,7 +175,7 @@ class RunDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getCompletion(text) {
 | 
			
		||||
        if (text.indexOf('/') != -1) {
 | 
			
		||||
        if (text.includes('/')) {
 | 
			
		||||
            return this._pathCompleter.get_completion_suffix(text);
 | 
			
		||||
        } else {
 | 
			
		||||
            return this._getCommandCompletion(text);
 | 
			
		||||
@@ -206,8 +198,8 @@ class RunDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            try {
 | 
			
		||||
                if (inTerminal) {
 | 
			
		||||
                    let exec = this._terminalSettings.get_string(EXEC_KEY);
 | 
			
		||||
                    let exec_arg = this._terminalSettings.get_string(EXEC_ARG_KEY);
 | 
			
		||||
                    command = exec + ' ' + exec_arg + ' ' + input;
 | 
			
		||||
                    let execArg = this._terminalSettings.get_string(EXEC_ARG_KEY);
 | 
			
		||||
                    command = `${exec} ${execArg} ${input}`;
 | 
			
		||||
                }
 | 
			
		||||
                Util.trySpawnCommandLine(command);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
 
 | 
			
		||||
@@ -44,11 +44,9 @@ var SUMMARY_ICON_SIZE = 48;
 | 
			
		||||
// - STANDARD_FADE_TIME is used when the session goes idle
 | 
			
		||||
// - MANUAL_FADE_TIME is used for lowering the shield when asked by the user,
 | 
			
		||||
//   or when cancelling the dialog
 | 
			
		||||
// - BACKGROUND_FADE_TIME is used when the background changes to crossfade to new background
 | 
			
		||||
// - CURTAIN_SLIDE_TIME is used when raising the shield before unlocking
 | 
			
		||||
var STANDARD_FADE_TIME = 10;
 | 
			
		||||
var MANUAL_FADE_TIME = 0.3;
 | 
			
		||||
var BACKGROUND_FADE_TIME = 1.0;
 | 
			
		||||
var CURTAIN_SLIDE_TIME = 0.3;
 | 
			
		||||
 | 
			
		||||
var Clock = class {
 | 
			
		||||
@@ -257,11 +255,10 @@ var NotificationsBox = class {
 | 
			
		||||
                             { height: natHeight,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               time: 0.25,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   this._scrollView.vscrollbar_policy = St.PolicyType.AUTOMATIC;
 | 
			
		||||
                                   widget.set_height(-1);
 | 
			
		||||
                               },
 | 
			
		||||
                               onCompleteScope: this
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
 | 
			
		||||
            this._updateVisibility();
 | 
			
		||||
@@ -370,7 +367,7 @@ class ScreenShieldArrow extends St.Bin {
 | 
			
		||||
        cr.setLineWidth(thickness);
 | 
			
		||||
 | 
			
		||||
        cr.moveTo(thickness / 2, h - thickness / 2);
 | 
			
		||||
        cr.lineTo(w/2, thickness);
 | 
			
		||||
        cr.lineTo(w / 2, thickness);
 | 
			
		||||
        cr.lineTo(w - thickness / 2, h - thickness / 2);
 | 
			
		||||
        cr.stroke();
 | 
			
		||||
        cr.$dispose();
 | 
			
		||||
@@ -383,11 +380,11 @@ class ScreenShieldArrow extends St.Bin {
 | 
			
		||||
        if (!this._shadow)
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        let shadow_box = new Clutter.ActorBox();
 | 
			
		||||
        this._shadow.get_box(this._drawingArea.get_allocation_box(), shadow_box);
 | 
			
		||||
        let shadowBox = new Clutter.ActorBox();
 | 
			
		||||
        this._shadow.get_box(this._drawingArea.get_allocation_box(), shadowBox);
 | 
			
		||||
 | 
			
		||||
        volume.set_width(Math.max(shadow_box.x2 - shadow_box.x1, volume.get_width()));
 | 
			
		||||
        volume.set_height(Math.max(shadow_box.y2 - shadow_box.y1, volume.get_height()));
 | 
			
		||||
        volume.set_width(Math.max(shadowBox.x2 - shadowBox.x1, volume.get_width()));
 | 
			
		||||
        volume.set_height(Math.max(shadowBox.y2 - shadowBox.y1, volume.get_height()));
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -532,18 +529,18 @@ var ScreenShield = class {
 | 
			
		||||
        this._loginManager.getCurrentSessionProxy(sessionProxy => {
 | 
			
		||||
            this._loginSession = sessionProxy;
 | 
			
		||||
            this._loginSession.connectSignal('Lock',
 | 
			
		||||
                                             () => { this.lock(false); });
 | 
			
		||||
                                             () => this.lock(false));
 | 
			
		||||
            this._loginSession.connectSignal('Unlock',
 | 
			
		||||
                                             () => { this.deactivate(false); });
 | 
			
		||||
                                             () => this.deactivate(false));
 | 
			
		||||
            this._loginSession.connect('g-properties-changed', this._syncInhibitor.bind(this));
 | 
			
		||||
            this._syncInhibitor();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
 | 
			
		||||
        this._settings.connect('changed::' + LOCK_ENABLED_KEY, this._syncInhibitor.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${LOCK_ENABLED_KEY}`, this._syncInhibitor.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._lockSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
 | 
			
		||||
        this._lockSettings.connect('changed::' + DISABLE_LOCK_KEY, this._syncInhibitor.bind(this));
 | 
			
		||||
        this._lockSettings.connect(`changed::${DISABLE_LOCK_KEY}`, this._syncInhibitor.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._isModal = false;
 | 
			
		||||
        this._hasLockScreen = false;
 | 
			
		||||
@@ -743,10 +740,10 @@ var ScreenShield = class {
 | 
			
		||||
                               delay: unitaryDelay * (N_ARROWS - (i + 1)),
 | 
			
		||||
                               time: ARROW_ANIMATION_TIME,
 | 
			
		||||
                               transition(t, b, c, d) {
 | 
			
		||||
                                 if (t < d/2)
 | 
			
		||||
                                     return TweenerEquations.easeOutQuad(t, 0, maxOpacity, d/2);
 | 
			
		||||
                                 else
 | 
			
		||||
                                     return TweenerEquations.easeInQuad(t - d/2, maxOpacity, -maxOpacity, d/2);
 | 
			
		||||
                                   if (t < d / 2)
 | 
			
		||||
                                       return TweenerEquations.easeOutQuad(t, 0, maxOpacity, d / 2);
 | 
			
		||||
                                   else
 | 
			
		||||
                                       return TweenerEquations.easeInQuad(t - d / 2, maxOpacity, -maxOpacity, d / 2);
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
        }
 | 
			
		||||
@@ -765,15 +762,15 @@ var ScreenShield = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onDragMotion() {
 | 
			
		||||
	let [origX, origY] = this._dragAction.get_press_coords(0);
 | 
			
		||||
	let [currentX, currentY] = this._dragAction.get_motion_coords(0);
 | 
			
		||||
        let [origX, origY] = this._dragAction.get_press_coords(0);
 | 
			
		||||
        let [currentX, currentY] = this._dragAction.get_motion_coords(0);
 | 
			
		||||
 | 
			
		||||
	let newY = currentY - origY;
 | 
			
		||||
	newY = clamp(newY, -global.stage.height, 0);
 | 
			
		||||
        let newY = currentY - origY;
 | 
			
		||||
        newY = clamp(newY, -global.stage.height, 0);
 | 
			
		||||
 | 
			
		||||
	this._lockScreenGroup.y = newY;
 | 
			
		||||
        this._lockScreenGroup.y = newY;
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onDragEnd(action, actor, eventX, eventY, modifiers) {
 | 
			
		||||
@@ -781,7 +778,7 @@ var ScreenShield = class {
 | 
			
		||||
            return;
 | 
			
		||||
        if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
 | 
			
		||||
            // Complete motion automatically
 | 
			
		||||
	    let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
 | 
			
		||||
            let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
 | 
			
		||||
            this._liftShield(true, -velocityY);
 | 
			
		||||
        } else {
 | 
			
		||||
            // restore the lock screen to its original place
 | 
			
		||||
@@ -793,11 +790,10 @@ var ScreenShield = class {
 | 
			
		||||
                             { y: 0,
 | 
			
		||||
                               time: time,
 | 
			
		||||
                               transition: 'easeInQuad',
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   this._lockScreenGroup.fixed_position_set = false;
 | 
			
		||||
                                   this._lockScreenState = MessageTray.State.SHOWN;
 | 
			
		||||
                               },
 | 
			
		||||
                               onCompleteScope: this,
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
 | 
			
		||||
            this._maybeCancelDialog();
 | 
			
		||||
@@ -935,9 +931,9 @@ var ScreenShield = class {
 | 
			
		||||
            // if velocity is specified, it's in pixels per milliseconds
 | 
			
		||||
            let h = global.stage.height;
 | 
			
		||||
            let delta = (h + this._lockScreenGroup.y);
 | 
			
		||||
            let min_velocity = global.stage.height / (CURTAIN_SLIDE_TIME * 1000);
 | 
			
		||||
            let minVelocity = global.stage.height / (CURTAIN_SLIDE_TIME * 1000);
 | 
			
		||||
 | 
			
		||||
            velocity = Math.max(min_velocity, velocity);
 | 
			
		||||
            velocity = Math.max(minVelocity, velocity);
 | 
			
		||||
            let time = (delta / velocity) / 1000;
 | 
			
		||||
 | 
			
		||||
            Tweener.addTween(this._lockScreenGroup,
 | 
			
		||||
@@ -1010,11 +1006,10 @@ var ScreenShield = class {
 | 
			
		||||
                             { y: 0,
 | 
			
		||||
                               time: MANUAL_FADE_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   this._lockScreenShown({ fadeToBlack: fadeToBlack,
 | 
			
		||||
                                                           animateFade: true });
 | 
			
		||||
                               },
 | 
			
		||||
                               onCompleteScope: this
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._lockScreenGroup.fixed_position_set = false;
 | 
			
		||||
@@ -1182,7 +1177,7 @@ var ScreenShield = class {
 | 
			
		||||
 | 
			
		||||
    deactivate(animate) {
 | 
			
		||||
        if (this._dialog)
 | 
			
		||||
            this._dialog.finish(() => { this._continueDeactivate(animate); });
 | 
			
		||||
            this._dialog.finish(() => this._continueDeactivate(animate));
 | 
			
		||||
        else
 | 
			
		||||
            this._continueDeactivate(animate);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1290,7 +1285,7 @@ var ScreenShield = class {
 | 
			
		||||
 | 
			
		||||
    lock(animate) {
 | 
			
		||||
        if (this._lockSettings.get_boolean(DISABLE_LOCK_KEY)) {
 | 
			
		||||
            log('Screen lock is locked down, not locking') // lock, lock - who's there?
 | 
			
		||||
            log('Screen lock is locked down, not locking'); // lock, lock - who's there?
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,10 +24,10 @@ var ScreenshotService = class {
 | 
			
		||||
        Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _createScreenshot(invocation, needsDisk=true) {
 | 
			
		||||
    _createScreenshot(invocation, needsDisk = true) {
 | 
			
		||||
        let lockedDown = false;
 | 
			
		||||
        if (needsDisk)
 | 
			
		||||
            lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk')
 | 
			
		||||
            lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk');
 | 
			
		||||
 | 
			
		||||
        let sender = invocation.get_sender();
 | 
			
		||||
        if (this._screenShooter.has(sender) || lockedDown) {
 | 
			
		||||
@@ -72,9 +72,9 @@ var ScreenshotService = class {
 | 
			
		||||
                flashspot.fire(() => {
 | 
			
		||||
                    this._removeShooterForSender(invocation.get_sender());
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            } else {
 | 
			
		||||
                this._removeShooterForSender(invocation.get_sender());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
 | 
			
		||||
@@ -125,11 +125,11 @@ var ScreenshotService = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ScreenshotWindowAsync(params, invocation) {
 | 
			
		||||
        let [include_frame, include_cursor, flash, filename] = params;
 | 
			
		||||
        let [includeFrame, includeCursor, flash, filename] = params;
 | 
			
		||||
        let screenshot = this._createScreenshot(invocation);
 | 
			
		||||
        if (!screenshot)
 | 
			
		||||
            return;
 | 
			
		||||
        screenshot.screenshot_window (include_frame, include_cursor, filename,
 | 
			
		||||
        screenshot.screenshot_window (includeFrame, includeCursor, filename,
 | 
			
		||||
            (o, res) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    let [result, area, filenameUsed] =
 | 
			
		||||
@@ -143,11 +143,11 @@ var ScreenshotService = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ScreenshotAsync(params, invocation) {
 | 
			
		||||
        let [include_cursor, flash, filename] = params;
 | 
			
		||||
        let [includeCursor, flash, filename] = params;
 | 
			
		||||
        let screenshot = this._createScreenshot(invocation);
 | 
			
		||||
        if (!screenshot)
 | 
			
		||||
            return;
 | 
			
		||||
        screenshot.screenshot(include_cursor, filename,
 | 
			
		||||
        screenshot.screenshot(includeCursor, filename,
 | 
			
		||||
            (o, res) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    let [result, area, filenameUsed] =
 | 
			
		||||
@@ -166,12 +166,12 @@ var ScreenshotService = class {
 | 
			
		||||
        selectArea.connect('finished', (selectArea, areaRectangle) => {
 | 
			
		||||
            if (areaRectangle) {
 | 
			
		||||
                let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y,
 | 
			
		||||
                    areaRectangle.width, areaRectangle.height);
 | 
			
		||||
                                                     areaRectangle.width, areaRectangle.height);
 | 
			
		||||
                let retval = GLib.Variant.new('(iiii)', retRectangle);
 | 
			
		||||
                invocation.return_value(retval);
 | 
			
		||||
            } else {
 | 
			
		||||
                invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
 | 
			
		||||
                    "Operation was cancelled");
 | 
			
		||||
                                                "Operation was cancelled");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -185,7 +185,7 @@ var ScreenshotService = class {
 | 
			
		||||
                                            "Invalid params");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
 | 
			
		||||
        let flashspot = new Flashspot({ x: x, y: y, width: width, height: height });
 | 
			
		||||
        flashspot.fire();
 | 
			
		||||
        invocation.return_value(null);
 | 
			
		||||
    }
 | 
			
		||||
@@ -213,7 +213,7 @@ var ScreenshotService = class {
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
 | 
			
		||||
                    "Operation was cancelled");
 | 
			
		||||
                                                "Operation was cancelled");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -150,7 +150,7 @@ function destroyTestWindows() {
 | 
			
		||||
 * within a performance automation script
 | 
			
		||||
 */
 | 
			
		||||
function defineScriptEvent(name, description) {
 | 
			
		||||
    Shell.PerfLog.get_default().define_event("script." + name,
 | 
			
		||||
    Shell.PerfLog.get_default().define_event(`script.${name}`,
 | 
			
		||||
                                             description,
 | 
			
		||||
                                             "");
 | 
			
		||||
}
 | 
			
		||||
@@ -163,7 +163,7 @@ function defineScriptEvent(name, description) {
 | 
			
		||||
 * previously defined with defineScriptEvent
 | 
			
		||||
 */
 | 
			
		||||
function scriptEvent(name) {
 | 
			
		||||
    Shell.PerfLog.get_default().event("script." + name);
 | 
			
		||||
    Shell.PerfLog.get_default().event(`script.${name}`);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -181,7 +181,7 @@ function _collect(scriptModule, outputFile) {
 | 
			
		||||
    for (let f in scriptModule) {
 | 
			
		||||
        let m = /([A-Za-z]+)_([A-Za-z]+)/.exec(f);
 | 
			
		||||
        if (m)
 | 
			
		||||
            eventHandlers[m[1] + "." + m[2]] = scriptModule[f];
 | 
			
		||||
            eventHandlers[`${m[1]}.${m[2]}`] = scriptModule[f];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Shell.PerfLog.get_default().replay(
 | 
			
		||||
@@ -224,15 +224,15 @@ function _collect(scriptModule, outputFile) {
 | 
			
		||||
            // Extra checks here because JSON.stringify generates
 | 
			
		||||
            // invalid JSON for undefined values
 | 
			
		||||
            if (metric.description == null) {
 | 
			
		||||
                log("Error: No description found for metric " + name);
 | 
			
		||||
                log(`Error: No description found for metric ${name}`);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (metric.units == null) {
 | 
			
		||||
                log("Error: No units found for metric " + name);
 | 
			
		||||
                log(`Error: No units found for metric ${name}`);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (metric.value == null) {
 | 
			
		||||
                log("Error: No value found for metric " + name);
 | 
			
		||||
                log(`Error: No value found for metric ${name}`);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -241,10 +241,10 @@ function _collect(scriptModule, outputFile) {
 | 
			
		||||
            first = false;
 | 
			
		||||
 | 
			
		||||
            Shell.write_string_to_stream(out,
 | 
			
		||||
                                         '{ "name": ' + JSON.stringify(name) + ',\n' +
 | 
			
		||||
                                         '    "description": ' + JSON.stringify(metric.description) + ',\n' +
 | 
			
		||||
                                         '    "units": ' + JSON.stringify(metric.units) + ',\n' +
 | 
			
		||||
                                         '    "value": ' + JSON.stringify(metric.value) + ' }');
 | 
			
		||||
                                         `{ "name": ${JSON.stringify(name)},\n` +
 | 
			
		||||
                                         `    "description": ${JSON.stringify(metric.description)},\n` +
 | 
			
		||||
                                         `    "units": ${JSON.stringify(metric.units)},\n` +
 | 
			
		||||
                                         `    "value": ${JSON.stringify(metric.value)} }`);
 | 
			
		||||
        }
 | 
			
		||||
        Shell.write_string_to_stream(out, ' ]');
 | 
			
		||||
 | 
			
		||||
@@ -263,8 +263,8 @@ function _collect(scriptModule, outputFile) {
 | 
			
		||||
        print ('------------------------------------------------------------');
 | 
			
		||||
        for (let i = 0; i < metrics.length; i++) {
 | 
			
		||||
            let metric = metrics[i];
 | 
			
		||||
            print ('# ' + scriptModule.METRICS[metric].description);
 | 
			
		||||
            print (metric + ': ' +  scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units);
 | 
			
		||||
            print (`# ${scriptModule.METRICS[metric].description}`);
 | 
			
		||||
            print (`${metric}: ${scriptModule.METRICS[metric].value}${scriptModule.METRICS[metric].units}`);
 | 
			
		||||
        }
 | 
			
		||||
        print ('------------------------------------------------------------');
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -214,13 +214,13 @@ var SearchResultsBase = class {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (metas.length != metasNeeded.length) {
 | 
			
		||||
                    log('Wrong number of result metas returned by search provider ' + this.provider.id +
 | 
			
		||||
                        ': expected ' + metasNeeded.length + ' but got ' + metas.length);
 | 
			
		||||
                    log(`Wrong number of result metas returned by search provider ${this.provider.id}: ` +
 | 
			
		||||
                        `expected ${metasNeeded.length} but got ${metas.length}`);
 | 
			
		||||
                    callback(false);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (metas.some(meta => !meta.name || !meta.id)) {
 | 
			
		||||
                    log('Invalid result meta returned from search provider ' + this.provider.id);
 | 
			
		||||
                    log(`Invalid result meta returned from search provider ${this.provider.id}`);
 | 
			
		||||
                    callback(false);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,7 @@ function _loadMode(file, info) {
 | 
			
		||||
        if (fileContent instanceof Uint8Array)
 | 
			
		||||
            fileContent = imports.byteArray.toString(fileContent);
 | 
			
		||||
        newMode = JSON.parse(fileContent);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -128,7 +128,7 @@ function _loadMode(file, info) {
 | 
			
		||||
    let propBlacklist = ['unlockDialog'];
 | 
			
		||||
    for (let prop in _modes[DEFAULT_MODE]) {
 | 
			
		||||
        if (newMode[prop] !== undefined &&
 | 
			
		||||
            propBlacklist.indexOf(prop) == -1)
 | 
			
		||||
            !propBlacklist.includes(prop))
 | 
			
		||||
            _modes[modeName][prop] = newMode[prop];
 | 
			
		||||
    }
 | 
			
		||||
    _modes[modeName]['isPrimary'] = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,8 @@ var GnomeShell = class {
 | 
			
		||||
        this._grabbers = new Map();
 | 
			
		||||
 | 
			
		||||
        global.display.connect('accelerator-activated',
 | 
			
		||||
            (display, action, deviceid, timestamp) => {
 | 
			
		||||
                this._emitAcceleratorActivated(action, deviceid, timestamp);
 | 
			
		||||
            (display, action, device, timestamp) => {
 | 
			
		||||
                this._emitAcceleratorActivated(action, device, timestamp);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this._cachedOverviewVisible = false;
 | 
			
		||||
@@ -65,7 +65,7 @@ var GnomeShell = class {
 | 
			
		||||
                returnValue = '';
 | 
			
		||||
            success = true;
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            returnValue = '' + e;
 | 
			
		||||
            returnValue = `${e}`;
 | 
			
		||||
            success = false;
 | 
			
		||||
        }
 | 
			
		||||
        return [success, returnValue];
 | 
			
		||||
@@ -144,14 +144,15 @@ var GnomeShell = class {
 | 
			
		||||
        return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _emitAcceleratorActivated(action, deviceid, timestamp) {
 | 
			
		||||
    _emitAcceleratorActivated(action, device, timestamp) {
 | 
			
		||||
        let destination = this._grabbedAccelerators.get(action);
 | 
			
		||||
        if (!destination)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let connection = this._dbusImpl.get_connection();
 | 
			
		||||
        let info = this._dbusImpl.get_info();
 | 
			
		||||
        let params = { 'device-id': GLib.Variant.new('u', deviceid),
 | 
			
		||||
        let params = { 'device-id': GLib.Variant.new('u', device.get_device_id()),
 | 
			
		||||
                       'device-node': GLib.Variant.new('s', device.get_device_node()),
 | 
			
		||||
                       'timestamp': GLib.Variant.new('u', timestamp),
 | 
			
		||||
                       'action-mode': GLib.Variant.new('u', Main.actionMode) };
 | 
			
		||||
        connection.emit_signal(destination,
 | 
			
		||||
 
 | 
			
		||||
@@ -118,7 +118,7 @@ function _setMenuAlignment(entry, stageX) {
 | 
			
		||||
    let [success, entryX, entryY] = entry.transform_stage_point(stageX, 0);
 | 
			
		||||
    if (success)
 | 
			
		||||
        entry.menu.setSourceAlignment(entryX / entry.width);
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _onButtonPressEvent(actor, event, entry) {
 | 
			
		||||
    if (entry.menu.isOpen) {
 | 
			
		||||
@@ -131,14 +131,14 @@ function _onButtonPressEvent(actor, event, entry) {
 | 
			
		||||
        return Clutter.EVENT_STOP;
 | 
			
		||||
    }
 | 
			
		||||
    return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _onPopup(actor, entry) {
 | 
			
		||||
    let [success, textX, textY, lineHeight] = entry.clutter_text.position_to_coords(-1);
 | 
			
		||||
    if (success)
 | 
			
		||||
        entry.menu.setSourceAlignment(textX / entry.width);
 | 
			
		||||
    entry.menu.open(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function addContextMenu(entry, params) {
 | 
			
		||||
    if (entry.menu)
 | 
			
		||||
@@ -162,7 +162,7 @@ function addContextMenu(entry, params) {
 | 
			
		||||
        _onButtonPressEvent(actor, event, entry);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    entry.connect('popup-menu', actor => { _onPopup(actor, entry); });
 | 
			
		||||
    entry.connect('popup-menu', actor => _onPopup(actor, entry));
 | 
			
		||||
 | 
			
		||||
    entry.connect('destroy', () => {
 | 
			
		||||
        entry.menu.destroy();
 | 
			
		||||
 
 | 
			
		||||
@@ -20,23 +20,13 @@ var WORK_SPINNER_ICON_SIZE = 16;
 | 
			
		||||
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
 | 
			
		||||
 | 
			
		||||
/* ------ Common Utils ------- */
 | 
			
		||||
function _setLabelText(label, text) {
 | 
			
		||||
    if (text) {
 | 
			
		||||
        label.set_text(text);
 | 
			
		||||
        label.show();
 | 
			
		||||
    } else {
 | 
			
		||||
        label.set_text('');
 | 
			
		||||
        label.hide();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _setButtonsForChoices(dialog, choices) {
 | 
			
		||||
    let buttons = [];
 | 
			
		||||
 | 
			
		||||
    for (let idx = 0; idx < choices.length; idx++) {
 | 
			
		||||
        let button = idx;
 | 
			
		||||
        buttons.unshift({ label: choices[idx],
 | 
			
		||||
                          action: () => { dialog.emit('response', button); }
 | 
			
		||||
                          action: () => dialog.emit('response', button)
 | 
			
		||||
                        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -50,18 +40,13 @@ function _setLabelsForMessage(content, message) {
 | 
			
		||||
    content.body = labels.join('\n');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _createIcon(gicon) {
 | 
			
		||||
    return new St.Icon({ gicon: gicon,
 | 
			
		||||
                         style_class: 'shell-mount-operation-icon' })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
var ListItem = class {
 | 
			
		||||
    constructor(app) {
 | 
			
		||||
        this._app = app;
 | 
			
		||||
 | 
			
		||||
        let layout = new St.BoxLayout({ vertical: false});
 | 
			
		||||
        let layout = new St.BoxLayout({ vertical: false });
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.Button({ style_class: 'mount-dialog-app-list-item',
 | 
			
		||||
                                     can_focus: true,
 | 
			
		||||
@@ -403,7 +388,7 @@ var ShellMountPasswordDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        this._defaultButtons = [{ label: _("Cancel"),
 | 
			
		||||
                                  action: this._onCancelButton.bind(this),
 | 
			
		||||
                                  key:    Clutter.Escape
 | 
			
		||||
                                  key: Clutter.Escape
 | 
			
		||||
                                },
 | 
			
		||||
                                { label: _("Unlock"),
 | 
			
		||||
                                  action: this._onUnlockButton.bind(this),
 | 
			
		||||
@@ -412,7 +397,7 @@ var ShellMountPasswordDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        this._usesKeyfilesButtons = [{ label: _("Cancel"),
 | 
			
		||||
                                       action: this._onCancelButton.bind(this),
 | 
			
		||||
                                       key:    Clutter.Escape
 | 
			
		||||
                                       key: Clutter.Escape
 | 
			
		||||
                                     },
 | 
			
		||||
                                     { /* Translators: %s is the Disks application */
 | 
			
		||||
                                       label: _("Open %s").format(disksApp.get_name()),
 | 
			
		||||
@@ -504,7 +489,7 @@ var ShellProcessesDialog = GObject.registerClass({
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent({ icon });
 | 
			
		||||
        this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
 | 
			
		||||
 | 
			
		||||
        let scrollView = new St.ScrollView({ style_class: 'mount-dialog-app-list'});
 | 
			
		||||
        let scrollView = new St.ScrollView({ style_class: 'mount-dialog-app-list' });
 | 
			
		||||
        scrollView.set_policy(St.PolicyType.NEVER,
 | 
			
		||||
                              St.PolicyType.AUTOMATIC);
 | 
			
		||||
        this.contentLayout.add(scrollView,
 | 
			
		||||
@@ -594,7 +579,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
    _setCurrentRequest(invocation, id, type) {
 | 
			
		||||
        let oldId = this._currentId;
 | 
			
		||||
        let oldType = this._currentType;
 | 
			
		||||
        let requestId = id + '@' + invocation.get_sender();
 | 
			
		||||
        let requestId = `${id}@${invocation.get_sender()}`;
 | 
			
		||||
 | 
			
		||||
        this._clearCurrentRequest(Gio.MountOperationResult.UNHANDLED, {});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,8 @@ var Slider = class extends BarLevel.BarLevel {
 | 
			
		||||
            canFocus: true,
 | 
			
		||||
            reactive: true,
 | 
			
		||||
            accessibleRole: Atk.Role.SLIDER,
 | 
			
		||||
        }
 | 
			
		||||
        super(value, params)
 | 
			
		||||
        };
 | 
			
		||||
        super(value, params);
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('button-press-event', this._startDragging.bind(this));
 | 
			
		||||
        this.actor.connect('touch-event', this._touchDragging.bind(this));
 | 
			
		||||
@@ -42,8 +42,6 @@ var Slider = class extends BarLevel.BarLevel {
 | 
			
		||||
        let [hasHandleColor, handleBorderColor] =
 | 
			
		||||
            themeNode.lookup_color('-slider-handle-border-color', false);
 | 
			
		||||
 | 
			
		||||
        const TAU = Math.PI * 2;
 | 
			
		||||
 | 
			
		||||
        let handleX = handleRadius + (width - 2 * handleRadius) * this._value / this._maxValue;
 | 
			
		||||
        let handleY = height / 2;
 | 
			
		||||
 | 
			
		||||
@@ -144,7 +142,7 @@ var Slider = class extends BarLevel.BarLevel {
 | 
			
		||||
        if (direction == Clutter.ScrollDirection.DOWN) {
 | 
			
		||||
            delta = -SLIDER_SCROLL_STEP;
 | 
			
		||||
        } else if (direction == Clutter.ScrollDirection.UP) {
 | 
			
		||||
            delta = +SLIDER_SCROLL_STEP;
 | 
			
		||||
            delta = SLIDER_SCROLL_STEP;
 | 
			
		||||
        } else if (direction == Clutter.ScrollDirection.SMOOTH) {
 | 
			
		||||
            let [dx, dy] = event.get_scroll_delta();
 | 
			
		||||
            // Even though the slider is horizontal, use dy to match
 | 
			
		||||
@@ -185,10 +183,9 @@ var Slider = class extends BarLevel.BarLevel {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _moveHandle(absX, absY) {
 | 
			
		||||
        let relX, relY, sliderX, sliderY;
 | 
			
		||||
        [sliderX, sliderY] = this.actor.get_transformed_position();
 | 
			
		||||
        let relX, sliderX;
 | 
			
		||||
        [sliderX] = this.actor.get_transformed_position();
 | 
			
		||||
        relX = absX - sliderX;
 | 
			
		||||
        relY = absY - sliderY;
 | 
			
		||||
 | 
			
		||||
        let width = this._barLevelWidth;
 | 
			
		||||
        let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius');
 | 
			
		||||
 
 | 
			
		||||
@@ -42,24 +42,24 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
        this.add_child(this._hbox);
 | 
			
		||||
 | 
			
		||||
        this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
 | 
			
		||||
        this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this));
 | 
			
		||||
        this._a11ySettings.connect(`changed::${KEY_ALWAYS_SHOW}`, this._queueSyncMenuVisibility.bind(this));
 | 
			
		||||
 | 
			
		||||
        let highContrast = this._buildHCItem();
 | 
			
		||||
        this.menu.addMenuItem(highContrast);
 | 
			
		||||
 | 
			
		||||
        let magnifier = this._buildItem(_("Zoom"), APPLICATIONS_SCHEMA,
 | 
			
		||||
                                                   'screen-magnifier-enabled');
 | 
			
		||||
                                        'screen-magnifier-enabled');
 | 
			
		||||
        this.menu.addMenuItem(magnifier);
 | 
			
		||||
 | 
			
		||||
        let textZoom = this._buildFontItem();
 | 
			
		||||
        this.menu.addMenuItem(textZoom);
 | 
			
		||||
 | 
			
		||||
        let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA,
 | 
			
		||||
                                                               'screen-reader-enabled');
 | 
			
		||||
                                           'screen-reader-enabled');
 | 
			
		||||
        this.menu.addMenuItem(screenReader);
 | 
			
		||||
 | 
			
		||||
        let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA,
 | 
			
		||||
                                                                   'screen-keyboard-enabled');
 | 
			
		||||
                                             'screen-keyboard-enabled');
 | 
			
		||||
        this.menu.addMenuItem(screenKeyboard);
 | 
			
		||||
 | 
			
		||||
        let visualBell = this._buildItem(_("Visual Alerts"), WM_SCHEMA, KEY_VISUAL_BELL);
 | 
			
		||||
@@ -99,13 +99,13 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
        GLib.Source.set_name_by_id(this._syncMenuVisibilityIdle, '[gnome-shell] this._syncMenuVisibility');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _buildItemExtended(string, initial_value, writable, on_set) {
 | 
			
		||||
        let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value);
 | 
			
		||||
    _buildItemExtended(string, initialValue, writable, onSet) {
 | 
			
		||||
        let widget = new PopupMenu.PopupSwitchMenuItem(string, initialValue);
 | 
			
		||||
        if (!writable)
 | 
			
		||||
            widget.actor.reactive = false;
 | 
			
		||||
        else
 | 
			
		||||
            widget.connect('toggled', item => {
 | 
			
		||||
                on_set(item.state);
 | 
			
		||||
                onSet(item.state);
 | 
			
		||||
            });
 | 
			
		||||
        return widget;
 | 
			
		||||
    }
 | 
			
		||||
@@ -117,7 +117,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
            settings.is_writable(key),
 | 
			
		||||
            enabled => settings.set_boolean(key, enabled));
 | 
			
		||||
 | 
			
		||||
        settings.connect('changed::' + key, () => {
 | 
			
		||||
        settings.connect(`changed::${key}`, () => {
 | 
			
		||||
            widget.setToggleState(settings.get_boolean(key));
 | 
			
		||||
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
@@ -140,7 +140,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
                if (enabled) {
 | 
			
		||||
                    interfaceSettings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME);
 | 
			
		||||
                    interfaceSettings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME);
 | 
			
		||||
                } else if(!hasHC) {
 | 
			
		||||
                } else if (!hasHC) {
 | 
			
		||||
                    interfaceSettings.set_string(KEY_GTK_THEME, gtkTheme);
 | 
			
		||||
                    interfaceSettings.set_string(KEY_ICON_THEME, iconTheme);
 | 
			
		||||
                } else {
 | 
			
		||||
@@ -149,7 +149,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
 | 
			
		||||
        interfaceSettings.connect(`changed::${KEY_GTK_THEME}`, () => {
 | 
			
		||||
            let value = interfaceSettings.get_string(KEY_GTK_THEME);
 | 
			
		||||
            if (value == HIGH_CONTRAST_THEME) {
 | 
			
		||||
                highContrast.setToggleState(true);
 | 
			
		||||
@@ -161,7 +161,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
 | 
			
		||||
        interfaceSettings.connect(`changed::${KEY_ICON_THEME}`, () => {
 | 
			
		||||
            let value = interfaceSettings.get_string(KEY_ICON_THEME);
 | 
			
		||||
            if (value != HIGH_CONTRAST_THEME)
 | 
			
		||||
                iconTheme = value;
 | 
			
		||||
@@ -173,9 +173,9 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
    _buildFontItem() {
 | 
			
		||||
        let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
 | 
			
		||||
        let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
        let initial_setting = (factor > 1.0);
 | 
			
		||||
        let initialSetting = (factor > 1.0);
 | 
			
		||||
        let widget = this._buildItemExtended(_("Large Text"),
 | 
			
		||||
            initial_setting,
 | 
			
		||||
            initialSetting,
 | 
			
		||||
            settings.is_writable(KEY_TEXT_SCALING_FACTOR),
 | 
			
		||||
            enabled => {
 | 
			
		||||
                if (enabled)
 | 
			
		||||
@@ -185,7 +185,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
                    settings.reset(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
 | 
			
		||||
        settings.connect(`changed::${KEY_TEXT_SCALING_FACTOR}`, () => {
 | 
			
		||||
            let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
            let active = (factor > 1.0);
 | 
			
		||||
            widget.setToggleState(active);
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
    _getNDevices() {
 | 
			
		||||
        let adapter = this._getDefaultAdapter();
 | 
			
		||||
        if (!adapter)
 | 
			
		||||
            return [ this._hadSetupDevices ? 1 : -1, -1 ];
 | 
			
		||||
            return [this._hadSetupDevices ? 1 : -1, -1];
 | 
			
		||||
 | 
			
		||||
        let nConnectedDevices = 0;
 | 
			
		||||
        let nDevices = 0;
 | 
			
		||||
@@ -105,11 +105,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
            global.settings.set_boolean(HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return [ nDevices, nConnectedDevices];
 | 
			
		||||
        return [nDevices, nConnectedDevices];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        let [ nDevices, nConnectedDevices ] = this._getNDevices();
 | 
			
		||||
        let [nDevices, nConnectedDevices] = this._getNDevices();
 | 
			
		||||
        let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
 | 
			
		||||
 | 
			
		||||
        this.menu.setSensitive(sensitive);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, St } = imports.gi;
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
 | 
			
		||||
const PanelMenu = imports.ui.panelMenu;
 | 
			
		||||
const PopupMenu = imports.ui.popupMenu;
 | 
			
		||||
@@ -9,26 +8,26 @@ const KEY_DWELL_CLICK_ENABLED = 'dwell-click-enabled';
 | 
			
		||||
const KEY_DWELL_MODE          = 'dwell-mode';
 | 
			
		||||
const DWELL_MODE_WINDOW       = 'window';
 | 
			
		||||
const DWELL_CLICK_MODES = {
 | 
			
		||||
    primary:   {
 | 
			
		||||
                 name: _("Single Click"),
 | 
			
		||||
                 icon: 'pointer-primary-click-symbolic',
 | 
			
		||||
                 type: Clutter.PointerA11yDwellClickType.PRIMARY
 | 
			
		||||
               },
 | 
			
		||||
    double:    {
 | 
			
		||||
                 name: _("Double Click"),
 | 
			
		||||
                 icon: 'pointer-double-click-symbolic',
 | 
			
		||||
                 type: Clutter.PointerA11yDwellClickType.DOUBLE
 | 
			
		||||
               },
 | 
			
		||||
    drag:      {
 | 
			
		||||
                 name: _("Drag"),
 | 
			
		||||
                 icon: 'pointer-drag-symbolic',
 | 
			
		||||
                 type: Clutter.PointerA11yDwellClickType.DRAG
 | 
			
		||||
               },
 | 
			
		||||
    primary: {
 | 
			
		||||
        name: _("Single Click"),
 | 
			
		||||
        icon: 'pointer-primary-click-symbolic',
 | 
			
		||||
        type: Clutter.PointerA11yDwellClickType.PRIMARY
 | 
			
		||||
    },
 | 
			
		||||
    double: {
 | 
			
		||||
        name: _("Double Click"),
 | 
			
		||||
        icon: 'pointer-double-click-symbolic',
 | 
			
		||||
        type: Clutter.PointerA11yDwellClickType.DOUBLE
 | 
			
		||||
    },
 | 
			
		||||
    drag: {
 | 
			
		||||
        name: _("Drag"),
 | 
			
		||||
        icon: 'pointer-drag-symbolic',
 | 
			
		||||
        type: Clutter.PointerA11yDwellClickType.DRAG
 | 
			
		||||
    },
 | 
			
		||||
    secondary: {
 | 
			
		||||
                 name: _("Secondary Click"),
 | 
			
		||||
                 icon: 'pointer-secondary-click-symbolic',
 | 
			
		||||
                 type: Clutter.PointerA11yDwellClickType.SECONDARY
 | 
			
		||||
               },
 | 
			
		||||
        name: _("Secondary Click"),
 | 
			
		||||
        icon: 'pointer-secondary-click-symbolic',
 | 
			
		||||
        type: Clutter.PointerA11yDwellClickType.SECONDARY
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var DwellClickIndicator = GObject.registerClass(
 | 
			
		||||
@@ -45,8 +44,8 @@ class DwellClickIndicator extends PanelMenu.Button {
 | 
			
		||||
        this.add_child(this._hbox);
 | 
			
		||||
 | 
			
		||||
        this._a11ySettings = new Gio.Settings({ schema_id: MOUSE_A11Y_SCHEMA });
 | 
			
		||||
        this._a11ySettings.connect('changed::' + KEY_DWELL_CLICK_ENABLED, this._syncMenuVisibility.bind(this));
 | 
			
		||||
        this._a11ySettings.connect('changed::' + KEY_DWELL_MODE, this._syncMenuVisibility.bind(this));
 | 
			
		||||
        this._a11ySettings.connect(`changed::${KEY_DWELL_CLICK_ENABLED}`, this._syncMenuVisibility.bind(this));
 | 
			
		||||
        this._a11ySettings.connect(`changed::${KEY_DWELL_MODE}`, this._syncMenuVisibility.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._deviceManager = Clutter.DeviceManager.get_default();
 | 
			
		||||
        this._deviceManager.connect('ptr-a11y-dwell-click-type-changed', this._updateClickType.bind(this));
 | 
			
		||||
@@ -72,9 +71,9 @@ class DwellClickIndicator extends PanelMenu.Button {
 | 
			
		||||
        this.menu.addAction(mode.name, this._setClickType.bind(this, mode), mode.icon);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateClickType(manager, click_type) {
 | 
			
		||||
    _updateClickType(manager, clickType) {
 | 
			
		||||
        for (let mode in DWELL_CLICK_MODES) {
 | 
			
		||||
            if (DWELL_CLICK_MODES[mode].type == click_type)
 | 
			
		||||
            if (DWELL_CLICK_MODES[mode].type == clickType)
 | 
			
		||||
                this._icon.icon_name = DWELL_CLICK_MODES[mode].icon;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ var InputSource = class {
 | 
			
		||||
            return this.id;
 | 
			
		||||
 | 
			
		||||
        if (engineDesc.variant && engineDesc.variant.length > 0)
 | 
			
		||||
            return engineDesc.layout + '+' + engineDesc.variant;
 | 
			
		||||
            return `${engineDesc.layout}+${engineDesc.variant}`;
 | 
			
		||||
        else
 | 
			
		||||
            return engineDesc.layout;
 | 
			
		||||
    }
 | 
			
		||||
@@ -199,8 +199,8 @@ var InputSourceSystemSettings = class extends InputSourceSettings {
 | 
			
		||||
                                 let props;
 | 
			
		||||
                                 try {
 | 
			
		||||
                                     props = conn.call_finish(result).deep_unpack()[0];
 | 
			
		||||
                                 } catch(e) {
 | 
			
		||||
                                     log('Could not get properties from ' + this._BUS_NAME);
 | 
			
		||||
                                 } catch (e) {
 | 
			
		||||
                                     log(`Could not get properties from ${this._BUS_NAME}`);
 | 
			
		||||
                                     return;
 | 
			
		||||
                                 }
 | 
			
		||||
                                 let layouts = props['X11Layout'].unpack();
 | 
			
		||||
@@ -227,8 +227,8 @@ var InputSourceSystemSettings = class extends InputSourceSettings {
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < layouts.length && !!layouts[i]; i++) {
 | 
			
		||||
            let id = layouts[i];
 | 
			
		||||
            if (!!variants[i])
 | 
			
		||||
                id += '+' + variants[i];
 | 
			
		||||
            if (variants[i])
 | 
			
		||||
                id += `+${variants[i]}`;
 | 
			
		||||
            sourcesList.push({ type: INPUT_SOURCE_TYPE_XKB, id: id });
 | 
			
		||||
        }
 | 
			
		||||
        return sourcesList;
 | 
			
		||||
@@ -250,9 +250,9 @@ var InputSourceSessionSettings = class extends InputSourceSettings {
 | 
			
		||||
        this._KEY_PER_WINDOW = 'per-window';
 | 
			
		||||
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA });
 | 
			
		||||
        this._settings.connect('changed::' + this._KEY_INPUT_SOURCES, this._emitInputSourcesChanged.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + this._KEY_KEYBOARD_OPTIONS, this._emitKeyboardOptionsChanged.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + this._KEY_PER_WINDOW, this._emitPerWindowChanged.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${this._KEY_INPUT_SOURCES}`, this._emitInputSourcesChanged.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${this._KEY_KEYBOARD_OPTIONS}`, this._emitKeyboardOptionsChanged.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${this._KEY_PER_WINDOW}`, this._emitPerWindowChanged.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getSourcesList(key) {
 | 
			
		||||
@@ -539,7 +539,7 @@ var InputSourceManager = class {
 | 
			
		||||
            let exists = false;
 | 
			
		||||
 | 
			
		||||
            if (type == INPUT_SOURCE_TYPE_XKB) {
 | 
			
		||||
                [exists, displayName, shortName, , ] =
 | 
			
		||||
                [exists, displayName, shortName] =
 | 
			
		||||
                    this._xkbInfo.get_layout_info(id);
 | 
			
		||||
            } else if (type == INPUT_SOURCE_TYPE_IBUS) {
 | 
			
		||||
                if (this._disableIBus)
 | 
			
		||||
@@ -564,7 +564,7 @@ var InputSourceManager = class {
 | 
			
		||||
        if (infosList.length == 0) {
 | 
			
		||||
            let type = INPUT_SOURCE_TYPE_XKB;
 | 
			
		||||
            let id = KeyboardManager.DEFAULT_LAYOUT;
 | 
			
		||||
            let [ , displayName, shortName, , ] = this._xkbInfo.get_layout_info(id);
 | 
			
		||||
            let [, displayName, shortName] = this._xkbInfo.get_layout_info(id);
 | 
			
		||||
            infosList.push({ type: type, id: id, displayName: displayName, shortName: shortName });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -875,7 +875,7 @@ class InputSourceIndicator extends PanelMenu.Button {
 | 
			
		||||
            let is = this._inputSourceManager.inputSources[i];
 | 
			
		||||
 | 
			
		||||
            let menuItem = new LayoutMenuItem(is.displayName, is.shortName);
 | 
			
		||||
            menuItem.connect('activate', () => { is.activate(true); });
 | 
			
		||||
            menuItem.connect('activate', () => is.activate(true));
 | 
			
		||||
 | 
			
		||||
            let indicatorLabel = new St.Label({ text: is.shortName,
 | 
			
		||||
                                                visible: false });
 | 
			
		||||
@@ -1059,7 +1059,7 @@ class InputSourceIndicator extends PanelMenu.Button {
 | 
			
		||||
 | 
			
		||||
        let description = xkbLayout;
 | 
			
		||||
        if (xkbVariant.length > 0)
 | 
			
		||||
            description = description + '\t' + xkbVariant;
 | 
			
		||||
            description = `${description}\t${xkbVariant}`;
 | 
			
		||||
 | 
			
		||||
        Util.spawn(['gkbd-keyboard-display', '-l', description]);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user