Compare commits
113 Commits
3.7.90
...
wip/gcampa
Author | SHA1 | Date | |
---|---|---|---|
6d4ca1fcc8 | |||
93b1af401f | |||
3368e49aa7 | |||
9e31f05861 | |||
b52f4ed25b | |||
00eb764880 | |||
6d011a3700 | |||
f9d9caf417 | |||
b50702dd52 | |||
e74a82b9d6 | |||
12fa983242 | |||
1607df835a | |||
7b705dd670 | |||
323e3028b6 | |||
7e1b4692e2 | |||
c1dd971ce9 | |||
39610e6933 | |||
fdb189102d | |||
e54d095064 | |||
e6634c56d3 | |||
deb77a4dde | |||
90ea27c423 | |||
19533f87e3 | |||
e6c5c84133 | |||
404aaa5658 | |||
2c70df25f5 | |||
db959ac2eb | |||
bbf0dce390 | |||
1cbb8b9851 | |||
96387cce47 | |||
570fc68cb1 | |||
e6ce0057af | |||
a3f625fe39 | |||
bdfe459d64 | |||
95ec8ef5e1 | |||
b8198716d9 | |||
071a4e5f83 | |||
d99cd71408 | |||
030e6aa507 | |||
f146b01e3e | |||
c249ff9046 | |||
8b48560c81 | |||
bdbea2463b | |||
8fb2263471 | |||
ea55c36a3a | |||
37595ff3e7 | |||
cca008b73c | |||
b9dcbd9d33 | |||
b6bf8d5b2d | |||
43ed66cf26 | |||
57eae1be43 | |||
b394d184cc | |||
81e01b6f88 | |||
52efe32e0f | |||
e7886734c4 | |||
083c37a7b2 | |||
b24a10aa00 | |||
e1ef14d12b | |||
1a33de91e2 | |||
6e15e2d72a | |||
d58b715c52 | |||
804ff8b5a5 | |||
6e89d2f46a | |||
e99d69b7d9 | |||
f25416c3f5 | |||
a7bb6a2781 | |||
41f14e0e89 | |||
01bd10f485 | |||
476eacd5ca | |||
ca2fb74f41 | |||
8a2baf5b6e | |||
d44fc3aa1b | |||
7d78c42dfc | |||
a361180745 | |||
310dc10c4d | |||
96e02c4c2e | |||
afb3b9f029 | |||
d5e647a191 | |||
a1d37617a8 | |||
2541f85942 | |||
07fd23dc5e | |||
946311b2a3 | |||
4868032215 | |||
fb0cf64536 | |||
b37afcdba1 | |||
f644bee831 | |||
6fcc7e3e23 | |||
95602eb85d | |||
9f3afdf928 | |||
627a2412d2 | |||
acffd1e792 | |||
62ca4ba624 | |||
6ea8f35343 | |||
1bd8c67041 | |||
7425b382d6 | |||
5f61b57d63 | |||
9db73767d9 | |||
c562245c16 | |||
9525216d78 | |||
28a71a29e6 | |||
7b06d34ba4 | |||
656d24e477 | |||
df0f03d831 | |||
1db6d15677 | |||
08a0479c9e | |||
6682b7dfa5 | |||
aad5d98b43 | |||
a8a4a85dac | |||
ad71b969b2 | |||
8bcb10391e | |||
8e7d74bc3b | |||
629b6faa22 | |||
ef1e27966d |
@ -69,7 +69,6 @@ GIO_MIN_VERSION=2.35.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
LIBEDATASERVER_MIN_VERSION=3.5.3
|
||||
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
||||
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
||||
POLKIT_MIN_VERSION=0.100
|
||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||
GCR_MIN_VERSION=3.3.90
|
||||
@ -94,7 +93,6 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
||||
libcanberra libcanberra-gtk3
|
||||
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
||||
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
||||
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
||||
|
@ -644,6 +644,9 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
#overview {
|
||||
spacing: 24px;
|
||||
}
|
||||
|
||||
.overview-controls {
|
||||
padding-bottom: 32px;
|
||||
}
|
||||
|
||||
@ -731,13 +734,36 @@ StScrollBar StButton#vhandle:active {
|
||||
-vertical-spacing: 32px;
|
||||
padding-left: 32px;
|
||||
padding-right: 32px;
|
||||
padding-bottom: 32px;
|
||||
padding-bottom: 48px;
|
||||
}
|
||||
|
||||
.window-picker.external-monitor {
|
||||
padding: 32px;
|
||||
}
|
||||
|
||||
.messages-indicator {
|
||||
color: #999999;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.messages-indicator-contents {
|
||||
spacing: 12px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.messages-indicator-contents:hover {
|
||||
color: white;
|
||||
text-shadow: black 0px 2px 2px;
|
||||
}
|
||||
|
||||
.messages-indicator-highlight {
|
||||
background-gradient-start: transparent;
|
||||
background-gradient-end: #999999;
|
||||
background-gradient-direction: vertical;
|
||||
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
/* Dash */
|
||||
|
||||
#dash {
|
||||
@ -781,7 +807,7 @@ StScrollBar StButton#vhandle:active {
|
||||
/* Search Results */
|
||||
|
||||
#searchResults {
|
||||
padding: 20px 10px 10px 10px;
|
||||
padding: 20px 10px 0px 10px;
|
||||
spacing: 18px;
|
||||
}
|
||||
|
||||
@ -850,15 +876,18 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.app-view-controls {
|
||||
width: 250px;
|
||||
padding-bottom: 32px;
|
||||
}
|
||||
|
||||
.app-view-control {
|
||||
padding: 4px 16px;
|
||||
}
|
||||
|
||||
StScrollView.frequent-apps StScrollBar {
|
||||
min-width: 0px;
|
||||
width: 0px;
|
||||
.search-display > StBoxLayout,
|
||||
.all-apps > StBoxLayout,
|
||||
.frequent-apps > StBoxLayout {
|
||||
/* horizontal padding to make sure the scrollbar doesn't overlap content */
|
||||
padding: 0px 18px;
|
||||
}
|
||||
|
||||
.app-folder-icon {
|
||||
@ -881,8 +910,6 @@ StScrollView.frequent-apps StScrollBar {
|
||||
}
|
||||
|
||||
.list-search-result-description {
|
||||
font-weight: bold;
|
||||
font-size: 12pt;
|
||||
color: #eeeeec;
|
||||
}
|
||||
|
||||
@ -936,6 +963,10 @@ StScrollView.frequent-apps StScrollBar {
|
||||
color:white;
|
||||
}
|
||||
|
||||
.list-search-result:hover .list-search-result-description {
|
||||
text-shadow: rgba(0,0,0,0.8) 0px 1px 2px;
|
||||
}
|
||||
|
||||
.show-apps {
|
||||
padding: 4px 0;
|
||||
}
|
||||
@ -1577,12 +1608,26 @@ StScrollView.frequent-apps StScrollBar {
|
||||
-shell-counter-overlap-y: 13px;
|
||||
}
|
||||
|
||||
/* OSD */
|
||||
.osd-window {
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
spacing: 1em;
|
||||
}
|
||||
|
||||
.osd-window .level {
|
||||
height: 0.6em;
|
||||
border-radius: 0.3em;
|
||||
background-color: rgba(190,190,190,0.2);
|
||||
}
|
||||
|
||||
/* App Switcher */
|
||||
.switcher-popup {
|
||||
padding: 8px;
|
||||
spacing: 16px;
|
||||
}
|
||||
|
||||
.osd-window,
|
||||
.switcher-list {
|
||||
background: rgba(0,0,0,0.8);
|
||||
border: 1px solid rgba(128,128,128,0.40);
|
||||
@ -2480,7 +2525,7 @@ StScrollView.frequent-apps StScrollBar {
|
||||
}
|
||||
|
||||
.input-source-switcher-symbol {
|
||||
font-size: 42pt;
|
||||
font-size: 34pt;
|
||||
width: 96px;
|
||||
height: 96px;
|
||||
}
|
||||
|
@ -69,6 +69,7 @@ nobase_dist_js_DATA = \
|
||||
ui/shellEntry.js \
|
||||
ui/shellMountOperation.js \
|
||||
ui/notificationDaemon.js \
|
||||
ui/osdWindow.js \
|
||||
ui/overview.js \
|
||||
ui/overviewControls.js \
|
||||
ui/panel.js \
|
||||
|
@ -45,6 +45,7 @@ const Application = new Lang.Class({
|
||||
this._extensionPrefsModules = {};
|
||||
|
||||
this._extensionIters = {};
|
||||
this._startupUuid = null;
|
||||
},
|
||||
|
||||
_buildModel: function() {
|
||||
@ -203,6 +204,7 @@ const Application = new Lang.Class({
|
||||
_scanExtensions: function() {
|
||||
let finder = new ExtensionUtils.ExtensionFinder();
|
||||
finder.connect('extension-found', Lang.bind(this, this._extensionFound));
|
||||
finder.connect('extensions-loaded', Lang.bind(this, this._extensionsLoaded));
|
||||
finder.scanExtensions();
|
||||
},
|
||||
|
||||
@ -212,6 +214,11 @@ const Application = new Lang.Class({
|
||||
this._extensionIters[extension.uuid] = iter;
|
||||
},
|
||||
|
||||
_extensionsLoaded: function() {
|
||||
if (this._startupUuid && this._extensionAvailable(this._startupUuid))
|
||||
this._selectExtension(this._startupUuid);
|
||||
this._startupUuid = null;
|
||||
},
|
||||
|
||||
_onActivate: function() {
|
||||
this._window.present();
|
||||
@ -232,10 +239,10 @@ const Application = new Lang.Class({
|
||||
// Strip off "extension:///" prefix which fakes a URI, if it exists
|
||||
uuid = stripPrefix(uuid, "extension:///");
|
||||
|
||||
if (!this._extensionAvailable(uuid))
|
||||
return 1;
|
||||
|
||||
this._selectExtension(uuid);
|
||||
if (this._extensionAvailable(uuid))
|
||||
this._selectExtension(uuid);
|
||||
else
|
||||
this._startupUuid = uuid;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -753,7 +753,7 @@ const LoginDialog = new Lang.Class({
|
||||
time: _FADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
|
||||
if (!this._user || (this._user.is_logged_in() && this._verifyingUser))
|
||||
if ((this._user && !this._user.is_logged_in()) || this._verifyingUser)
|
||||
this._sessionList.actor.show();
|
||||
|
||||
this._promptEntry.grab_key_focus();
|
||||
|
@ -174,10 +174,15 @@ const ExtensionFinder = new Lang.Class({
|
||||
this.emit('extension-found', extension);
|
||||
},
|
||||
|
||||
_extensionsLoaded: function() {
|
||||
this.emit('extensions-loaded');
|
||||
},
|
||||
|
||||
scanExtensions: function() {
|
||||
let perUserDir = Gio.File.new_for_path(global.userdatadir);
|
||||
FileUtils.collectFromDatadirsAsync('extensions',
|
||||
{ processFile: Lang.bind(this, this._loadExtension),
|
||||
loadedCallback: Lang.bind(this, this._extensionsLoaded),
|
||||
includeUserDir: true,
|
||||
data: perUserDir });
|
||||
}
|
||||
|
@ -98,43 +98,13 @@ const AppSwitcherPopup = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_getAppLists: function() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let allApps = appSys.get_running ();
|
||||
|
||||
let screen = global.screen;
|
||||
let display = screen.get_display();
|
||||
let windows = display.get_tab_list(Meta.TabList.NORMAL_ALL, screen,
|
||||
screen.get_active_workspace());
|
||||
|
||||
// windows is only the windows on the current workspace. For
|
||||
// each one, if it corresponds to an app we know, move that
|
||||
// app from allApps to apps.
|
||||
let apps = [];
|
||||
for (let i = 0; i < windows.length && allApps.length != 0; i++) {
|
||||
let app = tracker.get_window_app(windows[i]);
|
||||
let index = allApps.indexOf(app);
|
||||
if (index != -1) {
|
||||
apps.push(app);
|
||||
allApps.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Now @apps is a list of apps on the current workspace, in
|
||||
// standard Alt+Tab order (MRU except for minimized windows),
|
||||
// and allApps is a list of apps that only appear on other
|
||||
// workspaces, sorted by user_time, which is good enough.
|
||||
return [apps, allApps];
|
||||
},
|
||||
|
||||
_createSwitcher: function() {
|
||||
let [localApps, otherApps] = this._getAppLists();
|
||||
let apps = Shell.AppSystem.get_default().get_running ();
|
||||
|
||||
if (localApps.length == 0 && otherApps.length == 0)
|
||||
if (apps.length == 0)
|
||||
return false;
|
||||
|
||||
this._switcherList = new AppSwitcher(localApps, otherApps, this);
|
||||
this._switcherList = new AppSwitcher(apps, this);
|
||||
this._items = this._switcherList.icons;
|
||||
|
||||
return true;
|
||||
@ -265,12 +235,8 @@ const AppSwitcherPopup = new Lang.Class({
|
||||
this.parent();
|
||||
|
||||
let appIcon = this._items[this._selectedIndex];
|
||||
let window;
|
||||
if (this._currentWindow >= 0)
|
||||
window = appIcon.cachedWindows[this._currentWindow];
|
||||
else
|
||||
window = null;
|
||||
appIcon.app.activate_window(window, timestamp);
|
||||
let window = this._currentWindow > 0 ? this._currentWindow : 0;
|
||||
appIcon.app.activate_window(appIcon.cachedWindows[window], timestamp);
|
||||
},
|
||||
|
||||
_onDestroy : function() {
|
||||
@ -461,34 +427,26 @@ const AppSwitcher = new Lang.Class({
|
||||
Name: 'AppSwitcher',
|
||||
Extends: SwitcherPopup.SwitcherList,
|
||||
|
||||
_init : function(localApps, otherApps, altTabPopup) {
|
||||
_init : function(apps, altTabPopup) {
|
||||
this.parent(true);
|
||||
|
||||
// Construct the AppIcons, add to the popup
|
||||
let activeWorkspace = global.screen.get_active_workspace();
|
||||
let workspaceIcons = [];
|
||||
let otherIcons = [];
|
||||
for (let i = 0; i < localApps.length; i++) {
|
||||
let appIcon = new AppIcon(localApps[i]);
|
||||
// Cache the window list now; we don't handle dynamic changes here,
|
||||
// and we don't want to be continually retrieving it
|
||||
appIcon.cachedWindows = appIcon.app.get_windows();
|
||||
workspaceIcons.push(appIcon);
|
||||
}
|
||||
for (let i = 0; i < otherApps.length; i++) {
|
||||
let appIcon = new AppIcon(otherApps[i]);
|
||||
appIcon.cachedWindows = appIcon.app.get_windows();
|
||||
otherIcons.push(appIcon);
|
||||
}
|
||||
|
||||
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]);
|
||||
|
||||
let windowTracker = Shell.WindowTracker.get_default();
|
||||
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL,
|
||||
global.screen, null);
|
||||
|
||||
// Construct the AppIcons, add to the popup
|
||||
for (let i = 0; i < apps.length; i++) {
|
||||
let appIcon = new AppIcon(apps[i]);
|
||||
// Cache the window list now; we don't handle dynamic changes here,
|
||||
// and we don't want to be continually retrieving it
|
||||
appIcon.cachedWindows = allWindows.filter(function(w) {
|
||||
return windowTracker.get_window_app (w) == appIcon.app;
|
||||
});
|
||||
this._addIcon(appIcon);
|
||||
}
|
||||
|
||||
this._curApp = -1;
|
||||
this._iconSize = 0;
|
||||
@ -514,8 +472,6 @@ const AppSwitcher = new Lang.Class({
|
||||
let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
|
||||
let iconSpacing = iconNaturalHeight + iconPadding + iconBorder;
|
||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||
if (this._separator)
|
||||
totalSpacing += this._separator.width + this._list.spacing;
|
||||
|
||||
// We just assume the whole screen here due to weirdness happing with the passed width
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
@ -638,24 +594,12 @@ const ThumbnailList = new Lang.Class({
|
||||
_init : function(windows) {
|
||||
this.parent(false);
|
||||
|
||||
let activeWorkspace = global.screen.get_active_workspace();
|
||||
|
||||
// We fake the value of 'separatorAdded' when the app has no window
|
||||
// on the current workspace, to avoid displaying a useless separator in
|
||||
// that case.
|
||||
let separatorAdded = windows.length == 0 || windows[0].get_workspace() != activeWorkspace;
|
||||
|
||||
this._labels = new Array();
|
||||
this._thumbnailBins = new Array();
|
||||
this._clones = new Array();
|
||||
this._windows = windows;
|
||||
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
if (!separatorAdded && windows[i].get_workspace() != activeWorkspace) {
|
||||
this.addSeparator();
|
||||
separatorAdded = true;
|
||||
}
|
||||
|
||||
let box = new St.BoxLayout({ style_class: 'thumbnail-box',
|
||||
vertical: true });
|
||||
|
||||
|
@ -175,7 +175,9 @@ const AllView = new Lang.Class({
|
||||
y_fill: false,
|
||||
y_align: St.Align.START,
|
||||
x_expand: true,
|
||||
style_class: 'vfade' });
|
||||
y_expand: true,
|
||||
overlay_scrollbars: true,
|
||||
style_class: 'all-apps vfade' });
|
||||
this.actor.add_actor(box);
|
||||
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
let action = new Clutter.PanAction({ interpolate: true });
|
||||
@ -297,22 +299,11 @@ const FrequentView = new Lang.Class({
|
||||
|
||||
_init: function() {
|
||||
this._grid = new IconGrid.IconGrid({ xAlign: St.Align.MIDDLE,
|
||||
fillParent: true,
|
||||
columnLimit: MAX_COLUMNS });
|
||||
let box = new St.BoxLayout({ vertical: true });
|
||||
box.add(this._grid.actor);
|
||||
|
||||
// HACK: IconGrid currently lacks API to only display items that match
|
||||
// the allocation, so rather than clipping away eventual overflow, we
|
||||
// use an unscrollable ScrollView with hidden scrollbars to nicely
|
||||
// fade out cut off items
|
||||
this.actor = new St.ScrollView({ x_fill: true,
|
||||
y_fill: false,
|
||||
y_align: St.Align.START,
|
||||
x_expand: true,
|
||||
reactive: false,
|
||||
style_class: 'frequent-apps vfade' });
|
||||
this.actor.add_actor(box);
|
||||
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
this.actor = new St.Widget({ style_class: 'frequent-apps',
|
||||
x_expand: true, y_expand: true });
|
||||
this.actor.add_actor(this._grid.actor);
|
||||
|
||||
this._usage = Shell.AppUsage.get_default();
|
||||
},
|
||||
@ -373,10 +364,7 @@ const AppDisplay = new Lang.Class({
|
||||
|
||||
this._viewStack = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true, y_expand: true });
|
||||
let bin = new St.Bin({ child: this._viewStack,
|
||||
clip_to_allocation: true,
|
||||
x_fill: true, y_fill: true });
|
||||
this.actor.add(bin, { expand: true });
|
||||
this.actor.add(this._viewStack, { expand: true });
|
||||
|
||||
let layout = new Clutter.BoxLayout({ homogeneous: true });
|
||||
this._controls = new St.Widget({ style_class: 'app-view-controls',
|
||||
@ -579,10 +567,6 @@ const FolderIcon = new Lang.Class({
|
||||
|
||||
this._popup = new AppFolderPopup(this, side);
|
||||
this._parentView.addFolderPopup(this._popup);
|
||||
let constraint = new Clutter.AlignConstraint({ source: this._parentView.actor,
|
||||
align_axis: Clutter.AlignAxis.X_AXIS,
|
||||
factor: 0.5 });
|
||||
this._popup.actor.add_constraint(constraint);
|
||||
|
||||
// Position the popup above or below the source icon
|
||||
if (side == St.Side.BOTTOM) {
|
||||
@ -612,7 +596,17 @@ const AppFolderPopup = new Lang.Class({
|
||||
this._isOpen = false;
|
||||
|
||||
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||
visible: false });
|
||||
visible: false,
|
||||
// We don't want to expand really, but look
|
||||
// at the layout manager of our parent...
|
||||
//
|
||||
// DOUBLE HACK: if you set one, you automatically
|
||||
// get the effect for the other direction too, so
|
||||
// we need to set the y_align
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.START });
|
||||
this._boxPointer = new BoxPointer.BoxPointer(this._arrowSide,
|
||||
{ style_class: 'app-folder-popup-bin',
|
||||
x_fill: true,
|
||||
|
@ -14,7 +14,6 @@ const Params = imports.misc.params;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
||||
const DRAW_BACKGROUND_KEY = 'draw-background';
|
||||
const PRIMARY_COLOR_KEY = 'primary-color';
|
||||
const SECONDARY_COLOR_KEY = 'secondary-color';
|
||||
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
|
||||
@ -490,11 +489,6 @@ const Background = new Lang.Class({
|
||||
},
|
||||
|
||||
_load: function () {
|
||||
if (!this._settings.get_boolean(DRAW_BACKGROUND_KEY)) {
|
||||
this._setLoaded();
|
||||
return;
|
||||
}
|
||||
|
||||
this._cache = getBackgroundCache();
|
||||
|
||||
this._loadPattern(this._cache);
|
||||
@ -565,22 +559,24 @@ const Background = new Lang.Class({
|
||||
});
|
||||
Signals.addSignalMethods(Background.prototype);
|
||||
|
||||
const StillFrame = new Lang.Class({
|
||||
Name: 'StillFrame',
|
||||
const SystemBackground = new Lang.Class({
|
||||
Name: 'SystemBackground',
|
||||
|
||||
_init: function(monitorIndex) {
|
||||
_init: function() {
|
||||
this._cache = getBackgroundCache();
|
||||
this.actor = new Meta.BackgroundActor();
|
||||
this.actor._delegate = this;
|
||||
|
||||
let content = new Meta.Background({ meta_screen: global.screen,
|
||||
monitor: monitorIndex,
|
||||
effects: Meta.BackgroundEffects.NONE });
|
||||
content.load_still_frame();
|
||||
|
||||
this.actor.content = content;
|
||||
this._cache.getImageContent({ style: GDesktopEnums.BackgroundStyle.WALLPAPER,
|
||||
filename: global.datadir + '/theme/noise-texture.png',
|
||||
effects: Meta.BackgroundEffects.NONE,
|
||||
onFinished: Lang.bind(this, function(content) {
|
||||
this.actor.content = content;
|
||||
this.emit('loaded');
|
||||
})
|
||||
});
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(StillFrame.prototype);
|
||||
Signals.addSignalMethods(SystemBackground.prototype);
|
||||
|
||||
const Animation = new Lang.Class({
|
||||
Name: 'Animation',
|
||||
@ -641,12 +637,14 @@ const BackgroundManager = new Lang.Class({
|
||||
params = Params.parse(params, { container: null,
|
||||
layoutManager: Main.layoutManager,
|
||||
monitorIndex: null,
|
||||
effects: Meta.BackgroundEffects.NONE });
|
||||
effects: Meta.BackgroundEffects.NONE,
|
||||
controlPosition: true });
|
||||
|
||||
this._container = params.container;
|
||||
this._layoutManager = params.layoutManager;
|
||||
this._effects = params.effects;
|
||||
this._monitorIndex = params.monitorIndex;
|
||||
this._controlPosition = params.controlPosition;
|
||||
|
||||
this.background = this._createBackground();
|
||||
this._newBackground = null;
|
||||
@ -706,9 +704,12 @@ const BackgroundManager = new Lang.Class({
|
||||
this._container.add_child(background.actor);
|
||||
|
||||
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
||||
background.actor.set_position(monitor.x, monitor.y);
|
||||
|
||||
background.actor.set_size(monitor.width, monitor.height);
|
||||
background.actor.lower_bottom();
|
||||
if (this._controlPosition) {
|
||||
background.actor.set_position(monitor.x, monitor.y);
|
||||
background.actor.lower_bottom();
|
||||
}
|
||||
|
||||
let signalId = background.connect('changed', Lang.bind(this, function() {
|
||||
background.disconnect(signalId);
|
||||
|
@ -640,6 +640,10 @@ const ChatSource = new Lang.Class({
|
||||
return this._pendingMessages.length;
|
||||
},
|
||||
|
||||
get indicatorCount() {
|
||||
return this.count;
|
||||
},
|
||||
|
||||
get unseenCount() {
|
||||
return this.count;
|
||||
},
|
||||
|
183
js/ui/dash.js
183
js/ui/dash.js
@ -33,30 +33,26 @@ function getAppFromSource(source) {
|
||||
// when requesting a size
|
||||
const DashItemContainer = new Lang.Class({
|
||||
Name: 'DashItemContainer',
|
||||
Extends: St.Widget,
|
||||
|
||||
_init: function() {
|
||||
this.actor = new Shell.GenericContainer({ style_class: 'dash-item-container' });
|
||||
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._delegate = this;
|
||||
this.parent({ style_class: 'dash-item-container' });
|
||||
|
||||
this._labelText = "";
|
||||
this.label = new St.Label({ style_class: 'dash-label'});
|
||||
this.label.hide();
|
||||
Main.layoutManager.addChrome(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.child = null;
|
||||
this._childScale = 1;
|
||||
this._childOpacity = 255;
|
||||
this._childScale = 0;
|
||||
this._childOpacity = 0;
|
||||
this.animatingOut = false;
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
vfunc_allocate: function(box, flags) {
|
||||
this.set_allocation(box, flags);
|
||||
|
||||
if (this.child == null)
|
||||
return;
|
||||
|
||||
@ -78,28 +74,28 @@ const DashItemContainer = new Lang.Class({
|
||||
this.child.allocate(childBox, flags);
|
||||
},
|
||||
|
||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||
alloc.min_size = 0;
|
||||
alloc.natural_size = 0;
|
||||
vfunc_get_preferred_height: function(forWidth) {
|
||||
let themeNode = this.get_theme_node();
|
||||
|
||||
if (this.child == null)
|
||||
return;
|
||||
return [0, 0];
|
||||
|
||||
forWidth = themeNode.adjust_for_width(forWidth);
|
||||
let [minHeight, natHeight] = this.child.get_preferred_height(forWidth);
|
||||
alloc.min_size += minHeight * this.child.scale_y;
|
||||
alloc.natural_size += natHeight * this.child.scale_y;
|
||||
return themeNode.adjust_preferred_height(minHeight * this.child.scale_y,
|
||||
natHeight * this.child.scale_y);
|
||||
},
|
||||
|
||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||
alloc.min_size = 0;
|
||||
alloc.natural_size = 0;
|
||||
vfunc_get_preferred_width: function(forHeight) {
|
||||
let themeNode = this.get_theme_node();
|
||||
|
||||
if (this.child == null)
|
||||
return;
|
||||
return [0, 0];
|
||||
|
||||
forHeight = themeNode.adjust_for_height(forHeight);
|
||||
let [minWidth, natWidth] = this.child.get_preferred_width(forHeight);
|
||||
alloc.min_size = minWidth * this.child.scale_y;
|
||||
alloc.natural_size = natWidth * this.child.scale_y;
|
||||
return themeNode.adjust_preferred_width(minWidth * this.child.scale_y,
|
||||
natWidth * this.child.scale_y);
|
||||
},
|
||||
|
||||
showLabel: function() {
|
||||
@ -110,9 +106,9 @@ const DashItemContainer = new Lang.Class({
|
||||
this.label.opacity = 0;
|
||||
this.label.show();
|
||||
|
||||
let [stageX, stageY] = this.actor.get_transformed_position();
|
||||
let [stageX, stageY] = this.get_transformed_position();
|
||||
|
||||
let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1;
|
||||
let itemHeight = this.allocation.y2 - this.allocation.y1;
|
||||
|
||||
let labelHeight = this.label.get_height();
|
||||
let yOffset = Math.floor((itemHeight - labelHeight) / 2)
|
||||
@ -126,7 +122,7 @@ const DashItemContainer = new Lang.Class({
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
x = stageX - this.label.get_width() - xOffset;
|
||||
else
|
||||
x = stageX + this.actor.get_width() + xOffset;
|
||||
x = stageX + this.get_width() + xOffset;
|
||||
|
||||
this.label.set_position(x, y);
|
||||
Tweener.addTween(this.label,
|
||||
@ -156,22 +152,25 @@ const DashItemContainer = new Lang.Class({
|
||||
if (this.child == actor)
|
||||
return;
|
||||
|
||||
this.actor.destroy_all_children();
|
||||
this.destroy_all_children();
|
||||
|
||||
this.child = actor;
|
||||
this.actor.add_actor(this.child);
|
||||
this.add_actor(this.child);
|
||||
|
||||
this.child.set_scale_with_gravity(this._childScale, this._childScale,
|
||||
Clutter.Gravity.CENTER);
|
||||
this.child.set_opacity(this._childOpacity);
|
||||
},
|
||||
|
||||
animateIn: function() {
|
||||
show: function(animate) {
|
||||
if (this.child == null)
|
||||
return;
|
||||
|
||||
this.childScale = 0;
|
||||
this.childOpacity = 0;
|
||||
let time = animate ? DASH_ANIMATION_TIME : 0;
|
||||
Tweener.addTween(this,
|
||||
{ childScale: 1.0,
|
||||
childOpacity: 255,
|
||||
time: DASH_ANIMATION_TIME,
|
||||
time: time,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
},
|
||||
@ -180,7 +179,7 @@ const DashItemContainer = new Lang.Class({
|
||||
if (this.label)
|
||||
this.label.destroy();
|
||||
|
||||
this.actor.destroy();
|
||||
this.parent();
|
||||
},
|
||||
|
||||
animateOutAndDestroy: function() {
|
||||
@ -188,19 +187,18 @@ const DashItemContainer = new Lang.Class({
|
||||
this.label.destroy();
|
||||
|
||||
if (this.child == null) {
|
||||
this.actor.destroy();
|
||||
this.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
this.animatingOut = true;
|
||||
this.childScale = 1.0;
|
||||
Tweener.addTween(this,
|
||||
{ childScale: 0.0,
|
||||
childOpacity: 0,
|
||||
time: DASH_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.actor.destroy();
|
||||
this.destroy();
|
||||
})
|
||||
});
|
||||
},
|
||||
@ -213,7 +211,7 @@ const DashItemContainer = new Lang.Class({
|
||||
|
||||
this.child.set_scale_with_gravity(scale, scale,
|
||||
Clutter.Gravity.CENTER);
|
||||
this.actor.queue_relayout();
|
||||
this.queue_relayout();
|
||||
},
|
||||
|
||||
get childScale() {
|
||||
@ -227,7 +225,7 @@ const DashItemContainer = new Lang.Class({
|
||||
return;
|
||||
|
||||
this.child.set_opacity(opacity);
|
||||
this.actor.queue_redraw();
|
||||
this.queue_redraw();
|
||||
},
|
||||
|
||||
get childOpacity() {
|
||||
@ -358,6 +356,23 @@ const DashActor = new Lang.Class({
|
||||
childBox.y1 = contentBox.y2 - showAppsNatHeight;
|
||||
childBox.y2 = contentBox.y2;
|
||||
showAppsButton.allocate(childBox, flags);
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(forWidth) {
|
||||
// We want to request the natural height of all our children
|
||||
// as our natural height, so we chain up to StWidget (which
|
||||
// then calls BoxLayout), but we only request the showApps
|
||||
// button as the minimum size
|
||||
|
||||
let [, natHeight] = this.parent(forWidth);
|
||||
|
||||
let themeNode = this.get_theme_node();
|
||||
let adjustedForWidth = themeNode.adjust_for_width(forWidth);
|
||||
let [, showAppsButton] = this.get_children();
|
||||
let [minHeight, ] = showAppsButton.get_preferred_height(adjustedForWidth);
|
||||
[minHeight, ] = themeNode.adjust_preferred_height(minHeight, natHeight);
|
||||
|
||||
return [minHeight, natHeight];
|
||||
}
|
||||
});
|
||||
|
||||
@ -383,12 +398,14 @@ const Dash = new Lang.Class({
|
||||
this._container.add_actor(this._box);
|
||||
|
||||
this._showAppsIcon = new ShowAppsIcon();
|
||||
this._showAppsIcon.childScale = 1;
|
||||
this._showAppsIcon.childOpacity = 255;
|
||||
this._showAppsIcon.icon.setIconSize(this.iconSize);
|
||||
this._hookUpLabel(this._showAppsIcon);
|
||||
|
||||
this.showAppsButton = this._showAppsIcon.toggleButton;
|
||||
|
||||
this._container.add_actor(this._showAppsIcon.actor);
|
||||
this._container.add_actor(this._showAppsIcon);
|
||||
|
||||
this.actor = new St.Bin({ child: this._container });
|
||||
this.actor.connect('notify::height', Lang.bind(this,
|
||||
@ -450,7 +467,7 @@ const Dash = new Lang.Class({
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
|
||||
let showAppsHovered =
|
||||
this._showAppsIcon.actor.contains(dragEvent.targetActor);
|
||||
this._showAppsIcon.contains(dragEvent.targetActor);
|
||||
|
||||
if (!this._box.contains(dragEvent.targetActor) || showAppsHovered)
|
||||
this._clearDragPlaceholder();
|
||||
@ -565,13 +582,13 @@ const Dash = new Lang.Class({
|
||||
// animating out (which means they will be destroyed at the end of
|
||||
// the animation)
|
||||
let iconChildren = this._box.get_children().filter(function(actor) {
|
||||
return actor._delegate.child &&
|
||||
actor._delegate.child._delegate &&
|
||||
actor._delegate.child._delegate.icon &&
|
||||
!actor._delegate.animatingOut;
|
||||
return actor.child &&
|
||||
actor.child._delegate &&
|
||||
actor.child._delegate.icon &&
|
||||
!actor.animatingOut;
|
||||
});
|
||||
|
||||
iconChildren.push(this._showAppsIcon.actor);
|
||||
iconChildren.push(this._showAppsIcon);
|
||||
|
||||
if (this._maxHeight == -1)
|
||||
return;
|
||||
@ -584,23 +601,18 @@ const Dash = new Lang.Class({
|
||||
let availHeight = maxContent.y2 - maxContent.y1;
|
||||
let spacing = themeNode.get_length('spacing');
|
||||
|
||||
|
||||
let firstIcon = iconChildren[0]._delegate.child._delegate.icon;
|
||||
let firstButton = iconChildren[0].child;
|
||||
let firstIcon = firstButton._delegate.icon;
|
||||
|
||||
let minHeight, natHeight;
|
||||
|
||||
// Enforce the current icon size during the size request if
|
||||
// the icon is animating
|
||||
if (firstIcon._animating) {
|
||||
let [currentWidth, currentHeight] = firstIcon.icon.get_size();
|
||||
// Enforce the current icon size during the size request
|
||||
let [currentWidth, currentHeight] = firstIcon.icon.get_size();
|
||||
|
||||
firstIcon.icon.set_size(this.iconSize, this.iconSize);
|
||||
[minHeight, natHeight] = iconChildren[0].get_preferred_height(-1);
|
||||
firstIcon.icon.set_size(this.iconSize, this.iconSize);
|
||||
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
|
||||
|
||||
firstIcon.icon.set_size(currentWidth, currentHeight);
|
||||
} else {
|
||||
[minHeight, natHeight] = iconChildren[0].get_preferred_height(-1);
|
||||
}
|
||||
firstIcon.icon.set_size(currentWidth, currentHeight);
|
||||
|
||||
// Subtract icon padding and box spacing from the available height
|
||||
availHeight -= iconChildren.length * (natHeight - this.iconSize) +
|
||||
@ -625,7 +637,7 @@ const Dash = new Lang.Class({
|
||||
|
||||
let scale = oldIconSize / newIconSize;
|
||||
for (let i = 0; i < iconChildren.length; i++) {
|
||||
let icon = iconChildren[i]._delegate.child._delegate.icon;
|
||||
let icon = iconChildren[i].child._delegate.icon;
|
||||
|
||||
// Set the new size immediately, to keep the icons' sizes
|
||||
// in sync with this.iconSize
|
||||
@ -645,15 +657,11 @@ const Dash = new Lang.Class({
|
||||
icon.icon.set_size(icon.icon.width * scale,
|
||||
icon.icon.height * scale);
|
||||
|
||||
icon._animating = true;
|
||||
Tweener.addTween(icon.icon,
|
||||
{ width: targetWidth,
|
||||
height: targetHeight,
|
||||
time: DASH_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
icon._animating = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
@ -664,13 +672,13 @@ const Dash = new Lang.Class({
|
||||
let running = this._appSystem.get_running();
|
||||
|
||||
let children = this._box.get_children().filter(function(actor) {
|
||||
return actor._delegate.child &&
|
||||
actor._delegate.child._delegate &&
|
||||
actor._delegate.child._delegate.app;
|
||||
return actor.child &&
|
||||
actor.child._delegate &&
|
||||
actor.child._delegate.app;
|
||||
});
|
||||
// Apps currently in the dash
|
||||
let oldApps = children.map(function(actor) {
|
||||
return actor._delegate.child._delegate.app;
|
||||
return actor.child._delegate.app;
|
||||
});
|
||||
// Apps supposed to be in the dash
|
||||
let newApps = [];
|
||||
@ -736,7 +744,7 @@ const Dash = new Lang.Class({
|
||||
let insertHere = newApps[newIndex + 1] &&
|
||||
newApps[newIndex + 1] == oldApps[oldIndex];
|
||||
let alreadyRemoved = removedActors.reduce(function(result, actor) {
|
||||
let removedApp = actor._delegate.child._delegate.app;
|
||||
let removedApp = actor.child._delegate.app;
|
||||
return result || removedApp == newApps[newIndex];
|
||||
}, false);
|
||||
|
||||
@ -753,11 +761,11 @@ const Dash = new Lang.Class({
|
||||
}
|
||||
|
||||
for (let i = 0; i < addedItems.length; i++)
|
||||
this._box.insert_child_at_index(addedItems[i].item.actor,
|
||||
this._box.insert_child_at_index(addedItems[i].item,
|
||||
addedItems[i].pos);
|
||||
|
||||
for (let i = 0; i < removedActors.length; i++) {
|
||||
let item = removedActors[i]._delegate;
|
||||
let item = removedActors[i];
|
||||
|
||||
// Don't animate item removal when the overview is transitioning
|
||||
// or hidden
|
||||
@ -771,18 +779,20 @@ const Dash = new Lang.Class({
|
||||
|
||||
// Skip animations on first run when adding the initial set
|
||||
// of items, to avoid all items zooming in at once
|
||||
if (!this._shownInitially) {
|
||||
|
||||
let animate = this._shownInitially && Main.overview.visible &&
|
||||
!Main.overview.animationInProgress;
|
||||
|
||||
if (!this._shownInitially)
|
||||
this._shownInitially = true;
|
||||
return;
|
||||
|
||||
for (let i = 0; i < addedItems.length; i++) {
|
||||
addedItems[i].item.show(animate);
|
||||
}
|
||||
|
||||
// Don't animate item addition when the overview is transitioning
|
||||
// or hidden
|
||||
if (!Main.overview.visible || Main.overview.animationInProgress)
|
||||
return;
|
||||
|
||||
for (let i = 0; i < addedItems.length; i++)
|
||||
addedItems[i].item.animateIn();
|
||||
// Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744
|
||||
// Without it, StBoxLayout may use a stale size cache
|
||||
this._box.queue_relayout();
|
||||
},
|
||||
|
||||
_clearDragPlaceholder: function() {
|
||||
@ -813,7 +823,7 @@ const Dash = new Lang.Class({
|
||||
// the remove target has the same size as "normal" items, we don't
|
||||
// need to do the same adjustment there.
|
||||
if (this._dragPlaceholder) {
|
||||
boxHeight -= this._dragPlaceholder.actor.height;
|
||||
boxHeight -= this._dragPlaceholder.height;
|
||||
numChildren--;
|
||||
}
|
||||
|
||||
@ -827,7 +837,7 @@ const Dash = new Lang.Class({
|
||||
if (this._dragPlaceholder) {
|
||||
this._dragPlaceholder.animateOutAndDestroy();
|
||||
this._animatingPlaceholdersCount++;
|
||||
this._dragPlaceholder.actor.connect('destroy',
|
||||
this._dragPlaceholder.connect('destroy',
|
||||
Lang.bind(this, function() {
|
||||
this._animatingPlaceholdersCount--;
|
||||
}));
|
||||
@ -842,7 +852,7 @@ const Dash = new Lang.Class({
|
||||
// an animation
|
||||
let fadeIn;
|
||||
if (this._dragPlaceholder) {
|
||||
this._dragPlaceholder.actor.destroy();
|
||||
this._dragPlaceholder.destroy();
|
||||
fadeIn = false;
|
||||
} else {
|
||||
fadeIn = true;
|
||||
@ -851,10 +861,9 @@ const Dash = new Lang.Class({
|
||||
this._dragPlaceholder = new DragPlaceholderItem();
|
||||
this._dragPlaceholder.child.set_width (this.iconSize);
|
||||
this._dragPlaceholder.child.set_height (this.iconSize / 2);
|
||||
this._box.insert_child_at_index(this._dragPlaceholder.actor,
|
||||
this._box.insert_child_at_index(this._dragPlaceholder,
|
||||
this._dragPlaceholderPos);
|
||||
if (fadeIn)
|
||||
this._dragPlaceholder.animateIn();
|
||||
this._dragPlaceholder.show(fadeIn);
|
||||
}
|
||||
|
||||
// Remove the drag placeholder if we are not in the
|
||||
@ -892,10 +901,10 @@ const Dash = new Lang.Class({
|
||||
let children = this._box.get_children();
|
||||
for (let i = 0; i < this._dragPlaceholderPos; i++) {
|
||||
if (this._dragPlaceholder &&
|
||||
children[i] == this._dragPlaceholder.actor)
|
||||
children[i] == this._dragPlaceholder)
|
||||
continue;
|
||||
|
||||
let childId = children[i]._delegate.child._delegate.app.get_id();
|
||||
let childId = children[i].child._delegate.app.get_id();
|
||||
if (childId == id)
|
||||
continue;
|
||||
if (childId in favorites)
|
||||
|
@ -176,13 +176,16 @@ const IconGrid = new Lang.Class({
|
||||
_init: function(params) {
|
||||
params = Params.parse(params, { rowLimit: null,
|
||||
columnLimit: null,
|
||||
fillParent: false,
|
||||
xAlign: St.Align.MIDDLE });
|
||||
this._rowLimit = params.rowLimit;
|
||||
this._colLimit = params.columnLimit;
|
||||
this._xAlign = params.xAlign;
|
||||
this._fillParent = params.fillParent;
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: 'icon-grid',
|
||||
vertical: true });
|
||||
|
||||
// Pulled from CSS, but hardcode some defaults here
|
||||
this._spacing = 0;
|
||||
this._hItemSize = this._vItemSize = ICON_SIZE;
|
||||
@ -196,6 +199,11 @@ const IconGrid = new Lang.Class({
|
||||
},
|
||||
|
||||
_getPreferredWidth: function (grid, forHeight, alloc) {
|
||||
if (this._fillParent)
|
||||
// Ignore all size requests of children and request a size of 0;
|
||||
// later we'll allocate as many children as fit the parent
|
||||
return;
|
||||
|
||||
let children = this._grid.get_children();
|
||||
let nColumns = this._colLimit ? Math.min(this._colLimit,
|
||||
children.length)
|
||||
@ -217,12 +225,20 @@ const IconGrid = new Lang.Class({
|
||||
},
|
||||
|
||||
_getPreferredHeight: function (grid, forWidth, alloc) {
|
||||
if (this._fillParent)
|
||||
// Ignore all size requests of children and request a size of 0;
|
||||
// later we'll allocate as many children as fit the parent
|
||||
return;
|
||||
|
||||
let children = this._getVisibleChildren();
|
||||
let nColumns;
|
||||
if (forWidth < 0)
|
||||
let nColumns, spacing;
|
||||
if (forWidth < 0) {
|
||||
nColumns = children.length;
|
||||
else
|
||||
nColumns = this._computeLayout(forWidth)[0];
|
||||
spacing = this._spacing;
|
||||
} else {
|
||||
[nColumns, , spacing] = this._computeLayout(forWidth);
|
||||
}
|
||||
|
||||
let nRows;
|
||||
if (nColumns > 0)
|
||||
nRows = Math.ceil(children.length / nColumns);
|
||||
@ -230,13 +246,20 @@ const IconGrid = new Lang.Class({
|
||||
nRows = 0;
|
||||
if (this._rowLimit)
|
||||
nRows = Math.min(nRows, this._rowLimit);
|
||||
let totalSpacing = Math.max(0, nRows - 1) * this._spacing;
|
||||
let totalSpacing = Math.max(0, nRows - 1) * spacing;
|
||||
let height = nRows * this._vItemSize + totalSpacing;
|
||||
alloc.min_size = height;
|
||||
alloc.natural_size = height;
|
||||
},
|
||||
|
||||
_allocate: function (grid, box, flags) {
|
||||
if (this._fillParent) {
|
||||
// Reset the passed in box to fill the parent
|
||||
let parentBox = this.actor.get_parent().allocation;
|
||||
let gridBox = this.actor.get_theme_node().get_content_box(parentBox);
|
||||
box = this._grid.get_theme_node().get_content_box(gridBox);
|
||||
}
|
||||
|
||||
let children = this._getVisibleChildren();
|
||||
let availWidth = box.x2 - box.x1;
|
||||
let availHeight = box.y2 - box.y1;
|
||||
@ -280,7 +303,8 @@ const IconGrid = new Lang.Class({
|
||||
childBox.x2 = childBox.x1 + width;
|
||||
childBox.y2 = childBox.y1 + height;
|
||||
|
||||
if (this._rowLimit && rowIndex >= this._rowLimit) {
|
||||
if (this._rowLimit && rowIndex >= this._rowLimit ||
|
||||
this._fillParent && childBox.y2 > availHeight) {
|
||||
this._grid.set_skip_paint(children[i], true);
|
||||
} else {
|
||||
children[i].allocate(childBox, flags);
|
||||
|
@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
@ -25,8 +26,8 @@ const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||
|
||||
// The message tray takes this much pressure
|
||||
// in the pressure barrier at once to release it.
|
||||
const MESSAGE_TRAY_PRESSURE_THRESHOLD = 200; // pixels
|
||||
const MESSAGE_TRAY_PRESSURE_TIMEOUT = 3000; // ms
|
||||
const MESSAGE_TRAY_PRESSURE_THRESHOLD = 250; // pixels
|
||||
const MESSAGE_TRAY_PRESSURE_TIMEOUT = 1000; // ms
|
||||
|
||||
function isPopupMetaWindow(actor) {
|
||||
switch(actor.meta_window.get_window_type()) {
|
||||
@ -200,9 +201,6 @@ const LayoutManager = new Lang.Class({
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
this._consoleBackgroundGroup = new Meta.BackgroundGroup();
|
||||
global.stage.insert_child_below(this._consoleBackgroundGroup, null);
|
||||
|
||||
this._backgroundGroup = new Meta.BackgroundGroup();
|
||||
global.window_group.add_child(this._backgroundGroup);
|
||||
this._backgroundGroup.lower_bottom();
|
||||
@ -541,17 +539,6 @@ const LayoutManager = new Lang.Class({
|
||||
// so events don't get delivered to X11 windows (which are distorted by the animation)
|
||||
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
||||
|
||||
// build new backgrounds
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
let monitor = this.monitors[i];
|
||||
|
||||
let stillFrame = new Background.StillFrame(i);
|
||||
this._consoleBackgroundGroup.add_child(stillFrame.actor);
|
||||
|
||||
stillFrame.actor.set_size(this.monitors[i].width, this.monitors[i].height);
|
||||
stillFrame.actor.set_position(this.monitors[i].x, this.monitors[i].y);
|
||||
}
|
||||
|
||||
if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
@ -568,11 +555,42 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
this.uiGroup.set_pivot_point(x / global.screen_width,
|
||||
y / global.screen_height);
|
||||
this.uiGroup.scale_x = this.uiGroup.scale_y = 0;
|
||||
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.5;
|
||||
this.uiGroup.opacity = 0;
|
||||
}
|
||||
|
||||
this._systemBackground = new Background.SystemBackground();
|
||||
this._systemBackground.actor.hide();
|
||||
|
||||
global.stage.insert_child_below(this._systemBackground.actor, null);
|
||||
|
||||
let constraint = new Clutter.BindConstraint({ source: global.stage,
|
||||
coordinate: Clutter.BindCoordinate.ALL });
|
||||
this._systemBackground.actor.add_constraint(constraint);
|
||||
|
||||
let signalId = this._systemBackground.connect('loaded',
|
||||
Lang.bind(this, function() {
|
||||
this._systemBackground.disconnect(signalId);
|
||||
this._systemBackground.actor.show();
|
||||
|
||||
// We're mostly prepared for the startup animation
|
||||
// now, but since a lot is going on asynchronously
|
||||
// during startup, let's defer emission of the
|
||||
// startup-prepared signal until the event loop is
|
||||
// uncontended and idle. This helps to prevent us
|
||||
// from running the animation when the system is
|
||||
// bogged down
|
||||
GLib.idle_add(GLib.PRIORITY_LOW,
|
||||
Lang.bind(this, function() {
|
||||
this.emit('startup-prepared');
|
||||
return false;
|
||||
}));
|
||||
|
||||
}));
|
||||
},
|
||||
|
||||
startupAnimation: function() {
|
||||
global.stage.show();
|
||||
if (Main.sessionMode.isGreeter)
|
||||
this._startupAnimationGreeter();
|
||||
else
|
||||
@ -593,6 +611,7 @@ const LayoutManager = new Lang.Class({
|
||||
Tweener.addTween(this.uiGroup,
|
||||
{ scale_x: 1,
|
||||
scale_y: 1,
|
||||
opacity: 255,
|
||||
time: STARTUP_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._startupAnimationComplete,
|
||||
@ -606,8 +625,8 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
global.stage_input_mode = Shell.StageInputMode.NORMAL;
|
||||
|
||||
this._consoleBackgroundGroup.destroy();
|
||||
this._consoleBackgroundGroup = null;
|
||||
this._systemBackground.actor.destroy();
|
||||
this._systemBackground = null;
|
||||
|
||||
this._startingUp = false;
|
||||
|
||||
@ -885,9 +904,11 @@ const LayoutManager = new Lang.Class({
|
||||
for (let i = 0; i < this.monitors.length; i++)
|
||||
this.monitors[i].inFullscreen = true;
|
||||
} else {
|
||||
let monitor = this.monitors[metaWindow.get_monitor()];
|
||||
if (monitor)
|
||||
monitor.inFullscreen = true;
|
||||
let monitors = metaWindow.get_all_monitors();
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
let index = monitors[i];
|
||||
this.monitors[index].inFullscreen = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -920,7 +941,7 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
if (primaryWasInFullscreen != this.primaryMonitor.inFullscreen) {
|
||||
let windows = this._getWindowActorsForWorkspace(global.screen.get_active_workspace());
|
||||
for (let i = 0; i < windows.length - 1; i++) {
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let window = windows[i];
|
||||
let metaWindow = window.meta_window;
|
||||
|
||||
@ -932,8 +953,9 @@ const LayoutManager = new Lang.Class({
|
||||
if (!metaWindow.is_on_primary_monitor())
|
||||
continue;
|
||||
|
||||
// Minimize monitor sized windows
|
||||
if (metaWindow.is_monitor_sized())
|
||||
// Minimize monitor sized windows that are not focused
|
||||
if (metaWindow.is_monitor_sized() &&
|
||||
!metaWindow.appears_focused)
|
||||
metaWindow.minimize();
|
||||
}
|
||||
this.emit('primary-fullscreen-changed', this.primaryMonitor.inFullscreen);
|
||||
@ -1074,7 +1096,7 @@ const HotCorner = new Lang.Class({
|
||||
// multiple times due to an accidental jitter.
|
||||
this._entered = false;
|
||||
|
||||
this.actor = new Clutter.Group({ name: 'hot-corner-environs',
|
||||
this.actor = new Clutter.Actor({ name: 'hot-corner-environs',
|
||||
width: 3,
|
||||
height: 3,
|
||||
reactive: true });
|
||||
@ -1086,7 +1108,7 @@ const HotCorner = new Lang.Class({
|
||||
reactive: true });
|
||||
this._corner._delegate = this;
|
||||
|
||||
this.actor.add_actor(this._corner);
|
||||
this.actor.add_child(this._corner);
|
||||
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||
this._corner.set_position(this.actor.width - this._corner.width, 0);
|
||||
@ -1302,6 +1324,11 @@ const PressureBarrier = new Lang.Class({
|
||||
this._reset();
|
||||
},
|
||||
|
||||
_trigger: function() {
|
||||
this.emit('trigger');
|
||||
this._reset();
|
||||
},
|
||||
|
||||
_onBarrierHit: function(barrier, event) {
|
||||
// Throw out all events where the pointer was grabbed by another
|
||||
// client, as the client that grabbed the pointer expects to have
|
||||
@ -1319,6 +1346,11 @@ const PressureBarrier = new Lang.Class({
|
||||
let slide = this._getDistanceAlongBarrier(event);
|
||||
let distance = this._getDistanceAcrossBarrier(event);
|
||||
|
||||
if (distance >= this._threshold) {
|
||||
this._trigger();
|
||||
return;
|
||||
}
|
||||
|
||||
// Throw out events where the cursor is move more
|
||||
// along the axis of the barrier than moving with
|
||||
// the barrier.
|
||||
@ -1329,12 +1361,10 @@ const PressureBarrier = new Lang.Class({
|
||||
|
||||
this._trimBarrierEvents();
|
||||
this._barrierEvents.push(event);
|
||||
this._currentPressure += distance;
|
||||
this._currentPressure += Math.min(15, distance);
|
||||
|
||||
if (this._currentPressure >= this._threshold) {
|
||||
this.emit('trigger');
|
||||
this._reset();
|
||||
}
|
||||
if (this._currentPressure >= this._threshold)
|
||||
this._trigger();
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(PressureBarrier.prototype);
|
||||
|
@ -685,7 +685,8 @@ const Memory = new Lang.Class({
|
||||
const Extensions = new Lang.Class({
|
||||
Name: 'Extensions',
|
||||
|
||||
_init: function() {
|
||||
_init: function(lookingGlass) {
|
||||
this._lookingGlass = lookingGlass;
|
||||
this.actor = new St.BoxLayout({ vertical: true,
|
||||
name: 'lookingGlassExtensions' });
|
||||
this._noExtensions = new St.Label({ style_class: 'lg-extensions-none',
|
||||
@ -912,7 +913,7 @@ const LookingGlass = new Lang.Class({
|
||||
this._memory = new Memory();
|
||||
notebook.appendPage('Memory', this._memory.actor);
|
||||
|
||||
this._extensions = new Extensions();
|
||||
this._extensions = new Extensions(this);
|
||||
notebook.appendPage('Extensions', this._extensions.actor);
|
||||
|
||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function (o, e) {
|
||||
|
@ -18,6 +18,7 @@ const ExtensionSystem = imports.ui.extensionSystem;
|
||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||
const Keyboard = imports.ui.keyboard;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const OsdWindow = imports.ui.osdWindow;
|
||||
const Overview = imports.ui.overview;
|
||||
const Panel = imports.ui.panel;
|
||||
const Params = imports.misc.params;
|
||||
@ -51,6 +52,7 @@ let screenShield = null;
|
||||
let notificationDaemon = null;
|
||||
let windowAttentionHandler = null;
|
||||
let ctrlAltTabManager = null;
|
||||
let osdWindow = null;
|
||||
let sessionMode = null;
|
||||
let shellDBusService = null;
|
||||
let shellMountOpDBusService = null;
|
||||
@ -89,6 +91,9 @@ function start() {
|
||||
global.logError = window.log;
|
||||
global.log = window.log;
|
||||
|
||||
// Hide the stage until we're ready for it
|
||||
global.stage.hide();
|
||||
|
||||
// Chain up async errors reported from C
|
||||
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
|
||||
|
||||
@ -134,6 +139,7 @@ function startSession() {
|
||||
|
||||
xdndHandler = new XdndHandler.XdndHandler();
|
||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||
osdWindow = new OsdWindow.OsdWindow();
|
||||
overview = new Overview.Overview();
|
||||
wm = new WindowManager.WindowManager();
|
||||
magnifier = new Magnifier.Magnifier();
|
||||
@ -165,6 +171,9 @@ function startSession() {
|
||||
// initiate logouts.
|
||||
EndSessionDialog.init();
|
||||
|
||||
// We're ready for the session manager to move to the next phase
|
||||
Meta.register_with_session();
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
log('GNOME Shell started at ' + _startDate);
|
||||
@ -190,13 +199,9 @@ function startSession() {
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.init();
|
||||
|
||||
// Run the startup animation as soon as the mainloop is idle enough.
|
||||
// This is necessary to have it smooth and without interruptions from
|
||||
// completed IO tasks
|
||||
GLib.idle_add(GLib.PRIORITY_LOW, function() {
|
||||
layoutManager.startupAnimation();
|
||||
return false;
|
||||
});
|
||||
layoutManager.connect('startup-prepared', function() {
|
||||
layoutManager.startupAnimation();
|
||||
});
|
||||
}
|
||||
|
||||
let _workspaces = [];
|
||||
|
@ -1153,6 +1153,11 @@ const Source = new Lang.Class({
|
||||
return this.notifications.length;
|
||||
},
|
||||
|
||||
get indicatorCount() {
|
||||
let notifications = this.notifications.filter(function(n) { return !n.isTransient && !n.resident; });
|
||||
return notifications.length;
|
||||
},
|
||||
|
||||
get unseenCount() {
|
||||
return this.notifications.filter(function(n) { return !n.acknowledged; }).length;
|
||||
},
|
||||
@ -1695,6 +1700,7 @@ const MessageTray = new Lang.Class({
|
||||
this._sources = new Hash.Map();
|
||||
this._chatSummaryItemsCount = 0;
|
||||
|
||||
this._trayDwellTimeoutId = 0;
|
||||
this._setupTrayDwellIfNeeded();
|
||||
this._sessionUpdated();
|
||||
|
||||
@ -1759,7 +1765,6 @@ const MessageTray = new Lang.Class({
|
||||
if (!global.display.supports_extended_barriers()) {
|
||||
let pointerWatcher = PointerWatcher.getPointerWatcher();
|
||||
pointerWatcher.addWatch(TRAY_DWELL_CHECK_INTERVAL, Lang.bind(this, this._checkTrayDwell));
|
||||
this._trayDwellTimeoutId = 0;
|
||||
this._trayDwelling = false;
|
||||
this._trayDwellUserTime = 0;
|
||||
}
|
||||
@ -2348,6 +2353,7 @@ const MessageTray = new Lang.Class({
|
||||
return false;
|
||||
}
|
||||
|
||||
this.emit('showing');
|
||||
this._tween(this.actor, '_trayState', State.SHOWN,
|
||||
{ y: -this.actor.height,
|
||||
time: ANIMATION_TIME,
|
||||
@ -2398,6 +2404,7 @@ const MessageTray = new Lang.Class({
|
||||
// is distracting, so hide it immediately in case it was visible.
|
||||
this._summaryBoxPointer.actor.hide();
|
||||
|
||||
this.emit('hiding');
|
||||
this._tween(this.actor, '_trayState', State.HIDDEN,
|
||||
{ y: 0,
|
||||
time: ANIMATION_TIME,
|
||||
|
@ -58,7 +58,9 @@ const ModalDialog = new Lang.Class({
|
||||
|
||||
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
|
||||
|
||||
this._pressedKey = null;
|
||||
this._buttonKeys = {};
|
||||
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
||||
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
|
||||
|
||||
this._backgroundBin = new St.Bin();
|
||||
@ -80,7 +82,7 @@ const ModalDialog = new Lang.Class({
|
||||
let stack = new Shell.Stack();
|
||||
this._backgroundBin.child = stack;
|
||||
|
||||
this._eventBlocker = new Clutter.Group({ reactive: true });
|
||||
this._eventBlocker = new Clutter.Actor({ reactive: true });
|
||||
stack.add_actor(this._eventBlocker);
|
||||
stack.add_actor(this.dialogLayout);
|
||||
} else {
|
||||
@ -179,10 +181,19 @@ const ModalDialog = new Lang.Class({
|
||||
return button;
|
||||
},
|
||||
|
||||
_onKeyReleaseEvent: function(object, event) {
|
||||
let symbol = event.get_key_symbol();
|
||||
let buttonInfo = this._buttonKeys[symbol];
|
||||
_onKeyPressEvent: function(object, event) {
|
||||
this._pressedKey = event.get_key_symbol();
|
||||
},
|
||||
|
||||
_onKeyReleaseEvent: function(object, event) {
|
||||
let pressedKey = this._pressedKey;
|
||||
this._pressedKey = null;
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol != pressedKey)
|
||||
return false;
|
||||
|
||||
let buttonInfo = this._buttonKeys[symbol];
|
||||
if (!buttonInfo)
|
||||
return false;
|
||||
|
||||
|
179
js/ui/osdWindow.js
Normal file
179
js/ui/osdWindow.js
Normal file
@ -0,0 +1,179 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Lang = imports.lang;
|
||||
const Layout = imports.ui.layout;
|
||||
const Main = imports.ui.main;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const HIDE_TIMEOUT = 1500;
|
||||
const FADE_TIME = 0.1;
|
||||
const LEVEL_ANIMATION_TIME = 0.1;
|
||||
|
||||
const LevelBar = new Lang.Class({
|
||||
Name: 'LevelBar',
|
||||
|
||||
_init: function() {
|
||||
this._level = 0;
|
||||
|
||||
this.actor = new St.Bin({ style_class: 'level',
|
||||
x_fill: true, y_fill: true });
|
||||
this._bar = new St.DrawingArea();
|
||||
this._bar.connect('repaint', Lang.bind(this, this._repaint));
|
||||
|
||||
this.actor.set_child(this._bar);
|
||||
},
|
||||
|
||||
get level() {
|
||||
return this._level;
|
||||
},
|
||||
|
||||
set level(value) {
|
||||
let newValue = Math.max(0, Math.min(value, 100));
|
||||
if (newValue == this._level)
|
||||
return;
|
||||
this._level = newValue;
|
||||
this._bar.queue_repaint();
|
||||
},
|
||||
|
||||
_repaint: function() {
|
||||
let cr = this._bar.get_context();
|
||||
|
||||
let node = this.actor.get_theme_node();
|
||||
let radius = node.get_border_radius(0); // assume same radius for all corners
|
||||
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
|
||||
|
||||
let [w, h] = this._bar.get_surface_size();
|
||||
w *= (this._level / 100.);
|
||||
|
||||
if (w == 0)
|
||||
return;
|
||||
|
||||
cr.moveTo(radius, 0);
|
||||
if (w >= radius)
|
||||
cr.arc(w - radius, radius, radius, 1.5 * Math.PI, 2. * Math.PI);
|
||||
else
|
||||
cr.lineTo(w, 0);
|
||||
if (w >= radius)
|
||||
cr.arc(w - radius, h - radius, radius, 0, 0.5 * Math.PI);
|
||||
else
|
||||
cr.lineTo(w, h);
|
||||
cr.arc(radius, h - radius, radius, 0.5 * Math.PI, Math.PI);
|
||||
cr.arc(radius, radius, radius, Math.PI, 1.5 * Math.PI);
|
||||
cr.fill();
|
||||
}
|
||||
});
|
||||
|
||||
const OsdWindow = new Lang.Class({
|
||||
Name: 'OsdWindow',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.Widget({ x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true }));
|
||||
this._box = new St.BoxLayout({ style_class: 'osd-window',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._box);
|
||||
|
||||
this._icon = new St.Icon();
|
||||
this._box.add(this._icon, { expand: true });
|
||||
|
||||
this._label = new St.Label();
|
||||
this._box.add(this._label);
|
||||
|
||||
this._level = new LevelBar();
|
||||
this._box.add(this._level.actor);
|
||||
|
||||
this._hideTimeoutId = 0;
|
||||
this._reset();
|
||||
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
Lang.bind(this, this._monitorsChanged));
|
||||
this._monitorsChanged();
|
||||
|
||||
Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false });
|
||||
},
|
||||
|
||||
setIcon: function(icon) {
|
||||
this._icon.gicon = icon;
|
||||
},
|
||||
|
||||
setLabel: function(label) {
|
||||
this._label.visible = (label != undefined);
|
||||
if (label)
|
||||
this._label.text = label;
|
||||
},
|
||||
|
||||
setLevel: function(level) {
|
||||
this._level.actor.visible = (level != undefined);
|
||||
if (this.actor.visible)
|
||||
Tweener.addTween(this._level,
|
||||
{ level: level,
|
||||
time: LEVEL_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
else
|
||||
this._level.level = level;
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if (!this._icon.gicon)
|
||||
return;
|
||||
|
||||
if (!this.actor.visible) {
|
||||
this.actor.show();
|
||||
this.actor.opacity = 0;
|
||||
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: FADE_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
}
|
||||
|
||||
if (this._hideTimeoutId)
|
||||
Mainloop.source_remove(this._hideTimeoutId);
|
||||
this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT,
|
||||
Lang.bind(this, this._hide));
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
if (!this._hideTimeoutId)
|
||||
return;
|
||||
|
||||
Mainloop.source_remove(this._hideTimeoutId);
|
||||
this._hideTimeoutId = 0;
|
||||
this._hide();
|
||||
},
|
||||
|
||||
_hide: function() {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: FADE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, this._reset) });
|
||||
},
|
||||
|
||||
_reset: function() {
|
||||
this.actor.hide();
|
||||
this.setLabel(null);
|
||||
this.setLevel(null);
|
||||
},
|
||||
|
||||
_monitorsChanged: function() {
|
||||
/* assume 130x130 on a 640x480 display and scale from there */
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let scalew = monitor.width / 640.0;
|
||||
let scaleh = monitor.height / 480.0;
|
||||
let scale = Math.min(scalew, scaleh);
|
||||
let size = 130 * Math.max(1, scale);
|
||||
|
||||
this._box.set_size(size, size);
|
||||
this._box.translation_y = monitor.height / 4;
|
||||
|
||||
this._icon.icon_size = size / 2;
|
||||
}
|
||||
});
|
@ -13,6 +13,7 @@ const Gdk = imports.gi.Gdk;
|
||||
const Background = imports.ui.background;
|
||||
const Dash = imports.ui.dash;
|
||||
const DND = imports.ui.dnd;
|
||||
const LayoutManager = imports.ui.layout;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const OverviewControls = imports.ui.overviewControls;
|
||||
@ -92,7 +93,9 @@ const Overview = new Lang.Class({
|
||||
_init: function() {
|
||||
this._overviewCreated = false;
|
||||
this._initCalled = false;
|
||||
this._controlPressed = false;
|
||||
|
||||
global.stage.connect('captured-event', Lang.bind(this, this._capturedEvent));
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||
this._sessionUpdated();
|
||||
},
|
||||
@ -116,17 +119,27 @@ const Overview = new Lang.Class({
|
||||
this._desktopFade = new St.Bin();
|
||||
global.overlay_group.add_actor(this._desktopFade);
|
||||
|
||||
let layout = new Clutter.BinLayout();
|
||||
this._stack = new Clutter.Actor({ layout_manager: layout });
|
||||
this._stack.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
|
||||
|
||||
/* Translators: This is the main view to select
|
||||
activities. See also note for "Activities" string. */
|
||||
this._overview = new St.BoxLayout({ name: 'overview',
|
||||
accessible_name: _("Overview"),
|
||||
reactive: true,
|
||||
vertical: true });
|
||||
vertical: true,
|
||||
x_expand: true,
|
||||
y_expand: true });
|
||||
this._overview._delegate = this;
|
||||
|
||||
this._groupStack = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true, y_expand: true,
|
||||
clip_to_allocation: true });
|
||||
this._group = new St.BoxLayout({ name: 'overview-group',
|
||||
reactive: true,
|
||||
clip_to_allocation: true });
|
||||
x_expand: true, y_expand: true });
|
||||
this._groupStack.add_actor(this._group);
|
||||
|
||||
this._backgroundGroup = new Meta.BackgroundGroup();
|
||||
global.overlay_group.add_child(this._backgroundGroup);
|
||||
@ -148,8 +161,9 @@ const Overview = new Lang.Class({
|
||||
this._overview.add_actor(this._coverPane);
|
||||
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
|
||||
|
||||
this._overview.hide();
|
||||
global.overlay_group.add_actor(this._overview);
|
||||
this._stack.hide();
|
||||
this._stack.add_actor(this._overview);
|
||||
global.overlay_group.add_actor(this._stack);
|
||||
|
||||
this._coverPane.hide();
|
||||
|
||||
@ -224,6 +238,20 @@ const Overview = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_capturedEvent: function(actor, event) {
|
||||
let type = event.type();
|
||||
if (type != Clutter.EventType.KEY_PRESS &&
|
||||
type != Clutter.EventType.KEY_RELEASE)
|
||||
return false;
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.KEY_Control_L ||
|
||||
symbol == Clutter.KEY_Control_R)
|
||||
this._controlPressed = type == Clutter.EventType.KEY_PRESS;
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_sessionUpdated: function() {
|
||||
this.isDummy = !Main.sessionMode.hasOverview;
|
||||
this._createOverview();
|
||||
@ -269,15 +297,22 @@ const Overview = new Lang.Class({
|
||||
this._thumbnailsBox,
|
||||
this._viewSelector);
|
||||
|
||||
this._controls.dashActor.x_align = Clutter.ActorAlign.START;
|
||||
this._controls.dashActor.y_expand = true;
|
||||
|
||||
// Put the dash in a separate layer to allow content to be centered
|
||||
this._groupStack.add_actor(this._controls.dashActor);
|
||||
|
||||
// Pack all the actors into the group
|
||||
this._group.add_actor(this._controls.dashActor);
|
||||
this._group.add_actor(this._controls.dashSpacer);
|
||||
this._group.add(this._viewSelector.actor, { x_fill: true,
|
||||
expand: true });
|
||||
this._group.add_actor(this._controls.thumbnailsActor);
|
||||
|
||||
// Add our same-line elements after the search entry
|
||||
this._overview.add(this._group, { y_fill: true,
|
||||
expand: true });
|
||||
this._overview.add(this._groupStack, { y_fill: true, expand: true });
|
||||
|
||||
this._stack.add_actor(this._controls.indicatorActor);
|
||||
|
||||
// TODO - recalculate everything when desktop size changes
|
||||
this.dashIconSize = this._dash.iconSize;
|
||||
@ -411,12 +446,8 @@ const Overview = new Lang.Class({
|
||||
// when it is next shown.
|
||||
this.hide();
|
||||
|
||||
let primary = Main.layoutManager.primaryMonitor;
|
||||
let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
||||
|
||||
this._overview.set_position(primary.x, primary.y);
|
||||
this._overview.set_size(primary.width, primary.height);
|
||||
|
||||
this._coverPane.set_position(0, workArea.y);
|
||||
this._coverPane.set_size(workArea.width, workArea.height);
|
||||
|
||||
@ -518,12 +549,12 @@ const Overview = new Lang.Class({
|
||||
Meta.disable_unredirect_for_screen(global.screen);
|
||||
global.window_group.hide();
|
||||
global.top_window_group.hide();
|
||||
this._overview.show();
|
||||
this._stack.show();
|
||||
this._backgroundGroup.show();
|
||||
this._viewSelector.show();
|
||||
|
||||
this._overview.opacity = 0;
|
||||
Tweener.addTween(this._overview,
|
||||
this._stack.opacity = 0;
|
||||
Tweener.addTween(this._stack,
|
||||
{ opacity: 255,
|
||||
transition: 'easeOutQuad',
|
||||
time: ANIMATION_TIME,
|
||||
@ -565,6 +596,9 @@ const Overview = new Lang.Class({
|
||||
if (!this._shown)
|
||||
return;
|
||||
|
||||
if (this._controlPressed)
|
||||
return;
|
||||
|
||||
if (!this._shownTemporarily)
|
||||
this._animateNotVisible();
|
||||
|
||||
@ -642,7 +676,7 @@ const Overview = new Lang.Class({
|
||||
this._viewSelector.zoomFromOverview();
|
||||
|
||||
// Make other elements fade out.
|
||||
Tweener.addTween(this._overview,
|
||||
Tweener.addTween(this._stack,
|
||||
{ opacity: 0,
|
||||
transition: 'easeOutQuad',
|
||||
time: ANIMATION_TIME,
|
||||
@ -680,7 +714,7 @@ const Overview = new Lang.Class({
|
||||
this._viewSelector.hide();
|
||||
this._desktopFade.hide();
|
||||
this._backgroundGroup.hide();
|
||||
this._overview.hide();
|
||||
this._stack.hide();
|
||||
|
||||
this.visible = false;
|
||||
this.animationInProgress = false;
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
@ -98,6 +99,7 @@ const SlidingControl = new Lang.Class({
|
||||
this.layout = new SlideLayout();
|
||||
this.layout.slideDirection = params.slideDirection;
|
||||
this.actor = new St.Widget({ layout_manager: this.layout,
|
||||
style_class: 'overview-controls',
|
||||
clip_to_allocation: true });
|
||||
|
||||
Main.overview.connect('showing', Lang.bind(this, this._onOverviewShowing));
|
||||
@ -247,7 +249,7 @@ const ThumbnailsSlider = new Lang.Class({
|
||||
_getAlwaysZoomOut: function() {
|
||||
// Always show the pager when hover, during a drag, or if workspaces are
|
||||
// actually used, e.g. there are windows on more than one
|
||||
let alwaysZoomOut = this.actor.hover || this.inDrag || global.screen.n_workspaces > 2;
|
||||
let alwaysZoomOut = this.actor.hover || this.inDrag || !Meta.prefs_get_dynamic_workspaces() || global.screen.n_workspaces > 2;
|
||||
|
||||
if (!alwaysZoomOut) {
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
@ -328,19 +330,183 @@ const DashSlider = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const DashSpacer = new Lang.Class({
|
||||
Name: 'DashSpacer',
|
||||
Extends: St.Widget,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
|
||||
this._bindConstraint = null;
|
||||
},
|
||||
|
||||
setDashActor: function(dashActor) {
|
||||
if (this._bindConstraint) {
|
||||
this.remove_constraint(this._bindConstraint);
|
||||
this._bindConstraint = null;
|
||||
}
|
||||
|
||||
if (dashActor) {
|
||||
this._bindConstraint = new Clutter.BindConstraint({ source: dashActor,
|
||||
coordinate: Clutter.BindCoordinate.SIZE });
|
||||
this.add_constraint(this._bindConstraint);
|
||||
}
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(forHeight) {
|
||||
let box = this.get_allocation_box();
|
||||
let minWidth = this.parent(forHeight)[0];
|
||||
let natWidth = box.x2 - box.x1;
|
||||
return [minWidth, natWidth];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(forWidth) {
|
||||
let box = this.get_allocation_box();
|
||||
let minHeight = this.parent(forWidth)[0];
|
||||
let natHeight = box.y2 - box.y1;
|
||||
return [minHeight, natHeight];
|
||||
}
|
||||
});
|
||||
|
||||
const MessagesIndicator = new Lang.Class({
|
||||
Name: 'MessagesIndicator',
|
||||
|
||||
_init: function(viewSelector) {
|
||||
this._count = 0;
|
||||
this._sources = [];
|
||||
this._viewSelector = viewSelector;
|
||||
|
||||
this._container = new St.BoxLayout({ style_class: 'messages-indicator-contents',
|
||||
reactive: true,
|
||||
track_hover: true,
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER });
|
||||
|
||||
this._icon = new St.Icon({ icon_name: 'user-idle-symbolic',
|
||||
icon_size: 16 });
|
||||
this._container.add_actor(this._icon);
|
||||
|
||||
this._label = new St.Label();
|
||||
this._container.add_actor(this._label);
|
||||
|
||||
this._highlight = new St.Widget({ style_class: 'messages-indicator-highlight',
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
visible: false });
|
||||
|
||||
this._container.connect('notify::hover', Lang.bind(this,
|
||||
function() {
|
||||
this._highlight.visible = this._container.hover;
|
||||
}));
|
||||
|
||||
let clickAction = new Clutter.ClickAction();
|
||||
this._container.add_action(clickAction);
|
||||
clickAction.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
Main.messageTray.openTray();
|
||||
}));
|
||||
|
||||
Main.messageTray.connect('showing', Lang.bind(this,
|
||||
function() {
|
||||
this._highlight.visible = false;
|
||||
this._container.hover = false;
|
||||
}));
|
||||
|
||||
let layout = new Clutter.BinLayout();
|
||||
this.actor = new St.Widget({ layout_manager: layout,
|
||||
style_class: 'messages-indicator',
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
visible: false });
|
||||
this.actor.add_actor(this._container);
|
||||
this.actor.add_actor(this._highlight);
|
||||
|
||||
Main.messageTray.connect('source-added', Lang.bind(this, this._onSourceAdded));
|
||||
Main.messageTray.connect('source-removed', Lang.bind(this, this._onSourceRemoved));
|
||||
|
||||
let sources = Main.messageTray.getSources();
|
||||
sources.forEach(Lang.bind(this, function(source) { this._onSourceAdded(null, source); }));
|
||||
|
||||
this._viewSelector.connect('page-changed', Lang.bind(this, this._updateVisibility));
|
||||
Main.overview.connect('showing', Lang.bind(this, this._updateVisibility));
|
||||
},
|
||||
|
||||
_onSourceAdded: function(tray, source) {
|
||||
if (source.trayIcon)
|
||||
return;
|
||||
|
||||
if (source.isTransient)
|
||||
return;
|
||||
|
||||
source.connect('count-updated', Lang.bind(this, this._updateCount));
|
||||
this._sources.push(source);
|
||||
this._updateCount();
|
||||
},
|
||||
|
||||
_onSourceRemoved: function(tray, source) {
|
||||
this._sources.splice(this._sources.indexOf(source), 1);
|
||||
this._updateCount();
|
||||
},
|
||||
|
||||
_updateCount: function() {
|
||||
let count = 0;
|
||||
this._sources.forEach(Lang.bind(this,
|
||||
function(source) {
|
||||
count += source.indicatorCount;
|
||||
}));
|
||||
|
||||
this._count = count;
|
||||
this._label.text = ngettext("%d new message",
|
||||
"%d new messages",
|
||||
count).format(count);
|
||||
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
let activePage = this._viewSelector.getActivePage();
|
||||
let visible = ((this._count > 0) && (activePage == ViewSelector.ViewPage.WINDOWS));
|
||||
|
||||
this.actor.visible = visible;
|
||||
}
|
||||
});
|
||||
|
||||
const ControlsManager = new Lang.Class({
|
||||
Name: 'ControlsManager',
|
||||
|
||||
_init: function(dash, thumbnails, viewSelector) {
|
||||
this._dashSlider = new DashSlider(dash);
|
||||
this.dashActor = this._dashSlider.actor;
|
||||
this.dashSpacer = new DashSpacer();
|
||||
this.dashSpacer.setDashActor(this.dashActor);
|
||||
|
||||
this._thumbnailsSlider = new ThumbnailsSlider(thumbnails);
|
||||
this.thumbnailsActor = this._thumbnailsSlider.actor;
|
||||
|
||||
this._indicator = new MessagesIndicator(viewSelector);
|
||||
this.indicatorActor = this._indicator.actor;
|
||||
|
||||
this._viewSelector = viewSelector;
|
||||
this._viewSelector.connect('page-changed', Lang.bind(this, this._setVisibility));
|
||||
this._viewSelector.connect('page-empty', Lang.bind(this, this._onPageEmpty));
|
||||
|
||||
Main.overview.connect('showing', Lang.bind(this, this._updateSpacerVisibility));
|
||||
Main.overview.connect('item-drag-begin', Lang.bind(this,
|
||||
function() {
|
||||
let activePage = this._viewSelector.getActivePage();
|
||||
if (activePage != ViewSelector.ViewPage.WINDOWS)
|
||||
this._viewSelector.fadeHalf();
|
||||
}));
|
||||
Main.overview.connect('item-drag-end', Lang.bind(this,
|
||||
function() {
|
||||
this._viewSelector.fadeIn();
|
||||
}));
|
||||
Main.overview.connect('item-drag-cancelled', Lang.bind(this,
|
||||
function() {
|
||||
this._viewSelector.fadeIn();
|
||||
}));
|
||||
},
|
||||
|
||||
_setVisibility: function() {
|
||||
@ -368,8 +534,18 @@ const ControlsManager = new Lang.Class({
|
||||
this._thumbnailsSlider.slideOut();
|
||||
},
|
||||
|
||||
_updateSpacerVisibility: function() {
|
||||
if (Main.overview.animationInProgress && !Main.overview.visibleTarget)
|
||||
return;
|
||||
|
||||
let activePage = this._viewSelector.getActivePage();
|
||||
this.dashSpacer.visible = (activePage == ViewSelector.ViewPage.WINDOWS);
|
||||
},
|
||||
|
||||
_onPageEmpty: function() {
|
||||
this._dashSlider.pageEmpty();
|
||||
this._thumbnailsSlider.pageEmpty();
|
||||
|
||||
this._updateSpacerVisibility();
|
||||
}
|
||||
});
|
||||
|
@ -203,7 +203,7 @@ const TextShadower = new Lang.Class({
|
||||
let child = children[i];
|
||||
let childBox = new Clutter.ActorBox();
|
||||
// The order of the labels here is arbitrary, except
|
||||
// we know the "real" label is at the end because Clutter.Group
|
||||
// we know the "real" label is at the end because Clutter.Actor
|
||||
// sorts by Z order
|
||||
switch (i) {
|
||||
case 0: // top
|
||||
|
@ -255,6 +255,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
metas[i][prop] = metas[i][prop].deep_unpack();
|
||||
resultMetas.push({ id: metas[i]['id'],
|
||||
name: metas[i]['name'],
|
||||
description: metas[i]['description'],
|
||||
createIcon: Lang.bind(this,
|
||||
this.createIcon, metas[i]) });
|
||||
}
|
||||
|
@ -447,7 +447,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._lockScreenGroup.add_actor(this._lockScreenContents);
|
||||
|
||||
this._backgroundGroup = new Meta.BackgroundGroup();
|
||||
this._backgroundGroup = new Clutter.Actor();
|
||||
|
||||
this._lockScreenGroup.add_actor(this._backgroundGroup);
|
||||
this._backgroundGroup.lower_bottom();
|
||||
@ -538,21 +538,22 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
_createBackground: function(monitorIndex) {
|
||||
let bin = new St.Bin({ style_class: 'screen-shield-background' });
|
||||
let monitor = Main.layoutManager.monitors[monitorIndex];
|
||||
let widget = new St.Widget({ style_class: 'screen-shield-background',
|
||||
x: monitor.x,
|
||||
y: monitor.y,
|
||||
width: monitor.width,
|
||||
height: monitor.height });
|
||||
|
||||
let group = new Meta.BackgroundGroup();
|
||||
bin.child = group;
|
||||
|
||||
let bgManager = new Background.BackgroundManager({ container: group,
|
||||
let bgManager = new Background.BackgroundManager({ container: widget,
|
||||
monitorIndex: monitorIndex,
|
||||
effects: Meta.BackgroundEffects.BLUR | Meta.BackgroundEffects.DESATURATE });
|
||||
|
||||
effects: Meta.BackgroundEffects.BLUR | Meta.BackgroundEffects.DESATURATE,
|
||||
controlPosition: false });
|
||||
bgManager.background.saturation = 0.6;
|
||||
|
||||
this._bgManagers.push(bgManager);
|
||||
|
||||
this._backgroundGroup.add_child(bin);
|
||||
bin.lower_bottom();
|
||||
this._backgroundGroup.add_child(widget);
|
||||
},
|
||||
|
||||
_updateBackgrounds: function() {
|
||||
@ -863,6 +864,14 @@ const ScreenShield = new Lang.Class({
|
||||
});
|
||||
},
|
||||
|
||||
_hideLockScreenComplete: function() {
|
||||
if (Main.sessionMode.currentMode == 'lock-screen')
|
||||
Main.sessionMode.popMode('lock-screen');
|
||||
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup.hide();
|
||||
},
|
||||
|
||||
_hideLockScreen: function(animate, velocity) {
|
||||
if (this._lockScreenState == MessageTray.State.HIDDEN)
|
||||
return;
|
||||
@ -886,21 +895,13 @@ const ScreenShield = new Lang.Class({
|
||||
{ y: -h,
|
||||
time: time,
|
||||
transition: 'easeInQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup.hide();
|
||||
},
|
||||
onCompleteScope: this,
|
||||
onComplete: Lang.bind(this, this._hideLockScreenComplete),
|
||||
});
|
||||
} else {
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup.hide();
|
||||
this._hideLockScreenComplete();
|
||||
}
|
||||
|
||||
global.stage.show_cursor();
|
||||
|
||||
if (Main.sessionMode.currentMode == 'lock-screen')
|
||||
Main.sessionMode.popMode('lock-screen');
|
||||
},
|
||||
|
||||
_ensureUnlockDialog: function(onPrimary, allowCancel) {
|
||||
|
@ -76,6 +76,11 @@ const ScreenshotService = new Lang.Class({
|
||||
|
||||
ScreenshotAreaAsync : function (params, invocation) {
|
||||
let [x, y, width, height, flash, filename, callback] = params;
|
||||
if (height <= 0 || width <= 0) {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||
"Invalid params");
|
||||
return;
|
||||
}
|
||||
let screenshot = new Shell.Screenshot();
|
||||
screenshot.screenshot_area (x, y, width, height, filename,
|
||||
Lang.bind(this, this._onScreenshotComplete,
|
||||
|
@ -103,10 +103,9 @@ const ListSearchResult = new Lang.Class({
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START });
|
||||
|
||||
// TODO: should highlight terms in the description here
|
||||
if (this.metaInfo['description']) {
|
||||
let description = new St.Label({ style_class: 'list-search-result-description',
|
||||
text: '"' + this.metaInfo['description'] + '"' });
|
||||
let description = new St.Label({ style_class: 'list-search-result-description' });
|
||||
description.clutter_text.set_markup(this.metaInfo['description']);
|
||||
details.add(description, { x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.START,
|
||||
@ -331,7 +330,8 @@ const SearchResults = new Lang.Class({
|
||||
|
||||
this._scrollView = new St.ScrollView({ x_fill: true,
|
||||
y_fill: false,
|
||||
style_class: 'vfade' });
|
||||
overlay_scrollbars: true,
|
||||
style_class: 'search-display vfade' });
|
||||
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
this._scrollView.add_actor(scrollChild);
|
||||
let action = new Clutter.PanAction({ interpolate: true });
|
||||
|
@ -1,14 +1,16 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Lang = imports.lang;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const ExtensionSystem = imports.ui.extensionSystem;
|
||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Hash = imports.misc.hash;
|
||||
const Main = imports.ui.main;
|
||||
const Screenshot = imports.ui.screenshot;
|
||||
|
||||
@ -18,6 +20,26 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
|
||||
<arg type="b" direction="out" name="success" />
|
||||
<arg type="s" direction="out" name="result" />
|
||||
</method>
|
||||
<method name="ShowOSD">
|
||||
<arg type="a{sv}" direction="in" name="params"/>
|
||||
</method>
|
||||
<method name="GrabAccelerator">
|
||||
<arg type="s" direction="in" name="accelerator"/>
|
||||
<arg type="u" direction="in" name="flags"/>
|
||||
<arg type="u" direction="out" name="action"/>
|
||||
</method>
|
||||
<method name="GrabAccelerators">
|
||||
<arg type="a(su)" direction="in" name="accelerators"/>
|
||||
<arg type="au" direction="out" name="actions"/>
|
||||
</method>
|
||||
<method name="UngrabAccelerator">
|
||||
<arg type="u" direction="in" name="action"/>
|
||||
<arg type="b" direction="out" name="success"/>
|
||||
</method>
|
||||
<signal name="AcceleratorActivated">
|
||||
<arg name="action" type="u" />
|
||||
<arg name="deviceid" type="u" />
|
||||
</signal>
|
||||
<property name="Mode" type="s" access="read" />
|
||||
<property name="OverviewActive" type="b" access="readwrite" />
|
||||
<property name="ShellVersion" type="s" access="read" />
|
||||
@ -47,8 +69,16 @@ const GnomeShell = new Lang.Class({
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
|
||||
|
||||
this._extensionsSerivce = new GnomeShellExtensions();
|
||||
this._extensionsService = new GnomeShellExtensions();
|
||||
this._screenshotService = new Screenshot.ScreenshotService();
|
||||
|
||||
this._grabbedAccelerators = new Hash.Map();
|
||||
this._grabbers = new Hash.Map();
|
||||
|
||||
global.display.connect('accelerator-activated', Lang.bind(this,
|
||||
function(display, action, deviceid) {
|
||||
this._emitAcceleratorActivated(action, deviceid);
|
||||
}));
|
||||
},
|
||||
|
||||
/**
|
||||
@ -84,6 +114,102 @@ const GnomeShell = new Lang.Class({
|
||||
return [success, returnValue];
|
||||
},
|
||||
|
||||
ShowOSD: function(params) {
|
||||
for (let param in params)
|
||||
params[param] = params[param].deep_unpack();
|
||||
|
||||
let icon = null;
|
||||
if (params['icon'])
|
||||
icon = Gio.Icon.new_for_string(params['icon']);
|
||||
|
||||
Main.osdWindow.setIcon(icon);
|
||||
Main.osdWindow.setLabel(params['label']);
|
||||
Main.osdWindow.setLevel(params['level']);
|
||||
|
||||
Main.osdWindow.show();
|
||||
},
|
||||
|
||||
GrabAcceleratorAsync: function(params, invocation) {
|
||||
let [accel, flags] = params;
|
||||
let sender = invocation.get_sender();
|
||||
let bindingAction = this._grabAcceleratorForSender(accel, flags, sender);
|
||||
return invocation.return_value(GLib.Variant.new('(u)', [bindingAction]));
|
||||
},
|
||||
|
||||
GrabAcceleratorsAsync: function(params, invocation) {
|
||||
let [accels] = params;
|
||||
let sender = invocation.get_sender();
|
||||
let bindingActions = [];
|
||||
for (let i = 0; i < accels.length; i++) {
|
||||
let [accel, flags] = accels[i];
|
||||
bindingActions.push(this._grabAcceleratorForSender(accel, flags, sender));
|
||||
}
|
||||
return invocation.return_value(GLib.Variant.new('(au)', [bindingActions]));
|
||||
},
|
||||
|
||||
UngrabAcceleratorAsync: function(params, invocation) {
|
||||
let [action] = params;
|
||||
let grabbedBy = this._grabbedAccelerators.get(action);
|
||||
if (invocation.get_sender() != grabbedBy)
|
||||
return invocation.return_value(GLib.Variant.new('(b)', [false]));
|
||||
|
||||
let ungrabSucceeded = global.display.ungrab_accelerator(action);
|
||||
if (ungrabSucceeded)
|
||||
this._grabbedAccelerators.delete(action);
|
||||
return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
|
||||
},
|
||||
|
||||
_emitAcceleratorActivated: function(action, deviceid) {
|
||||
let destination = this._grabbedAccelerators.get(action);
|
||||
if (!destination)
|
||||
return;
|
||||
|
||||
let connection = this._dbusImpl.get_connection();
|
||||
let info = this._dbusImpl.get_info();
|
||||
connection.emit_signal(destination,
|
||||
this._dbusImpl.get_object_path(),
|
||||
info ? info.name : null,
|
||||
'AcceleratorActivated',
|
||||
GLib.Variant.new('(uu)', [action, deviceid]));
|
||||
},
|
||||
|
||||
_grabAcceleratorForSender: function(accelerator, flags, sender) {
|
||||
let bindingAction = global.display.grab_accelerator(accelerator);
|
||||
if (bindingAction == Meta.KeyBindingAction.NONE)
|
||||
return Meta.KeyBindingAction.NONE;
|
||||
|
||||
let bindingName = Meta.external_binding_name_for_action(bindingAction);
|
||||
Main.wm.allowKeybinding(bindingName, flags);
|
||||
|
||||
this._grabbedAccelerators.set(bindingAction, sender);
|
||||
|
||||
if (!this._grabbers.has(sender)) {
|
||||
let id = Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
|
||||
Lang.bind(this, this._onGrabberBusNameVanished));
|
||||
this._grabbers.set(sender, id);
|
||||
}
|
||||
|
||||
return bindingAction;
|
||||
},
|
||||
|
||||
_ungrabAccelerator: function(action) {
|
||||
let ungrabSucceeded = global.display.ungrab_accelerator(action);
|
||||
if (ungrabSucceeded)
|
||||
this._grabbedAccelerators.delete(action);
|
||||
},
|
||||
|
||||
_onGrabberBusNameVanished: function(connection, name) {
|
||||
let grabs = this._grabbedAccelerators.items();
|
||||
for (let i = 0; i < grabs.length; i++) {
|
||||
let [action, sender] = grabs[i];
|
||||
if (sender == name)
|
||||
this._ungrabAccelerator(action);
|
||||
}
|
||||
Gio.bus_unwatch_name(this._grabbers.get(name));
|
||||
this._grabbers.delete(name);
|
||||
},
|
||||
|
||||
|
||||
Mode: global.session_mode,
|
||||
|
||||
get OverviewActive() {
|
||||
|
@ -89,7 +89,8 @@ const EntryMenu = new Lang.Class({
|
||||
|
||||
_updateCopyItem: function() {
|
||||
let selection = this._entry.clutter_text.get_selection();
|
||||
this._copyItem.setSensitive(selection && selection != '');
|
||||
this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
|
||||
selection && selection != '');
|
||||
},
|
||||
|
||||
_updatePasteItem: function() {
|
||||
|
@ -398,6 +398,9 @@ const InputSourceIndicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_switchInputSource: function(display, screen, window, binding) {
|
||||
if (this._mruSources.length < 2)
|
||||
return;
|
||||
|
||||
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
|
||||
let modifiers = binding.get_modifiers();
|
||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
||||
|
@ -160,6 +160,7 @@ const SwitcherPopup = new Lang.Class({
|
||||
// disturbed by the popup briefly flashing.
|
||||
this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT,
|
||||
Lang.bind(this, function () {
|
||||
Main.osdWindow.cancel();
|
||||
this.actor.opacity = 255;
|
||||
this._initialDelayTimeoutId = 0;
|
||||
}));
|
||||
@ -304,7 +305,7 @@ const SwitcherList = new Lang.Class({
|
||||
this.actor.connect('allocate', Lang.bind(this, this._allocateTop));
|
||||
|
||||
// Here we use a GenericContainer so that we can force all the
|
||||
// children except the separator to have the same width.
|
||||
// children to have the same width.
|
||||
this._list = new Shell.GenericContainer({ style_class: 'switcher-list-item-container' });
|
||||
this._list.spacing = 0;
|
||||
this._list.connect('style-changed', Lang.bind(this, function() {
|
||||
@ -339,7 +340,6 @@ const SwitcherList = new Lang.Class({
|
||||
|
||||
this._items = [];
|
||||
this._highlighted = -1;
|
||||
this._separator = null;
|
||||
this._squareItems = squareItems;
|
||||
this._minSize = 0;
|
||||
this._scrollableRight = true;
|
||||
@ -402,12 +402,6 @@ const SwitcherList = new Lang.Class({
|
||||
this._itemEntered(index);
|
||||
},
|
||||
|
||||
addSeparator: function () {
|
||||
let box = new St.Bin({ style_class: 'separator' });
|
||||
this._separator = box;
|
||||
this._list.add_actor(box);
|
||||
},
|
||||
|
||||
highlight: function(index, justOutline) {
|
||||
if (this._highlighted != -1) {
|
||||
this._items[this._highlighted].remove_style_pseudo_class('outlined');
|
||||
@ -515,14 +509,8 @@ const SwitcherList = new Lang.Class({
|
||||
_getPreferredWidth: function (actor, forHeight, alloc) {
|
||||
let [maxChildMin, maxChildNat] = this._maxChildWidth(forHeight);
|
||||
|
||||
let separatorWidth = 0;
|
||||
if (this._separator) {
|
||||
let [sepMin, sepNat] = this._separator.get_preferred_width(forHeight);
|
||||
separatorWidth = sepNat + this._list.spacing;
|
||||
}
|
||||
|
||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||
alloc.min_size = this._items.length * maxChildMin + separatorWidth + totalSpacing;
|
||||
alloc.min_size = this._items.length * maxChildMin + totalSpacing;
|
||||
alloc.natural_size = alloc.min_size;
|
||||
this._minSize = alloc.min_size;
|
||||
},
|
||||
@ -553,14 +541,7 @@ const SwitcherList = new Lang.Class({
|
||||
let [maxChildMin, maxChildNat] = this._maxChildWidth(childHeight);
|
||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||
|
||||
let separatorWidth = 0;
|
||||
if (this._separator) {
|
||||
let [sepMin, sepNat] = this._separator.get_preferred_width(childHeight);
|
||||
separatorWidth = sepNat;
|
||||
totalSpacing += this._list.spacing;
|
||||
}
|
||||
|
||||
let childWidth = Math.floor(Math.max(0, box.x2 - box.x1 - totalSpacing - separatorWidth) / this._items.length);
|
||||
let childWidth = Math.floor(Math.max(0, box.x2 - box.x1 - totalSpacing) / this._items.length);
|
||||
|
||||
let x = 0;
|
||||
let children = this._list.get_children();
|
||||
@ -580,14 +561,6 @@ const SwitcherList = new Lang.Class({
|
||||
children[i].allocate(childBox, flags);
|
||||
|
||||
x += this._list.spacing + childWidth;
|
||||
} else if (children[i] == this._separator) {
|
||||
// We want the separator to be more compact than the rest.
|
||||
childBox.x1 = x;
|
||||
childBox.y1 = 0;
|
||||
childBox.x2 = x + separatorWidth;
|
||||
childBox.y2 = childHeight;
|
||||
children[i].allocate(childBox, flags);
|
||||
x += this._list.spacing + separatorWidth;
|
||||
} else {
|
||||
// Something else, eg, AppSwitcher's arrows;
|
||||
// we don't allocate it.
|
||||
|
@ -1,8 +1,8 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Shell = imports.gi.Shell;
|
||||
@ -45,12 +45,9 @@ const Tweener = imports.tweener.tweener;
|
||||
// calls any of these is almost certainly wrong anyway, because they
|
||||
// affect the entire application.)
|
||||
|
||||
let animationSettings = null;
|
||||
|
||||
// Called from Main.start
|
||||
function init() {
|
||||
Tweener.setFrameTicker(new ClutterFrameTicker());
|
||||
animationSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
|
||||
}
|
||||
|
||||
|
||||
@ -77,7 +74,7 @@ function _wrapTweening(target, tweeningParameters) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!animationSettings.get_boolean('enable-animations'))
|
||||
if (!Gtk.Settings.get_default().gtk_enable_animations)
|
||||
tweeningParameters['time'] = 0.000001;
|
||||
|
||||
_addHandler(target, tweeningParameters, 'onStart', _tweenStarted);
|
||||
|
@ -52,6 +52,7 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session
|
||||
<property name="Remote" type="b" access="read"/>
|
||||
<property name="Class" type="s" access="read"/>
|
||||
<property name="Type" type="s" access="read"/>
|
||||
<property name="State" type="s" access="read"/>
|
||||
</interface>;
|
||||
|
||||
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
|
||||
@ -888,6 +889,7 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
let descriptionLabel = new St.Label({ style_class: 'end-session-dialog-description'});
|
||||
descriptionLabel.set_text(_("Shutting down might cause them to lose unsaved work."));
|
||||
descriptionLabel.clutter_text.line_wrap = true;
|
||||
dialog.contentLayout.add(descriptionLabel, { x_fill: true,
|
||||
y_fill: true,
|
||||
y_align: St.Align.START });
|
||||
@ -961,6 +963,9 @@ const UserMenuButton = new Lang.Class({
|
||||
if (proxy.Class != 'user')
|
||||
continue;
|
||||
|
||||
if (proxy.State == 'closing')
|
||||
continue;
|
||||
|
||||
if (proxy.Id == GLib.getenv('XDG_SESSION_ID'))
|
||||
continue;
|
||||
|
||||
|
@ -83,11 +83,10 @@ const ViewSelector = new Lang.Class({
|
||||
this._entry.connect('notify::mapped', Lang.bind(this, this._onMapped));
|
||||
global.stage.connect('notify::key-focus', Lang.bind(this, this._onStageKeyFocusChanged));
|
||||
|
||||
this._inactiveIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-find-symbolic' });
|
||||
this._activeIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-clear-symbolic' });
|
||||
this._entry.set_secondary_icon(this._inactiveIcon);
|
||||
this._entry.set_primary_icon(new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-find-symbolic' }));
|
||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-clear-symbolic' });
|
||||
|
||||
this._iconClickedId = 0;
|
||||
this._capturedEventId = 0;
|
||||
@ -279,8 +278,7 @@ const ViewSelector = new Lang.Class({
|
||||
else
|
||||
Main.overview.hide();
|
||||
return true;
|
||||
} else if (Clutter.keysym_to_unicode(symbol) ||
|
||||
(symbol == Clutter.BackSpace && this._searchActive)) {
|
||||
} else if (this._shouldTriggerSearch(symbol)) {
|
||||
this.startSearch(event);
|
||||
} else if (!this._searchActive) {
|
||||
if (symbol == Clutter.Tab || symbol == Clutter.Down) {
|
||||
@ -345,6 +343,17 @@ const ViewSelector = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_shouldTriggerSearch: function(symbol) {
|
||||
let unicode = Clutter.keysym_to_unicode(symbol);
|
||||
if (unicode == 0)
|
||||
return false;
|
||||
|
||||
if (getTermsForSearchString(String.fromCharCode(unicode)).length > 0)
|
||||
return true;
|
||||
|
||||
return symbol == Clutter.BackSpace && this._searchActive;
|
||||
},
|
||||
|
||||
startSearch: function(event) {
|
||||
global.stage.set_key_focus(this._text);
|
||||
this._text.event(event, true);
|
||||
@ -366,7 +375,7 @@ const ViewSelector = new Lang.Class({
|
||||
this._searchResults.startingSearch();
|
||||
|
||||
if (this._searchActive) {
|
||||
this._entry.set_secondary_icon(this._activeIcon);
|
||||
this._entry.set_secondary_icon(this._clearIcon);
|
||||
|
||||
if (this._iconClickedId == 0)
|
||||
this._iconClickedId = this._entry.connect('secondary-icon-clicked',
|
||||
@ -386,7 +395,7 @@ const ViewSelector = new Lang.Class({
|
||||
this._searchTimeoutId = 0;
|
||||
}
|
||||
|
||||
this._entry.set_secondary_icon(this._inactiveIcon);
|
||||
this._entry.set_secondary_icon(null);
|
||||
this._searchCancelled();
|
||||
}
|
||||
},
|
||||
@ -502,6 +511,22 @@ const ViewSelector = new Lang.Class({
|
||||
return ViewPage.APPS;
|
||||
else
|
||||
return ViewPage.SEARCH;
|
||||
},
|
||||
|
||||
fadeIn: function() {
|
||||
let actor = this._activePage;
|
||||
Tweener.addTween(actor, { opacity: 255,
|
||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / 2,
|
||||
transition: 'easeInQuad'
|
||||
});
|
||||
},
|
||||
|
||||
fadeHalf: function() {
|
||||
let actor = this._activePage;
|
||||
Tweener.addTween(actor, { opacity: 128,
|
||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME / 2,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(ViewSelector.prototype);
|
||||
|
@ -174,15 +174,6 @@ const WindowManager = new Lang.Class({
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._openAppMenu));
|
||||
|
||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||
this._undimWindow(this._dimmedWindows[i]);
|
||||
}));
|
||||
Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||
for (let i = 0; i < this._dimmedWindows.length; i++)
|
||||
this._dimWindow(this._dimmedWindows[i]);
|
||||
}));
|
||||
},
|
||||
|
||||
setCustomKeybindingHandler: function(name, modes, handler) {
|
||||
@ -342,15 +333,13 @@ const WindowManager = new Lang.Class({
|
||||
if (shouldDim && !window._dimmed) {
|
||||
window._dimmed = true;
|
||||
this._dimmedWindows.push(window);
|
||||
if (!Main.overview.visible)
|
||||
this._dimWindow(window);
|
||||
this._dimWindow(window);
|
||||
} else if (!shouldDim && window._dimmed) {
|
||||
window._dimmed = false;
|
||||
this._dimmedWindows = this._dimmedWindows.filter(function(win) {
|
||||
return win != window;
|
||||
});
|
||||
if (!Main.overview.visible)
|
||||
this._undimWindow(window);
|
||||
this._undimWindow(window);
|
||||
}
|
||||
},
|
||||
|
||||
@ -564,9 +553,9 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
let switchData = {};
|
||||
this._switchData = switchData;
|
||||
switchData.inGroup = new Clutter.Group();
|
||||
switchData.outGroup = new Clutter.Group();
|
||||
switchData.movingWindowBin = new Clutter.Group();
|
||||
switchData.inGroup = new Clutter.Actor();
|
||||
switchData.outGroup = new Clutter.Actor();
|
||||
switchData.movingWindowBin = new Clutter.Actor();
|
||||
switchData.windows = [];
|
||||
|
||||
let wgroup = global.window_group;
|
||||
@ -593,7 +582,7 @@ const WindowManager = new Lang.Class({
|
||||
switchData.windows.push({ window: window,
|
||||
parent: window.get_parent() });
|
||||
window.reparent(switchData.inGroup);
|
||||
window.show_all();
|
||||
window.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,7 @@ const Main = imports.ui.main;
|
||||
const Overview = imports.ui.overview;
|
||||
const Panel = imports.ui.panel;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
|
||||
const FOCUS_ANIMATION_TIME = 0.15;
|
||||
|
||||
@ -41,6 +42,68 @@ function _interpolate(start, end, step) {
|
||||
return start + (end - start) * step;
|
||||
}
|
||||
|
||||
const WindowCloneLayout = new Lang.Class({
|
||||
Name: 'WindowCloneLayout',
|
||||
Extends: Clutter.LayoutManager,
|
||||
|
||||
_init: function(boundingBox) {
|
||||
this.parent();
|
||||
|
||||
this._boundingBox = boundingBox;
|
||||
},
|
||||
|
||||
get boundingBox() {
|
||||
return this._boundingBox;
|
||||
},
|
||||
|
||||
set boundingBox(b) {
|
||||
this._boundingBox = b;
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
_makeBoxForWindow: function(window) {
|
||||
// We need to adjust the position of the actor because of the
|
||||
// consequences of invisible borders -- in reality, the texture
|
||||
// has an extra set of "padding" around it that we need to trim
|
||||
// down.
|
||||
|
||||
// The outer rect (from which we compute the bounding box)
|
||||
// paradoxically is the smaller rectangle, containing the positions
|
||||
// of the visible frame. The input rect contains everything,
|
||||
// including the invisible border padding.
|
||||
let inputRect = window.get_input_rect();
|
||||
|
||||
let box = new Clutter.ActorBox();
|
||||
|
||||
box.set_origin(inputRect.x - this._boundingBox.x,
|
||||
inputRect.y - this._boundingBox.y);
|
||||
box.set_size(inputRect.width, inputRect.height);
|
||||
|
||||
return box;
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
return [this._boundingBox.height, this._boundingBox.height];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
return [this._boundingBox.width, this._boundingBox.width];
|
||||
},
|
||||
|
||||
vfunc_allocate: function(container, box, flags) {
|
||||
let clone = container.get_children().forEach(function (child) {
|
||||
let realWindow;
|
||||
if (child == container._delegate._windowClone)
|
||||
realWindow = container._delegate.realWindow;
|
||||
else
|
||||
realWindow = child.source;
|
||||
|
||||
child.allocate(this._makeBoxForWindow(realWindow.meta_window),
|
||||
flags);
|
||||
}, this);
|
||||
},
|
||||
});
|
||||
|
||||
const WindowClone = new Lang.Class({
|
||||
Name: 'WindowClone',
|
||||
|
||||
@ -50,10 +113,7 @@ const WindowClone = new Lang.Class({
|
||||
this.metaWindow._delegate = this;
|
||||
this._workspace = workspace;
|
||||
|
||||
let [borderX, borderY] = this._getInvisibleBorderPadding();
|
||||
this._windowClone = new Clutter.Clone({ source: realWindow.get_texture(),
|
||||
x: -borderX,
|
||||
y: -borderY });
|
||||
this._windowClone = new Clutter.Clone({ source: realWindow.get_texture() });
|
||||
// We expect this.actor to be used for all interaction rather than
|
||||
// this._windowClone; as the former is reactive and the latter
|
||||
// is not, this just works for most cases. However, for DND all
|
||||
@ -61,22 +121,17 @@ const WindowClone = new Lang.Class({
|
||||
// To avoid this, we hide it from pick.
|
||||
Shell.util_set_hidden_from_pick(this._windowClone, true);
|
||||
|
||||
this.origX = realWindow.x + borderX;
|
||||
this.origY = realWindow.y + borderY;
|
||||
|
||||
let outerRect = realWindow.meta_window.get_outer_rect();
|
||||
|
||||
// The MetaShapedTexture that we clone has a size that includes
|
||||
// the invisible border; this is inconvenient; rather than trying
|
||||
// to compensate all over the place we insert a ClutterGroup into
|
||||
// to compensate all over the place we insert a custom container into
|
||||
// the hierarchy that is sized to only the visible portion.
|
||||
this.actor = new Clutter.Group({ reactive: true,
|
||||
x: this.origX,
|
||||
y: this.origY,
|
||||
width: outerRect.width,
|
||||
height: outerRect.height });
|
||||
// As usual, we cannot use a ShellGenericContainer or StWidget here,
|
||||
// because Workspace plays dirty tricks with reparenting to do DNDs
|
||||
// and scroll-to-zoom.
|
||||
this.actor = new Clutter.Actor({ reactive: true,
|
||||
layout_manager: new WindowCloneLayout() });
|
||||
|
||||
this.actor.add_actor(this._windowClone);
|
||||
this.actor.add_child(this._windowClone);
|
||||
|
||||
this.actor._delegate = this;
|
||||
|
||||
@ -84,10 +139,19 @@ const WindowClone = new Lang.Class({
|
||||
this._dragSlot = [0, 0, 0, 0];
|
||||
this._stackAbove = null;
|
||||
|
||||
this._sizeChangedId = this.realWindow.connect('size-changed',
|
||||
this._windowClone._updateId = this.realWindow.connect('size-changed',
|
||||
Lang.bind(this, this._onRealWindowSizeChanged));
|
||||
this._realWindowDestroyId = this.realWindow.connect('destroy',
|
||||
Lang.bind(this, this._disconnectRealWindowSignals));
|
||||
this._windowClone._destroyId = this.realWindow.connect('destroy', Lang.bind(this, function() {
|
||||
// First destroy the clone and then destroy everything
|
||||
// This will ensure that we never see it in the _disconnectSignals loop
|
||||
this._windowClone.destroy();
|
||||
this.destroy();
|
||||
}));
|
||||
|
||||
this._updateAttachedDialogs();
|
||||
this._computeBoundingBox();
|
||||
this.actor.x = this._boundingBox.x;
|
||||
this.actor.y = this._boundingBox.y;
|
||||
|
||||
let clickAction = new Clutter.ClickAction();
|
||||
clickAction.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
@ -121,6 +185,97 @@ const WindowClone = new Lang.Class({
|
||||
return this._slot;
|
||||
},
|
||||
|
||||
deleteAll: function() {
|
||||
// Delete all windows, starting from the bottom-most (most-modal) one
|
||||
|
||||
let windows = this.actor.get_children();
|
||||
for (let i = windows.length - 1; i >= 1; i--) {
|
||||
let realWindow = windows[i].source;
|
||||
let metaWindow = realWindow.meta_window;
|
||||
|
||||
metaWindow.delete(global.get_current_time());
|
||||
}
|
||||
|
||||
this.metaWindow.delete(global.get_current_time());
|
||||
},
|
||||
|
||||
addAttachedDialog: function(win) {
|
||||
this._doAddAttachedDialog(win, win.get_compositor_private());
|
||||
this._computeBoundingBox();
|
||||
this._updateDimmer();
|
||||
this.emit('size-changed');
|
||||
},
|
||||
|
||||
_doAddAttachedDialog: function(metaWin, realWin) {
|
||||
let clone = new Clutter.Clone({ source: realWin });
|
||||
clone._updateId = realWin.connect('size-changed', Lang.bind(this, function() {
|
||||
this._computeBoundingBox();
|
||||
this.emit('size-changed');
|
||||
}));
|
||||
clone._destroyId = realWin.connect('destroy', Lang.bind(this, function() {
|
||||
clone.destroy();
|
||||
|
||||
this._computeBoundingBox();
|
||||
this._updateDimmer();
|
||||
this.emit('size-changed');
|
||||
}));
|
||||
this.actor.add_child(clone);
|
||||
},
|
||||
|
||||
_updateAttachedDialogs: function() {
|
||||
let iter = Lang.bind(this, function(win) {
|
||||
let actor = win.get_compositor_private();
|
||||
|
||||
if (!actor)
|
||||
return false;
|
||||
if (!win.is_attached_dialog())
|
||||
return false;
|
||||
|
||||
this._doAddAttachedDialog(win, actor);
|
||||
win.foreach_transient(iter);
|
||||
return true;
|
||||
});
|
||||
this.metaWindow.foreach_transient(iter);
|
||||
|
||||
this._dimmer = new WindowManager.WindowDimmer(this._windowClone);
|
||||
this._updateDimmer();
|
||||
},
|
||||
|
||||
_updateDimmer: function() {
|
||||
if (this.actor.get_n_children() > 1) {
|
||||
this._dimmer.setEnabled(true);
|
||||
this._dimmer.dimFactor = 1.0;
|
||||
} else {
|
||||
this._dimmer.setEnabled(false);
|
||||
}
|
||||
},
|
||||
|
||||
get boundingBox() {
|
||||
return this._boundingBox;
|
||||
},
|
||||
|
||||
getOriginalPosition: function() {
|
||||
return [this._boundingBox.x, this._boundingBox.y];
|
||||
},
|
||||
|
||||
_computeBoundingBox: function() {
|
||||
let rect = this.metaWindow.get_outer_rect();
|
||||
|
||||
this.actor.get_children().forEach(function (child) {
|
||||
let realWindow;
|
||||
if (child == this._windowClone)
|
||||
realWindow = this.realWindow;
|
||||
else
|
||||
realWindow = child.source;
|
||||
|
||||
let metaWindow = realWindow.meta_window;
|
||||
rect = rect.union(metaWindow.get_outer_rect());
|
||||
}, this);
|
||||
|
||||
this._boundingBox = rect;
|
||||
this.actor.layout_manager.boundingBox = rect;
|
||||
},
|
||||
|
||||
setStackAbove: function (actor) {
|
||||
this._stackAbove = actor;
|
||||
if (this.inDrag)
|
||||
@ -136,44 +291,26 @@ const WindowClone = new Lang.Class({
|
||||
this.actor.destroy();
|
||||
},
|
||||
|
||||
_disconnectRealWindowSignals: function() {
|
||||
if (this._sizeChangedId > 0)
|
||||
this.realWindow.disconnect(this._sizeChangedId);
|
||||
this._sizeChangedId = 0;
|
||||
_disconnectSignals: function() {
|
||||
this.actor.get_children().forEach(Lang.bind(this, function (child) {
|
||||
let realWindow;
|
||||
if (child == this._windowClone)
|
||||
realWindow = this.realWindow;
|
||||
else
|
||||
realWindow = child.source;
|
||||
|
||||
if (this._realWindowDestroyId > 0)
|
||||
this.realWindow.disconnect(this._realWindowDestroyId);
|
||||
this._realWindowDestroyId = 0;
|
||||
},
|
||||
|
||||
_getInvisibleBorderPadding: function() {
|
||||
// We need to adjust the position of the actor because of the
|
||||
// consequences of invisible borders -- in reality, the texture
|
||||
// has an extra set of "padding" around it that we need to trim
|
||||
// down.
|
||||
|
||||
// The outer rect paradoxically is the smaller rectangle,
|
||||
// containing the positions of the visible frame. The input
|
||||
// rect contains everything, including the invisible border
|
||||
// padding.
|
||||
let outerRect = this.metaWindow.get_outer_rect();
|
||||
let inputRect = this.metaWindow.get_input_rect();
|
||||
let [borderX, borderY] = [outerRect.x - inputRect.x,
|
||||
outerRect.y - inputRect.y];
|
||||
|
||||
return [borderX, borderY];
|
||||
realWindow.disconnect(child._updateId);
|
||||
realWindow.disconnect(child._destroyId);
|
||||
}));
|
||||
},
|
||||
|
||||
_onRealWindowSizeChanged: function() {
|
||||
let [borderX, borderY] = this._getInvisibleBorderPadding();
|
||||
let outerRect = this.metaWindow.get_outer_rect();
|
||||
this.actor.set_size(outerRect.width, outerRect.height);
|
||||
this._windowClone.set_position(-borderX, -borderY);
|
||||
this._computeBoundingBox();
|
||||
this.emit('size-changed');
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this._disconnectRealWindowSignals();
|
||||
this._disconnectSignals();
|
||||
|
||||
this.metaWindow._delegate = null;
|
||||
this.actor._delegate = null;
|
||||
@ -432,7 +569,7 @@ const WindowOverlay = new Lang.Class({
|
||||
Lang.bind(this,
|
||||
this._onWindowAdded));
|
||||
|
||||
metaWindow.delete(global.get_current_time());
|
||||
this._windowClone.deleteAll();
|
||||
},
|
||||
|
||||
_onWindowAdded: function(workspace, win) {
|
||||
@ -561,6 +698,80 @@ const WindowPositionFlags = {
|
||||
ANIMATE: 1 << 1
|
||||
};
|
||||
|
||||
// Window Thumbnail Layout Algorithm
|
||||
// =================================
|
||||
//
|
||||
// General overview
|
||||
// ----------------
|
||||
//
|
||||
// The window thumbnail layout algorithm calculates some optimal layout
|
||||
// by computing layouts with some number of rows, calculating how good
|
||||
// each layout is, and stopping iterating when it finds one that is worse
|
||||
// than the previous layout. A layout consists of which windows are in
|
||||
// which rows, row sizes and other general state tracking that would make
|
||||
// calculating window positions from this information fairly easy.
|
||||
//
|
||||
// We don't compute some global order of windows right now for optimal
|
||||
// travel when animating into the overview; windows are assumed to be
|
||||
// in some stable order.
|
||||
//
|
||||
// After a layout is computed that's considered the best layout, we
|
||||
// compute the layout scale to fit it in the area, and then compute
|
||||
// slots (sizes and positions) for each thumbnail.
|
||||
//
|
||||
// Layout generation
|
||||
// -----------------
|
||||
//
|
||||
// Layout generation is naive and simple: we simply add windows to a row
|
||||
// until we've added too many windows to a row, and then make a new row,
|
||||
// until we have our required N rows. The potential issue with this strategy
|
||||
// is that we may have too many windows at the bottom in some pathological
|
||||
// cases, which tends to make the thumbnails have the shape of a pile of
|
||||
// sand with a peak, with one window at the top.
|
||||
//
|
||||
// Scaling factors
|
||||
// ---------------
|
||||
//
|
||||
// Thumbnail position is mostly straightforward -- the main issue is
|
||||
// computing an optimal scale for each window that fits the constraints,
|
||||
// and doesn't make the thumbnail too small to see. There are two factors
|
||||
// involved in thumbnail scale to make sure that these two goals are met:
|
||||
// the window scale (calculated by _computeWindowScale) and the layout
|
||||
// scale (calculated by computeSizeAndScale).
|
||||
//
|
||||
// The calculation logic becomes slightly more complicated because row
|
||||
// and column spacing are not scaled, they're constant, so we can't
|
||||
// simply generate a bunch of window positions and then scale it. In
|
||||
// practice, it's not too bad -- we can simply try to fit the layout
|
||||
// in the input area minus whatever spacing we have, and then add
|
||||
// it back afterwards.
|
||||
//
|
||||
// The window scale is constant for the window's size regardless of the
|
||||
// input area or the layout scale or rows or anything else, and right
|
||||
// now just enlarges the window if it's too small. The fact that this
|
||||
// factor is stable makes it easy to calculate, so there's no sense
|
||||
// in not applying it in most calculations.
|
||||
//
|
||||
// The layout scale depends on the input area, the rows, etc, but is the
|
||||
// same for the entire layout, rather than being per-window. After
|
||||
// generating the rows of windows, we basically do some basic math to
|
||||
// fit the full, unscaled layout to the input area, as described above.
|
||||
//
|
||||
// With these two factors combined, the final scale of each thumbnail is
|
||||
// simply windowScale * layoutScale... almost.
|
||||
//
|
||||
// There's one additional constraint: the thumbnail scale must never be
|
||||
// larger than WINDOW_CLONE_MAXIMUM_SCALE, which means that the inequality:
|
||||
//
|
||||
// windowScale * layoutScale <= WINDOW_CLONE_MAXIMUM_SCALE
|
||||
//
|
||||
// must always be true. This is for each individual window -- while we
|
||||
// could adjust layoutScale to make the largest thumbnail smaller than
|
||||
// WINDOW_CLONE_MAXIMUM_SCALE, it would shrink windows which are already
|
||||
// under the inequality. To solve this, we simply cheat: we simply keep
|
||||
// each window's "cell" area to be the same, but we shrink the thumbnail
|
||||
// and center it horizontally, and align it to the bottom vertically.
|
||||
|
||||
const LayoutStrategy = new Lang.Class({
|
||||
Name: 'LayoutStrategy',
|
||||
Abstract: true,
|
||||
@ -583,19 +794,15 @@ const LayoutStrategy = new Lang.Class({
|
||||
// meant to be scaled
|
||||
//
|
||||
// * neither height/fullHeight have any sort of spacing or padding
|
||||
//
|
||||
// * if cellWidth is present, all windows in the row will occupy
|
||||
// the space of cellWidth, centered.
|
||||
return { x: 0, y: 0,
|
||||
width: 0, height: 0,
|
||||
fullWidth: 0, fullHeight: 0,
|
||||
cellWidth: 0,
|
||||
windows: [] };
|
||||
},
|
||||
|
||||
// Computes and returns a fancy scale for @window using the
|
||||
// base scale, @scale.
|
||||
_computeWindowScale: function(window, scale) {
|
||||
// Computes and returns an individual scaling factor for @window,
|
||||
// to be applied in addition to the overal layout scale.
|
||||
_computeWindowScale: function(window) {
|
||||
// Since we align windows next to each other, the height of the
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
// them, so two windows with equal height, but maybe differering
|
||||
@ -608,14 +815,13 @@ const LayoutStrategy = new Lang.Class({
|
||||
// good. We'll use a multiplier of 1.5 for this.
|
||||
|
||||
// Map from [0, 1] to [1.5, 1]
|
||||
let fancyScale = _interpolate(1.5, 1, ratio) * scale;
|
||||
return fancyScale;
|
||||
return _interpolate(1.5, 1, ratio);
|
||||
},
|
||||
|
||||
// Compute the size of each row, by assigning to the properties
|
||||
// row.width, row.height, row.fullWidth, row.fullHeight, and
|
||||
// (optionally) row.cellWidth, for each row in @layout.rows.
|
||||
// This method is intended to be called by subclasses.
|
||||
// (optionally) for each row in @layout.rows. This method is
|
||||
// intended to be called by subclasses.
|
||||
_computeRowSizes: function(layout) {
|
||||
throw new Error('_computeRowSizes not implemented');
|
||||
},
|
||||
@ -676,7 +882,7 @@ const LayoutStrategy = new Lang.Class({
|
||||
computeWindowSlots: function(layout, area) {
|
||||
this._computeRowSizes(layout);
|
||||
|
||||
let { rows: rows, scale: scale, state: state } = layout;
|
||||
let { rows: rows, scale: scale } = layout;
|
||||
|
||||
let slots = [];
|
||||
|
||||
@ -697,24 +903,22 @@ const LayoutStrategy = new Lang.Class({
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
let row = rows[i];
|
||||
row.y += baseY;
|
||||
let baseX = row.x;
|
||||
let x = row.x;
|
||||
for (let j = 0; j < row.windows.length; j++) {
|
||||
let window = row.windows[j];
|
||||
|
||||
let s = this._computeWindowScale(window, scale);
|
||||
let s = scale * this._computeWindowScale(window);
|
||||
let cellWidth = window.actor.width * s;
|
||||
let cellHeight = window.actor.height * s;
|
||||
|
||||
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
|
||||
let width = window.actor.width * s;
|
||||
let height = window.actor.height * s;
|
||||
let y = row.y + row.height - height;
|
||||
let cloneWidth = window.actor.width * s;
|
||||
|
||||
let x = baseX;
|
||||
if (row.cellWidth) {
|
||||
x += (row.cellWidth - width) / 2;
|
||||
width = row.cellWidth;
|
||||
}
|
||||
let cloneX = x + (cellWidth - cloneWidth) / 2;
|
||||
let cloneY = row.y + row.height - cellHeight;
|
||||
|
||||
slots.push([x, y, s, window]);
|
||||
baseX += width + this._columnSpacing;
|
||||
slots.push([cloneX, cloneY, s, window]);
|
||||
x += cellWidth + this._columnSpacing;
|
||||
}
|
||||
}
|
||||
return slots;
|
||||
@ -753,7 +957,9 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
let rows = [];
|
||||
let totalWidth = 0;
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
totalWidth += windows[i].actor.width;
|
||||
let window = windows[i];
|
||||
let s = this._computeWindowScale(window);
|
||||
totalWidth += window.actor.width * s;
|
||||
}
|
||||
|
||||
let idealRowWidth = totalWidth / numRows;
|
||||
@ -765,7 +971,7 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
|
||||
for (; windowIdx < windows.length; windowIdx++) {
|
||||
let window = windows[windowIdx];
|
||||
let s = this._computeWindowScale(window, 1);
|
||||
let s = this._computeWindowScale(window);
|
||||
let width = window.actor.width * s;
|
||||
let height = window.actor.height * s;
|
||||
row.fullHeight = Math.max(row.fullHeight, height);
|
||||
@ -814,7 +1020,7 @@ const Workspace = new Lang.Class({
|
||||
|
||||
this.monitorIndex = monitorIndex;
|
||||
this._monitor = Main.layoutManager.monitors[this.monitorIndex];
|
||||
this._windowOverlaysGroup = new Clutter.Group();
|
||||
this._windowOverlaysGroup = new Clutter.Actor();
|
||||
// Without this the drop area will be overlapped.
|
||||
this._windowOverlaysGroup.set_size(0, 0);
|
||||
|
||||
@ -1151,9 +1357,29 @@ const Workspace = new Lang.Class({
|
||||
if (this._lookupIndex (metaWin) != -1)
|
||||
return;
|
||||
|
||||
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||
if (!this._isMyWindow(win))
|
||||
return;
|
||||
|
||||
if (!this._isOverviewWindow(win)) {
|
||||
if (metaWin.is_attached_dialog()) {
|
||||
let parent = metaWin.get_transient_for();
|
||||
while (parent.is_attached_dialog())
|
||||
parent = metaWin.get_transient_for();
|
||||
|
||||
let idx = this._lookupIndex (parent);
|
||||
if (idx < 0) {
|
||||
// parent was not created yet, it will take care
|
||||
// of the dialog when created
|
||||
return;
|
||||
}
|
||||
|
||||
let clone = this._windows[idx];
|
||||
clone.addAttachedDialog(metaWin);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
let [clone, overlay] = this._addWindowClone(win);
|
||||
|
||||
if (win._overviewHint) {
|
||||
@ -1252,9 +1478,11 @@ const Workspace = new Lang.Class({
|
||||
overlay.hide();
|
||||
|
||||
if (clone.metaWindow.showing_on_its_workspace()) {
|
||||
let [origX, origY] = clone.getOriginalPosition();
|
||||
|
||||
Tweener.addTween(clone.actor,
|
||||
{ x: clone.origX,
|
||||
y: clone.origY,
|
||||
{ x: origX,
|
||||
y: origY,
|
||||
scale_x: 1.0,
|
||||
scale_y: 1.0,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
@ -1349,6 +1577,11 @@ const Workspace = new Lang.Class({
|
||||
|
||||
overlay.connect('show-close-button', Lang.bind(this, this._onShowOverlayClose));
|
||||
|
||||
if (this._windows.length == 0)
|
||||
clone.setStackAbove(null);
|
||||
else
|
||||
clone.setStackAbove(this._windows[this._windows.length - 1].actor);
|
||||
|
||||
this._windows.push(clone);
|
||||
this._windowOverlays.push(overlay);
|
||||
|
||||
|
@ -13,6 +13,7 @@ const Background = imports.ui.background;
|
||||
const DND = imports.ui.dnd;
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
const Workspace = imports.ui.workspace;
|
||||
const WorkspacesView = imports.ui.workspacesView;
|
||||
|
||||
@ -31,20 +32,49 @@ const WORKSPACE_KEEP_ALIVE_TIME = 100;
|
||||
|
||||
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
||||
|
||||
/* A layout manager that requests size only for primary_actor, but then allocates
|
||||
all using a fixed layout */
|
||||
const PrimaryActorLayout = new Lang.Class({
|
||||
Name: 'PrimaryActorLayout',
|
||||
Extends: Clutter.FixedLayout,
|
||||
|
||||
_init: function(primaryActor) {
|
||||
this.parent();
|
||||
|
||||
this.primaryActor = primaryActor;
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(forHeight) {
|
||||
return this.primaryActor.get_preferred_width(forHeight);
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(forWidth) {
|
||||
return this.primaryActor.get_preferred_height(forWidth);
|
||||
},
|
||||
});
|
||||
|
||||
const WindowClone = new Lang.Class({
|
||||
Name: 'WindowClone',
|
||||
|
||||
_init : function(realWindow) {
|
||||
this.actor = new Clutter.Clone({ source: realWindow.get_texture(),
|
||||
this.clone = new Clutter.Clone({ source: realWindow });
|
||||
|
||||
/* Can't use a Shell.GenericContainer because of DND and reparenting... */
|
||||
this.actor = new Clutter.Actor({ layout_manager: new PrimaryActorLayout(this.clone),
|
||||
reactive: true });
|
||||
this.actor._delegate = this;
|
||||
this.actor.add_child(this.clone);
|
||||
this.realWindow = realWindow;
|
||||
this.metaWindow = realWindow.meta_window;
|
||||
|
||||
this._positionChangedId = this.realWindow.connect('position-changed',
|
||||
Lang.bind(this, this._onPositionChanged));
|
||||
this._realWindowDestroyedId = this.realWindow.connect('destroy',
|
||||
Lang.bind(this, this._disconnectRealWindowSignals));
|
||||
this.clone._updateId = this.realWindow.connect('position-changed',
|
||||
Lang.bind(this, this._onPositionChanged));
|
||||
this.clone._destroyId = this.realWindow.connect('destroy', Lang.bind(this, function() {
|
||||
// First destroy the clone and then destroy everything
|
||||
// This will ensure that we never see it in the _disconnectSignals loop
|
||||
this.clone.destroy();
|
||||
this.destroy();
|
||||
}));
|
||||
this._onPositionChanged();
|
||||
|
||||
this.actor.connect('button-release-event',
|
||||
@ -60,6 +90,24 @@ const WindowClone = new Lang.Class({
|
||||
this._draggable.connect('drag-cancelled', Lang.bind(this, this._onDragCancelled));
|
||||
this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd));
|
||||
this.inDrag = false;
|
||||
|
||||
let iter = Lang.bind(this, function(win) {
|
||||
let actor = win.get_compositor_private();
|
||||
|
||||
if (!actor)
|
||||
return false;
|
||||
if (!win.is_attached_dialog())
|
||||
return false;
|
||||
|
||||
this._doAddAttachedDialog(win, actor);
|
||||
win.foreach_transient(iter);
|
||||
|
||||
return true;
|
||||
});
|
||||
this.metaWindow.foreach_transient(iter);
|
||||
|
||||
this._dimmer = new WindowManager.WindowDimmer(this.clone);
|
||||
this._updateDimmer();
|
||||
},
|
||||
|
||||
setStackAbove: function (actor) {
|
||||
@ -74,25 +122,57 @@ const WindowClone = new Lang.Class({
|
||||
this.actor.destroy();
|
||||
},
|
||||
|
||||
addAttachedDialog: function(win) {
|
||||
this._doAddAttachedDialog(win, win.get_compositor_private());
|
||||
this._updateDimmer();
|
||||
},
|
||||
|
||||
_doAddAttachedDialog: function(metaDialog, realDialog) {
|
||||
let clone = new Clutter.Clone({ source: realDialog });
|
||||
this._updateDialogPosition(realDialog, clone);
|
||||
|
||||
clone._updateId = realDialog.connect('position-changed',
|
||||
Lang.bind(this, this._updateDialogPosition, clone));
|
||||
clone._destroyId = realDialog.connect('destroy', Lang.bind(this, function() {
|
||||
clone.destroy();
|
||||
this._updateDimmer();
|
||||
}));
|
||||
this.actor.add_child(clone);
|
||||
},
|
||||
|
||||
_updateDimmer: function() {
|
||||
if (this.actor.get_n_children() > 1) {
|
||||
this._dimmer.setEnabled(true);
|
||||
this._dimmer.dimFactor = 1.0;
|
||||
} else {
|
||||
this._dimmer.setEnabled(false);
|
||||
}
|
||||
},
|
||||
|
||||
_updateDialogPosition: function(realDialog, cloneDialog) {
|
||||
let metaDialog = realDialog.meta_window;
|
||||
let dialogRect = metaDialog.get_outer_rect();
|
||||
let rect = this.metaWindow.get_outer_rect();
|
||||
|
||||
cloneDialog.set_position(dialogRect.x - rect.x, dialogRect.y - rect.y);
|
||||
},
|
||||
|
||||
_onPositionChanged: function() {
|
||||
let rect = this.metaWindow.get_outer_rect();
|
||||
this.actor.set_position(this.realWindow.x, this.realWindow.y);
|
||||
},
|
||||
|
||||
_disconnectRealWindowSignals: function() {
|
||||
if (this._positionChangedId != 0) {
|
||||
this.realWindow.disconnect(this._positionChangedId);
|
||||
this._positionChangedId = 0;
|
||||
}
|
||||
_disconnectSignals: function() {
|
||||
this.actor.get_children().forEach(function(child) {
|
||||
let realWindow = child.source;
|
||||
|
||||
if (this._realWindowDestroyedId != 0) {
|
||||
this.realWindow.disconnect(this._realWindowDestroyedId);
|
||||
this._realWindowDestroyedId = 0;
|
||||
}
|
||||
realWindow.disconnect(child._updateId);
|
||||
realWindow.disconnect(child._destroyId);
|
||||
});
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this._disconnectRealWindowSignals();
|
||||
this._disconnectSignals();
|
||||
|
||||
this.actor._delegate = null;
|
||||
|
||||
@ -166,8 +246,8 @@ const WorkspaceThumbnail = new Lang.Class({
|
||||
style_class: 'workspace-thumbnail' });
|
||||
this.actor._delegate = this;
|
||||
|
||||
this._contents = new Clutter.Group();
|
||||
this.actor.add_actor(this._contents);
|
||||
this._contents = new Clutter.Actor();
|
||||
this.actor.add_child(this._contents);
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
@ -320,10 +400,26 @@ const WorkspaceThumbnail = new Lang.Class({
|
||||
if (this._lookupIndex (metaWin) != -1)
|
||||
return;
|
||||
|
||||
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||
if (!this._isMyWindow(win))
|
||||
return;
|
||||
|
||||
let clone = this._addWindowClone(win);
|
||||
if (this._isOverviewWindow(win)) {
|
||||
this._addWindowClone(win);
|
||||
} else if (metaWin.is_attached_dialog()) {
|
||||
let parent = metaWin.get_transient_for();
|
||||
while (parent.is_attached_dialog())
|
||||
parent = metaWin.get_transient_for();
|
||||
|
||||
let idx = this._lookupIndex (parent);
|
||||
if (idx < 0) {
|
||||
// parent was not created yet, it will take care
|
||||
// of the dialog when created
|
||||
return;
|
||||
}
|
||||
|
||||
let clone = this._windows[idx];
|
||||
clone.addAttachedDialog(metaWin);
|
||||
}
|
||||
},
|
||||
|
||||
_windowAdded : function(metaWorkspace, metaWin) {
|
||||
@ -551,7 +647,6 @@ const ThumbnailsBox = new Lang.Class({
|
||||
|
||||
this.actor.connect('button-press-event', function() { return true; });
|
||||
this.actor.connect('button-release-event', Lang.bind(this, this._onButtonRelease));
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
|
||||
Main.overview.connect('showing',
|
||||
Lang.bind(this, this._createThumbnails));
|
||||
@ -590,7 +685,7 @@ const ThumbnailsBox = new Lang.Class({
|
||||
let thumbnail = this._thumbnails[i]
|
||||
let [w, h] = thumbnail.actor.get_transformed_size();
|
||||
if (y >= thumbnail.actor.y && y <= thumbnail.actor.y + h) {
|
||||
thumbnail.activate(event.time);
|
||||
thumbnail.activate(event.get_time());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1215,16 +1310,5 @@ const ThumbnailsBox = new Lang.Class({
|
||||
},
|
||||
onCompleteScope: this
|
||||
});
|
||||
},
|
||||
|
||||
_onScrollEvent: function (actor, event) {
|
||||
switch (event.get_scroll_direction()) {
|
||||
case Clutter.ScrollDirection.UP:
|
||||
Main.wm.actionMoveWorkspace(Meta.MotionDirection.UP);
|
||||
break;
|
||||
case Clutter.ScrollDirection.DOWN:
|
||||
Main.wm.actionMoveWorkspace(Meta.MotionDirection.DOWN);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -21,14 +21,7 @@ const XdndHandler = new Lang.Class({
|
||||
Shell.util_set_hidden_from_pick(this._dummy, true);
|
||||
this._dummy.hide();
|
||||
|
||||
// Mutter delays the creation of the output window as long
|
||||
// as possible to avoid flicker. In case a plugin wants to
|
||||
// access it directly it has to connect to the stage's show
|
||||
// signal. (see comment in compositor.c:meta_compositor_manage_screen)
|
||||
global.stage.connect('show', function () {
|
||||
global.init_xdnd();
|
||||
return false;
|
||||
});
|
||||
global.init_xdnd();
|
||||
|
||||
global.connect('xdnd-enter', Lang.bind(this, this._onEnter));
|
||||
global.connect('xdnd-position-changed', Lang.bind(this, this._onPositionChanged));
|
||||
@ -75,7 +68,7 @@ const XdndHandler = new Lang.Class({
|
||||
source: cursorWindow});
|
||||
|
||||
this._cursorWindowClone = new Clutter.Clone({ source: cursorWindow });
|
||||
global.overlay_group.add_actor(this._cursorWindowClone);
|
||||
Main.uiGroup.add_actor(this._cursorWindowClone);
|
||||
Shell.util_set_hidden_from_pick(this._cursorWindowClone, true);
|
||||
|
||||
// Make sure that the clone has the same position as the source
|
||||
@ -89,7 +82,7 @@ const XdndHandler = new Lang.Class({
|
||||
},
|
||||
|
||||
_onPositionChanged: function(obj, x, y) {
|
||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
|
||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
|
||||
|
||||
// Make sure that the cursor window is on top
|
||||
if (this._cursorWindowClone)
|
||||
|
@ -1,3 +1,6 @@
|
||||
# List of source files containing translatable strings.
|
||||
# Please keep this file sorted alphabetically.
|
||||
[encoding: UTF-8]
|
||||
data/50-gnome-shell-screenshot.xml.in
|
||||
data/50-gnome-shell-system.xml.in
|
||||
data/gnome-shell.desktop.in.in
|
||||
@ -30,6 +33,7 @@ js/ui/lookingGlass.js
|
||||
js/ui/main.js
|
||||
js/ui/messageTray.js
|
||||
js/ui/notificationDaemon.js
|
||||
js/ui/overviewControls.js
|
||||
js/ui/overview.js
|
||||
js/ui/panel.js
|
||||
js/ui/popupMenu.js
|
||||
|
358
po/it.po
358
po/it.po
@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 3.7.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-02-19 11:03+0100\n"
|
||||
"PO-Revision-Date: 2013-02-19 11:07+0100\n"
|
||||
"POT-Creation-Date: 2013-03-02 15:53+0100\n"
|
||||
"PO-Revision-Date: 2013-03-02 15:54+0100\n"
|
||||
"Last-Translator: Luca Ferretti <lferrett@gnome.org>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
"Language: it\n"
|
||||
@ -58,7 +58,7 @@ msgid "Window management and application launching"
|
||||
msgstr "Gestisce finestre e avvia applicazioni"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
#: ../js/extensionPrefs/main.js:152
|
||||
#: ../js/extensionPrefs/main.js:153
|
||||
msgid "GNOME Shell Extension Preferences"
|
||||
msgstr "Preferenze estensioni di GNOME Shell"
|
||||
|
||||
@ -128,14 +128,24 @@ msgstr ""
|
||||
"visualizzate nell'area dei preferiti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||
msgid "List of categories that should be displayed as folders"
|
||||
msgstr "Elenco di categorie che dovrebbero essere mostrare come cartelle"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||
msgid ""
|
||||
"Each category name in this list will be represented as folder in the "
|
||||
"application view, rather than being displayed inline in the main view."
|
||||
msgstr "Ciascun nome di categoria in questa lista sarà rappresentata come una cartella nella vista applicazioni, invece che essere mostrata nella vista principale"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Cronologia per il dialogo dei comandi (Alt-F2)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||
msgid "History for the looking glass dialog"
|
||||
msgstr "Cronologia per il dialogo looking glass"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid ""
|
||||
"Internally used to store the last IM presence explicitly set by the user. "
|
||||
"The value here is from the TpConnectionPresenceType enumeration."
|
||||
@ -144,7 +154,7 @@ msgstr ""
|
||||
"esplicitamente dall'utente. Il valore corrisponde alla enumerazione "
|
||||
"TpConnectionPresenceType."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"Internally used to store the last session presence status for the user. The "
|
||||
"value here is from the GsmPresenceStatus enumeration."
|
||||
@ -152,11 +162,11 @@ msgstr ""
|
||||
"Usato internamente per memorizzare lo stato di presenza dell'ultima sessione "
|
||||
"per l'utente. Il valore corrisponde alla enumerazione GsmPresenceStatus."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr "Mostra sempre l'elemento \"Termina sessione\" nel menù utente."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
@ -164,13 +174,13 @@ msgstr ""
|
||||
"Questa chiave sovrascrive lo scomparsa automatica dell'elemento \"Termina "
|
||||
"sessione\" nelle modalità singolo utente, sessione singola."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Indica se ricordare la password per montare file system remoti o cifrati"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@ -182,73 +192,73 @@ msgstr ""
|
||||
"aggiunta la corrispettiva casella di selezione. Questa chiave imposta lo "
|
||||
"stato predefinito di tale casella."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Mostra il numero della settimana nel calendario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Se VERO, mostra il giorno della settimana ISO nel calendario."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Associazione tasti per aprire menù applicazioni"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Associazione di tasti per aprire il menù delle applicazioni."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Associazione tasti per aprire la vista \"Mostra applicazioni\""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Associazione di tasti per aprire la vista \"Mosta applicazioni\" della "
|
||||
"panoramica Attività."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Associazione tasti per commutare la visibilità del cassetto messaggi"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr ""
|
||||
"Associazione di tasti per commutare la visibilità del cassetto messaggi."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Associazione tasti dare il focus alla notifica attiva"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Associazione di tasti per dare il focus alla notifica attiva."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Associazione tasti per commutare registrazione schermo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr ""
|
||||
"Associazione di tasti per avviare/fermare il registratore di schermo "
|
||||
"incorporato."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Quale tastiera usare"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Il tipo di tastiera da usare."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Framerate per la registrazione di screencast."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@ -256,11 +266,11 @@ msgstr ""
|
||||
"Il framerate in fotogrammi al secondo dello screencast registrato attraverso "
|
||||
"il registratore della GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "La pipeline di gstreamer utilizzata per codificare lo screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -287,11 +297,11 @@ msgstr ""
|
||||
"usato come un segnaposto per una stima del valore di thread ottimale per il "
|
||||
"sistema in uso."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Estensione del file utilizzato per salvare lo screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -301,11 +311,11 @@ msgstr ""
|
||||
"data corrente e utilizza questa estensione. Dovrebbe essere modificato "
|
||||
"quando si registra utilizzando un diverso formato contenitore."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "The application icon mode."
|
||||
msgstr "La modalità dell'icona dell'applicazione."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@ -315,22 +325,22 @@ msgstr ""
|
||||
"sono: \"thumbnail-only\" (mostra una miniatura della finestra), \"app-icon-"
|
||||
"only\" (mostra solo l'icona dell'applicazione) oppure \"both\"."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Collega la finestra modale a quella genitore"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Questa chiave scavalca la chiave in org.gnome.mutter quando si esegue GNOME "
|
||||
"Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Disposizione dei pulsanti nella barra del titolo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
@ -338,76 +348,73 @@ msgstr ""
|
||||
"Questa chiave scavalca la chiave in org.gnome.desktop.wm.preferences quando "
|
||||
"si esegue GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Abilita il tiling di bordo quando si trascinano le finestre sui bordi dello schermo"
|
||||
msgstr ""
|
||||
"Abilita il tiling di bordo quando si trascinano le finestre sui bordi dello "
|
||||
"schermo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Spazi di lavoro sono gestiti dinamicamente"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Spazi di lavoro solo sul monitor primario"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:124
|
||||
#: ../js/extensionPrefs/main.js:125
|
||||
#, c-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr ""
|
||||
"Si è verificato un errore nel caricare il dialogo delle preferenze per %s:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:164
|
||||
#: ../js/extensionPrefs/main.js:165
|
||||
msgid "Extension"
|
||||
msgstr "Estensione"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:188
|
||||
#: ../js/extensionPrefs/main.js:189
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr ""
|
||||
"Selezionare una estensione da configurare usando la casella combinata qui "
|
||||
"sopra."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:569
|
||||
#: ../js/gdm/loginDialog.js:405
|
||||
msgid "Session…"
|
||||
msgstr "Sessione…"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:726
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Accesso"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
#: ../js/gdm/loginDialog.js:629
|
||||
msgid "Not listed?"
|
||||
msgstr "Non elencato?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:970 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:178
|
||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
||||
#: ../js/ui/userMenu.js:932
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:986
|
||||
#: ../js/gdm/loginDialog.js:799
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Accedi"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:986
|
||||
#: ../js/gdm/loginDialog.js:799
|
||||
msgid "Next"
|
||||
msgstr "Avanti"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:1095 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Nome utente: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1391
|
||||
#: ../js/gdm/loginDialog.js:1157
|
||||
msgid "Login Window"
|
||||
msgstr "Finestra di accesso"
|
||||
|
||||
@ -430,50 +437,53 @@ msgstr "Riavvia"
|
||||
msgid "Power Off"
|
||||
msgstr "Spegni"
|
||||
|
||||
#: ../js/gdm/util.js:152
|
||||
#: ../js/gdm/util.js:182
|
||||
msgid "Authentication error"
|
||||
msgstr "Errore di autenticazione"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:269
|
||||
#: ../js/gdm/util.js:299
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(o passare il dito)"
|
||||
|
||||
#: ../js/gdm/util.js:294
|
||||
#: ../js/gdm/util.js:324
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(p.e. utente o %s)"
|
||||
|
||||
#: ../js/misc/util.js:92
|
||||
#: ../js/misc/util.js:94
|
||||
msgid "Command not found"
|
||||
msgstr "Comando non trovato"
|
||||
|
||||
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
||||
#. something nicer
|
||||
#: ../js/misc/util.js:125
|
||||
#: ../js/misc/util.js:127
|
||||
msgid "Could not parse command:"
|
||||
msgstr "Impossibile analizzare il comando:"
|
||||
|
||||
#: ../js/misc/util.js:133
|
||||
#: ../js/misc/util.js:135
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Esecuzione di «%s» non riuscita:"
|
||||
|
||||
#. Translators: Filter to display all applications
|
||||
#: ../js/ui/appDisplay.js:259
|
||||
#: ../js/ui/appDisplay.js:348
|
||||
msgid "Frequent"
|
||||
msgstr "Frequenti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:355
|
||||
msgid "All"
|
||||
msgstr "Tutte"
|
||||
|
||||
#: ../js/ui/appDisplay.js:624
|
||||
#: ../js/ui/appDisplay.js:913
|
||||
msgid "New Window"
|
||||
msgstr "Nuova finestra"
|
||||
|
||||
#: ../js/ui/appDisplay.js:627 ../js/ui/dash.js:286
|
||||
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Rimuovi dai preferiti"
|
||||
|
||||
#: ../js/ui/appDisplay.js:628
|
||||
#: ../js/ui/appDisplay.js:917
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Aggiungi ai preferiti"
|
||||
|
||||
@ -489,6 +499,14 @@ msgstr "%s è stato aggiunto ai preferiti."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s è stato rimosso dai preferiti."
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
|
||||
msgid "Settings"
|
||||
msgstr "Impostazioni"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:21
|
||||
msgid "Change Background…"
|
||||
msgstr "Cambia sfondo…"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
@ -800,39 +818,39 @@ msgid "Mute"
|
||||
msgstr "Disattiva notifiche"
|
||||
|
||||
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
|
||||
#: ../js/ui/components/telepathyClient.js:938
|
||||
#: ../js/ui/components/telepathyClient.js:942
|
||||
#, no-c-format
|
||||
msgid "<b>Yesterday</b>, <b>%H:%M</b>"
|
||||
msgstr "<b>Ieri</b>, <b>%-H.%M</b>"
|
||||
|
||||
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
|
||||
#: ../js/ui/components/telepathyClient.js:944
|
||||
#: ../js/ui/components/telepathyClient.js:948
|
||||
#, no-c-format
|
||||
msgid "<b>%A</b>, <b>%H:%M</b>"
|
||||
msgstr "<b>%A</b>, <b>%-H.%M</b>"
|
||||
|
||||
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
|
||||
#: ../js/ui/components/telepathyClient.js:949
|
||||
#: ../js/ui/components/telepathyClient.js:953
|
||||
#, no-c-format
|
||||
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
|
||||
msgstr "<b>%d</b> <b>%B</b>, <b>%-H.%M</b>"
|
||||
|
||||
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
|
||||
#: ../js/ui/components/telepathyClient.js:953
|
||||
#: ../js/ui/components/telepathyClient.js:957
|
||||
#, no-c-format
|
||||
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
|
||||
msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%-H.%M</b>"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:981
|
||||
#: ../js/ui/components/telepathyClient.js:985
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s ha cambiato nome in %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1084
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Invio su %s"
|
||||
@ -840,38 +858,38 @@ msgstr "Invio su %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1092
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s ti sta invitando su %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1094
|
||||
#: ../js/ui/components/telepathyClient.js:1133
|
||||
#: ../js/ui/components/telepathyClient.js:1173
|
||||
#: ../js/ui/components/telepathyClient.js:1236
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
msgid "Decline"
|
||||
msgstr "Declina"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1095
|
||||
#: ../js/ui/components/telepathyClient.js:1174
|
||||
#: ../js/ui/components/telepathyClient.js:1237
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
msgid "Accept"
|
||||
msgstr "Accetta"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1125
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videochiamata da %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1128
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Chiamata da %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1135
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
msgid "Answer"
|
||||
msgstr "Rispondi"
|
||||
|
||||
@ -880,112 +898,112 @@ msgstr "Rispondi"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1167
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s ti sta inviando %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1202
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s chiede il permesso di vedere quando sei online"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1294
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
msgid "Network error"
|
||||
msgstr "Errore di rete"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1296
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Authentication failed"
|
||||
msgstr "Autenticazione non riuscita"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
msgid "Encryption error"
|
||||
msgstr "Errore di cifratura"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Certificato non fornito"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Certificato non fidato"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certificato scaduto"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Certificato non attivato"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Corrispondenza errata nel nome host del certificato"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Corrispondenza errata nell'impronta digitare del certificato"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Certificato auto-firmato"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Lo stato è impostato a fuori rete"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
msgid "Encryption is not available"
|
||||
msgstr "La cifratura non è disponibile"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Il certificato non è valido"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
msgid "Connection has been refused"
|
||||
msgstr "La connessione è stata rifiutata"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Impossibile stabilire la connessione"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Connessione persa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Questo account è già connesso al server"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"La connessione è stata sostituita da una nuova connessione usando la stessa "
|
||||
"risorsa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "L'account esiste già sul server"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Il server è al momento troppo occupato per gestire la connessione"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Il certificato è stato revocato"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Il certificato usa un algoritmo di cifratura non sicuro o è "
|
||||
"crittograficamente debole"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -996,22 +1014,22 @@ msgstr ""
|
||||
|
||||
# indica lo stato del device BT, per esempio gli auricolari
|
||||
# credo sia meglio l'aggettivo che il sostantivo
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid "Internal error"
|
||||
msgstr "Errore interno"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#, c-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "Impossibile connettersi a %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
msgid "View account"
|
||||
msgstr "Visualizza account"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1394
|
||||
#: ../js/ui/components/telepathyClient.js:1398
|
||||
msgid "Unknown reason"
|
||||
msgstr "Motivo sconosciuto"
|
||||
|
||||
@ -1019,14 +1037,14 @@ msgstr "Motivo sconosciuto"
|
||||
msgid "Windows"
|
||||
msgstr "Finestre"
|
||||
|
||||
#: ../js/ui/dash.js:250 ../js/ui/dash.js:288
|
||||
#: ../js/ui/dash.js:248 ../js/ui/dash.js:286
|
||||
msgid "Show Applications"
|
||||
msgstr "Mostra applicazioni"
|
||||
|
||||
# cruscotto?!?!?!?!?!?!?
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/dash.js:418
|
||||
#: ../js/ui/dash.js:435
|
||||
msgid "Dash"
|
||||
msgstr "Dash"
|
||||
|
||||
@ -1152,86 +1170,86 @@ msgstr "Installa"
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Scaricare e installare «%s» da extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:621 ../js/ui/status/keyboard.js:314
|
||||
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
|
||||
#: ../js/ui/status/power.js:211
|
||||
msgid "Keyboard"
|
||||
msgstr "Tastiera"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:692
|
||||
#: ../js/ui/lookingGlass.js:693
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nessuna estensione installata"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: ../js/ui/lookingGlass.js:746
|
||||
#: ../js/ui/lookingGlass.js:747
|
||||
#, c-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s non ha emesso alcun errore."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:752
|
||||
#: ../js/ui/lookingGlass.js:753
|
||||
msgid "Hide Errors"
|
||||
msgstr "Nascondi errori"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
|
||||
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:817
|
||||
msgid "Show Errors"
|
||||
msgstr "Mostra errori"
|
||||
|
||||
# (ndt) o abilitata?
|
||||
#: ../js/ui/lookingGlass.js:765
|
||||
#: ../js/ui/lookingGlass.js:766
|
||||
msgid "Enabled"
|
||||
msgstr "Abilitato"
|
||||
|
||||
# (ndt) o disabilitata?
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
|
||||
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Disabilitato"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:770
|
||||
#: ../js/ui/lookingGlass.js:771
|
||||
msgid "Error"
|
||||
msgstr "Errore"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:772
|
||||
#: ../js/ui/lookingGlass.js:773
|
||||
msgid "Out of date"
|
||||
msgstr "Non aggiornato"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:774
|
||||
#: ../js/ui/lookingGlass.js:775
|
||||
msgid "Downloading"
|
||||
msgstr "Scaricamento"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:798
|
||||
#: ../js/ui/lookingGlass.js:799
|
||||
msgid "View Source"
|
||||
msgstr "Visualizza sorgente"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:807
|
||||
#: ../js/ui/lookingGlass.js:808
|
||||
msgid "Web Page"
|
||||
msgstr "Pagina web"
|
||||
|
||||
#: ../js/ui/messageTray.js:1201
|
||||
#: ../js/ui/messageTray.js:1182
|
||||
msgid "Open"
|
||||
msgstr "Apri"
|
||||
|
||||
#: ../js/ui/messageTray.js:1208
|
||||
#: ../js/ui/messageTray.js:1189
|
||||
msgid "Remove"
|
||||
msgstr "Rimuovi"
|
||||
|
||||
#: ../js/ui/messageTray.js:1520
|
||||
#: ../js/ui/messageTray.js:1501
|
||||
msgid "Clear Messages"
|
||||
msgstr "Pulisci messaggi"
|
||||
|
||||
#: ../js/ui/messageTray.js:1547
|
||||
#: ../js/ui/messageTray.js:1528
|
||||
msgid "Notification Settings"
|
||||
msgstr "Impostazioni notifiche"
|
||||
|
||||
#: ../js/ui/messageTray.js:1725
|
||||
#: ../js/ui/messageTray.js:1707
|
||||
msgid "No Messages"
|
||||
msgstr "Nessun messaggio"
|
||||
|
||||
#: ../js/ui/messageTray.js:1806
|
||||
#: ../js/ui/messageTray.js:1787
|
||||
msgid "Message Tray"
|
||||
msgstr "Cassetto messaggi"
|
||||
|
||||
#: ../js/ui/messageTray.js:2881
|
||||
#: ../js/ui/messageTray.js:2864
|
||||
msgid "System Information"
|
||||
msgstr "Informazione di sistema"
|
||||
|
||||
@ -1240,11 +1258,18 @@ msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Sconosciuto"
|
||||
|
||||
#: ../js/ui/overview.js:93
|
||||
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "%d nuovo messaggio"
|
||||
msgstr[1] "%d nuovi messaggi"
|
||||
|
||||
#: ../js/ui/overview.js:82
|
||||
msgid "Undo"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: ../js/ui/overview.js:140
|
||||
#: ../js/ui/overview.js:129
|
||||
msgid "Overview"
|
||||
msgstr "Panoramica"
|
||||
|
||||
@ -1252,7 +1277,7 @@ msgstr "Panoramica"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/overview.js:220
|
||||
#: ../js/ui/overview.js:284
|
||||
msgid "Type to search…"
|
||||
msgstr "Digita per cercare…"
|
||||
|
||||
@ -1266,7 +1291,7 @@ msgstr "Esci"
|
||||
msgid "Activities"
|
||||
msgstr "Attività"
|
||||
|
||||
#: ../js/ui/panel.js:982
|
||||
#: ../js/ui/panel.js:983
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superiore"
|
||||
|
||||
@ -1289,29 +1314,22 @@ msgstr "Chiudi"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:117
|
||||
#: ../js/ui/screenShield.js:90
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:180
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "%d nuovo messaggio"
|
||||
msgstr[1] "%d nuovi messaggi"
|
||||
|
||||
#: ../js/ui/screenShield.js:182
|
||||
#: ../js/ui/screenShield.js:155
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d nuova notifica"
|
||||
msgstr[1] "%d nuove notifiche"
|
||||
|
||||
#: ../js/ui/screenShield.js:469 ../js/ui/userMenu.js:805
|
||||
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
|
||||
msgid "Lock"
|
||||
msgstr "Blocca"
|
||||
|
||||
#: ../js/ui/screenShield.js:635
|
||||
#: ../js/ui/screenShield.js:639
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "GNOME deve bloccare lo schermo"
|
||||
|
||||
@ -1322,11 +1340,11 @@ msgstr "GNOME deve bloccare lo schermo"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: ../js/ui/screenShield.js:754 ../js/ui/screenShield.js:1165
|
||||
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
||||
msgid "Unable to lock"
|
||||
msgstr "Impossibile bloccare"
|
||||
|
||||
#: ../js/ui/screenShield.js:755 ../js/ui/screenShield.js:1166
|
||||
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Il blocco è stato impedito da un'applicazione."
|
||||
|
||||
@ -1362,56 +1380,56 @@ msgstr "Password"
|
||||
msgid "Remember Password"
|
||||
msgstr "Ricorda password"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:192
|
||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
|
||||
msgid "Unlock"
|
||||
msgstr "Sblocca"
|
||||
|
||||
# su Android è Rilevabile :P
|
||||
#: ../js/ui/status/accessibility.js:35
|
||||
#: ../js/ui/status/accessibility.js:36
|
||||
msgid "Accessibility"
|
||||
msgstr "Accessibilità"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:40
|
||||
#: ../js/ui/status/accessibility.js:41
|
||||
msgid "Zoom"
|
||||
msgstr "Ingrandimento"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:47
|
||||
#: ../js/ui/status/accessibility.js:48
|
||||
msgid "Screen Reader"
|
||||
msgstr "Lettore schermo"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:51
|
||||
#: ../js/ui/status/accessibility.js:52
|
||||
msgid "Screen Keyboard"
|
||||
msgstr "Tastiera a schermo"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:55
|
||||
#: ../js/ui/status/accessibility.js:56
|
||||
msgid "Visual Alerts"
|
||||
msgstr "Avvisi visibili"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:58
|
||||
#: ../js/ui/status/accessibility.js:59
|
||||
msgid "Sticky Keys"
|
||||
msgstr "Tasti singoli"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:61
|
||||
#: ../js/ui/status/accessibility.js:62
|
||||
msgid "Slow Keys"
|
||||
msgstr "Tasti lenti"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:64
|
||||
#: ../js/ui/status/accessibility.js:65
|
||||
msgid "Bounce Keys"
|
||||
msgstr "Tasti rimbalzati"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:67
|
||||
#: ../js/ui/status/accessibility.js:68
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Mouse da tastiera"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:71
|
||||
#: ../js/ui/status/accessibility.js:72
|
||||
msgid "Universal Access Settings"
|
||||
msgstr "Impostazioni accesso universale"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:107
|
||||
#: ../js/ui/status/accessibility.js:129
|
||||
msgid "High Contrast"
|
||||
msgstr "Contrasto elevato"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:154
|
||||
#: ../js/ui/status/accessibility.js:178
|
||||
msgid "Large Text"
|
||||
msgstr "Caratteri grandi"
|
||||
|
||||
@ -1774,11 +1792,11 @@ msgstr "Volume"
|
||||
msgid "Microphone"
|
||||
msgstr "Microfono"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:203
|
||||
#: ../js/ui/unlockDialog.js:151
|
||||
msgid "Log in as another user"
|
||||
msgstr "Accedi come altro utente"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:229
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
msgid "Unlock Window"
|
||||
msgstr "Sblocca finestra"
|
||||
|
||||
@ -1810,10 +1828,6 @@ msgstr "Fuori rete"
|
||||
msgid "Notifications"
|
||||
msgstr "Notifiche"
|
||||
|
||||
#: ../js/ui/userMenu.js:787
|
||||
msgid "Settings"
|
||||
msgstr "Impostazioni"
|
||||
|
||||
#: ../js/ui/userMenu.js:795
|
||||
msgid "Switch User"
|
||||
msgstr "Cambia utente"
|
||||
@ -1947,6 +1961,10 @@ msgstr "La password non può essere vuota"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Il dialogo di autenticazione è stato annullato dall'utente"
|
||||
|
||||
#~ msgctxt "title"
|
||||
#~ msgid "Sign In"
|
||||
#~ msgstr "Accesso"
|
||||
|
||||
#~ msgid "Clear"
|
||||
#~ msgstr "Pulisci"
|
||||
|
||||
|
292
po/pl.po
292
po/pl.po
@ -11,8 +11,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-02-17 18:28+0100\n"
|
||||
"PO-Revision-Date: 2013-02-17 18:29+0100\n"
|
||||
"POT-Creation-Date: 2013-02-24 01:52+0100\n"
|
||||
"PO-Revision-Date: 2013-02-24 01:53+0100\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"Language: pl\n"
|
||||
@ -129,14 +129,26 @@ msgstr ""
|
||||
"ulubionych."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||
msgid "List of categories that should be displayed as folders"
|
||||
msgstr "Lista kategorii, które powinny być wyświetlane jako katalogi"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||
msgid ""
|
||||
"Each category name in this list will be represented as folder in the "
|
||||
"application view, rather than being displayed inline in the main view."
|
||||
msgstr ""
|
||||
"Każda nazwa kategorii na tej liście będzie przedstawiana jako katalog w "
|
||||
"widoku programów, zamiast wyświetlać ją bezpośrednio w głównym widoku."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Historia okna dialogowego poleceń (Alt-F2)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||
msgid "History for the looking glass dialog"
|
||||
msgstr "Historia okna dialogowego looking glass"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid ""
|
||||
"Internally used to store the last IM presence explicitly set by the user. "
|
||||
"The value here is from the TpConnectionPresenceType enumeration."
|
||||
@ -145,7 +157,7 @@ msgstr ""
|
||||
"ustawionego przez użytkownika. Wartość pochodzi ze spisu "
|
||||
"TpConnectionPresenceType."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"Internally used to store the last session presence status for the user. The "
|
||||
"value here is from the GsmPresenceStatus enumeration."
|
||||
@ -153,11 +165,11 @@ msgstr ""
|
||||
"Używane wewnętrznie do przechowywania ostatniego stanu obecności dla "
|
||||
"użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr "Wyświetlanie elementu menu \"Wyloguj się\" w menu użytkownika."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
@ -165,14 +177,14 @@ msgstr ""
|
||||
"Ten klucz zastępuje automatyczne ukrywanie elementu menu \"Wyloguj się\" w "
|
||||
"sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Określa, czy pamiętać hasła do montowania zaszyfrowanych lub zdalnych "
|
||||
"systemów plików"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@ -184,80 +196,80 @@ msgstr ""
|
||||
"obecne będzie pole wyboru \"Zapamiętanie hasła\". Ten klucz ustawia domyślną "
|
||||
"wartość tego pola."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr ""
|
||||
"Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w "
|
||||
"formacie ISO."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Skrót do otwarcia menu programu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Skrót do otwarcia menu programu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Skrót do otwarcia widoku \"Wyświetl programy\""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr "Skrót do otwarcia widoku \"Wyświetl programy\" ekranu podglądu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Skrót do aktywacji bieżącego powiadomienia"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Skrót do aktywacji bieżącego powiadomienia."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Skrót do przełączenia nagrywania ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Której klawiatury używać"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Typ używanej klawiatury."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Liczba klatek na sekundę do nagrywania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -282,11 +294,11 @@ msgstr ""
|
||||
"i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na "
|
||||
"odgadniętą optymalną liczbę wątków dla komputera."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -296,11 +308,11 @@ msgstr ""
|
||||
"dacie, i używającej tego rozszerzenia. Rozszerzenie powinno zostać "
|
||||
"zmienione, aby nagrywać w innym formacie kontenera."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "The application icon mode."
|
||||
msgstr "Tryb ikon programów."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@ -310,22 +322,22 @@ msgstr ""
|
||||
"\"thumbnail-only\" (wyświetla miniaturę okna), \"app-icon-only\" (wyświetla "
|
||||
"tylko ikonę programu) lub \"both\" (wyświetla oba)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Dołączanie modalnych okien dialogowych do okien nadrzędnych"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Ten klucz zastępuje klucz w \"org.gnome.mutter\", kiedy uruchomiona jest "
|
||||
"powłoka GNOME."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Uporządkowanie przycisków na pasku tytułowym"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
@ -333,17 +345,17 @@ msgstr ""
|
||||
"Ten klucz zastępuje klucz w \"org.gnome.desktop.wm.preferences\", kiedy "
|
||||
"uruchomiona jest powłoka GNOME."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Włączenie kafelkowania przy krawędziach podczas przenoszenia okien do "
|
||||
"krawędzi ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Dynamiczne zarządzanie obszarami roboczymi"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Obszary robocze tylko na pierwszym monitorze"
|
||||
|
||||
@ -363,48 +375,43 @@ msgstr ""
|
||||
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
|
||||
"wyboru."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:569
|
||||
#: ../js/gdm/loginDialog.js:405
|
||||
msgid "Session…"
|
||||
msgstr "Sesja…"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:726
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Proszę się zalogować"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
#: ../js/gdm/loginDialog.js:629
|
||||
msgid "Not listed?"
|
||||
msgstr "Inny użytkownik?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:967 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:178
|
||||
#: ../js/ui/userMenu.js:931
|
||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
|
||||
#: ../js/ui/userMenu.js:932
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
#: ../js/gdm/loginDialog.js:799
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Zaloguj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
#: ../js/gdm/loginDialog.js:799
|
||||
msgid "Next"
|
||||
msgstr "Dalej"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Nazwa użytkownika: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1387
|
||||
#: ../js/gdm/loginDialog.js:1157
|
||||
msgid "Login Window"
|
||||
msgstr "Okno logowania"
|
||||
|
||||
@ -413,8 +420,8 @@ msgstr "Okno logowania"
|
||||
msgid "Power"
|
||||
msgstr "Zasilanie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:693 ../js/ui/userMenu.js:697
|
||||
#: ../js/ui/userMenu.js:813
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
|
||||
#: ../js/ui/userMenu.js:814
|
||||
msgid "Suspend"
|
||||
msgstr "Uśpij"
|
||||
|
||||
@ -422,55 +429,58 @@ msgstr "Uśpij"
|
||||
msgid "Restart"
|
||||
msgstr "Uruchom ponownie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:695
|
||||
#: ../js/ui/userMenu.js:697 ../js/ui/userMenu.js:812 ../js/ui/userMenu.js:935
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
|
||||
#: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
|
||||
msgid "Power Off"
|
||||
msgstr "Wyłącz komputer"
|
||||
|
||||
#: ../js/gdm/util.js:152
|
||||
#: ../js/gdm/util.js:182
|
||||
msgid "Authentication error"
|
||||
msgstr "Błąd uwierzytelniania"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:269
|
||||
#: ../js/gdm/util.js:299
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(lub przeciągnięcie palca)"
|
||||
|
||||
#: ../js/gdm/util.js:294
|
||||
#: ../js/gdm/util.js:324
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(np. użytkownik lub %s)"
|
||||
|
||||
#: ../js/misc/util.js:92
|
||||
#: ../js/misc/util.js:94
|
||||
msgid "Command not found"
|
||||
msgstr "Nie odnaleziono polecenia"
|
||||
|
||||
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
||||
#. something nicer
|
||||
#: ../js/misc/util.js:125
|
||||
#: ../js/misc/util.js:127
|
||||
msgid "Could not parse command:"
|
||||
msgstr "Nie można przetworzyć polecenia:"
|
||||
|
||||
#: ../js/misc/util.js:133
|
||||
#: ../js/misc/util.js:135
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Wykonanie polecenia \"%s\" się nie powiodło:"
|
||||
|
||||
#. Translators: Filter to display all applications
|
||||
#: ../js/ui/appDisplay.js:259
|
||||
#: ../js/ui/appDisplay.js:348
|
||||
msgid "Frequent"
|
||||
msgstr "Często używane"
|
||||
|
||||
#: ../js/ui/appDisplay.js:355
|
||||
msgid "All"
|
||||
msgstr "Wszystkie"
|
||||
|
||||
#: ../js/ui/appDisplay.js:667
|
||||
#: ../js/ui/appDisplay.js:913
|
||||
msgid "New Window"
|
||||
msgstr "Nowe okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:670 ../js/ui/dash.js:289
|
||||
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Usuń z ulubionych"
|
||||
|
||||
#: ../js/ui/appDisplay.js:671
|
||||
#: ../js/ui/appDisplay.js:917
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Dodaj do ulubionych"
|
||||
|
||||
@ -484,6 +494,14 @@ msgstr "Program %s został dodany do ulubionych."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Program %s został usunięty z ulubionych."
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
|
||||
msgid "Settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:21
|
||||
msgid "Change Background…"
|
||||
msgstr "Zmień tło…"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
@ -1008,13 +1026,13 @@ msgstr "Nieznana przyczyna"
|
||||
msgid "Windows"
|
||||
msgstr "Okna"
|
||||
|
||||
#: ../js/ui/dash.js:253 ../js/ui/dash.js:291
|
||||
#: ../js/ui/dash.js:248 ../js/ui/dash.js:286
|
||||
msgid "Show Applications"
|
||||
msgstr "Wyświetl programy"
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/dash.js:427
|
||||
#: ../js/ui/dash.js:435
|
||||
msgid "Dash"
|
||||
msgstr "Ulubione"
|
||||
|
||||
@ -1141,84 +1159,84 @@ msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr ""
|
||||
"Pobrać i zainstalować rozszerzenie \"%s\" z witryny extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:601 ../js/ui/status/keyboard.js:314
|
||||
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
|
||||
#: ../js/ui/status/power.js:211
|
||||
msgid "Keyboard"
|
||||
msgstr "Klawiatura"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:692
|
||||
#: ../js/ui/lookingGlass.js:693
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nie zainstalowano rozszerzeń"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: ../js/ui/lookingGlass.js:746
|
||||
#: ../js/ui/lookingGlass.js:747
|
||||
#, c-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "Rozszerzenie %s nie wysłało żadnych błędów."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:752
|
||||
#: ../js/ui/lookingGlass.js:753
|
||||
msgid "Hide Errors"
|
||||
msgstr "Ukryj błędy"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
|
||||
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:817
|
||||
msgid "Show Errors"
|
||||
msgstr "Wyświetl błędy"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:765
|
||||
#: ../js/ui/lookingGlass.js:766
|
||||
msgid "Enabled"
|
||||
msgstr "Włączone"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
|
||||
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Wyłączone"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:770
|
||||
#: ../js/ui/lookingGlass.js:771
|
||||
msgid "Error"
|
||||
msgstr "Błąd"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:772
|
||||
#: ../js/ui/lookingGlass.js:773
|
||||
msgid "Out of date"
|
||||
msgstr "Nieaktualne"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:774
|
||||
#: ../js/ui/lookingGlass.js:775
|
||||
msgid "Downloading"
|
||||
msgstr "Pobieranie"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:798
|
||||
#: ../js/ui/lookingGlass.js:799
|
||||
msgid "View Source"
|
||||
msgstr "Wyświetl źródło"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:807
|
||||
#: ../js/ui/lookingGlass.js:808
|
||||
msgid "Web Page"
|
||||
msgstr "Strona WWW"
|
||||
|
||||
#: ../js/ui/messageTray.js:1201
|
||||
#: ../js/ui/messageTray.js:1177
|
||||
msgid "Open"
|
||||
msgstr "Otwórz"
|
||||
|
||||
#: ../js/ui/messageTray.js:1208
|
||||
#: ../js/ui/messageTray.js:1184
|
||||
msgid "Remove"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: ../js/ui/messageTray.js:1520
|
||||
msgid "Clear"
|
||||
msgstr "Wyczyść"
|
||||
#: ../js/ui/messageTray.js:1496
|
||||
msgid "Clear Messages"
|
||||
msgstr "Wyczyść wiadomości"
|
||||
|
||||
#: ../js/ui/messageTray.js:1547
|
||||
#: ../js/ui/messageTray.js:1523
|
||||
msgid "Notification Settings"
|
||||
msgstr "Ustawienia powiadomień"
|
||||
|
||||
#: ../js/ui/messageTray.js:1735
|
||||
#: ../js/ui/messageTray.js:1702
|
||||
msgid "No Messages"
|
||||
msgstr "Brak wiadomości"
|
||||
|
||||
#: ../js/ui/messageTray.js:1811
|
||||
#: ../js/ui/messageTray.js:1782
|
||||
msgid "Message Tray"
|
||||
msgstr "Obszar powiadamiania"
|
||||
|
||||
#: ../js/ui/messageTray.js:2889
|
||||
#: ../js/ui/messageTray.js:2857
|
||||
msgid "System Information"
|
||||
msgstr "Informacje systemowe"
|
||||
|
||||
@ -1227,11 +1245,11 @@ msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
|
||||
#: ../js/ui/overview.js:93
|
||||
#: ../js/ui/overview.js:81
|
||||
msgid "Undo"
|
||||
msgstr "Cofnij"
|
||||
|
||||
#: ../js/ui/overview.js:140
|
||||
#: ../js/ui/overview.js:124
|
||||
msgid "Overview"
|
||||
msgstr "Podgląd"
|
||||
|
||||
@ -1239,7 +1257,7 @@ msgstr "Podgląd"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/overview.js:219
|
||||
#: ../js/ui/overview.js:272
|
||||
msgid "Type to search…"
|
||||
msgstr "Wyszukiwanie…"
|
||||
|
||||
@ -1276,11 +1294,11 @@ msgstr "Zamknij"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:117
|
||||
#: ../js/ui/screenShield.js:90
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:180
|
||||
#: ../js/ui/screenShield.js:153
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
@ -1288,7 +1306,7 @@ msgstr[0] "%d nowa wiadomość"
|
||||
msgstr[1] "%d nowe wiadomości"
|
||||
msgstr[2] "%d nowych wiadomości"
|
||||
|
||||
#: ../js/ui/screenShield.js:182
|
||||
#: ../js/ui/screenShield.js:155
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
@ -1296,11 +1314,11 @@ msgstr[0] "%d nowe powiadomienie"
|
||||
msgstr[1] "%d nowe powiadomienia"
|
||||
msgstr[2] "%d nowych powiadomień"
|
||||
|
||||
#: ../js/ui/screenShield.js:469 ../js/ui/userMenu.js:804
|
||||
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
|
||||
msgid "Lock"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: ../js/ui/screenShield.js:635
|
||||
#: ../js/ui/screenShield.js:638
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "Środowisko GNOME musi zablokować ekran"
|
||||
|
||||
@ -1311,11 +1329,11 @@ msgstr "Środowisko GNOME musi zablokować ekran"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: ../js/ui/screenShield.js:754 ../js/ui/screenShield.js:1165
|
||||
#: ../js/ui/screenShield.js:757 ../js/ui/screenShield.js:1168
|
||||
msgid "Unable to lock"
|
||||
msgstr "Nie można zablokować"
|
||||
|
||||
#: ../js/ui/screenShield.js:755 ../js/ui/screenShield.js:1166
|
||||
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Blokowanie zostało zablokowane przez program"
|
||||
|
||||
@ -1327,19 +1345,19 @@ msgstr "Wyszukiwanie…"
|
||||
msgid "No results."
|
||||
msgstr "Brak wyników."
|
||||
|
||||
#: ../js/ui/shellEntry.js:26
|
||||
#: ../js/ui/shellEntry.js:29
|
||||
msgid "Copy"
|
||||
msgstr "Skopiuj"
|
||||
|
||||
#: ../js/ui/shellEntry.js:31
|
||||
#: ../js/ui/shellEntry.js:34
|
||||
msgid "Paste"
|
||||
msgstr "Wklej"
|
||||
|
||||
#: ../js/ui/shellEntry.js:102
|
||||
#: ../js/ui/shellEntry.js:105
|
||||
msgid "Show Text"
|
||||
msgstr "Wyświetl tekst"
|
||||
|
||||
#: ../js/ui/shellEntry.js:104
|
||||
#: ../js/ui/shellEntry.js:107
|
||||
msgid "Hide Text"
|
||||
msgstr "Ukryj tekst"
|
||||
|
||||
@ -1351,55 +1369,55 @@ msgstr "Hasło"
|
||||
msgid "Remember Password"
|
||||
msgstr "Zapamiętanie hasła"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:192
|
||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokuj"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:35
|
||||
#: ../js/ui/status/accessibility.js:36
|
||||
msgid "Accessibility"
|
||||
msgstr "Dostępność"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:40
|
||||
#: ../js/ui/status/accessibility.js:41
|
||||
msgid "Zoom"
|
||||
msgstr "Powiększenie"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:47
|
||||
#: ../js/ui/status/accessibility.js:48
|
||||
msgid "Screen Reader"
|
||||
msgstr "Czytnik ekranowy"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:51
|
||||
#: ../js/ui/status/accessibility.js:52
|
||||
msgid "Screen Keyboard"
|
||||
msgstr "Klawiatura ekranowa"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:55
|
||||
#: ../js/ui/status/accessibility.js:56
|
||||
msgid "Visual Alerts"
|
||||
msgstr "Alarmy wizualne"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:58
|
||||
#: ../js/ui/status/accessibility.js:59
|
||||
msgid "Sticky Keys"
|
||||
msgstr "Trwałe klawisze"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:61
|
||||
#: ../js/ui/status/accessibility.js:62
|
||||
msgid "Slow Keys"
|
||||
msgstr "Powolne klawisze"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:64
|
||||
#: ../js/ui/status/accessibility.js:65
|
||||
msgid "Bounce Keys"
|
||||
msgstr "Odskakujące klawisze"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:67
|
||||
#: ../js/ui/status/accessibility.js:68
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Klawisze myszy"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:71
|
||||
#: ../js/ui/status/accessibility.js:72
|
||||
msgid "Universal Access Settings"
|
||||
msgstr "Ustawienia ułatwień dostępu"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:107
|
||||
#: ../js/ui/status/accessibility.js:129
|
||||
msgid "High Contrast"
|
||||
msgstr "Wysoki kontrast"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:154
|
||||
#: ../js/ui/status/accessibility.js:178
|
||||
msgid "Large Text"
|
||||
msgstr "Duży tekst"
|
||||
|
||||
@ -1760,63 +1778,59 @@ msgstr "Głośność"
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:203
|
||||
#: ../js/ui/unlockDialog.js:151
|
||||
msgid "Log in as another user"
|
||||
msgstr "Zaloguj jako inny użytkownik"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:229
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
msgid "Unlock Window"
|
||||
msgstr "Okno odblokowania"
|
||||
|
||||
#: ../js/ui/userMenu.js:191
|
||||
#: ../js/ui/userMenu.js:192
|
||||
msgid "Available"
|
||||
msgstr "Dostępny"
|
||||
|
||||
#: ../js/ui/userMenu.js:194
|
||||
#: ../js/ui/userMenu.js:195
|
||||
msgid "Busy"
|
||||
msgstr "Zajęty"
|
||||
|
||||
#: ../js/ui/userMenu.js:197
|
||||
#: ../js/ui/userMenu.js:198
|
||||
msgid "Invisible"
|
||||
msgstr "Niewidoczny"
|
||||
|
||||
#: ../js/ui/userMenu.js:200
|
||||
#: ../js/ui/userMenu.js:201
|
||||
msgid "Away"
|
||||
msgstr "Nieobecny"
|
||||
|
||||
#: ../js/ui/userMenu.js:203
|
||||
#: ../js/ui/userMenu.js:204
|
||||
msgid "Idle"
|
||||
msgstr "Bezczynny"
|
||||
|
||||
#: ../js/ui/userMenu.js:206
|
||||
#: ../js/ui/userMenu.js:207
|
||||
msgid "Offline"
|
||||
msgstr "Offline"
|
||||
|
||||
#: ../js/ui/userMenu.js:778
|
||||
#: ../js/ui/userMenu.js:779
|
||||
msgid "Notifications"
|
||||
msgstr "Powiadomienia"
|
||||
|
||||
#: ../js/ui/userMenu.js:786
|
||||
msgid "Settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
#: ../js/ui/userMenu.js:794
|
||||
#: ../js/ui/userMenu.js:795
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/userMenu.js:799
|
||||
#: ../js/ui/userMenu.js:800
|
||||
msgid "Log Out"
|
||||
msgstr "Wyloguj się"
|
||||
|
||||
#: ../js/ui/userMenu.js:819
|
||||
#: ../js/ui/userMenu.js:820
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Zaktualizuj i uruchom ponownie"
|
||||
|
||||
#: ../js/ui/userMenu.js:837
|
||||
#: ../js/ui/userMenu.js:838
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
|
||||
|
||||
#: ../js/ui/userMenu.js:838
|
||||
#: ../js/ui/userMenu.js:839
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@ -1826,20 +1840,20 @@ msgstr ""
|
||||
"użytkownik tego komputera może nie zobaczyć przychodzących od nich "
|
||||
"wiadomości."
|
||||
|
||||
#: ../js/ui/userMenu.js:884
|
||||
#: ../js/ui/userMenu.js:885
|
||||
msgid "Other users are logged in."
|
||||
msgstr "Inni użytkownicy są zalogowani."
|
||||
|
||||
#: ../js/ui/userMenu.js:889
|
||||
#: ../js/ui/userMenu.js:890
|
||||
msgid "Shutting down might cause them to lose unsaved work."
|
||||
msgstr "Wyłączenie komputera może spowodować utratę danych."
|
||||
|
||||
#: ../js/ui/userMenu.js:915
|
||||
#: ../js/ui/userMenu.js:916
|
||||
#, c-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (zdalnie)"
|
||||
|
||||
#: ../js/ui/userMenu.js:917
|
||||
#: ../js/ui/userMenu.js:918
|
||||
#, c-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (konsola)"
|
||||
|
597
po/pt_BR.po
597
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
191
po/sl.po
191
po/sl.po
@ -9,15 +9,16 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2013-02-07 17:30+0000\n"
|
||||
"PO-Revision-Date: 2013-02-07 20:04+0100\n"
|
||||
"POT-Creation-Date: 2013-02-12 15:16+0000\n"
|
||||
"PO-Revision-Date: 2013-02-24 21:33+0100\n"
|
||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||
"Language: Slovenian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
|
||||
"%100==4 ? 3 : 0);\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
"X-Generator: Poedit 1.5.4\n"
|
||||
|
||||
@ -371,9 +372,10 @@ msgid "Not listed?"
|
||||
msgstr "Ali je ni na seznamu?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:967 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:374
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:178
|
||||
#: ../js/ui/userMenu.js:931
|
||||
msgid "Cancel"
|
||||
msgstr "Prekliči"
|
||||
|
||||
@ -403,8 +405,8 @@ msgstr "Prijavno okno"
|
||||
msgid "Power"
|
||||
msgstr "Napajanje"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:683
|
||||
#: ../js/ui/userMenu.js:799
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:693 ../js/ui/userMenu.js:697
|
||||
#: ../js/ui/userMenu.js:813
|
||||
msgid "Suspend"
|
||||
msgstr "Zaustavi"
|
||||
|
||||
@ -412,8 +414,8 @@ msgstr "Zaustavi"
|
||||
msgid "Restart"
|
||||
msgstr "Zaženi znova"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:681
|
||||
#: ../js/ui/userMenu.js:683 ../js/ui/userMenu.js:798
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:695
|
||||
#: ../js/ui/userMenu.js:697 ../js/ui/userMenu.js:812 ../js/ui/userMenu.js:935
|
||||
msgid "Power Off"
|
||||
msgstr "Izklop"
|
||||
|
||||
@ -482,60 +484,63 @@ msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Celodnevno"
|
||||
|
||||
#. Translators: Shown in calendar event list, if 24h format
|
||||
#: ../js/ui/calendar.js:66
|
||||
#. Translators: Shown in calendar event list, if 24h format,
|
||||
#. \u2236 is a ratio character, similar to :
|
||||
#: ../js/ui/calendar.js:67
|
||||
msgctxt "event list time"
|
||||
msgid "%H:%M"
|
||||
msgstr "%H:%M"
|
||||
msgid "%H\\u2236%M"
|
||||
msgstr "%H\\u2236%M"
|
||||
|
||||
#. Transators: Shown in calendar event list, if 12h format
|
||||
#: ../js/ui/calendar.js:73
|
||||
#. Transators: Shown in calendar event list, if 12h format,
|
||||
#. \u2236 is a ratio character, similar to : and \u2009 is
|
||||
#. a thin space
|
||||
#: ../js/ui/calendar.js:76
|
||||
msgctxt "event list time"
|
||||
msgid "%l:%M %p"
|
||||
msgstr "%l:%M %p"
|
||||
msgid "%l\\u2236%M\\u2009%p"
|
||||
msgstr "%l\\u2236%M\\u2009%p"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Sunday.
|
||||
#. *
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#: ../js/ui/calendar.js:104
|
||||
#: ../js/ui/calendar.js:107
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "N"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:106
|
||||
#: ../js/ui/calendar.js:109
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "P"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:108
|
||||
#: ../js/ui/calendar.js:111
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "T"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:110
|
||||
#: ../js/ui/calendar.js:113
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "S"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:112
|
||||
#: ../js/ui/calendar.js:115
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "Č"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:114
|
||||
#: ../js/ui/calendar.js:117
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "P"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:116
|
||||
#: ../js/ui/calendar.js:119
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
@ -546,77 +551,77 @@ msgstr "S"
|
||||
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
|
||||
#. * both be 'T').
|
||||
#.
|
||||
#: ../js/ui/calendar.js:129
|
||||
#: ../js/ui/calendar.js:132
|
||||
msgctxt "list sunday"
|
||||
msgid "Su"
|
||||
msgstr "Ne"
|
||||
|
||||
#. Translators: Event list abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:131
|
||||
#: ../js/ui/calendar.js:134
|
||||
msgctxt "list monday"
|
||||
msgid "M"
|
||||
msgstr "P"
|
||||
|
||||
#. Translators: Event list abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:133
|
||||
#: ../js/ui/calendar.js:136
|
||||
msgctxt "list tuesday"
|
||||
msgid "T"
|
||||
msgstr "T"
|
||||
|
||||
#. Translators: Event list abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:135
|
||||
#: ../js/ui/calendar.js:138
|
||||
msgctxt "list wednesday"
|
||||
msgid "W"
|
||||
msgstr "S"
|
||||
|
||||
#. Translators: Event list abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:137
|
||||
#: ../js/ui/calendar.js:140
|
||||
msgctxt "list thursday"
|
||||
msgid "Th"
|
||||
msgstr "Če"
|
||||
|
||||
#. Translators: Event list abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:139
|
||||
#: ../js/ui/calendar.js:142
|
||||
msgctxt "list friday"
|
||||
msgid "F"
|
||||
msgstr "Pe"
|
||||
|
||||
#. Translators: Event list abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:141
|
||||
#: ../js/ui/calendar.js:144
|
||||
msgctxt "list saturday"
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
#. Translators: Text to show if there are no events
|
||||
#: ../js/ui/calendar.js:674
|
||||
#: ../js/ui/calendar.js:677
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Nič ni razporejeno"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: ../js/ui/calendar.js:690
|
||||
#: ../js/ui/calendar.js:693
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d. %m."
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: ../js/ui/calendar.js:693
|
||||
#: ../js/ui/calendar.js:696
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:703
|
||||
#: ../js/ui/calendar.js:706
|
||||
msgid "Today"
|
||||
msgstr "Danes"
|
||||
|
||||
#: ../js/ui/calendar.js:707
|
||||
#: ../js/ui/calendar.js:710
|
||||
msgid "Tomorrow"
|
||||
msgstr "Jutri"
|
||||
|
||||
#: ../js/ui/calendar.js:718
|
||||
#: ../js/ui/calendar.js:721
|
||||
msgid "This week"
|
||||
msgstr "Ta teden"
|
||||
|
||||
#: ../js/ui/calendar.js:726
|
||||
#: ../js/ui/calendar.js:729
|
||||
msgid "Next week"
|
||||
msgstr "Naslednji teden"
|
||||
|
||||
@ -628,16 +633,16 @@ msgstr "Zunanji pogon je priklopljen"
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Zunanji pogon je odklopljen"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:292
|
||||
#: ../js/ui/components/autorunManager.js:294
|
||||
msgid "Removable Devices"
|
||||
msgstr "Odstranljive naprave"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:591
|
||||
#: ../js/ui/components/autorunManager.js:593
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Odpri s programom %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:617
|
||||
#: ../js/ui/components/autorunManager.js:619
|
||||
msgid "Eject"
|
||||
msgstr "Izvrzi"
|
||||
|
||||
@ -1016,22 +1021,22 @@ msgstr "Nastavitve časa in datuma"
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%a, %e. %b., %R"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:61
|
||||
#: ../js/ui/endSessionDialog.js:62
|
||||
#, c-format
|
||||
msgctxt "title"
|
||||
msgid "Log Out %s"
|
||||
msgstr "Odjava %s"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:62
|
||||
#: ../js/ui/endSessionDialog.js:63
|
||||
msgctxt "title"
|
||||
msgid "Log Out"
|
||||
msgstr "Odjava"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:63
|
||||
#: ../js/ui/endSessionDialog.js:64
|
||||
msgid "Click Log Out to quit these applications and log out of the system."
|
||||
msgstr "Kliknite Odjava za končanje teh programov in odjavo iz sistema."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:65
|
||||
#: ../js/ui/endSessionDialog.js:66
|
||||
#, c-format
|
||||
msgid "%s will be logged out automatically in %d second."
|
||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||
@ -1040,7 +1045,7 @@ msgstr[1] "Uporabnik %s bo samodejno odjavljen čez %d sekundo."
|
||||
msgstr[2] "Uporabnik %s bo samodejno odjavljen čez %d sekundi."
|
||||
msgstr[3] "Uporabnik %s bo samodejno odjavljen čez %d sekunde."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:70
|
||||
#: ../js/ui/endSessionDialog.js:71
|
||||
#, c-format
|
||||
msgid "You will be logged out automatically in %d second."
|
||||
msgid_plural "You will be logged out automatically in %d seconds."
|
||||
@ -1049,26 +1054,26 @@ msgstr[1] "Uporabnik bo samodejno odjavljen čez %d sekundo."
|
||||
msgstr[2] "Uporabnik bo samodejno odjavljen čez %d sekundi."
|
||||
msgstr[3] "Uporabnik bo samodejno odjavljen čez %d sekunde."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:74
|
||||
#: ../js/ui/endSessionDialog.js:75
|
||||
msgid "Logging out of the system."
|
||||
msgstr "Odjavljanje iz sistema."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:76
|
||||
#: ../js/ui/endSessionDialog.js:77
|
||||
msgctxt "button"
|
||||
msgid "Log Out"
|
||||
msgstr "Odjava"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:81
|
||||
#: ../js/ui/endSessionDialog.js:82
|
||||
msgctxt "title"
|
||||
msgid "Power Off"
|
||||
msgstr "Izklop"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:82
|
||||
#: ../js/ui/endSessionDialog.js:83
|
||||
msgid "Click Power Off to quit these applications and power off the system."
|
||||
msgstr ""
|
||||
"Kliknite na gumb za izklop za končanje teh programov in izklop iz sistema."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:84
|
||||
#: ../js/ui/endSessionDialog.js:85
|
||||
#, c-format
|
||||
msgid "The system will power off automatically in %d second."
|
||||
msgid_plural "The system will power off automatically in %d seconds."
|
||||
@ -1077,31 +1082,31 @@ msgstr[1] "Sistem se bo samodejno izklopil čez %d sekundo."
|
||||
msgstr[2] "Sistem se bo samodejno izklopil čez %d sekundi."
|
||||
msgstr[3] "Sistem se bo samodejno izklopil čez %d sekunde."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:88
|
||||
#: ../js/ui/endSessionDialog.js:89
|
||||
msgid "Powering off the system."
|
||||
msgstr "Izklapljanje sistema"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107
|
||||
#: ../js/ui/endSessionDialog.js:91 ../js/ui/endSessionDialog.js:108
|
||||
msgctxt "button"
|
||||
msgid "Restart"
|
||||
msgstr "Ponoven zagon"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:92
|
||||
#: ../js/ui/endSessionDialog.js:93
|
||||
msgctxt "button"
|
||||
msgid "Power Off"
|
||||
msgstr "Izklop"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:98
|
||||
#: ../js/ui/endSessionDialog.js:99
|
||||
msgctxt "title"
|
||||
msgid "Restart"
|
||||
msgstr "Ponoven zagon"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:99
|
||||
#: ../js/ui/endSessionDialog.js:100
|
||||
msgid "Click Restart to quit these applications and restart the system."
|
||||
msgstr ""
|
||||
"Kliknite Zaženi znova za končanje teh programov in ponoven zagon sistema. "
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:101
|
||||
#: ../js/ui/endSessionDialog.js:102
|
||||
#, c-format
|
||||
msgid "The system will restart automatically in %d second."
|
||||
msgid_plural "The system will restart automatically in %d seconds."
|
||||
@ -1110,7 +1115,7 @@ msgstr[1] "Sistem se bo samodejno ponovno zagnal čez %d sekundo."
|
||||
msgstr[2] "Sistem se bo samodejno ponovno zagnal čez %d sekundi."
|
||||
msgstr[3] "Sistem se bo samodejno ponovno zagnal čez %d sekunde."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:105
|
||||
#: ../js/ui/endSessionDialog.js:106
|
||||
msgid "Restarting the system."
|
||||
msgstr "Ponoven zagon sistema."
|
||||
|
||||
@ -1189,15 +1194,23 @@ msgstr "Odpri"
|
||||
msgid "Remove"
|
||||
msgstr "Odstrani"
|
||||
|
||||
#: ../js/ui/messageTray.js:1629
|
||||
#: ../js/ui/messageTray.js:1461
|
||||
msgid "Clear"
|
||||
msgstr "Počisti"
|
||||
|
||||
#: ../js/ui/messageTray.js:1484
|
||||
msgid "Notification Settings"
|
||||
msgstr "Nastavitve obvestil"
|
||||
|
||||
#: ../js/ui/messageTray.js:1667
|
||||
msgid "No Messages"
|
||||
msgstr "Ni sporočil"
|
||||
|
||||
#: ../js/ui/messageTray.js:1648
|
||||
#: ../js/ui/messageTray.js:1728
|
||||
msgid "Message Tray"
|
||||
msgstr "Vrstica sporočanja"
|
||||
|
||||
#: ../js/ui/messageTray.js:2759
|
||||
#: ../js/ui/messageTray.js:2842
|
||||
msgid "System Information"
|
||||
msgstr "Podrobnosti sistema"
|
||||
|
||||
@ -1283,7 +1296,7 @@ msgstr[1] "%d novo obvestilo"
|
||||
msgstr[2] "%d novi obvestili"
|
||||
msgstr[3] "%d nova obvestila"
|
||||
|
||||
#: ../js/ui/screenShield.js:464 ../js/ui/userMenu.js:790
|
||||
#: ../js/ui/screenShield.js:464 ../js/ui/userMenu.js:804
|
||||
msgid "Lock"
|
||||
msgstr "Zakleni"
|
||||
|
||||
@ -1291,11 +1304,11 @@ msgstr "Zakleni"
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "Zakleniti je treba zaslon"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:430
|
||||
#: ../js/ui/searchDisplay.js:431
|
||||
msgid "Searching..."
|
||||
msgstr "Iskanje ..."
|
||||
|
||||
#: ../js/ui/searchDisplay.js:478
|
||||
#: ../js/ui/searchDisplay.js:479
|
||||
msgid "No results."
|
||||
msgstr "Ni najdenih zadetkov."
|
||||
|
||||
@ -1744,55 +1757,55 @@ msgstr "Prijava kot drug uporabnik"
|
||||
msgid "Unlock Window"
|
||||
msgstr "Odkleni okno"
|
||||
|
||||
#: ../js/ui/userMenu.js:177
|
||||
#: ../js/ui/userMenu.js:191
|
||||
msgid "Available"
|
||||
msgstr "Na voljo"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:194
|
||||
msgid "Busy"
|
||||
msgstr "Zaposleno"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:197
|
||||
msgid "Invisible"
|
||||
msgstr "Nevidno"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:200
|
||||
msgid "Away"
|
||||
msgstr "Odsotno"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:203
|
||||
msgid "Idle"
|
||||
msgstr "Nedejavno"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:206
|
||||
msgid "Offline"
|
||||
msgstr "Nepovezano"
|
||||
|
||||
#: ../js/ui/userMenu.js:764
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Notifications"
|
||||
msgstr "Obvestila"
|
||||
|
||||
#: ../js/ui/userMenu.js:772
|
||||
#: ../js/ui/userMenu.js:786
|
||||
msgid "Settings"
|
||||
msgstr "Nastavitve"
|
||||
|
||||
#: ../js/ui/userMenu.js:780
|
||||
#: ../js/ui/userMenu.js:794
|
||||
msgid "Switch User"
|
||||
msgstr "Preklopi uporabnika"
|
||||
|
||||
#: ../js/ui/userMenu.js:785
|
||||
#: ../js/ui/userMenu.js:799
|
||||
msgid "Log Out"
|
||||
msgstr "Odjava"
|
||||
|
||||
#: ../js/ui/userMenu.js:805
|
||||
#: ../js/ui/userMenu.js:819
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Namesti posodobitve in ponovno zaženi"
|
||||
|
||||
#: ../js/ui/userMenu.js:823
|
||||
#: ../js/ui/userMenu.js:837
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno"
|
||||
|
||||
#: ../js/ui/userMenu.js:824
|
||||
#: ../js/ui/userMenu.js:838
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@ -1801,6 +1814,24 @@ msgstr ""
|
||||
"povezanosti se je prilagodilo, da bodo drugi vedeli, da njihovih sporočil "
|
||||
"morda ne boste opazili."
|
||||
|
||||
#: ../js/ui/userMenu.js:884
|
||||
msgid "Other users are logged in."
|
||||
msgstr "Prijavljeni so tudi drugi uporabniki."
|
||||
|
||||
#: ../js/ui/userMenu.js:889
|
||||
msgid "Shutting down might cause them to lose unsaved work."
|
||||
msgstr "Z izklopom je njihovo delo lahko izgubljeno."
|
||||
|
||||
#: ../js/ui/userMenu.js:915
|
||||
#, c-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (oddaljeno)"
|
||||
|
||||
#: ../js/ui/userMenu.js:917
|
||||
#, c-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (konzola)"
|
||||
|
||||
#: ../js/ui/viewSelector.js:85
|
||||
msgid "Applications"
|
||||
msgstr "Programi"
|
||||
@ -1891,6 +1922,14 @@ msgstr "Geslo ne more biti prazno"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Uporabnik je zavrnil pogovorno okno overitve"
|
||||
|
||||
#~ msgctxt "event list time"
|
||||
#~ msgid "%H:%M"
|
||||
#~ msgstr "%H:%M"
|
||||
|
||||
#~ msgctxt "event list time"
|
||||
#~ msgid "%l:%M %p"
|
||||
#~ msgstr "%l:%M %p"
|
||||
|
||||
#~ msgid "United Kingdom"
|
||||
#~ msgstr "Velika Britanija"
|
||||
|
||||
|
565
po/zh_HK.po
565
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
565
po/zh_TW.po
565
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@ -284,7 +284,7 @@ default_log_handler (const char *log_domain,
|
||||
|
||||
/* Filter out telepathy-glib logs, we don't want to flood Shell's output
|
||||
* with those. */
|
||||
if (!g_str_has_prefix (log_domain, "tp-glib"))
|
||||
if (!log_domain || !g_str_has_prefix (log_domain, "tp-glib"))
|
||||
g_log_default_handler (log_domain, log_level, message, data);
|
||||
}
|
||||
|
||||
|
@ -236,6 +236,60 @@ shell_generic_container_set_skip_paint (ShellGenericContainer *self,
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
shell_generic_container_get_paint_volume (ClutterActor *self,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
ClutterActorBox paint_box, alloc_box;
|
||||
StThemeNode *theme_node;
|
||||
ClutterVertex origin;
|
||||
|
||||
/* Setting the paint volume does not make sense when we don't have any allocation */
|
||||
if (!clutter_actor_has_allocation (self))
|
||||
return FALSE;
|
||||
|
||||
theme_node = st_widget_get_theme_node (ST_WIDGET (self));
|
||||
clutter_actor_get_allocation_box (self, &alloc_box);
|
||||
|
||||
st_theme_node_get_paint_box (theme_node, &alloc_box, &paint_box);
|
||||
|
||||
origin.x = paint_box.x1 - alloc_box.x1;
|
||||
origin.y = paint_box.y1 - alloc_box.y1;
|
||||
origin.z = 0.0f;
|
||||
|
||||
clutter_paint_volume_set_origin (volume, &origin);
|
||||
clutter_paint_volume_set_width (volume, paint_box.x2 - paint_box.x1);
|
||||
clutter_paint_volume_set_height (volume, paint_box.y2 - paint_box.y1);
|
||||
|
||||
if (!clutter_actor_get_clip_to_allocation (self))
|
||||
{
|
||||
ClutterActor *child;
|
||||
/* Based on ClutterGroup/ClutterBox; include the children's
|
||||
* paint volumes, since they may paint outside our allocation.
|
||||
*/
|
||||
for (child = clutter_actor_get_first_child (self);
|
||||
child != NULL;
|
||||
child = clutter_actor_get_next_sibling (child))
|
||||
{
|
||||
const ClutterPaintVolume *child_volume;
|
||||
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||
continue;
|
||||
|
||||
if (shell_generic_container_get_skip_paint (SHELL_GENERIC_CONTAINER (self), child))
|
||||
continue;
|
||||
|
||||
child_volume = clutter_actor_get_transformed_paint_volume (child, self);
|
||||
if (!child_volume)
|
||||
return FALSE;
|
||||
|
||||
clutter_paint_volume_union (volume, child_volume);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
shell_generic_container_finalize (GObject *object)
|
||||
{
|
||||
@ -260,6 +314,7 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
|
||||
actor_class->allocate = shell_generic_container_allocate;
|
||||
actor_class->paint = shell_generic_container_paint;
|
||||
actor_class->pick = shell_generic_container_pick;
|
||||
actor_class->get_paint_volume = shell_generic_container_get_paint_volume;
|
||||
|
||||
widget_class->get_focus_chain = shell_generic_container_get_focus_chain;
|
||||
|
||||
|
@ -802,20 +802,22 @@ global_stage_notify_height (GObject *gobject,
|
||||
g_object_notify (G_OBJECT (global), "screen-height");
|
||||
}
|
||||
|
||||
static void
|
||||
global_stage_before_paint (ClutterStage *stage,
|
||||
ShellGlobal *global)
|
||||
static gboolean
|
||||
global_stage_before_paint (gpointer data)
|
||||
{
|
||||
shell_perf_log_event (shell_perf_log_get_default (),
|
||||
"clutter.stagePaintStart");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
global_stage_after_paint (ClutterStage *stage,
|
||||
ShellGlobal *global)
|
||||
static gboolean
|
||||
global_stage_after_paint (gpointer data)
|
||||
{
|
||||
shell_perf_log_event (shell_perf_log_get_default (),
|
||||
"clutter.stagePaintDone");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* This is an IBus workaround. The flow of events with IBus is that every time
|
||||
@ -939,10 +941,13 @@ _shell_global_set_plugin (ShellGlobal *global,
|
||||
g_signal_connect (global->stage, "notify::height",
|
||||
G_CALLBACK (global_stage_notify_height), global);
|
||||
|
||||
g_signal_connect (global->stage, "paint",
|
||||
G_CALLBACK (global_stage_before_paint), global);
|
||||
g_signal_connect_after (global->stage, "paint",
|
||||
G_CALLBACK (global_stage_after_paint), global);
|
||||
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
|
||||
global_stage_before_paint,
|
||||
NULL, NULL);
|
||||
|
||||
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
||||
global_stage_after_paint,
|
||||
NULL, NULL);
|
||||
|
||||
shell_perf_log_define_event (shell_perf_log_get_default(),
|
||||
"clutter.stagePaintStart",
|
||||
|
@ -602,7 +602,8 @@ st_entry_key_press_event (ClutterActor *actor,
|
||||
|
||||
/* copy */
|
||||
if ((event->modifier_state & CLUTTER_CONTROL_MASK)
|
||||
&& event->keyval == CLUTTER_c)
|
||||
&& event->keyval == CLUTTER_c &&
|
||||
clutter_text_get_password_char ((ClutterText*) priv->entry) == 0)
|
||||
{
|
||||
StClipboard *clipboard;
|
||||
gchar *text;
|
||||
@ -622,7 +623,8 @@ st_entry_key_press_event (ClutterActor *actor,
|
||||
|
||||
/* cut */
|
||||
if ((event->modifier_state & CLUTTER_CONTROL_MASK)
|
||||
&& event->keyval == CLUTTER_x)
|
||||
&& event->keyval == CLUTTER_x &&
|
||||
clutter_text_get_password_char ((ClutterText*) priv->entry) == 0)
|
||||
{
|
||||
StClipboard *clipboard;
|
||||
gchar *text;
|
||||
|
@ -64,20 +64,20 @@ void main ()
|
||||
|
||||
float vfade_scale = height / vfade_offset;
|
||||
if (fade_top) {
|
||||
ratio *= FADE((y / vfade_offset), min(vvalue * vfade_scale, 1.0));
|
||||
ratio *= FADE((y / vfade_offset), min(sqrt(vvalue) * vfade_scale, 1.0));
|
||||
}
|
||||
|
||||
if (fade_bottom) {
|
||||
ratio *= FADE((fade_area[1][1] - y)/(fade_area[1][1] - fade_bottom_start), min((1.0 - vvalue) * vfade_scale, 1.0));
|
||||
ratio *= FADE((fade_area[1][1] - y)/(fade_area[1][1] - fade_bottom_start), min(sqrt(1.0 - vvalue) * vfade_scale, 1.0));
|
||||
}
|
||||
|
||||
float hfade_scale = width / hfade_offset;
|
||||
if (fade_left) {
|
||||
ratio *= FADE(x / hfade_offset, min(hvalue * hfade_scale, 1.0));
|
||||
ratio *= FADE(x / hfade_offset, min(sqrt(hvalue) * hfade_scale, 1.0));
|
||||
}
|
||||
|
||||
if (fade_right) {
|
||||
ratio *= FADE((fade_area[1][0] - x)/(fade_area[1][0] - fade_right_start), min((1.0 - hvalue) * hfade_scale, 1.0));
|
||||
ratio *= FADE((fade_area[1][0] - x)/(fade_area[1][0] - fade_right_start), min(sqrt(1.0 - hvalue) * hfade_scale, 1.0));
|
||||
}
|
||||
|
||||
cogl_color_out *= ratio;
|
||||
|
@ -101,6 +101,7 @@ struct _StScrollViewPrivate
|
||||
gboolean row_size_set : 1;
|
||||
gboolean column_size_set : 1;
|
||||
guint mouse_scroll : 1;
|
||||
guint overlay_scrollbars : 1;
|
||||
guint hscrollbar_visible : 1;
|
||||
guint vscrollbar_visible : 1;
|
||||
};
|
||||
@ -115,6 +116,7 @@ enum {
|
||||
PROP_HSCROLLBAR_VISIBLE,
|
||||
PROP_VSCROLLBAR_VISIBLE,
|
||||
PROP_MOUSE_SCROLL,
|
||||
PROP_OVERLAY_SCROLLBARS,
|
||||
};
|
||||
|
||||
static void
|
||||
@ -148,6 +150,9 @@ st_scroll_view_get_property (GObject *object,
|
||||
case PROP_MOUSE_SCROLL:
|
||||
g_value_set_boolean (value, priv->mouse_scroll);
|
||||
break;
|
||||
case PROP_OVERLAY_SCROLLBARS:
|
||||
g_value_set_boolean (value, priv->overlay_scrollbars);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
}
|
||||
@ -212,6 +217,10 @@ st_scroll_view_set_property (GObject *object,
|
||||
st_scroll_view_set_mouse_scrolling (self,
|
||||
g_value_get_boolean (value));
|
||||
break;
|
||||
case PROP_OVERLAY_SCROLLBARS:
|
||||
st_scroll_view_set_overlay_scrollbars (self,
|
||||
g_value_get_boolean (value));
|
||||
break;
|
||||
case PROP_HSCROLLBAR_POLICY:
|
||||
st_scroll_view_set_policy (self,
|
||||
g_value_get_enum (value),
|
||||
@ -376,14 +385,14 @@ st_scroll_view_get_preferred_width (ClutterActor *actor,
|
||||
account_for_vscrollbar = FALSE;
|
||||
break;
|
||||
case GTK_POLICY_ALWAYS:
|
||||
account_for_vscrollbar = TRUE;
|
||||
account_for_vscrollbar = !priv->overlay_scrollbars;
|
||||
break;
|
||||
case GTK_POLICY_AUTOMATIC:
|
||||
/* For automatic scrollbars, we always request space for the vertical
|
||||
* scrollbar; we won't know whether we actually need one until our
|
||||
* height is assigned in allocate().
|
||||
*/
|
||||
account_for_vscrollbar = TRUE;
|
||||
account_for_vscrollbar = !priv->overlay_scrollbars;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -448,14 +457,14 @@ st_scroll_view_get_preferred_height (ClutterActor *actor,
|
||||
account_for_hscrollbar = FALSE;
|
||||
break;
|
||||
case GTK_POLICY_ALWAYS:
|
||||
account_for_hscrollbar = TRUE;
|
||||
account_for_hscrollbar = !priv->overlay_scrollbars;
|
||||
break;
|
||||
case GTK_POLICY_AUTOMATIC:
|
||||
/* For automatic scrollbars, we always request space for the horizontal
|
||||
* scrollbar; we won't know whether we actually need one until our
|
||||
* width is assigned in allocate().
|
||||
*/
|
||||
account_for_hscrollbar = TRUE;
|
||||
account_for_hscrollbar = !priv->overlay_scrollbars;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -626,14 +635,15 @@ st_scroll_view_allocate (ClutterActor *actor,
|
||||
clutter_actor_allocate (priv->hscroll, &child_box, flags);
|
||||
}
|
||||
|
||||
/* In case the scrollbar policy is NEVER, we don't trim the content
|
||||
* box allocation by the scrollbar size.
|
||||
/* In case the scrollbar policy is NEVER or scrollbars should be
|
||||
* overlayed, we don't trim the content box allocation by the
|
||||
* scrollbar size.
|
||||
* Fold this into the scrollbar sizes to simplify the rest of the
|
||||
* computations.
|
||||
*/
|
||||
if (priv->hscrollbar_policy == GTK_POLICY_NEVER)
|
||||
if (priv->hscrollbar_policy == GTK_POLICY_NEVER || priv->overlay_scrollbars)
|
||||
sb_height = 0;
|
||||
if (priv->vscrollbar_policy == GTK_POLICY_NEVER)
|
||||
if (priv->vscrollbar_policy == GTK_POLICY_NEVER || priv->overlay_scrollbars)
|
||||
sb_width = 0;
|
||||
|
||||
/* Child */
|
||||
@ -828,6 +838,14 @@ st_scroll_view_class_init (StScrollViewClass *klass)
|
||||
PROP_MOUSE_SCROLL,
|
||||
pspec);
|
||||
|
||||
pspec = g_param_spec_boolean ("overlay-scrollbars",
|
||||
"Use Overlay Scrollbars",
|
||||
"Overlay scrollbars over the content",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_OVERLAY_SCROLLBARS,
|
||||
pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1090,6 +1108,49 @@ st_scroll_view_get_mouse_scrolling (StScrollView *scroll)
|
||||
return priv->mouse_scroll;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_scroll_view_set_overlay_scrollbars:
|
||||
* @scroll: A #StScrollView
|
||||
* @enabled: Whether to enable overlay scrollbars
|
||||
*
|
||||
* Sets whether scrollbars are painted on top of the content.
|
||||
*/
|
||||
void
|
||||
st_scroll_view_set_overlay_scrollbars (StScrollView *scroll,
|
||||
gboolean enabled)
|
||||
{
|
||||
StScrollViewPrivate *priv;
|
||||
|
||||
g_return_if_fail (ST_IS_SCROLL_VIEW (scroll));
|
||||
|
||||
priv = ST_SCROLL_VIEW (scroll)->priv;
|
||||
|
||||
if (priv->overlay_scrollbars != enabled)
|
||||
{
|
||||
priv->overlay_scrollbars = enabled;
|
||||
g_object_notify (G_OBJECT (scroll), "overlay-scrollbars");
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (scroll));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* st_scroll_view_get_overlay_scrollbars:
|
||||
* @scroll: A #StScrollView
|
||||
*
|
||||
* Gets the value set by st_scroll_view_set_overlay_scrollbars().
|
||||
*/
|
||||
gboolean
|
||||
st_scroll_view_get_overlay_scrollbars (StScrollView *scroll)
|
||||
{
|
||||
StScrollViewPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (ST_IS_SCROLL_VIEW (scroll), FALSE);
|
||||
|
||||
priv = ST_SCROLL_VIEW (scroll)->priv;
|
||||
|
||||
return priv->overlay_scrollbars;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_scroll_view_set_policy:
|
||||
* @scroll: A #StScrollView
|
||||
|
@ -80,6 +80,10 @@ void st_scroll_view_set_mouse_scrolling (StScrollView *scroll,
|
||||
gboolean enabled);
|
||||
gboolean st_scroll_view_get_mouse_scrolling (StScrollView *scroll);
|
||||
|
||||
void st_scroll_view_set_overlay_scrollbars (StScrollView *scroll,
|
||||
gboolean enabled);
|
||||
gboolean st_scroll_view_get_overlay_scrollbars (StScrollView *scroll);
|
||||
|
||||
void st_scroll_view_set_policy (StScrollView *scroll,
|
||||
GtkPolicyType hscroll,
|
||||
GtkPolicyType vscroll);
|
||||
|
@ -791,6 +791,9 @@ st_widget_get_paint_volume (ClutterActor *self,
|
||||
{
|
||||
const ClutterPaintVolume *child_volume;
|
||||
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||
continue;
|
||||
|
||||
child_volume = clutter_actor_get_transformed_paint_volume (child, self);
|
||||
if (!child_volume)
|
||||
return FALSE;
|
||||
|
@ -339,6 +339,10 @@ function test() {
|
||||
let vfade = new St.Button({ label: 'No', style: 'text-decoration: underline; color: #4444ff;' });
|
||||
fadeBox.add(vfade);
|
||||
|
||||
fadeBox.add(new St.Label({ text: 'Overlay scrollbars: '}));
|
||||
let overlay = new St.Button({ label: 'No', style: 'text-decoration: underline; color: #4444ff;' });
|
||||
fadeBox.add(overlay);
|
||||
|
||||
function togglePadding(button) {
|
||||
switch(button.label) {
|
||||
case 'No':
|
||||
@ -388,6 +392,20 @@ function test() {
|
||||
vfade.connect('clicked', function() { toggleFade(vfade); });
|
||||
toggleFade(vfade);
|
||||
|
||||
function toggleOverlay(button) {
|
||||
switch(button.label) {
|
||||
case 'No':
|
||||
button.label = 'Yes';
|
||||
break;
|
||||
case 'Yes':
|
||||
button.label = 'No';
|
||||
break;
|
||||
}
|
||||
scrollView.overlay_scrollbars = (button.label == 'Yes');
|
||||
}
|
||||
|
||||
overlay.connect('clicked', function() { toggleOverlay(overlay); });
|
||||
|
||||
UI.main(stage);
|
||||
}
|
||||
test();
|
||||
|
Reference in New Issue
Block a user