Compare commits
	
		
			25 Commits
		
	
	
		
			wip/cherge
			...
			issue219
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1b7577298a | ||
| 
						 | 
					c4e0f6df08 | ||
| 
						 | 
					58aafe9520 | ||
| 
						 | 
					a46df7f8ec | ||
| 
						 | 
					1dd16618d1 | ||
| 
						 | 
					a4190f83ac | ||
| 
						 | 
					a8e17f73ec | ||
| 
						 | 
					86a741c1ee | ||
| 
						 | 
					5cc6fef689 | ||
| 
						 | 
					522a5fe480 | ||
| 
						 | 
					b1239b1257 | ||
| 
						 | 
					58063d9ee1 | ||
| 
						 | 
					d7aba2dece | ||
| 
						 | 
					35fced27df | ||
| 
						 | 
					be76b19300 | ||
| 
						 | 
					376d696b8b | ||
| 
						 | 
					695d61968d | ||
| 
						 | 
					d6d09fd3c8 | ||
| 
						 | 
					f1b1501f9b | ||
| 
						 | 
					cdbc99e992 | ||
| 
						 | 
					69afe7785d | ||
| 
						 | 
					b99e304f1e | ||
| 
						 | 
					c29bd46e7a | ||
| 
						 | 
					5fcf40b973 | ||
| 
						 | 
					a198dfe3d8 | 
@@ -1788,20 +1788,19 @@ StScrollBar {
 | 
			
		||||
  .login-dialog-user-list-view { -st-vfade-offset: 1em; }
 | 
			
		||||
  .login-dialog-user-list {
 | 
			
		||||
    spacing: 12px;
 | 
			
		||||
    padding: .2em;
 | 
			
		||||
    width: 23em;
 | 
			
		||||
    &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
 | 
			
		||||
    &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
 | 
			
		||||
  }
 | 
			
		||||
  .login-dialog-user-list-item {
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    padding: .2em;
 | 
			
		||||
    padding: 6px;
 | 
			
		||||
    color: darken($osd_fg_color,30%);
 | 
			
		||||
    &:ltr { padding-right: 1em; }
 | 
			
		||||
    &:rtl { padding-left: 1em; }
 | 
			
		||||
    &:ltr .user-widget { padding-right: 1em; }
 | 
			
		||||
    &:rtl .user-widget { padding-left: 1em; }
 | 
			
		||||
    .login-dialog-timed-login-indicator {
 | 
			
		||||
      height: 2px;
 | 
			
		||||
      margin: 2px 0 0 0;
 | 
			
		||||
      margin-top: 6px;
 | 
			
		||||
      background-color: $osd_fg_color;
 | 
			
		||||
    }
 | 
			
		||||
    &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
 | 
			
		||||
@@ -1816,8 +1815,8 @@ StScrollBar {
 | 
			
		||||
    padding-left: 15px;
 | 
			
		||||
  }
 | 
			
		||||
    .user-widget-label {
 | 
			
		||||
      &:ltr { padding-left: 18px; }
 | 
			
		||||
      &:rtl { padding-right: 18px; }
 | 
			
		||||
      &:ltr { padding-left: 14px; }
 | 
			
		||||
      &:rtl { padding-right: 14px; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  .login-dialog-prompt-layout {
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ const GLib = imports.gi.GLib;
 | 
			
		||||
const GObject = imports.gi.GObject;
 | 
			
		||||
const Gtk = imports.gi.Gtk;
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
const Meta = imports.gi.Meta;
 | 
			
		||||
const Pango = imports.gi.Pango;
 | 
			
		||||
const Shell = imports.gi.Shell;
 | 
			
		||||
@@ -86,7 +85,8 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
                                             GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
 | 
			
		||||
                                                 scale_x: 0 });
 | 
			
		||||
                                                 scale_x: 0,
 | 
			
		||||
                                                 visible: false });
 | 
			
		||||
        layout.add(this._timedLoginIndicator);
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('clicked', this._onClicked.bind(this));
 | 
			
		||||
@@ -126,6 +126,8 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this.hideTimedLoginIndicator();
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator.visible = true;
 | 
			
		||||
 | 
			
		||||
        let startTime = GLib.get_monotonic_time();
 | 
			
		||||
 | 
			
		||||
        this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33,
 | 
			
		||||
@@ -152,6 +154,8 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
            GLib.source_remove(this._timedLoginTimeoutId);
 | 
			
		||||
            this._timedLoginTimeoutId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator.visible = false;
 | 
			
		||||
        this._timedLoginIndicator.scale_x = 0.;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
@@ -991,59 +995,81 @@ var LoginDialog = new Lang.Class({
 | 
			
		||||
        return hold;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _showTimedLoginAnimation() {
 | 
			
		||||
        this._timedLoginItem.actor.grab_key_focus();
 | 
			
		||||
        return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _blockTimedLoginUntilIdle() {
 | 
			
		||||
        // This blocks timed login from starting until a few
 | 
			
		||||
        // seconds after the user stops interacting with the
 | 
			
		||||
        // login screen.
 | 
			
		||||
        //
 | 
			
		||||
        // We skip this step if the timed login delay is very
 | 
			
		||||
        // short.
 | 
			
		||||
        if ((this._timedLoginDelay - _TIMED_LOGIN_IDLE_THRESHOLD) <= 0)
 | 
			
		||||
          return null;
 | 
			
		||||
 | 
			
		||||
        let hold = new Batch.Hold();
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIdleTimeOutId = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD,
 | 
			
		||||
        this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD,
 | 
			
		||||
            () => {
 | 
			
		||||
                this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD;
 | 
			
		||||
                this._timedLoginIdleTimeOutId = 0;
 | 
			
		||||
                hold.release();
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
        GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
 | 
			
		||||
        GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId');
 | 
			
		||||
        return hold;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _startTimedLogin(userName, delay) {
 | 
			
		||||
        this._timedLoginItem = null;
 | 
			
		||||
        this._timedLoginDelay = delay;
 | 
			
		||||
        this._timedLoginAnimationTime = delay;
 | 
			
		||||
        let firstRun = true;
 | 
			
		||||
 | 
			
		||||
        // Cancel execution of old batch
 | 
			
		||||
        if (this._timedLoginBatch) {
 | 
			
		||||
            this._timedLoginBatch.cancel();
 | 
			
		||||
            this._timedLoginBatch = null;
 | 
			
		||||
            firstRun = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Reset previous idle-timeout
 | 
			
		||||
        if (this._timedLoginIdleTimeOutId) {
 | 
			
		||||
            GLib.source_remove(this._timedLoginIdleTimeOutId);
 | 
			
		||||
            this._timedLoginIdleTimeOutId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let loginItem = null;
 | 
			
		||||
        let animationTime;
 | 
			
		||||
 | 
			
		||||
        let tasks = [() => this._waitForItemForUser(userName),
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         this._timedLoginItem = this._userList.getItemFromUserName(userName);
 | 
			
		||||
                         loginItem = this._userList.getItemFromUserName(userName);
 | 
			
		||||
 | 
			
		||||
                         // If there is an animation running on the item, reset it.
 | 
			
		||||
                         loginItem.hideTimedLoginIndicator();
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // If we're just starting out, start on the right
 | 
			
		||||
                         // item.
 | 
			
		||||
                         // If we're just starting out, start on the right item.
 | 
			
		||||
                         if (!this._userManager.is_loaded) {
 | 
			
		||||
                             this._userList.jumpToItem(this._timedLoginItem);
 | 
			
		||||
                             this._userList.jumpToItem(loginItem);
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     this._blockTimedLoginUntilIdle,
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         this._userList.scrollToItem(this._timedLoginItem);
 | 
			
		||||
                         // This blocks the timed login animation until a few
 | 
			
		||||
                         // seconds after the user stops interacting with the
 | 
			
		||||
                         // login screen.
 | 
			
		||||
 | 
			
		||||
                         // We skip this step if the timed login delay is very short.
 | 
			
		||||
                         if (delay > _TIMED_LOGIN_IDLE_THRESHOLD) {
 | 
			
		||||
                             animationTime = delay - _TIMED_LOGIN_IDLE_THRESHOLD;
 | 
			
		||||
                             return this._blockTimedLoginUntilIdle();
 | 
			
		||||
                         } else {
 | 
			
		||||
                             animationTime = delay;
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     this._showTimedLoginAnimation,
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // If idle timeout is done, make sure the timed login indicator is shown
 | 
			
		||||
                         if (delay > _TIMED_LOGIN_IDLE_THRESHOLD &&
 | 
			
		||||
                             this._authPrompt.actor.visible)
 | 
			
		||||
                             this._authPrompt.cancel();
 | 
			
		||||
 | 
			
		||||
                         if (delay > _TIMED_LOGIN_IDLE_THRESHOLD || firstRun) {
 | 
			
		||||
                             this._userList.scrollToItem(loginItem);
 | 
			
		||||
                             loginItem.actor.grab_key_focus();
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     () => loginItem.showTimedLoginIndicator(animationTime),
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         this._timedLoginBatch = null;
 | 
			
		||||
@@ -1055,37 +1081,17 @@ var LoginDialog = new Lang.Class({
 | 
			
		||||
        return this._timedLoginBatch.run();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _resetTimedLogin() {
 | 
			
		||||
        if (this._timedLoginBatch) {
 | 
			
		||||
            this._timedLoginBatch.cancel();
 | 
			
		||||
            this._timedLoginBatch = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._timedLoginItem)
 | 
			
		||||
            this._timedLoginItem.hideTimedLoginIndicator();
 | 
			
		||||
 | 
			
		||||
        let userName = this._timedLoginItem.user.get_user_name();
 | 
			
		||||
 | 
			
		||||
        if (userName)
 | 
			
		||||
            this._startTimedLogin(userName, this._timedLoginDelay);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onTimedLoginRequested(client, userName, seconds) {
 | 
			
		||||
        if (this._timedLoginBatch)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._startTimedLogin(userName, seconds);
 | 
			
		||||
 | 
			
		||||
        // Restart timed login on user interaction
 | 
			
		||||
        global.stage.connect('captured-event', (actor, event) => {
 | 
			
		||||
           if (this._timedLoginDelay == undefined)
 | 
			
		||||
               return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
           if (event.type() == Clutter.EventType.KEY_PRESS ||
 | 
			
		||||
               event.type() == Clutter.EventType.BUTTON_PRESS) {
 | 
			
		||||
               if (this._timedLoginBatch) {
 | 
			
		||||
                   this._timedLoginBatch.cancel();
 | 
			
		||||
                   this._timedLoginBatch = null;
 | 
			
		||||
               }
 | 
			
		||||
           } else if (event.type() == Clutter.EventType.KEY_RELEASE ||
 | 
			
		||||
                      event.type() == Clutter.EventType.BUTTON_RELEASE) {
 | 
			
		||||
               this._resetTimedLogin();
 | 
			
		||||
               this._startTimedLogin(userName, seconds);
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({
 | 
			
		||||
            this._panelService.cursor_down();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._candidateArea.connect('candidate-clicked', () => {
 | 
			
		||||
        this._candidateArea.connect('candidate-clicked', (area, index, button, state) => {
 | 
			
		||||
            this._panelService.candidate_clicked(index, button, state);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -256,6 +256,14 @@ function _getStylesheet(name) {
 | 
			
		||||
    if (stylesheet.query_exists(null))
 | 
			
		||||
        return stylesheet;
 | 
			
		||||
 | 
			
		||||
    let dataDirs = GLib.get_system_data_dirs();
 | 
			
		||||
    for (let i = 0; i < dataDirs.length; i++) {
 | 
			
		||||
        let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]);
 | 
			
		||||
        let stylesheet = Gio.file_new_for_path(path);
 | 
			
		||||
        if (stylesheet.query_exists(null))
 | 
			
		||||
            return stylesheet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
 | 
			
		||||
    if (stylesheet.query_exists(null))
 | 
			
		||||
        return stylesheet;
 | 
			
		||||
 
 | 
			
		||||
@@ -394,8 +394,9 @@ var PopupImageMenuItem = new Lang.Class({
 | 
			
		||||
    _init(text, icon, params) {
 | 
			
		||||
        this.parent(params);
 | 
			
		||||
 | 
			
		||||
        this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
 | 
			
		||||
        this.actor.add_child(this._icon, { align: St.Align.END });
 | 
			
		||||
        this._icon = new St.Icon({ style_class: 'popup-menu-icon',
 | 
			
		||||
                                   x_align: Clutter.ActorAlign.END });
 | 
			
		||||
        this.actor.add_child(this._icon);
 | 
			
		||||
        this.label = new St.Label({ text: text });
 | 
			
		||||
        this.actor.add_child(this.label);
 | 
			
		||||
        this.actor.label_actor = this.label;
 | 
			
		||||
 
 | 
			
		||||
@@ -119,6 +119,9 @@ var RemoteMenuItemMapper = new Lang.Class({
 | 
			
		||||
        this._trackerItem = trackerItem;
 | 
			
		||||
 | 
			
		||||
        this.menuItem = new PopupMenu.PopupBaseMenuItem();
 | 
			
		||||
        this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
 | 
			
		||||
        this.menuItem.actor.add_child(this._icon);
 | 
			
		||||
 | 
			
		||||
        this._label = new St.Label();
 | 
			
		||||
        this.menuItem.actor.add_child(this._label);
 | 
			
		||||
        this.menuItem.actor.label_actor = this._label;
 | 
			
		||||
@@ -129,11 +132,13 @@ var RemoteMenuItemMapper = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        this._trackerItem.connect('notify::icon', this._updateIcon.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::role', this._updateRole.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._updateIcon();
 | 
			
		||||
        this._updateLabel();
 | 
			
		||||
        this._updateSensitivity();
 | 
			
		||||
        this._updateRole();
 | 
			
		||||
@@ -143,6 +148,11 @@ var RemoteMenuItemMapper = new Lang.Class({
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateIcon() {
 | 
			
		||||
        this._icon.gicon = this._trackerItem.icon;
 | 
			
		||||
        this._icon.visible = (this._icon.gicon != null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateLabel() {
 | 
			
		||||
        this._label.text = stripMnemonics(this._trackerItem.label);
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -354,7 +354,7 @@ var Indicator = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    _onEnrollFailed(obj, device, error) {
 | 
			
		||||
	const title = _('Thunderbolt authorization error');
 | 
			
		||||
	const body = _('Could not authorize the thunderbolt device: %s'.format(error.message));
 | 
			
		||||
	const body = _('Could not authorize the Thunderbolt device: %s'.format(error.message));
 | 
			
		||||
	this._notify(title, body);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -275,8 +275,8 @@ var WorkspaceThumbnail = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._createBackground();
 | 
			
		||||
 | 
			
		||||
        let monitor = Main.layoutManager.primaryMonitor;
 | 
			
		||||
        this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
 | 
			
		||||
        let workArea = Main.layoutManager.getWorkAreaForMonitor(this.monitorIndex);
 | 
			
		||||
        this.setPorthole(workArea.x, workArea.y, workArea.width, workArea.height);
 | 
			
		||||
 | 
			
		||||
        let windows = global.get_window_actors().filter(actor => {
 | 
			
		||||
            let win = actor.meta_window;
 | 
			
		||||
@@ -321,8 +321,6 @@ var WorkspaceThumbnail = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setPorthole(x, y, width, height) {
 | 
			
		||||
        this._portholeX = x;
 | 
			
		||||
        this._portholeY = y;
 | 
			
		||||
        this.actor.set_size(width, height);
 | 
			
		||||
        this._contents.set_position(-x, -y);
 | 
			
		||||
    },
 | 
			
		||||
@@ -675,11 +673,7 @@ var ThumbnailsBox = new Lang.Class({
 | 
			
		||||
        this._settings.connect('changed::dynamic-workspaces',
 | 
			
		||||
            this._updateSwitcherVisibility.bind(this));
 | 
			
		||||
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed', () => {
 | 
			
		||||
            this._destroyThumbnails();
 | 
			
		||||
            if (Main.overview.visible)
 | 
			
		||||
                this._createThumbnails();
 | 
			
		||||
        });
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateSwitcherVisibility() {
 | 
			
		||||
@@ -872,6 +866,9 @@ var ThumbnailsBox = new Lang.Class({
 | 
			
		||||
            Main.overview.connect('windows-restacked',
 | 
			
		||||
                                  this._syncStacking.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._workareasChangedId =
 | 
			
		||||
            global.screen.connect('workareas-changed', this._rebuildThumbnails.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._targetScale = 0;
 | 
			
		||||
        this._scale = 0;
 | 
			
		||||
        this._pendingScaleUpdate = false;
 | 
			
		||||
@@ -901,12 +898,24 @@ var ThumbnailsBox = new Lang.Class({
 | 
			
		||||
            this._syncStackingId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._workareasChangedId > 0) {
 | 
			
		||||
            global.screen.disconnect(this._workareasChangedId);
 | 
			
		||||
            this._workareasChangedId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (let w = 0; w < this._thumbnails.length; w++)
 | 
			
		||||
            this._thumbnails[w].destroy();
 | 
			
		||||
        this._thumbnails = [];
 | 
			
		||||
        this._porthole = null;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _rebuildThumbnails() {
 | 
			
		||||
        this._destroyThumbnails();
 | 
			
		||||
 | 
			
		||||
        if (Main.overview.visible)
 | 
			
		||||
            this._createThumbnails();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _workspacesChanged() {
 | 
			
		||||
        let validThumbnails =
 | 
			
		||||
            this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL);
 | 
			
		||||
@@ -1159,7 +1168,7 @@ var ThumbnailsBox = new Lang.Class({
 | 
			
		||||
    // The "porthole" is the portion of the screen that we show in the
 | 
			
		||||
    // workspaces
 | 
			
		||||
    _ensurePorthole() {
 | 
			
		||||
        if (!Main.layoutManager.primaryMonitor)
 | 
			
		||||
        if (!Main.layoutManager.primaryMonitor || !Main.overview.visible)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        if (!this._porthole)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								po/hr.po
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								po/hr.po
									
									
									
									
									
								
							@@ -7,8 +7,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-02-26 17:00+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-07 22:46+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-16 14:30+0200\n"
 | 
			
		||||
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
 | 
			
		||||
"Language-Team: Croatian <hr@li.org>\n"
 | 
			
		||||
"Language: hr\n"
 | 
			
		||||
@@ -337,7 +337,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Dogodila se greška učitavanja dijaloga osobitosti za %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -663,12 +663,12 @@ msgstr "Dodaj u omiljene"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Prikaži pojedinosti"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s je dodan u omiljene."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s je uklonjen iz omiljenih."
 | 
			
		||||
@@ -863,7 +863,7 @@ msgstr "Vanjski uređaj odspojen"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Otvori s(a) %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Lozinka:"
 | 
			
		||||
 | 
			
		||||
@@ -950,15 +950,15 @@ msgstr "Potrebna je lozinka za povezivanje s “%s”."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Mrežni upravitelj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Potrebna je ovjera"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administrator"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Ovjeri"
 | 
			
		||||
 | 
			
		||||
@@ -966,7 +966,7 @@ msgstr "Ovjeri"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Nažalost, to ne radi. Pokušajte ponovno."
 | 
			
		||||
 | 
			
		||||
@@ -1014,7 +1014,7 @@ msgstr "Dodaj satove iz svijeta…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Svjetski satovi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Vrijeme"
 | 
			
		||||
 | 
			
		||||
@@ -1022,7 +1022,7 @@ msgstr "Vrijeme"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s cijeli dan."
 | 
			
		||||
@@ -1031,7 +1031,7 @@ msgstr "%s cijeli dan."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, zatim %s kasnije."
 | 
			
		||||
@@ -1040,30 +1040,30 @@ msgstr "%s, zatim %s kasnije."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, zatim %s, praćena s %s kasnije."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Odaberi lokaciju…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Pretraživanje…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Kao da je %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Posjetite za opširnije vremenske informacije"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Vremenske informacije su trenutno nedostupne"
 | 
			
		||||
 | 
			
		||||
@@ -1977,16 +1977,16 @@ msgstr "Suspendiraj"
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Isključivanje"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:272
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Nepoznati Thunderbolt uređaj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
msgid ""
 | 
			
		||||
"New device has been detected while you were away. Please disconnect and "
 | 
			
		||||
"reconnect the device to start using it."
 | 
			
		||||
@@ -1994,14 +1994,14 @@ msgstr ""
 | 
			
		||||
"Otkriven je novi uređaj dok ste bili odsutni. Odspojite i ponovno spojite "
 | 
			
		||||
"uređaj kako bi ga mogli koristiti."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:334
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Greška Thunderbolt ovjere"
 | 
			
		||||
msgstr "Greška Thunderbolt odobravanja"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "Nemoguća ovjera Thunderbolt uređaja: %s"
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgstr "Nemoguće odobravanje Thunderbolt uređaja: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
msgid "Volume changed"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								po/ru.po
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								po/ru.po
									
									
									
									
									
								
							@@ -18,8 +18,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-12 11:47+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-12 16:48+0300\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 18:31+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-19 23:31+0300\n"
 | 
			
		||||
"Last-Translator: Stas Solovey <whats_up@tut.by>\n"
 | 
			
		||||
"Language-Team: Русский <gnome-cyr@gnome.org>\n"
 | 
			
		||||
"Language: ru\n"
 | 
			
		||||
@@ -344,7 +344,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:149
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -563,7 +563,6 @@ msgstr "Вчера, %H∶%M"
 | 
			
		||||
msgid "%A, %H∶%M"
 | 
			
		||||
msgstr "%A, %H∶%M"
 | 
			
		||||
 | 
			
		||||
# fix даты "11 мар., 20:35"
 | 
			
		||||
#. Translators: this is the month name and day number
 | 
			
		||||
#. followed by a time string in 24h format.
 | 
			
		||||
#. i.e. "May 25, 14:30"
 | 
			
		||||
@@ -572,7 +571,6 @@ msgstr "%A, %H∶%M"
 | 
			
		||||
msgid "%B %d, %H∶%M"
 | 
			
		||||
msgstr "%-d %B, %H∶%M"
 | 
			
		||||
 | 
			
		||||
# fix даты
 | 
			
		||||
#. Translators: this is the month name, day number, year
 | 
			
		||||
#. number followed by a time string in 24h format.
 | 
			
		||||
#. i.e. "May 25 2012, 14:30"
 | 
			
		||||
@@ -581,7 +579,6 @@ msgstr "%-d %B, %H∶%M"
 | 
			
		||||
msgid "%B %d %Y, %H∶%M"
 | 
			
		||||
msgstr "%-d %B %Y, %H∶%M"
 | 
			
		||||
 | 
			
		||||
# по всей видимости разрабы коммент перепутали c "Translators: Time in 12h format"
 | 
			
		||||
#. Translators: Time in 12h format
 | 
			
		||||
#: js/misc/util.js:257
 | 
			
		||||
msgid "%l∶%M %p"
 | 
			
		||||
@@ -823,7 +820,6 @@ msgctxt "calendar heading"
 | 
			
		||||
msgid "%A, %B %d"
 | 
			
		||||
msgstr "%A, %-d %B"
 | 
			
		||||
 | 
			
		||||
# fix для даты в календаре и на экране блокировки
 | 
			
		||||
#: js/ui/calendar.js:868
 | 
			
		||||
msgctxt "calendar heading"
 | 
			
		||||
msgid "%A, %B %d, %Y"
 | 
			
		||||
@@ -876,7 +872,7 @@ msgstr "Внешний диск отключён"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Открыть с помощью %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:285
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Пароль:"
 | 
			
		||||
 | 
			
		||||
@@ -963,15 +959,15 @@ msgstr "Для подключения к «%s» требуется пароль.
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Диспетчер сети"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:44
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Требуется подтверждение подлинности"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:72
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Администратор"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:152
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Подтвердить"
 | 
			
		||||
 | 
			
		||||
@@ -979,7 +975,7 @@ msgstr "Подтвердить"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:271 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Не удалось подтвердить подлинность. Попробуйте снова."
 | 
			
		||||
 | 
			
		||||
@@ -1004,7 +1000,6 @@ msgstr "Показать приложения"
 | 
			
		||||
msgid "Dash"
 | 
			
		||||
msgstr "Панель приложений"
 | 
			
		||||
 | 
			
		||||
# fix для даты в календаре и на экране блокировки
 | 
			
		||||
#. Translators: This is the date format to use when the calendar popup is
 | 
			
		||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
 | 
			
		||||
#.
 | 
			
		||||
@@ -1012,7 +1007,6 @@ msgstr "Панель приложений"
 | 
			
		||||
msgid "%B %e %Y"
 | 
			
		||||
msgstr "%-d %B %Y"
 | 
			
		||||
 | 
			
		||||
# fix для даты в календаре и на экране блокировки
 | 
			
		||||
#. Translators: This is the accessible name of the date button shown
 | 
			
		||||
#. * below the time in the shell; it should combine the weekday and the
 | 
			
		||||
#. * date, e.g. "Tuesday February 17 2015".
 | 
			
		||||
@@ -1029,7 +1023,7 @@ msgstr "Добавить мировые часы…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Мировые часы"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Погода"
 | 
			
		||||
 | 
			
		||||
@@ -1037,7 +1031,7 @@ msgstr "Погода"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s весь день."
 | 
			
		||||
@@ -1046,7 +1040,7 @@ msgstr "%s весь день."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, затем позднее %s."
 | 
			
		||||
@@ -1055,30 +1049,30 @@ msgstr "%s, затем позднее %s."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, затем %s, позже %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Выберите местоположение…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Загрузка…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Ощущается как %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Подключите интернет для получения информации о погоде"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Информация о погоде сейчас недоступна"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -395,13 +395,6 @@ get_app_for_window (ShellWindowTracker    *tracker,
 | 
			
		||||
  if (meta_window_is_remote (window))
 | 
			
		||||
    return _shell_app_new_for_window (window);
 | 
			
		||||
 | 
			
		||||
  /* Check if the window was opened from within a sandbox; if this
 | 
			
		||||
   * is the case, a corresponding .desktop file is guaranteed to match;
 | 
			
		||||
   */
 | 
			
		||||
  result = get_app_from_sandboxed_app_id (window);
 | 
			
		||||
  if (result != NULL)
 | 
			
		||||
    return result;
 | 
			
		||||
 | 
			
		||||
  /* Check if the window has a GApplication ID attached; this is
 | 
			
		||||
   * canonical if it does
 | 
			
		||||
   */
 | 
			
		||||
@@ -416,6 +409,15 @@ get_app_for_window (ShellWindowTracker    *tracker,
 | 
			
		||||
  if (result != NULL)
 | 
			
		||||
    return result;
 | 
			
		||||
 | 
			
		||||
  /* Check if the window was opened from within a sandbox; if this
 | 
			
		||||
   * is the case, a corresponding .desktop file is guaranteed to match;
 | 
			
		||||
   * Do this after having checked by WM_CLASS so that sandboxed apps
 | 
			
		||||
   * installing multiple .desktop files can properly match their windows.
 | 
			
		||||
   */
 | 
			
		||||
  result = get_app_from_sandboxed_app_id (window);
 | 
			
		||||
  if (result != NULL)
 | 
			
		||||
    return result;
 | 
			
		||||
 | 
			
		||||
  result = get_app_from_window_pid (tracker, window);
 | 
			
		||||
  if (result != NULL)
 | 
			
		||||
    return result;
 | 
			
		||||
 
 | 
			
		||||
@@ -308,9 +308,8 @@ st_entry_style_changed (StWidget *self)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  theme_node = st_widget_get_theme_node (self);
 | 
			
		||||
 
 | 
			
		||||
  st_theme_node_get_foreground_color (theme_node, &color);
 | 
			
		||||
  clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color);
 | 
			
		||||
 | 
			
		||||
  _st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
 | 
			
		||||
 | 
			
		||||
  if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
 | 
			
		||||
    clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size));
 | 
			
		||||
 
 | 
			
		||||
@@ -116,6 +116,7 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
  PangoAttrList *attribs = NULL;
 | 
			
		||||
  const PangoFontDescription *font;
 | 
			
		||||
  StTextAlign align;
 | 
			
		||||
  gdouble spacing;
 | 
			
		||||
 | 
			
		||||
  st_theme_node_get_foreground_color (theme_node, &color);
 | 
			
		||||
  clutter_text_set_color (text, &color);
 | 
			
		||||
@@ -123,11 +124,11 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
  font = st_theme_node_get_font (theme_node);
 | 
			
		||||
  clutter_text_set_font_description (text, (PangoFontDescription *) font);
 | 
			
		||||
 | 
			
		||||
  attribs = pango_attr_list_new ();
 | 
			
		||||
 | 
			
		||||
  decoration = st_theme_node_get_text_decoration (theme_node);
 | 
			
		||||
  if (decoration)
 | 
			
		||||
    {
 | 
			
		||||
      attribs = pango_attr_list_new ();
 | 
			
		||||
 | 
			
		||||
      if (decoration & ST_TEXT_DECORATION_UNDERLINE)
 | 
			
		||||
        {
 | 
			
		||||
          PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
 | 
			
		||||
@@ -143,6 +144,13 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
       */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  spacing = st_theme_node_get_letter_spacing (theme_node);
 | 
			
		||||
  if (spacing)
 | 
			
		||||
    {
 | 
			
		||||
      PangoAttribute *letter_spacing = pango_attr_letter_spacing_new ((int)(.5 + spacing) * PANGO_SCALE);
 | 
			
		||||
      pango_attr_list_insert (attribs, letter_spacing);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_text_set_attributes (text, attribs);
 | 
			
		||||
 | 
			
		||||
  if (attribs)
 | 
			
		||||
 
 | 
			
		||||
@@ -2545,6 +2545,28 @@ st_theme_node_get_text_align(StThemeNode *node)
 | 
			
		||||
  return ST_TEXT_ALIGN_LEFT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * st_theme_node_get_letter_spacing:
 | 
			
		||||
 * @node: a #StThemeNode
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the value for the letter-spacing style property, in pixels.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the value of the letter-spacing property, if
 | 
			
		||||
 *   found, or zero if such property has not been found.
 | 
			
		||||
 */
 | 
			
		||||
gdouble
 | 
			
		||||
st_theme_node_get_letter_spacing (StThemeNode *node)
 | 
			
		||||
{
 | 
			
		||||
  gdouble spacing = 0.;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (ST_IS_THEME_NODE (node), spacing);
 | 
			
		||||
 | 
			
		||||
  ensure_properties (node);
 | 
			
		||||
 | 
			
		||||
  st_theme_node_lookup_length (node, "letter-spacing", FALSE, &spacing);
 | 
			
		||||
  return spacing;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
font_family_from_terms (CRTerm *term,
 | 
			
		||||
                        char  **family)
 | 
			
		||||
 
 | 
			
		||||
@@ -223,6 +223,8 @@ StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
StTextAlign st_theme_node_get_text_align (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
double st_theme_node_get_letter_spacing (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
/* Font rule processing is pretty complicated, so we just hardcode it
 | 
			
		||||
 * under the standard font/font-family/font-size/etc names. This means
 | 
			
		||||
 * you can't have multiple separate styled fonts for a single item,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user