Compare commits

...

10 Commits

Author SHA1 Message Date
Giovanni Campagna c49758f1c5 Bump version to 3.5.90
To go along GNOME Shell 3.5.90
2012-08-22 16:19:53 +02:00
Giovanni Campagna 5ca52e89d5 windowsNavigator: update for gnome-shell changes
The ViewSelector was refactored for modekill feature. Update
accordingly.
2012-08-22 16:19:33 +02:00
Giovanni Campagna dd26111c04 systemMonitor: add tooltips to the indicators
Currently it's hard to find what the indicator mean, without any
label. Add a tooltip, shamelessly copied from js/ui/dash.js in
core shell.
2012-08-22 16:13:52 +02:00
Giovanni Campagna f40e7109e5 systemMonitor: update for gnome-shell changes
gnome-shell 3.5.90 has a new, bigger, message-tray. Restyle the
systemMonitor appropriately to blend in.
2012-08-22 16:13:52 +02:00
Giovanni Campagna 5cb3e1877a native-window-placement: update for gnome-shell changes
Workspace.positionWindows semantics changed, so the function
we want to override is now _realPositionWindows.
2012-08-22 16:13:52 +02:00
Giovanni Campagna a78a16b4a7 alternate-tab: respect aspect ratio for window thumbnails
It is weird if 16:9 thumbnails get turned into squares. Instead,
center them.

https://bugzilla.gnome.org/show_bug.cgi?id=656217
2012-08-22 15:35:33 +02:00
Daniel Mustieles a6307d48c0 Updated Spanish translation 2012-08-20 14:17:34 +02:00
A S Alam f9d95b9408 update Punjabi Translation 2012-08-19 15:12:45 +05:30
Giovanni Campagna fb3df46a25 alternate-tab: rework again
Kill the mode switch distinction, and kill the old and unmaintained
Workspace&Icons mode.
Introduce instead configurability for the All&Thumbnails code, which
now independently allows choosing if only all windows or only those
from current workspace should be shown, and in which way (thumbnail,
icon, both).
All configuration settings changed, so the extension must be configured
again (although hopefully I chose reasonable defaults)
2012-08-18 02:40:20 +02:00
Daniel Mustieles d2a7a95628 Updated Spanish translation 2012-08-10 11:14:52 +02:00
14 changed files with 746 additions and 870 deletions
+11
View File
@@ -1,3 +1,14 @@
3.5.90
======
* alternate-tab has been reworked again, the old mode switch
was removed and the all&thumbnails code extended to handle
icons and filtering to the workspace
* alternate-tab thumbnails now reflect the aspect ratio of the windows
* systemMonitor now shows a tooltip above the indicator
* native-window-placement, systemMonitor and windowsNavigator have been updated
for the newer shell
* updated translations (es, pa)
3.5.5 3.5.5
===== =====
* convenience module has been relicensed to BSD, * convenience module has been relicensed to BSD,
+1 -1
View File
@@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell-extensions],[3.5.5],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions]) AC_INIT([gnome-shell-extensions],[3.5.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([config]) AC_CONFIG_AUX_DIR([config])
+1 -1
View File
@@ -1,6 +1,6 @@
EXTENSION_ID = alternate-tab EXTENSION_ID = alternate-tab
EXTRA_MODULES = allThumbnails.js workspaceIcons.js prefs.js EXTRA_MODULES = prefs.js
include ../../extension.mk include ../../extension.mk
include ../../settings.mk include ../../settings.mk
-353
View File
@@ -1,353 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const AltTab = imports.ui.altTab;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const WindowManager = imports.ui.windowManager;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
const SETTINGS_SHOW_APP_ICON_KEY = 'show-app-icon';
function mod(a, b) {
return ((a+b) % b);
}
const AltTabPopupAllThumbnails = new Lang.Class({
Name: 'AlternateTab.AltTabPopup.AllThumbnails',
_init : function(settings) {
this._settings = settings;
this.actor = new Shell.GenericContainer({ name: 'altTabPopup',
reactive: true });
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._haveModal = false;
this._currentWindow = 0;
this._motionTimeoutId = 0;
// Initially disable hover so we ignore the enter-event if
// the switcher appears underneath the current pointer location
this._disableHover();
Main.uiGroup.add_actor(this.actor);
},
_getPreferredWidth: function (actor, forHeight, alloc) {
alloc.min_size = global.screen_width;
alloc.natural_size = global.screen_width;
},
_getPreferredHeight: function (actor, forWidth, alloc) {
alloc.min_size = global.screen_height;
alloc.natural_size = global.screen_height;
},
_allocate: function (actor, box, flags) {
let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor;
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
let vPadding = this.actor.get_theme_node().get_vertical_padding();
let hPadding = leftPadding + rightPadding;
// Allocate the appSwitcher
// We select a size based on an icon size that does not overflow the screen
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding);
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth);
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
childBox.y2 = childBox.y1 + childNaturalHeight;
this._appSwitcher.actor.allocate(childBox, flags);
},
show : function(backward, binding, mask) {
// This is roughly what meta_display_get_tab_list does, except
// that it doesn't filter on workspace
// See in particular src/core/window-private.h for the filters
let windows = global.get_window_actors().map(function(actor) {
return actor.meta_window;
}).filter(function(win) {
return !win.is_override_redirect() &&
win.get_window_type() != Meta.WindowType.DESKTOP &&
win.get_window_type() != Meta.WindowType.DOCK;
}).sort(function(one, two) {
return two.get_user_time() - one.get_user_time();
});
if (!windows.length) {
this.destroy();
return false;
}
if (!Main.pushModal(this.actor)) {
// Probably someone else has a pointer grab, try again with keyboard only
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
return false;
}
}
this._haveModal = true;
this._modifierMask = AltTab.primaryModifier(mask);
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
this._appSwitcher = new WindowList(windows, this._settings);
this.actor.add_actor(this._appSwitcher.actor);
this._appSwitcher.connect('item-activated', Lang.bind(this, this._windowActivated));
this._appSwitcher.connect('item-entered', Lang.bind(this, this._windowEntered));
// make the initial selection
if (backward)
this._select(windows.length - 1);
else
this._select(1);
this.actor.opacity = 0;
this.actor.show();
// There's a race condition; if the user released Alt before
// we got the grab, then we won't be notified. (See
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
// details.) So we check now. (Have to do this after updating
// selection.)
let [x, y, mods] = global.get_pointer();
if (!(mods & this._modifierMask)) {
this._finish();
return false;
}
// We delay showing the popup so that fast Alt+Tab users aren't
// disturbed by the popup briefly flashing.
this._initialDelayTimeoutId = Mainloop.timeout_add(AltTab.POPUP_DELAY_TIMEOUT,
Lang.bind(this, function () {
this.actor.opacity = 255;
this._initialDelayTimeoutId = 0;
}));
return true
},
_windowActivated : function(thumbnailList, n) {
let win = this._appSwitcher.windows[n];
Main.activateWindow(win);
this.destroy();
},
_finish : function() {
let win = this._appSwitcher.windows[this._currentWindow];
Main.activateWindow(win);
this.destroy();
},
_keyPressEvent : function(actor, event) {
let keysym = event.get_key_symbol();
let event_state = event.get_state();
let backwards = event_state & Clutter.ModifierType.SHIFT_MASK;
let action = global.display.get_keybinding_action(event.get_key_code(), event_state);
this._disableHover();
if (keysym == Clutter.Escape) {
this.destroy();
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS ||
action == Meta.KeyBindingAction.SWITCH_GROUP) {
this._select(backwards ? this._previousWindow() : this._nextWindow());
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD ||
action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
this._select(this._previousWindow());
} else {
if (keysym == Clutter.Left)
this._select(this._previousWindow());
else if (keysym == Clutter.Right)
this._select(this._nextWindow());
}
return true;
},
_keyReleaseEvent : function(actor, event) {
let [x, y, mods] = global.get_pointer();
let state = mods & this._modifierMask;
if (state == 0)
this._finish();
return true;
},
_onScroll : function(actor, event) {
let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP)
this._select(this._previousWindow());
else if (direction == Clutter.ScrollDirection.DOWN)
this._select(this._nextWindow());
return true;
},
_clickedOutside : function(actor, event) {
this.destroy();
},
_windowEntered : function(windowSwitcher, n) {
if (!this._mouseActive)
return;
this._select(n);
},
_disableHover : function() {
this._mouseActive = false;
if (this._motionTimeoutId != 0)
Mainloop.source_remove(this._motionTimeoutId);
this._motionTimeoutId = Mainloop.timeout_add(AltTab.DISABLE_HOVER_TIMEOUT, Lang.bind(this, this._mouseTimedOut));
},
_mouseTimedOut : function() {
this._motionTimeoutId = 0;
this._mouseActive = true;
},
_popModal: function() {
if (this._haveModal) {
Main.popModal(this.actor);
this._haveModal = false;
}
},
destroy : function() {
this._popModal();
if (this.actor.visible) {
Tweener.addTween(this.actor,
{ opacity: 0,
time: AltTab.POPUP_FADE_OUT_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.actor.destroy();
})
});
} else
this.actor.destroy();
},
_onDestroy : function() {
this._popModal();
if (this._motionTimeoutId != 0)
Mainloop.source_remove(this._motionTimeoutId);
if (this._initialDelayTimeoutId != 0)
Mainloop.source_remove(this._initialDelayTimeoutId);
},
_select : function(window) {
this._currentWindow = window;
this._appSwitcher.highlight(window);
},
_nextWindow: function() {
return mod(this._currentWindow + 1, this._appSwitcher.windows.length);
},
_previousWindow: function() {
return mod(this._currentWindow - 1, this._appSwitcher.windows.length);
},
});
const WindowIcon = new Lang.Class({
Name: 'WindowIcon',
_init: function(window, settings) {
this.window = window;
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
vertical: true });
this.icon = null;
this._iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
this.label = new St.Label({ text: window.get_title() });
this.actor.add(this.label, { x_fill: false });
if (settings.get_boolean(SETTINGS_SHOW_APP_ICON_KEY)) {
let tracker = Shell.WindowTracker.get_default();
this.app = tracker.get_window_app(window);
}
},
set_size: function(size) {
let mutterWindow = this.window.get_compositor_private();
let windowTexture = mutterWindow.get_texture();
let [width, height] = windowTexture.get_size();
let scale = Math.min(1.0, size / width, size / height);
this.clone = new Clutter.Clone({ source: windowTexture,
width: width * scale,
height: height * scale,
// usual hack for the usual bug in ClutterBinLayout...
x_expand: true,
y_expand: true });
this._iconBin.set_size(size, size);
this._iconBin.destroy_all_children();
this._iconBin.add_actor(this.clone);
if (this.app) {
this.appIcon = this.app.create_icon_texture(size / 2);
this.appIcon.x_expand = this.appIcon.y_expand = true;
this.appIcon.x_align = Clutter.ActorAlign.END;
this.appIcon.y_align = Clutter.ActorAlign.END;
this._iconBin.add_actor(this.appIcon);
}
}
});
const WindowList = new Lang.Class({
Name: 'AlternateTab.WindowList',
Extends: AltTab.SwitcherList,
_init : function(windows, settings) {
this.parent(true);
this.windows = windows;
this.icons = [];
for (let i = 0; i < windows.length; i++) {
let win = windows[i];
let icon = new WindowIcon(win, settings);
icon.set_size(128);
this.addItem(icon.actor, icon.label);
this.icons.push(icon);
}
}
});
+368 -15
View File
@@ -28,33 +28,386 @@ const N_ = function(e) { return e };
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension(); const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience; const Convenience = Me.imports.convenience;
const WorkspaceIcons = Me.imports.workspaceIcons;
const AllThumbnails = Me.imports.allThumbnails;
let settings; let settings;
const SETTINGS_BEHAVIOUR_KEY = 'behaviour'; const AppIconMode = {
THUMBNAIL_ONLY: 1,
const MODES = { APP_ICON_ONLY: 2,
all_thumbnails: AllThumbnails.AltTabPopupAllThumbnails, BOTH: 3,
workspace_icons: WorkspaceIcons.AltTabPopupWorkspaceIcons,
}; };
const SETTINGS_APP_ICON_MODE = 'app-icon-mode';
const SETTINGS_CURRENT_WORKSPACE_ONLY = 'current-workspace-only';
function mod(a, b) {
return ((a+b) % b);
}
const AltTabPopup = new Lang.Class({
Name: 'AlternateTab.AltTabPopup',
_init : function(settings) {
this._settings = settings;
this.actor = new Shell.GenericContainer({ name: 'altTabPopup',
reactive: true });
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._haveModal = false;
this._currentWindow = 0;
this._motionTimeoutId = 0;
// Initially disable hover so we ignore the enter-event if
// the switcher appears underneath the current pointer location
this._disableHover();
Main.uiGroup.add_actor(this.actor);
},
_getPreferredWidth: function (actor, forHeight, alloc) {
alloc.min_size = global.screen_width;
alloc.natural_size = global.screen_width;
},
_getPreferredHeight: function (actor, forWidth, alloc) {
alloc.min_size = global.screen_height;
alloc.natural_size = global.screen_height;
},
_allocate: function (actor, box, flags) {
let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor;
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
let vPadding = this.actor.get_theme_node().get_vertical_padding();
let hPadding = leftPadding + rightPadding;
// Allocate the appSwitcher
// We select a size based on an icon size that does not overflow the screen
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding);
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth);
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
childBox.y2 = childBox.y1 + childNaturalHeight;
this._appSwitcher.actor.allocate(childBox, flags);
},
show : function(backward, binding, mask) {
let windows;
if (!settings.get_boolean(SETTINGS_CURRENT_WORKSPACE_ONLY)) {
// This is roughly what meta_display_get_tab_list does, except
// that it doesn't filter on workspace
// See in particular src/core/window-private.h for the filters
windows = global.get_window_actors().map(function(actor) {
return actor.meta_window;
}).filter(function(win) {
return !win.is_override_redirect() &&
win.get_window_type() != Meta.WindowType.DESKTOP &&
win.get_window_type() != Meta.WindowType.DOCK;
}).sort(function(one, two) {
return two.get_user_time() - one.get_user_time();
});
} else {
windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, global.screen,
global.screen.get_active_workspace());
}
if (!windows.length) {
this.destroy();
return false;
}
if (!Main.pushModal(this.actor)) {
// Probably someone else has a pointer grab, try again with keyboard only
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
return false;
}
}
this._haveModal = true;
this._modifierMask = AltTab.primaryModifier(mask);
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
this._appSwitcher = new WindowList(windows, this._settings);
this.actor.add_actor(this._appSwitcher.actor);
this._appSwitcher.connect('item-activated', Lang.bind(this, this._windowActivated));
this._appSwitcher.connect('item-entered', Lang.bind(this, this._windowEntered));
// make the initial selection
if (backward)
this._select(windows.length - 1);
else
this._select(1);
this.actor.opacity = 0;
this.actor.show();
// There's a race condition; if the user released Alt before
// we got the grab, then we won't be notified. (See
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
// details.) So we check now. (Have to do this after updating
// selection.)
let [x, y, mods] = global.get_pointer();
if (!(mods & this._modifierMask)) {
this._finish();
return false;
}
// We delay showing the popup so that fast Alt+Tab users aren't
// disturbed by the popup briefly flashing.
this._initialDelayTimeoutId = Mainloop.timeout_add(AltTab.POPUP_DELAY_TIMEOUT,
Lang.bind(this, function () {
this.actor.opacity = 255;
this._initialDelayTimeoutId = 0;
}));
return true
},
_windowActivated : function(thumbnailList, n) {
let win = this._appSwitcher.windows[n];
Main.activateWindow(win);
this.destroy();
},
_finish : function() {
let win = this._appSwitcher.windows[this._currentWindow];
Main.activateWindow(win);
this.destroy();
},
_keyPressEvent : function(actor, event) {
let keysym = event.get_key_symbol();
let event_state = event.get_state();
let backwards = event_state & Clutter.ModifierType.SHIFT_MASK;
let action = global.display.get_keybinding_action(event.get_key_code(), event_state);
this._disableHover();
if (keysym == Clutter.Escape) {
this.destroy();
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS ||
action == Meta.KeyBindingAction.SWITCH_GROUP) {
this._select(backwards ? this._previousWindow() : this._nextWindow());
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD ||
action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
this._select(this._previousWindow());
} else {
if (keysym == Clutter.Left)
this._select(this._previousWindow());
else if (keysym == Clutter.Right)
this._select(this._nextWindow());
}
return true;
},
_keyReleaseEvent : function(actor, event) {
let [x, y, mods] = global.get_pointer();
let state = mods & this._modifierMask;
if (state == 0)
this._finish();
return true;
},
_onScroll : function(actor, event) {
let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP)
this._select(this._previousWindow());
else if (direction == Clutter.ScrollDirection.DOWN)
this._select(this._nextWindow());
return true;
},
_clickedOutside : function(actor, event) {
this.destroy();
},
_windowEntered : function(windowSwitcher, n) {
if (!this._mouseActive)
return;
this._select(n);
},
_disableHover : function() {
this._mouseActive = false;
if (this._motionTimeoutId != 0)
Mainloop.source_remove(this._motionTimeoutId);
this._motionTimeoutId = Mainloop.timeout_add(AltTab.DISABLE_HOVER_TIMEOUT, Lang.bind(this, this._mouseTimedOut));
},
_mouseTimedOut : function() {
this._motionTimeoutId = 0;
this._mouseActive = true;
},
_popModal: function() {
if (this._haveModal) {
Main.popModal(this.actor);
this._haveModal = false;
}
},
destroy : function() {
this._popModal();
if (this.actor.visible) {
Tweener.addTween(this.actor,
{ opacity: 0,
time: AltTab.POPUP_FADE_OUT_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.actor.destroy();
})
});
} else
this.actor.destroy();
},
_onDestroy : function() {
this._popModal();
if (this._motionTimeoutId != 0)
Mainloop.source_remove(this._motionTimeoutId);
if (this._initialDelayTimeoutId != 0)
Mainloop.source_remove(this._initialDelayTimeoutId);
},
_select : function(window) {
this._currentWindow = window;
this._appSwitcher.highlight(window);
},
_nextWindow: function() {
return mod(this._currentWindow + 1, this._appSwitcher.windows.length);
},
_previousWindow: function() {
return mod(this._currentWindow - 1, this._appSwitcher.windows.length);
},
});
const WindowIcon = new Lang.Class({
Name: 'AlternateTab.WindowIcon',
_init: function(window, settings) {
this.window = window;
this._settings = settings;
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
vertical: true });
this.icon = null;
this._iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
this.label = new St.Label({ text: window.get_title() });
this.actor.add(this.label, { x_fill: false });
let tracker = Shell.WindowTracker.get_default();
this.app = tracker.get_window_app(window);
let mutterWindow = this.window.get_compositor_private();
let windowTexture = mutterWindow.get_texture();
let [width, height] = windowTexture.get_size();
let scale, size;
this._iconBin.destroy_all_children();
switch (this._settings.get_enum(SETTINGS_APP_ICON_MODE)) {
case AppIconMode.THUMBNAIL_ONLY:
scale = Math.min(1.0, 128 / width, 128 / height);
size = 128;
this.clone = new Clutter.Clone({ source: windowTexture,
width: width * scale,
height: height * scale,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
// usual hack for the usual bug in ClutterBinLayout...
x_expand: true,
y_expand: true });
this._iconBin.add_actor(this.clone);
break;
case AppIconMode.BOTH:
scale = Math.min(1.0, 128 / width, 128 / height);
size = 128;
this.clone = new Clutter.Clone({ source: windowTexture,
width: width * scale,
height: height * scale,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
// usual hack for the usual bug in ClutterBinLayout...
x_expand: true,
y_expand: true });
this._iconBin.add_actor(this.clone);
this.appIcon = this.app.create_icon_texture(size / 2);
this.appIcon.x_expand = this.appIcon.y_expand = true;
this.appIcon.x_align = Clutter.ActorAlign.END;
this.appIcon.y_align = Clutter.ActorAlign.END;
this._iconBin.add_actor(this.appIcon);
break;
case AppIconMode.APP_ICON_ONLY:
size = 96;
this.appIcon = this.app.create_icon_texture(size);
this.appIcon.x_expand = this.appIcon.y_expand = true;
this._iconBin.add_actor(this.appIcon);
}
this._iconBin.set_size(size, size);
}
});
const WindowList = new Lang.Class({
Name: 'AlternateTab.WindowList',
Extends: AltTab.SwitcherList,
_init : function(windows, settings) {
this.parent(false);
this.windows = windows;
this.icons = [];
for (let i = 0; i < windows.length; i++) {
let win = windows[i];
let icon = new WindowIcon(win, settings);
this.addItem(icon.actor, icon.label);
this.icons.push(icon);
}
}
});
function doAltTab(display, screen, window, binding) { function doAltTab(display, screen, window, binding) {
let behaviour = settings.get_string(SETTINGS_BEHAVIOUR_KEY);
// alt-tab having no effect is unexpected, even with wrong settings
if (!(behaviour in MODES))
behaviour = 'all_thumbnails';
if (Main.wm._workspaceSwitcherPopup) if (Main.wm._workspaceSwitcherPopup)
Main.wm._workspaceSwitcherPopup.actor.hide(); Main.wm._workspaceSwitcherPopup.actor.hide();
let modifiers = binding.get_modifiers() let modifiers = binding.get_modifiers()
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK; let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
let constructor = MODES[behaviour]; let popup = new AltTabPopup(settings);
let popup = new constructor(settings);
if (!popup.show(backwards, binding.get_name(), binding.get_mask())) if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
popup.destroy(); popup.destroy();
} }
@@ -1,31 +1,25 @@
<schemalist gettext-domain="gnome-shell-extensions"> <schemalist gettext-domain="gnome-shell-extensions">
<enum id="org.gnome.shell.extensions.alternate-tab.BehaviourMode"> <enum id="org.gnome.shell.extensions.alternate-tab.AppIconMode">
<value value="1" nick="all_thumbnails"/> <value value="1" nick="thumbnail_only"/>
<value value="2" nick="workspace_icons"/> <value value="2" nick="app_icon_only"/>
<value value="3" nick="both"/>
</enum> </enum>
<schema id="org.gnome.shell.extensions.alternate-tab" path="/org/gnome/shell/extensions/alternate-tab/"> <schema id="org.gnome.shell.extensions.alternate-tab" path="/org/gnome/shell/extensions/alternate-tab/">
<key name="behaviour" enum="org.gnome.shell.extensions.alternate-tab.BehaviourMode"> <key name="app-icon-mode" enum="org.gnome.shell.extensions.alternate-tab.AppIconMode">
<default>'all_thumbnails'</default> <default>'both'</default>
<_summary>The alt tab behaviour.</_summary> <_summary>The application icon mode.</_summary>
<_description> <_description>
Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and workspace_icons. Configures how the windows are shown in the switcher. Valid possibilities
See the configuration dialogs for details. are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only'
(shows only the application icon) or 'both'.
</_description> </_description>
</key> </key>
<key type="b" name="highlight-selected"> <key type="b" name="current-workspace-only">
<default>false</default> <default>false</default>
<summary>Bring each selected window to the front.</summary> <summary>Limit switcher to current workspace.</summary>
<description> <description>
Bring each window to the front in turn as Alt+Tab is pressed. If true, only windows from the current workspace are shown in the switcher.
This setting applies only when the selected mode is 'workspace_icons'. Otherwise, all windows are included.
</description>
</key>
<key type="b" name="show-app-icon">
<default>true</default>
<summary>Show small application icon.</summary>
<description>
If true, a small application icon is overlayed to each window thumbnail.
This setting applies only when the selected mode is 'all_thumbnails'.
</description> </description>
</key> </key>
</schema> </schema>
+18 -61
View File
@@ -19,31 +19,13 @@ const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension(); const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience; const Convenience = Me.imports.convenience;
const SETTINGS_BEHAVIOUR_KEY = 'behaviour'; const SETTINGS_APP_ICON_MODE = 'app-icon-mode';
const SETTINGS_HIGHLIGHT_KEY = 'highlight-selected'; const SETTINGS_CURRENT_WORKSPACE_ONLY = 'current-workspace-only';
const SETTINGS_SHOW_APP_ICON_KEY = 'show-app-icon';
const MODES = { const MODES = {
all_thumbnails: { thumbnail_only: N_("Thumbnail only"),
name: N_("All & Thumbnails"), app_icon_only: N_("Application icon only"),
description: N_("This mode presents all applications from all workspaces in one selection \ both: N_("Thumbnail and application icon"),
list. Instead of using the application icon of every window, it uses small \
thumbnails resembling the window itself."),
extra_widgets: [
{ label: N_("Show overlaid application icon"), key: SETTINGS_SHOW_APP_ICON_KEY }
]
},
workspace_icons: {
name: N_("Workspace & Icons"),
description: N_("This mode lets you switch between the applications of your current \
workspace and gives you additionally the option to switch to the last used \
application of your previous workspace. This is always the last symbol in \
the list and is separated by a separator/vertical line if available. \n\
Every window is represented by its application icon."),
extra_widgets: [
{ label: N_("Move current selection to front before closing the popup"), key: SETTINGS_HIGHLIGHT_KEY }
]
}
}; };
const AltTabSettingsWidget = new GObject.Class({ const AltTabSettingsWidget = new GObject.Class({
@@ -53,65 +35,40 @@ const AltTabSettingsWidget = new GObject.Class({
_init : function(params) { _init : function(params) {
this.parent(params); this.parent(params);
this.column_spacing = 10;
this.margin = 10; this.margin = 10;
this.orientation = Gtk.Orientation.VERTICAL;
this._settings = Convenience.getSettings(); this._settings = Convenience.getSettings();
let introLabel = _("The Alternate Tab can be used in different modes, that \ let presentLabel = _("Present windows as");
affect the way windows are chosen and presented."); this.add(new Gtk.Label({ label: presentLabel, sensitive: true,
margin_bottom: 10, margin_top: 5 }));
this.attach(new Gtk.Label({ label: introLabel, wrap: true, sensitive: true,
margin_bottom: 10, margin_top: 5 }),
0, 0, 2, 1);
let top = 1; let top = 1;
let radio = null; let radio = null;
let currentMode = this._settings.get_string(SETTINGS_BEHAVIOUR_KEY); let currentMode = this._settings.get_string(SETTINGS_APP_ICON_MODE);
for (let mode in MODES) { for (let mode in MODES) {
// copy the mode variable because it has function scope, not block scope // copy the mode variable because it has function scope, not block scope
// so cannot be used in a closure // so cannot be used in a closure
let modeCapture = mode; let modeCapture = mode;
let obj = MODES[mode]; let name = Gettext.gettext(MODES[mode]);
let name = Gettext.gettext(obj.name);
let description = Gettext.gettext(obj.description);
let nextra = obj.extra_widgets.length;
radio = new Gtk.RadioButton({ group: radio, label: name, valign: Gtk.Align.START }); radio = new Gtk.RadioButton({ group: radio, label: name, valign: Gtk.Align.START });
radio.connect('toggled', Lang.bind(this, function(widget) { radio.connect('toggled', Lang.bind(this, function(widget) {
if (widget.active) if (widget.active)
this._settings.set_string(SETTINGS_BEHAVIOUR_KEY, modeCapture); this._settings.set_string(SETTINGS_APP_ICON_MODE, modeCapture);
this._updateSensitivity(widget, widget.active);
})); }));
this.attach(radio, 0, top, 1, nextra + 1); this.add(radio);
let descriptionLabel = new Gtk.Label({ label: description, wrap: true, sensitive: true,
xalign: 0.0, justify: Gtk.Justification.FILL });
this.attach(descriptionLabel, 1, top, 1, 1);
radio._extra = [];
for (let i = 0; i < nextra; i++) {
let key = obj.extra_widgets[i].key;
let label = Gettext.gettext(obj.extra_widgets[i].label);
let extra = new Gtk.CheckButton({ label: label });
this._settings.bind(key, extra, 'active', Gio.SettingsBindFlags.DEFAULT);
radio._extra.push(extra);
this.attach(extra, 1, top + i + 1, 1, 1);
}
if (mode == currentMode) if (mode == currentMode)
radio.active = true; radio.active = true;
this._updateSensitivity(radio, radio.active); top += 1;
top += nextra + 1;
} }
},
_updateSensitivity: function(widget, active) { let check = new Gtk.CheckButton({ label: _("Show only windows in the current workspace"),
for (let i = 0; i < widget._extra.length; i++) margin_top: 12 });
widget._extra[i].sensitive = active; this._settings.bind(SETTINGS_CURRENT_WORKSPACE_ONLY, check, 'active', Gio.SettingsBindFlags.DEFAULT);
this.add(check);
}, },
}); });
-274
View File
@@ -1,274 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const AltTab = imports.ui.altTab;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const WindowManager = imports.ui.windowManager;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
const SETTINGS_HIGHLIGHT_SELECTED_KEY = 'highlight-selected';
const AltTabPopupWorkspaceIcons = new Lang.Class({
Name: 'AlternateTab.AltTabPopupWorkspaceIcons',
Extends: AltTab.AltTabPopup,
_init: function(settings) {
this.parent();
this._settings = settings;
},
_windowActivated : function(thumbnailList, n) { },
show : function(backward, binding, mask) {
let appSys = Shell.AppSystem.get_default();
let apps = appSys.get_running ();
if (!apps.length)
return false;
if (!Main.pushModal(this.actor)) {
// Probably someone else has a pointer grab, try again with keyboard only
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
return false;
}
}
this._haveModal = true;
this._modifierMask = AltTab.primaryModifier(mask);
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
this._appSwitcher = new WindowSwitcher(apps, this);
this.actor.add_actor(this._appSwitcher.actor);
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
this._appIcons = this._appSwitcher.icons;
// Need to force an allocation so we can figure out whether we
// need to scroll when selecting
this.actor.opacity = 0;
this.actor.show();
this.actor.get_allocation_box();
this._highlight_selected = this._settings.get_boolean(SETTINGS_HIGHLIGHT_SELECTED_KEY);
// Make the initial selection
if (binding == 'switch_group') {
//see AltTab.AltTabPopup.show function
//cached windows are always of length one, so select first app and the window
//the direction doesn't matter, so ignore backward
this._select(0, 0);
} else if (binding == 'switch_group_backward') {
this._select(0, 0);
} else if (binding == 'switch_windows_backward') {
this._select(this._appIcons.length - 1);
} else if (this._appIcons.length == 1) {
this._select(0);
} else if (backward) {
this._select(this._appIcons.length - 1);
} else {
this._select(1);
}
// There's a race condition; if the user released Alt before
// we got the grab, then we won't be notified. (See
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
// details.) So we check now. (Have to do this after updating
// selection.)
let [x, y, mods] = global.get_pointer();
if (!(mods & this._modifierMask)) {
this._finish();
return false;
}
// We delay showing the popup so that fast Alt+Tab users aren't
// disturbed by the popup briefly flashing.
this._initialDelayTimeoutId = Mainloop.timeout_add(AltTab.POPUP_DELAY_TIMEOUT,
Lang.bind(this, function () {
this.actor.opacity = 255;
this._initialDelayTimeoutId = 0;
}));
return true;
},
_select : function(app, window, forceAppFocus) {
if (app != this._currentApp || window == null) {
if (this._thumbnails)
this._destroyThumbnails();
}
if (this._thumbnailTimeoutId != 0) {
Mainloop.source_remove(this._thumbnailTimeoutId);
this._thumbnailTimeoutId = 0;
}
this._thumbnailsFocused = (window != null) && !forceAppFocus;
this._currentApp = app;
this._currentWindow = window ? window : -1;
this._appSwitcher.highlight(app, this._thumbnailsFocused);
if (window != null) {
if (!this._thumbnails)
this._createThumbnails();
this._currentWindow = window;
this._thumbnails.highlight(window, forceAppFocus);
} else if (this._appIcons[this._currentApp].cachedWindows.length > 1 &&
!forceAppFocus) {
this._thumbnailTimeoutId = Mainloop.timeout_add (
AltTab.THUMBNAIL_POPUP_TIME,
Lang.bind(this, this._timeoutPopupThumbnails));
}
if (this._highlight_selected) {
let current_app = this._appIcons[this._currentApp];
Main.activateWindow(current_app.cachedWindows[0]);
}
},
_finish : function() {
let app = this._appIcons[this._currentApp];
if (!app)
return;
/*
* We've to restore the original Z-depth and order of all windows.
*
* Gnome-shell doesn't give an option to change Z-depth without
* messing the window's user_time.
*
* Pointless if the popup wasn't showed.
*/
if (this._highlight_selected && this.actor.opacity == 255) {
for (let i = this._appIcons.length - 2; i >= 0; i--) {
let app_walker = this._appIcons[i];
Main.activateWindow(app_walker.cachedWindows[0], global.get_current_time() - i - 1);
}
}
Main.activateWindow(app.cachedWindows[0]);
this.destroy();
}
});
const AppIcon = new Lang.Class({
Name: 'AlternateTab.AppIcon',
Extends: AltTab.AppIcon,
_init: function(app, window) {
this.app = app;
this.cachedWindows = [];
this.cachedWindows.push(window);
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
vertical: true });
this.icon = null;
this._iconBin = new St.Bin({ x_fill: true, y_fill: true });
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
let title = window.get_title();
if (title) {
this.label = new St.Label({ text: title });
let bin = new St.Bin({ x_align: St.Align.MIDDLE });
bin.add_actor(this.label);
this.actor.add(bin);
}
else {
this.label = new St.Label({ text: this.app.get_name() });
this.actor.add(this.label, { x_fill: false });
}
}
});
const WindowSwitcher = new Lang.Class({
Name: 'AlternateTab.WindowSwitcher',
Extends: AltTab.AppSwitcher,
_init : function(apps, altTabPopup) {
// Horrible HACK!
// We inherit from AltTab.AppSwitcher, but only chain up to
// AltTab.SwitcherList._init, to bypass AltTab.AppSwitcher._init
AltTab.SwitcherList.prototype._init.call(this, true);
// Construct the AppIcons, sort by time, add to the popup
let activeWorkspace = global.screen.get_active_workspace();
let workspaceIcons = [];
let otherIcons = [];
for (let i = 0; i < apps.length; i++) {
// Cache the window list now; we don't handle dynamic changes here,
// and we don't want to be continually retrieving it
let windows = apps[i].get_windows();
for(let j = 0; j < windows.length; j++) {
let appIcon = new AppIcon(apps[i], windows[j]);
if (this._isWindowOnWorkspace(windows[j], activeWorkspace)) {
workspaceIcons.push(appIcon);
}
else {
otherIcons.push(appIcon);
}
}
}
workspaceIcons.sort(Lang.bind(this, this._sortAppIcon));
otherIcons.sort(Lang.bind(this, this._sortAppIcon));
if(otherIcons.length > 0) {
let mostRecentOtherIcon = otherIcons[0];
otherIcons = [];
otherIcons.push(mostRecentOtherIcon);
}
this.icons = [];
this._arrows = [];
for (let i = 0; i < workspaceIcons.length; i++)
this._addIcon(workspaceIcons[i]);
if (workspaceIcons.length > 0 && otherIcons.length > 0)
this.addSeparator();
for (let i = 0; i < otherIcons.length; i++)
this._addIcon(otherIcons[i]);
this._curApp = -1;
this._iconSize = 0;
this._altTabPopup = altTabPopup;
this._mouseTimeOutId = 0;
},
_isWindowOnWorkspace: function(w, workspace) {
if (w.get_workspace() == workspace)
return true;
return false;
},
_sortAppIcon : function(appIcon1, appIcon2) {
let t1 = appIcon1.cachedWindows[0].get_user_time();
let t2 = appIcon2.cachedWindows[0].get_user_time();
if (t2 > t1) return 1;
else return -1;
}
});
@@ -301,13 +301,13 @@ function enable() {
workspaceInjections['_calculateWindowTransformationsNatural'] = undefined; workspaceInjections['_calculateWindowTransformationsNatural'] = undefined;
/** /**
* positionWindows: * _realPositionWindows:
* @flags: * @flags:
* INITIAL - this is the initial positioning of the windows. * INITIAL - this is the initial positioning of the windows.
* ANIMATE - Indicates that we need animate changing position. * ANIMATE - Indicates that we need animate changing position.
*/ */
workspaceInjections['positionWindows'] = Workspace.Workspace.prototype.positionWindows; workspaceInjections['positionWindows'] = Workspace.Workspace.prototype._realPositionWindows;
Workspace.Workspace.prototype.positionWindows = function(flags) { Workspace.Workspace.prototype._realPositionWindows = function(flags) {
if (this._repositionWindowsId > 0) { if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId); Mainloop.source_remove(this._repositionWindowsId);
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
+137 -23
View File
@@ -8,13 +8,21 @@ const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Main = imports.ui.main; const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const INDICATOR_UPDATE_INTERVAL = 500; const INDICATOR_UPDATE_INTERVAL = 500;
const INDICATOR_NUM_GRID_LINES = 3; const INDICATOR_NUM_GRID_LINES = 3;
let _cpuIndicator; const ITEM_LABEL_SHOW_TIME = 0.15;
let _memIndicator; const ITEM_LABEL_HIDE_TIME = 0.1;
let _box; const ITEM_HOVER_TIMEOUT = 300;
const Indicator = new Lang.Class({ const Indicator = new Lang.Class({
Name: 'SystemMonitor.Indicator', Name: 'SystemMonitor.Indicator',
@@ -22,7 +30,6 @@ const Indicator = new Lang.Class({
_init: function() { _init: function() {
this._initValues(); this._initValues();
this.drawing_area = new St.DrawingArea({ reactive: true }); this.drawing_area = new St.DrawingArea({ reactive: true });
this.drawing_area.width = 100; this.drawing_area.height = 100;
this.drawing_area.connect('repaint', Lang.bind(this, this._draw)); this.drawing_area.connect('repaint', Lang.bind(this, this._draw));
this.drawing_area.connect('button-press-event', function() { this.drawing_area.connect('button-press-event', function() {
let app = Shell.AppSystem.get_default().lookup_app('gnome-system-monitor.desktop'); let app = Shell.AppSystem.get_default().lookup_app('gnome-system-monitor.desktop');
@@ -30,7 +37,8 @@ const Indicator = new Lang.Class({
}); });
this.actor = new St.Bin({ style_class: "extension-systemMonitor-indicator-area", this.actor = new St.Bin({ style_class: "extension-systemMonitor-indicator-area",
reactive: true}); reactive: true, track_hover: true,
x_fill: true, y_fill: true });
this.actor.add_actor(this.drawing_area); this.actor.add_actor(this.drawing_area);
this._timeout = Mainloop.timeout_add(INDICATOR_UPDATE_INTERVAL, Lang.bind(this, function () { this._timeout = Mainloop.timeout_add(INDICATOR_UPDATE_INTERVAL, Lang.bind(this, function () {
@@ -40,10 +48,63 @@ const Indicator = new Lang.Class({
})); }));
}, },
showLabel: function() {
if (this.label == null)
return;
this.label.opacity = 0;
this.label.show();
let [stageX, stageY] = this.actor.get_transformed_position();
let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1;
let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1;
let labelWidth = this.label.width;
let labelHeight = this.label.height;
let xOffset = Math.floor((itemWidth - labelWidth) / 2)
let x = stageX + xOffset;
let node = this.label.get_theme_node();
let yOffset = node.get_length('-y-offset');
let y = stageY - this.label.get_height() - yOffset;
this.label.set_position(x, y);
Tweener.addTween(this.label,
{ opacity: 255,
time: ITEM_LABEL_SHOW_TIME,
transition: 'easeOutQuad',
});
},
setLabelText: function(text) {
if (this.label == null)
this.label = new St.Label({ style_class: 'extension-systemMonitor-indicator-label'});
this.label.set_text(text);
Main.layoutManager.addChrome(this.label);
this.label.hide();
},
hideLabel: function () {
Tweener.addTween(this.label,
{ opacity: 0,
time: ITEM_LABEL_HIDE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.label.hide();
})
});
},
destroy: function() { destroy: function() {
Mainloop.source_remove(this._timeout); Mainloop.source_remove(this._timeout);
this.actor.destroy(); this.actor.destroy();
if (this.label)
this.label.destroy();
}, },
_initValues: function() { _initValues: function() {
@@ -148,6 +209,8 @@ const CpuIndicator = new Lang.Class({
this.renderStats = this.renderStats.sort(function(a,b) { this.renderStats = this.renderStats.sort(function(a,b) {
return renderStatOrder[a] - renderStatOrder[b]; return renderStatOrder[a] - renderStatOrder[b];
}); });
this.setLabelText(_("CPU"));
}, },
_initValues: function() { _initValues: function() {
@@ -199,6 +262,8 @@ const MemoryIndicator = new Lang.Class({
this.renderStats = this.renderStats.sort(function(a,b) { this.renderStats = this.renderStats.sort(function(a,b) {
return renderStatOrder[a] - renderStatOrder[b]; return renderStatOrder[a] - renderStatOrder[b];
}); });
this.setLabelText(_("Memory"));
}, },
_initValues: function() { _initValues: function() {
@@ -222,23 +287,72 @@ const MemoryIndicator = new Lang.Class({
} }
}); });
const INDICATORS = [CpuIndicator, MemoryIndicator];
const Extension = new Lang.Class({
Name: 'SystemMonitor.Extension',
_init: function() {
Convenience.initTranslations();
this._showLabelTimeoutId = 0;
this._resetHoverTimeoutId = 0;
this._labelShowing = false;
},
enable: function() {
this._box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container' });
this._indicators = [ ];
for (let i = 0; i < INDICATORS.length; i++) {
let indicator = new (INDICATORS[i])();
indicator.actor.connect('notify::hover', Lang.bind(this, function() {
this._onHover(indicator);
}));
this._box.add_actor(indicator.actor);
this._indicators.push(indicator);
}
Main.messageTray.actor.add_actor(this._box);
},
disable: function() {
this._indicators.forEach(function(i) { i.destroy(); });
this._box.destroy();
},
_onHover: function (item) {
if (item.actor.get_hover()) {
if (this._showLabelTimeoutId == 0) {
let timeout = this._labelShowing ? 0 : ITEM_HOVER_TIMEOUT;
this._showLabelTimeoutId = Mainloop.timeout_add(timeout,
Lang.bind(this, function() {
this._labelShowing = true;
item.showLabel();
return false;
}));
if (this._resetHoverTimeoutId > 0) {
Mainloop.source_remove(this._resetHoverTimeoutId);
this._resetHoverTimeoutId = 0;
}
}
} else {
if (this._showLabelTimeoutId > 0)
Mainloop.source_remove(this._showLabelTimeoutId);
this._showLabelTimeoutId = 0;
item.hideLabel();
if (this._labelShowing) {
this._resetHoverTimeoutId = Mainloop.timeout_add(ITEM_HOVER_TIMEOUT,
Lang.bind(this, function() {
this._labelShowing = false;
return false;
}));
}
}
},
});
function init() { function init() {
// nothing to do here return new Extension();
}
function enable() {
_cpuIndicator = new CpuIndicator();
_memIndicator = new MemoryIndicator();
_box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container' });
_box.add(_cpuIndicator.actor);
_box.add(_memIndicator.actor);
Main.messageTray.actor.add_actor(_box);
}
function disable() {
_cpuIndicator.destroy();
_cpuIndicator = null;
_memIndicator.destroy();
_memIndicator = null;
_box.destroy();
} }
+15 -3
View File
@@ -2,15 +2,17 @@
spacing: 5px; spacing: 5px;
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
padding-bottom: 1px; padding-bottom: 10px;
padding-top: 0px; padding-top: 10px;
} }
.extension-systemMonitor-indicator-area { .extension-systemMonitor-indicator-area {
border: 1px solid #8d8d8d; border: 1px solid #8d8d8d;
border-radius: 3px; border-radius: 3px;
width: 100px; width: 100px;
height: 30px; /* message tray is 72px, so 20px padding of the container,
2px of border, makes it 50px */
height: 50px;
-grid-color: #575757; -grid-color: #575757;
-cpu-total-color: rgb(0,154,62); -cpu-total-color: rgb(0,154,62);
-cpu-user-color: rgb(69,154,0); -cpu-user-color: rgb(69,154,0);
@@ -21,3 +23,13 @@
-mem-other-color: rgb(205,203,41); -mem-other-color: rgb(205,203,41);
background-color: #1e1e1e; background-color: #1e1e1e;
} }
.extension-systemMonitor-indicator-label {
border-radius: 7px;
padding: 4px 12px;
background-color: rgba(0,0,0,0.9);
text-align: center;
-y-offset: 8px;
font-size: 9pt;
font-weight: bold;
}
+1 -1
View File
@@ -139,7 +139,7 @@ function enable() {
workViewInjections['_onKeyRelease'] = undefined; workViewInjections['_onKeyRelease'] = undefined;
WorkspacesView.WorkspacesView.prototype._onKeyPress = function(s, o) { WorkspacesView.WorkspacesView.prototype._onKeyPress = function(s, o) {
if(Main.overview._viewSelector._activeTab.id != 'windows') if(Main.overview._viewSelector._activePage != Main.overview._viewSelector._workspacesPage)
return false; return false;
if ((o.get_key_symbol() == Clutter.KEY_Alt_L || if ((o.get_key_symbol() == Clutter.KEY_Alt_L ||
+88 -51
View File
@@ -11,74 +11,55 @@ msgstr ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n" "Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=extensions\n" "shell&keywords=I18N+L10N&component=extensions\n"
"POT-Creation-Date: 2012-06-08 12:07+0000\n" "POT-Creation-Date: 2012-08-18 00:42+0000\n"
"PO-Revision-Date: 2012-08-20 13:16+0200\n" "PO-Revision-Date: 2012-08-20 13:16+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.5\n" "X-Generator: Gtranslator 2.91.5\n"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1 #: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "The alt tab behaviour." #| msgid "Show overlaid application icon"
msgid "The application icon mode."
msgstr "El modo de icono de la aplicación." msgstr "El modo de icono de la aplicación."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2 #: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid "" msgid ""
"Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and " "Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'." "only' (shows only the application icon) or 'both'."
msgstr "" msgstr ""
"Establece el comportamiento de Alt+Tab. Los valores posibles son: " "Configura cómo se muestran las ventanas en el intercambiador. Las opciones "
"«native» (nativo), «all_thumbnails» (todo y miniaturas) y " "posibles son «thumbnail-only» (muestra una miniatura de la ventana, «app-"
"«workspace_icons» (iconos de áreas de trabajo). Para obtener información más " "icon-only» (sólo muestra el icono de la aplicación) o «both» (se muestran "
"ambas cosas)."
#: ../extensions/alternate-tab/prefs.js:26
#| msgid "All & Thumbnails"
msgid "Thumbnail only"
msgstr "Sólo miniaturas" msgstr "Sólo miniaturas"
#: ../extensions/alternate-tab/prefs.js:27 #: ../extensions/alternate-tab/prefs.js:27
msgid "All & Thumbnails" #| msgid "Application"
msgid "Application icon only"
msgstr "Sólo icono de la aplicación" msgstr "Sólo icono de la aplicación"
#: ../extensions/alternate-tab/prefs.js:28 #: ../extensions/alternate-tab/prefs.js:28
msgid "" #| msgid "Show overlaid application icon"
"This mode presents all applications from all workspaces in one selection " msgid "Thumbnail and application icon"
"list. Instead of using the application icon of every window, it uses small "
"thumbnails resembling the window itself."
msgstr ""
"Este modo presenta todas las aplicaciones de todas las áreas de trabajo en "
"una lista de selección. En lugar de usar el icono de aplicación de cada "
msgstr "Miniatura e icono de la aplicación" msgstr "Miniatura e icono de la aplicación"
#: ../extensions/alternate-tab/prefs.js:34 #: ../extensions/alternate-tab/prefs.js:43
msgid "Workspace & Icons" msgid "Present windows as"
msgstr "Presentar ventanas como" msgstr "Presentar ventanas como"
#: ../extensions/alternate-tab/prefs.js:35 #: ../extensions/alternate-tab/prefs.js:68
msgid "" msgid "Show only windows in the current workspace"
"This mode let's you switch between the applications of your current "
"workspace and gives you additionally the option to switch to the last used "
"application of your previous workspace. This is always the last symbol in "
"the list and is segregated by a separator/vertical line if available. \n"
"Every window is represented by its application icon."
msgstr ""
"Este modo le permite alternar entre las aplicaciones de su área de trabajo "
"actual y le da la opción de cambiar a la última aplicación utilizada de su "
"área de trabajo anterior. Este siempre es el último símbolo de la lista y "
"está separado por un separador/línea vertical si está disponible.\n"
"Cada ventana está representada por su icono de aplicación."
#: ../extensions/alternate-tab/prefs.js:41
msgid "Move current selection to front before closing the popup"
msgstr ""
"Mover la selección actual al frente antes de cerrar la ventana emergente"
#: ../extensions/alternate-tab/prefs.js:58
msgid ""
"The Alternate Tab can be used in different modes, that affect the way "
"windows are chosen and presented."
msgstr ""
"La combinación de teclas Alt+Tab se puede usar en diferentes modos, que "
msgstr "Mostrar ventanas solamente en el área de trabajo actual" msgstr "Mostrar ventanas solamente en el área de trabajo actual"
#. add the new entries #. add the new entries
@@ -90,7 +71,6 @@ msgid "Hibernate"
msgid "Hibernate" msgid "Hibernate"
msgstr "Hibernar" msgstr "Hibernar"
#: ../extensions/alternative-status-menu/extension.js:78
#: ../extensions/alternative-status-menu/extension.js:78 #: ../extensions/alternative-status-menu/extension.js:78
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
@@ -358,6 +338,63 @@ msgstr "Hacia abajo"
#: ../extensions/xrandr-indicator/extension.js:82 #: ../extensions/xrandr-indicator/extension.js:82
msgid "Configure display settings..." msgid "Configure display settings..."
msgstr "Configurar las opciones de pantalla…" msgstr "Configurar las opciones de pantalla…"
#~ msgid "The alt tab behaviour."
#~ msgstr "El comportamiento de Alt+Tab."
#~ msgid ""
#~ "Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and "
#~ "workspace_icons. See the configuration dialogs for details."
#~ msgstr ""
#~ "Establece el comportamiento de Alt+Tab. Los valores posibles son: "
#~ "«native» (nativo), «all_thumbnails» (todo y miniaturas) y "
#~ "«workspace_icons» (iconos de áreas de trabajo). Para obtener información "
#~ "más detallada, consulte la configuración de los diálogos "
#~ msgid ""
#~ "This mode presents all applications from all workspaces in one selection "
#~ "list. Instead of using the application icon of every window, it uses "
#~ "small thumbnails resembling the window itself."
#~ msgstr ""
#~ "Este modo presenta todas las aplicaciones de todas las áreas de trabajo "
#~ "en una lista de selección. En lugar de usar el icono de aplicación de "
#~ "cada ventana, usa pequeñas miniaturas que se asemejan a la propia ventana."
#~ msgid "Workspace & Icons"
#~ msgstr "Área de trabajo e iconos"
#~| msgid ""
#~| "This mode let's you switch between the applications of your current "
#~| "workspace and gives you additionally the option to switch to the last "
#~| "used application of your previous workspace. This is always the last "
#~| "symbol in the list and is segregated by a separator/vertical line if "
#~| "available. \n"
#~| "Every window is represented by its application icon."
#~ msgid ""
#~ "This mode lets you switch between the applications of your current "
#~ "workspace and gives you additionally the option to switch to the last "
#~ "used application of your previous workspace. This is always the last "
#~ "symbol in the list and is separated by a separator/vertical line if "
#~ "available. \n"
#~ "Every window is represented by its application icon."
#~ msgstr ""
#~ "Este modo le permite alternar entre las aplicaciones de su área de "
#~ "trabajo actual y le da la opción de cambiar a la última aplicación "
#~ "utilizada de su área de trabajo anterior. Este siempre es el último "
#~ "símbolo de la lista y está separado por un separador/línea vertical si "
#~ "está disponible.\n"
#~ "Cada ventana está representada por su icono de aplicación."
#~ msgid "Move current selection to front before closing the popup"
#~ msgstr ""
#~ "Mover la selección actual al frente antes de cerrar la ventana emergente"
#~ msgid ""
#~ "The Alternate Tab can be used in different modes, that affect the way "
#~ "windows are chosen and presented."
#~ msgstr ""
#~ "La combinación de teclas Alt+Tab se puede usar en diferentes modos, que "
#~ "afectan la manera en que se eligen y presentan las ventanas."
#~ msgid "Indicates if Alternate Tab is newly installed" #~ msgid "Indicates if Alternate Tab is newly installed"
#~ msgstr "Indica si se ha instalado Alt+Tab recientemente" #~ msgstr "Indica si se ha instalado Alt+Tab recientemente"
+89 -64
View File
@@ -8,78 +8,79 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions gnome-3-0\n" "Project-Id-Version: gnome-shell-extensions gnome-3-0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=extensions\n" "shell&keywords=I18N+L10N&component=extensions\n"
"POT-Creation-Date: 2012-02-24 18:22+0000\n" "POT-Creation-Date: 2012-08-18 00:42+0000\n"
"PO-Revision-Date: 2012-03-17 16:50+0530\n" "PO-Revision-Date: 2012-08-19 15:11+0530\n"
"Last-Translator: A S Alam <aalam@users.sf.net>\n" "Last-Translator: A S Alam <aalam@users.sf.net>\n"
"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n" "Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
"Language: pa\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: pa\n" "X-Generator: Lokalize 1.4\n"
"X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1 #: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "The alt tab behaviour." msgid "The application icon mode."
msgstr "alt tab ਰਵੱਈਆ ਹੈ।" msgstr "ਐਪਲੀਕੇਸ਼ਨ ਆਈਕਾਨ ਮੋਡ"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2 #: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
#| msgid ""
#| "Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails "
#| "and workspace_icons."
msgid "" msgid ""
"Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and " "Configures how the windows are shown in the switcher. Valid possibilities "
"workspace_icons. See the configuration dialogs for details." "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr "" msgstr ""
"Alt-Tab ਰਵੱਈਆ ਸੈੱਟ ਕਰੋ। ਸੰਭਵ ਮੁੱਲ ਹਨ: all_thumbnails ਅਤੇ workspace_icons। "
"ਵੇਰਵੇ ਲਈ ਸੰਰਚਨਾ ਡਾਈਲਾਗ ਵੇਖੋ।" #: ../extensions/alternate-tab/prefs.js:26
#| msgid "All & Thumbnails"
msgid "Thumbnail only"
msgstr "ਕੇਵਲ ਥੰਮਨੇਲ ਹੀ"
#: ../extensions/alternate-tab/prefs.js:27 #: ../extensions/alternate-tab/prefs.js:27
msgid "All & Thumbnails" #| msgid "Application"
msgstr "ਸਭ ਅਤੇ ਥੰਮਨੇਲ" msgid "Application icon only"
msgstr "ਐਪਲੀਕੇਸ਼ਨ ਆਈਕਾਨ ਹੀ"
#: ../extensions/alternate-tab/prefs.js:28 #: ../extensions/alternate-tab/prefs.js:28
msgid "" msgid "Thumbnail and application icon"
"This mode presents all applications from all workspaces in one selection " msgstr "ਥੰਮਨੇਲ ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਆਈਕਾਨ"
"list. Instead of using the application icon of every window, it uses small "
"thumbnails resembling the window itself."
msgstr ""
#: ../extensions/alternate-tab/prefs.js:34 #: ../extensions/alternate-tab/prefs.js:43
msgid "Workspace & Icons" msgid "Present windows as"
msgstr "ਵਰਕਸਪੇਸ ਅਤੇ ਆਈਕਾਨ" msgstr "ਵਿੰਡੋਜ਼ ਨੂੰ ਪੇਸ਼ ਕਰੋ"
#: ../extensions/alternate-tab/prefs.js:35 #: ../extensions/alternate-tab/prefs.js:68
msgid "" msgid "Show only windows in the current workspace"
"This mode let's you switch between the applications of your current " msgstr "ਮੌਜੂਦਾ ਵਰਕਸਪੇਸ ਵਿੱਚੋਂ ਹੀ ਵਿੰਡੋਜ਼ ਹੀ ਵੇਖਾਓ"
"workspace and gives you additionally the option to switch to the last used "
"application of your previous workspace. This is always the last symbol in "
"the list and is segregated by a separator/vertical line if available. \n"
"Every window is represented by its application icon."
msgstr ""
#: ../extensions/alternate-tab/prefs.js:41
msgid "Move current selection to front before closing the popup"
msgstr ""
#: ../extensions/alternate-tab/prefs.js:58
msgid ""
"The Alternate Tab can be used in different modes, that affect the way "
"windows are chosen and presented."
msgstr ""
#. add the new entries #. add the new entries
#: ../extensions/alternative-status-menu/extension.js:64 #: ../extensions/alternative-status-menu/extension.js:68
msgid "Suspend" msgid "Suspend"
msgstr "ਸਸਪੈਂਡ" msgstr "ਸਸਪੈਂਡ"
#: ../extensions/alternative-status-menu/extension.js:69 #: ../extensions/alternative-status-menu/extension.js:73
msgid "Hibernate" msgid "Hibernate"
msgstr "ਹਾਈਬਰਨੇਟ" msgstr "ਹਾਈਬਰਨੇਟ"
#: ../extensions/alternative-status-menu/extension.js:74 #: ../extensions/alternative-status-menu/extension.js:78
msgid "Power Off..." #| msgid "Power Off..."
msgstr "...ਬੰਦ ਕਰੋ" msgid "Power Off"
msgstr "ਬੰਦ ਕਰੋ"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
msgid "Enable suspending"
msgstr "ਸਸਪੈਂਡ ਕਰਨਾ ਯੋਗ"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
msgid "Control the visibility of the Suspend menu item"
msgstr "ਸਸਪੈਂਡ ਮੇਨੂ ਆਈਟਮ ਦੀ ਦਿੱਖ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
msgid "Enable hibernating"
msgstr "ਹਾਈਬਰਨੇਟ ਕਰਨਾ ਚਾਲੂ"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
msgid "Control the visibility of the Hibernate menu item"
msgstr "ਹਾਈਬਰਨੇਟ ਮੇਨੂ ਆਈਟਮ ਦੀ ਦਿੱਖ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1 #: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid "Application and workspace list" msgid "Application and workspace list"
@@ -95,13 +96,11 @@ msgstr ""
"ਰੱਖਦਾ ਹੈ" "ਰੱਖਦਾ ਹੈ"
#: ../extensions/auto-move-windows/prefs.js:55 #: ../extensions/auto-move-windows/prefs.js:55
#| msgid "Quit Application"
msgid "Application" msgid "Application"
msgstr "ਐਪਲੀਕੇਸ਼ਨ" msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#: ../extensions/auto-move-windows/prefs.js:64 #: ../extensions/auto-move-windows/prefs.js:64
#: ../extensions/auto-move-windows/prefs.js:106 #: ../extensions/auto-move-windows/prefs.js:106
#| msgid "Workspace & Icons"
msgid "Workspace" msgid "Workspace"
msgstr "ਵਰਕਸਪੇਸ" msgstr "ਵਰਕਸਪੇਸ"
@@ -117,23 +116,23 @@ msgstr "ਨਵਾਂ ਮਿਲਾਉਣ ਨਿਯਮ ਬਣਾਉ"
msgid "Add" msgid "Add"
msgstr "ਸ਼ਾਮਲ" msgstr "ਸ਼ਾਮਲ"
#: ../extensions/dock/extension.js:489 #: ../extensions/dock/extension.js:600
msgid "Drag here to add favorites" msgid "Drag here to add favorites"
msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ" msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ"
#: ../extensions/dock/extension.js:815 #: ../extensions/dock/extension.js:926
msgid "New Window" msgid "New Window"
msgstr "ਨਵੀਂ ਵਿੰਡੋ" msgstr "ਨਵੀਂ ਵਿੰਡੋ"
#: ../extensions/dock/extension.js:817 #: ../extensions/dock/extension.js:928
msgid "Quit Application" msgid "Quit Application"
msgstr "ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰੋ" msgstr "ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰੋ"
#: ../extensions/dock/extension.js:822 #: ../extensions/dock/extension.js:933
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ" msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
#: ../extensions/dock/extension.js:823 #: ../extensions/dock/extension.js:934
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ" msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
@@ -164,8 +163,6 @@ msgid "Autohide effect"
msgstr "ਆਪੇ-ਓਹਲੇ ਹੋਣ ਪ੍ਰਭਾਵ" msgstr "ਆਪੇ-ਓਹਲੇ ਹੋਣ ਪ੍ਰਭਾਵ"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7 #: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
#| msgid ""
#| "Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
msgid "" msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and " "Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
"'move'" "'move'"
@@ -181,7 +178,23 @@ msgstr "ਆਪੇ ਓਹਲੇ ਹੋਣ ਅੰਤਰਾਲ"
msgid "Sets the time duration of the autohide effect." msgid "Sets the time duration of the autohide effect."
msgstr "ਆਪੇ-ਓਹਲੇ ਕਰਨ ਦੇ ਪ੍ਰਭਾਵ ਦੀ ਸਮੇਂ ਦਾ ਅੰਤਰਾਲ ਸੈੱਟ ਕਰੋ।" msgstr "ਆਪੇ-ਓਹਲੇ ਕਰਨ ਦੇ ਪ੍ਰਭਾਵ ਦੀ ਸਮੇਂ ਦਾ ਅੰਤਰਾਲ ਸੈੱਟ ਕਰੋ।"
#: ../extensions/drive-menu/extension.js:66 #: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:10
msgid "Monitor"
msgstr "ਮਾਨੀਟਰ"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:11
msgid ""
"Sets monitor to display dock in. The default value (-1) is the primary "
"monitor."
msgstr ""
"ਡੌਕ ਵਿੱਚ ਵੇਖਾਉਣ ਲਈ ਨਿਗਾਰਨ ਸੈੱਟ ਕਰੋ। ਪ੍ਰਾਈਮਰੀ ਮਾਨੀਟਰ ਲਈ ਡਿਫਾਲਟ ਮੁੱਲ (-1) ਹੈ।"
#: ../extensions/drive-menu/extension.js:57
#| msgid "Removable Devices"
msgid "Removable devices"
msgstr "ਹਟਾਉਣਯੋਗ ਜੰਤਰ"
#: ../extensions/drive-menu/extension.js:68
msgid "Open file manager" msgid "Open file manager"
msgstr "ਫਾਇਲ ਮੈਨੇਜਰ ਖੋਲ੍ਹੋ" msgstr "ਫਾਇਲ ਮੈਨੇਜਰ ਖੋਲ੍ਹੋ"
@@ -256,7 +269,7 @@ msgid ""
"restarting the shell to have any effect." "restarting the shell to have any effect."
msgstr "" msgstr ""
#: ../extensions/places-menu/extension.js:37 #: ../extensions/places-menu/extension.js:39
msgid "Removable Devices" msgid "Removable Devices"
msgstr "ਹਟਾਉਣਯੋਗ ਜੰਤਰ" msgstr "ਹਟਾਉਣਯੋਗ ਜੰਤਰ"
@@ -269,23 +282,19 @@ msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "ਥੀਮ ਦਾ ਨਾਂ, ਜੋ ~/.themes/name/gnome-shell ਤੋਂ ਲੋਡ ਕੀਤਾ ਜਾਵੇਗਾ" msgstr "ਥੀਮ ਦਾ ਨਾਂ, ਜੋ ~/.themes/name/gnome-shell ਤੋਂ ਲੋਡ ਕੀਤਾ ਜਾਵੇਗਾ"
#: ../extensions/workspace-indicator/extension.js:30 #: ../extensions/workspace-indicator/extension.js:30
#| msgid "Workspace & Icons"
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "ਵਰਕਸਪੇਸ ਇੰਡੀਕੇਟਰ" msgstr "ਵਰਕਸਪੇਸ ਇੰਡੀਕੇਟਰ"
#: ../extensions/workspace-indicator/prefs.js:151 #: ../extensions/workspace-indicator/prefs.js:141
#| msgid "Workspace & Icons"
msgid "Workspace names:" msgid "Workspace names:"
msgstr "ਵਰਕਸਪੇਸ ਨਾਂ:" msgstr "ਵਰਕਸਪੇਸ ਨਾਂ:"
#: ../extensions/workspace-indicator/prefs.js:162 #: ../extensions/workspace-indicator/prefs.js:152
#| msgid "Native"
msgid "Name" msgid "Name"
msgstr "ਨਾਂ" msgstr "ਨਾਂ"
#: ../extensions/workspace-indicator/prefs.js:196 #: ../extensions/workspace-indicator/prefs.js:186
#, c-format #, c-format
#| msgid "Workspace & Icons"
msgid "Workspace %d" msgid "Workspace %d"
msgstr "ਵਰਕਸਪੇਸ %d" msgstr "ਵਰਕਸਪੇਸ %d"
@@ -309,6 +318,22 @@ msgstr "ਉਤਲਾ ਹੇਠ"
msgid "Configure display settings..." msgid "Configure display settings..."
msgstr "ਡਿਸਪਲੇਅ ਸੈਟਿੰਗ ਸੰਰਚਨਾ..." msgstr "ਡਿਸਪਲੇਅ ਸੈਟਿੰਗ ਸੰਰਚਨਾ..."
#~ msgid "The alt tab behaviour."
#~ msgstr "alt tab ਰਵੱਈਆ ਹੈ।"
#~| msgid ""
#~| "Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails "
#~| "and workspace_icons."
#~ msgid ""
#~ "Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and "
#~ "workspace_icons. See the configuration dialogs for details."
#~ msgstr ""
#~ "Alt-Tab ਰਵੱਈਆ ਸੈੱਟ ਕਰੋ। ਸੰਭਵ ਮੁੱਲ ਹਨ: all_thumbnails ਅਤੇ workspace_icons। ਵੇਰਵੇ ਲਈ "
#~ "ਸੰਰਚਨਾ ਡਾਈਲਾਗ ਵੇਖੋ।"
#~ msgid "Workspace & Icons"
#~ msgstr "ਵਰਕਸਪੇਸ ਅਤੇ ਆਈਕਾਨ"
#~ msgid "Available" #~ msgid "Available"
#~ msgstr "ਉਪਲੱਬਧ" #~ msgstr "ਉਪਲੱਬਧ"