Skip to content
Commits on Source (127)
This diff is collapsed.
# History of versions #
* Version 23
* Use the system bell sound instead of GSound (Sergio Costas)
* Transformed DING into a Gtk.Application (Sergio Costas)
* Code cleaning (Sundeep Mediratta and Sergio Costas)
* Fixed loss of focus when an application goes full screen (Sergio Costas)
* Fixed translation problems when installed system-wide (Sergio Costas)
* Fixed pictures preview (Sundeep Mediratta)
* Removed some warnings in the log (Sergio Costas)
* Don't reload the desktop when a window changes to FullScreen (Daniel van Vugt)
* Catch Gio exceptions from extra folders (Daniel van Vugt)
* Version 22
* GSound is now optional (Sergio Costas)
* Version 21
* New folders get a default name and, then, are renamed if the user wants (Sundeep Mediratta)
* Several fixes for DnD (Sergio Costas and Sundeep Mediratta)
* Removed odd symbols from windows title (Sergio Costas)
* Added support for search files in the desktop (Sundeep Mediratta)
* Support nested folders in scripts and templates (Sergio Costas)
* Fixed a crash if a file is created and deleted too quickly (Sundeep Mediratta)
* The desktop now receives the focus when there are no other windows in the current workspace (Sergio Costas)
* Better error management in several places (Sundeep Mediratta and Sergio Costas)
* Version 20
* Removed gir1.2-clutter dependency (Sergio Costas)
* Added compatibility with Gnome Shell 41 (Daniel van Vugt)
* Version 19
* Alt+Enter shows properties like Nautilus (Sundeep Mediratta)
* Hide error windows, new folder window, dialog window and prefrences from taskbar and pager (Sundeep Mediratta)
* "Extract" menu item (Sundeep Mediratta)
* Ignore distance in double-clicks, needed for touch screens (Kai-Heng Feng)
* Dont draw green highlight around desktop when dragging and dropping files on it (Sundeep Mediratta)
* Global rubberband (Sundeep Mediratta)
* Smaller icon targets to allow more usable space for right click, and extra padding around rendered icons (Sundeep Mediratta)
* Allows to arrange and sort icons (Sundeep Mediratta)
* Don't unselect the icons after moving them (Sergio Costas)
* Fixed the default location in network mounts (Juha Erkkilä)
* Use the new Nautilus.FileOperations2 API (Marco Trevisan)
* Version 0.18.0
* Pretty selection (Daniel Van Vugt)
* Don't draw green rectangle on screen (Sundeep Mediratta)
* Support for High DPI rendering of icons (Daniel Van Vugt)
* Added "Extract" and "Extract to" options (Sundeep Mediratta)
* Update desktop via DBus metadata change notification (Sundeep Mediratta)
* Version 0.17.0
* Now the preferences are shown in Gnome Shell 40 (Sergio Costas)
* Version 0.16.0
* Simple shadow to improve appearance (Daniel van Vugt)
* Compatibility with Gnome Shell 40 (Sergio Costas)
* Don't show "Email" option if a folder is selected (Sundeep Mediratta)
* Changed the text for "Preferences", to make easier to identify it as "Desktop icons preferences"
* Make new folders near the place where the user did right click (Sundeep Mediratta)
* Version 0.15.0
* Allow to create a folder from a selection of files (Sundeep Mediratta)
* Allow to compress a selection of files (Sundeep Mediratta)
* Allow to send by mail a selection of files (Sundeep Mediratta)
* Allow to show properties of a selection of files (Sundeep Mediratta)
* Added support for scripts (Sundeep Mediratta)
* Updates the desktop icons when the icon theme has changed (Artyom Zorin)
* Now adds new icons to the main screen (Sergio Costas)
* Added hotkey to show/hide hidden files in the desktop (Sergio Costas)
* Added support for dual GPUs (Sergio Costas)
* Improved readability (Ivailo Iliev)
* Now doesn't maximize a minimized window when closing a popup menu (Sergio Costas)
* Keep selected a new file created from templates (Sergio Costas)
* Version 0.14.0
* Now RETURN key in "New folder" and "Rename" only works when the "OK" button is enabled
* Now doesn't use 100% of CPU when an external drive has been mounted by another user
* Version 0.13.0
* added support for fractional zoom
* fixed bug when closing Gedit without saving
* ensures that new icons are added in the right corner always
* shows the destination of a DnD operation
* fix bug when showing drives
* don't show an error when aborting a DnD operation
* Version 0.12.0
* Don't fail if there is no TEMPLATES folder
* Support Ctrl+A for 'select all'
* Use "Home" as the name of the user's personal folder
* Show mounted drives in the desktop
* Re-read the desktop on error
* Custom icons support
* Detect changes in the size of the working area
* Preserves the drop place for remote places
* Better detection for focus loss
* Don't fail if there is no TEMPLATES folder
* Support Ctrl+A for 'select all'
* Use "Home" as the name of the user's personal folder
* Show mounted drives in the desktop
* Re-read the desktop on error
* Custom icons support
* Detect changes in the size of the working area
* Preserves the drop place for remote places
* Better detection for focus loss
* Version 0.11.0 (2020/04/17)
* Copy files instead of move when using DnD into another drive
* Removed flicker when a file is created or removed
* Fix DnD for Chrome and other programs
* Template support
* Allow to choose the align corner for the icons
* Added "Select all" option
* Added support for preview
* Creates folders in the place where the mouse cursor is
* Copy files instead of move when using DnD into another drive
* Removed flicker when a file is created or removed
* Fix DnD for Chrome and other programs
* Template support
* Allow to choose the align corner for the icons
* Added "Select all" option
* Added support for preview
* Creates folders in the place where the mouse cursor is
* Version 0.10.0 (2020/02/22)
* Added 'tiny' icon size
* Doesn't allow to use an existing name when renaming or creating a new folder
* Fixed the DnD positioning (finally)
* Added 'tiny' icon size
* Doesn't allow to use an existing name when renaming or creating a new folder
* Fixed the DnD positioning (finally)
* Version 0.9.1 (2020/02/06)
* Now "Delete permanently" works again
* Now "Delete permanently" works again
* Version 0.9.0 (2020/01/31)
* Fix bug that prevented it to work with Gnome Shell 3.30
* Fix bug that prevented it to work with Gnome Shell 3.30
* Version 0.8.0 (2020/01/19)
* Fix memory leak when using the rubber band too fast
* Add finally full support for multimonitor and HiDPI combined
* Better precision in DnD
* Fix memory leak when using the rubber band too fast
* Add finally full support for multimonitor and HiDPI combined
* Better precision in DnD
* Version 0.7.0 (2019/12/09)
* Don't show ".desktop" in enabled .desktop files
* Appearance more consistent with Nautilus
* Allows to permanently delete files
* When clicking on a text script, honors "executable-text-activation" setting and, if set, asks what to do
* Honors "show-image-thumbnails" setting
* .desktop files are now launched with the $HOME folder as the current folder
* Allows to run script files with blank spaces in the file name
* Shows an error if Nautilus is not available in the system
* Shows an error if a file or folder can't be permanently deleted
* Added note about configuration
* Don't show ".desktop" in enabled .desktop files
* Appearance more consistent with Nautilus
* Allows to permanently delete files
* When clicking on a text script, honors "executable-text-activation" setting and, if set, asks what to do
* Honors "show-image-thumbnails" setting
* .desktop files are now launched with the $HOME folder as the current folder
* Allows to run script files with blank spaces in the file name
* Shows an error if Nautilus is not available in the system
* Shows an error if a file or folder can't be permanently deleted
* Added note about configuration
* Version 0.6.0 (2019/10/29)
* Fix icon distribution in the desktop
* Show the "Name" field in the .desktop files
* Better wrap of the names
* Show a tooltip with the filename
* Show a hand mouse cursor on "single click" policy
* Add "delete permanently" option
* Shift + Delete do "delete permanently"
* Better detection of screen size change
* Show symlink emblem also in .desktop files and in files with preview
* Fix "symlink in all icons" bug
* Ensure that all the emblems fit in the icon
* Fix icon distribution in the desktop
* Show the "Name" field in the .desktop files
* Better wrap of the names
* Show a tooltip with the filename
* Show a hand mouse cursor on "single click" policy
* Add "delete permanently" option
* Shift + Delete do "delete permanently"
* Better detection of screen size change
* Show symlink emblem also in .desktop files and in files with preview
* Fix "symlink in all icons" bug
* Ensure that all the emblems fit in the icon
* Version 0.5.0 (2019/10/15)
* Fix right-click menu in trash not showing sometimes
* Fix opening a file during New folder operation
* Changed license to GPLv3 only
* Fix right-click menu in trash not showing sometimes
* Fix opening a file during New folder operation
* Changed license to GPLv3 only
* Version 0.4.0 (2019/10/04)
* Fix Drag'n'Drop in some special cases
* Don't relaunch the desktop process when disabling and enabling fast
* Temporary fix for X11 size
* Fix Drag'n'Drop in some special cases
* Don't relaunch the desktop process when disabling and enabling fast
* Temporary fix for X11 size
* Version 0.3.0 (2019/09/17)
* Separate Wayland and X11 paths
* When a file is dropped from another window, it is done at the cursor
* Fixed bug when dragging several files into a Nautilus window
* Separate Wayland and X11 paths
* When a file is dropped from another window, it is done at the cursor
* Fixed bug when dragging several files into a Nautilus window
* Version 0.2.0 (2019/08/19)
* Shows the full filename if selected
* Use theme color for selections
* Sends debug info to the journal
* Now kills fine old, unneeded processes
* Allows to launch the desktop app as standalone
* Ensures that the desktop is kept at background when switching workspaces
* Honors the Scale value (for retina-like monitors)
* Hotkeys
* Check if the desktop folder is writable by others
* Now the settings window doesn't block the icons
* Don't show hidden files
* Shows the full filename if selected
* Use theme color for selections
* Sends debug info to the journal
* Now kills fine old, unneeded processes
* Allows to launch the desktop app as standalone
* Ensures that the desktop is kept at background when switching workspaces
* Honors the Scale value (for retina-like monitors)
* Hotkeys
* Check if the desktop folder is writable by others
* Now the settings window doesn't block the icons
* Don't show hidden files
* Version 0.1.0 (2019/08/13)
* First semi-working version version
* Has everything supported by Desktop Icons, plus Drag'n'Drop
* First semi-working version version
* Has everything supported by Desktop Icons, plus Drag'n'Drop
/* DING: Desktop Icons New Generation for GNOME Shell
*
* Copyright (C) 2019 Sergio Costas (rastersoft@gmail.com)
* Based on code original (C) Carlos Soriano
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const DesktopIconsUtil = imports.desktopIconsUtil;
const Gettext = imports.gettext.domain('ding');
const _ = Gettext.gettext;
var AskNamePopup = class {
constructor(filename, title, parentWindow) {
this._desktopPath = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP);
this._window = new Gtk.Dialog({use_header_bar: true,
window_position: Gtk.WindowPosition.CENTER_ON_PARENT,
transient_for: parentWindow,
resizable: false});
this._button = this._window.add_button(_("OK"), Gtk.ResponseType.OK);
this._window.add_button(_("Cancel"), Gtk.ResponseType.CANCEL);
this._window.set_modal(true);
this._window.set_title(title);
DesktopIconsUtil.windowHidePagerTaskbarModal(this._window, true);
let contentArea = this._window.get_content_area();
this._textArea = new Gtk.Entry();
if (filename) {
this._textArea.text = filename;
}
contentArea.pack_start(this._textArea, true, true, 5);
this._textArea.connect('activate', () => {
if (this._button.sensitive) {
this._window.response(Gtk.ResponseType.OK);
}
});
this._textArea.connect('changed', () => {
this._validate();
});
this._validate();
}
_validate() {
let text = this._textArea.text;
let final_path = this._desktopPath + '/' + text;
let final_file = Gio.File.new_for_commandline_arg(final_path);
if ((text == '') || (-1 != text.indexOf('/')) || final_file.query_exists(null)) {
this._button.sensitive = false;
} else {
this._button.sensitive = true;
}
}
run() {
this._window.show_all();
let retval = this._window.run();
this._window.hide();
if (retval == Gtk.ResponseType.OK) {
return this._textArea.text;
} else {
return null;
}
}
};
......@@ -27,8 +27,10 @@ const _ = Gettext.gettext;
var AskRenamePopup = class {
constructor(fileItem) {
constructor(fileItem, allowReturnOnSameName, closeCB) {
this._closeCB = closeCB;
this._allowReturnOnSameName = allowReturnOnSameName;
this._desktopPath = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP);
this._fileItem = fileItem;
this._popover = new Gtk.Popover({relative_to: fileItem.container,
......@@ -44,7 +46,7 @@ var AskRenamePopup = class {
this._textArea = new Gtk.Entry();
this._textArea.text = fileItem.fileName;
contentBox.attach(this._textArea, 0, 1, 1, 1);
this._button = new Gtk.Button({label: _("Rename")});
this._button = new Gtk.Button({label: allowReturnOnSameName ? _("OK") : _("Rename")});
contentBox.attach(this._button, 1, 1, 1, 1);
this._button.connect('clicked', () => {
this._do_rename();
......@@ -57,10 +59,15 @@ var AskRenamePopup = class {
this._do_rename();
}
});
this._popover.connect('closed', () => {
closeCB();
});
this._textArea.set_can_default(true);
this._popover.set_default_widget(this._textArea);
this._button.get_style_context().add_class("suggested-action");
this._popover.show_all();
contentBox.show_all();
this._popover.popup();
this._popover.set_relative_to(this._fileItem._iconContainer);
this._validate();
this._textArea.grab_focus_without_selecting();
this._textArea.select_region(0, DesktopIconsUtil.getFileExtensionOffset(fileItem.fileName, fileItem.isDirectory));
......@@ -70,7 +77,9 @@ var AskRenamePopup = class {
let text = this._textArea.text;
let final_path = this._desktopPath + '/' + text;
let final_file = Gio.File.new_for_commandline_arg(final_path);
if ((text == '') || (-1 != text.indexOf('/')) || (text == this._fileItem.fileName) || final_file.query_exists(null)) {
if ((text == '') || (-1 != text.indexOf('/')) ||
((text == this._fileItem.fileName) && (!this._allowReturnOnSameName)) ||
(final_file.query_exists(null) && (text != this._fileItem.fileName))) {
this._button.sensitive = false;
} else {
this._button.sensitive = true;
......@@ -78,6 +87,11 @@ var AskRenamePopup = class {
}
_do_rename() {
this._popover.popdown();
this._closeCB();
if (this._fileItem.fileName == this._textArea.text) {
return;
}
DBusUtils.NautilusFileOperations2Proxy.RenameURIRemote(
this._fileItem.file.get_uri(), this._textArea.text,
DBusUtils.NautilusFileOperations2Proxy.platformData(),
......
......@@ -21,15 +21,36 @@
const GnomeDesktop = imports.gi.GnomeDesktop;
const Gio = imports.gi.Gio;
let thumbnailFactory = GnomeDesktop.DesktopThumbnailFactory.new(GnomeDesktop.DesktopThumbnailSize.LARGE);
let file = Gio.File.new_for_path(ARGV[0]);
let fileUri = file.get_uri();
let fileInfo = file.query_info('standard::content-type,time::modified', Gio.FileQueryInfoFlags.NONE, null);
let modifiedTime = fileInfo.get_attribute_uint64('time::modified');
let thumbnailPixbuf = thumbnailFactory.generate_thumbnail(fileUri, fileInfo.get_content_type());
if (thumbnailPixbuf == null)
thumbnailFactory.create_failed_thumbnail(fileUri, modifiedTime);
else
thumbnailFactory.save_thumbnail(thumbnailPixbuf, fileUri, modifiedTime);
function CreateThumbnail() {
let thumbnailFactory = GnomeDesktop.DesktopThumbnailFactory.new(GnomeDesktop.DesktopThumbnailSize.LARGE);
let file = Gio.File.new_for_path(ARGV[0]);
if (!file.query_exists(null)) {
return 1;
}
let fileUri = file.get_uri();
let fileInfo = file.query_info('standard::content-type,time::modified', Gio.FileQueryInfoFlags.NONE, null);
let modifiedTime = fileInfo.get_attribute_uint64('time::modified');
// check if the thumbnail has been already created in the meantime by another program
let thumbnail = thumbnailFactory.lookup(fileUri, modifiedTime);
if (thumbnail != null) {
return 3;
}
if (thumbnailFactory.has_valid_failed_thumbnail(fileUri, modifiedTime)) {
return 4;
}
// now, generate the file
let thumbnailPixbuf = thumbnailFactory.generate_thumbnail(fileUri, fileInfo.get_content_type());
if (thumbnailPixbuf == null) {
thumbnailFactory.create_failed_thumbnail(fileUri, modifiedTime);
return 2;
} else {
thumbnailFactory.save_thumbnail(thumbnailPixbuf, fileUri, modifiedTime);
return 0;
}
}
CreateThumbnail();
......@@ -62,7 +62,7 @@ var DesktopGrid = class {
this._elementWidth = Math.floor(this._width / this._maxColumns);
this._elementHeight = Math.floor(this._height / this._maxRows);
this._window = new Gtk.Window({"title": desktopName});
this._window = new Gtk.ApplicationWindow({application: desktopManager.mainApp, "title": desktopName});
if (asDesktop) {
this._window.set_decorated(false);
this._window.set_deletable(false);
......@@ -83,7 +83,7 @@ var DesktopGrid = class {
return true;
} else {
// Exit if this instance is working as an stand-alone window
Gtk.main_quit();
return false;
}
});
......@@ -167,21 +167,73 @@ var DesktopGrid = class {
targets.add(Gdk.atom_intern('text/plain', false), 0, 3);
dropDestination.drag_dest_set_target_list(targets);
dropDestination.connect('drag-motion', (widget, context, x, y, time) => {
x = this._elementWidth * Math.floor(x / this._elementWidth);
y = this._elementHeight * Math.floor(y / this._elementHeight);
[x, y] = this._coordinatesLocalToGlobal(x, y);
this._desktopManager.onDragMotion(x, y);
this.receiveMotion(x, y);
});
this._eventBox.connect('drag-leave', (widget, context, time) => {
this._desktopManager.onDragLeave();
this.receiveLeave();
});
dropDestination.connect('drag-data-received', (widget, context, x, y, selection, info, time) => {
this.receiveDrop(x, y, selection, info, false);
});
}
receiveLeave() {
this._desktopManager.onDragLeave();
}
receiveMotion(x, y, global) {
if (! global) {
x = this._elementWidth * Math.floor(x / this._elementWidth);
y = this._elementHeight * Math.floor(y / this._elementHeight);
[x, y] = this._coordinatesLocalToGlobal(x, y);
this._desktopManager.onDragDataReceived(x, y, selection, info);
this._window.queue_draw();
});
}
this._desktopManager.onDragMotion(x, y);
}
receiveDrop(x, y, selection, info, forceLocal) {
if (! forceLocal) {
x = this._elementWidth * Math.floor(x / this._elementWidth);
y = this._elementHeight * Math.floor(y / this._elementHeight);
[x, y] = this._coordinatesLocalToGlobal(x, y);
}
this._desktopManager.onDragDataReceived(x, y, selection, info, forceLocal);
this._window.queue_draw();
}
highLightGridAt(x,y) {
let selected = this.getGridAt(x, y, false);
this._selectedList = [selected];
this._window.queue_draw();
}
unHighLightGrids() {
this._selectedList = null;
this._window.queue_draw();
}
_getGridCoordinates(x, y, clamp) {
let placeX = Math.floor(x / this._elementWidth);
let placeY = Math.floor(y / this._elementHeight);
placeX = DesktopIconsUtil.clamp(placeX, 0, this._maxColumns - 1);
placeY = DesktopIconsUtil.clamp(placeY, 0, this._maxRows - 1);
return [placeX, placeY];
}
gridInUse(x, y) {
let [placeX, placeY] = this._getGridCoordinates(x, y);
return !this._isEmptyAt(placeX, placeY);
}
getGridLocalCoordinates(x, y) {
let [column, row] = this._getGridCoordinates(x, y);
let localX = Math.floor(this._width * column / this._maxColumns);
let localY = Math.floor(this._height * row / this._maxRows);
return [localX, localY];
}
_fileAt(x,y) {
let [placeX, placeY] = this._getGridCoordinates(x, y);
return this._gridStatus[placeY * this._maxColumns + placeX];
}
refreshDrag(selectedList, ox, oy) {
......@@ -194,8 +246,8 @@ var DesktopGrid = class {
for (let [x, y] of selectedList) {
x += ox;
y += oy;
let r = this.getGridAt(x, y, false);
if (r !== null) {
let r = this.getGridAt(x, y);
if ((r !== null) && ((!this.gridInUse(r[0], r[1])) || this._fileAt(r[0], r[1]).isSelected)) {
newSelectedList.push(r);
}
}
......@@ -301,10 +353,13 @@ var DesktopGrid = class {
_addFileItemTo(fileItem, column, row, coordinatesAction) {
if (this._destroying) {
return;
}
let localX = Math.floor(this._width * column / this._maxColumns);
let localY = Math.floor(this._height * row / this._maxRows);
this._container.put(fileItem.container, localX + elementSpacing, localY + elementSpacing);
this._setGridUse(column, row, true);
this._setGridUse(column, row, fileItem);
this._fileItems[fileItem.uri] = [column, row, fileItem];
let [x, y] = this._coordinatesLocalToGlobal(localX + elementSpacing, localY + elementSpacing);
fileItem.setCoordinates(x,
......@@ -344,7 +399,7 @@ var DesktopGrid = class {
}
_isEmptyAt(x,y) {
return !this._gridStatus[y * this._maxColumns + x];
return (this._gridStatus[y * this._maxColumns + x] === false);
}
_setGridUse(x, y, inUse) {
......@@ -354,12 +409,14 @@ var DesktopGrid = class {
getGridAt(x, y, globalCoordinates) {
if (this._coordinatesBelongToThisGrid(x, y)) {
[x, y] = this._coordinatesGlobalToLocal(x, y);
x = this._elementWidth * Math.floor((x / this._elementWidth) + 0.5);
y = this._elementHeight * Math.floor((y / this._elementHeight) + 0.5);
if (globalCoordinates) {
x = this._elementWidth * Math.floor((x / this._elementWidth) + 0.5);
y = this._elementHeight * Math.floor((y / this._elementHeight) + 0.5);
[x, y] = this._coordinatesLocalToGlobal(x, y);
return [x, y];
} else {
return this.getGridLocalCoordinates(x, y);
}
return [x, y];
} else {
return null;
}
......
......@@ -36,6 +36,14 @@ function getScriptsDir() {
return Gio.File.new_for_commandline_arg(scriptsDir);
}
function getTemplatesDir() {
let templatesDir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_TEMPLATES);
if (templatesDir == GLib.get_home_dir()) {
return null;
}
return Gio.File.new_for_commandline_arg(templatesDir)
}
function clamp(value, min, max) {
return Math.max(Math.min(value, max), min);
};
......@@ -254,10 +262,13 @@ function windowHidePagerTaskbarModal(window, modal) {
window.set_skip_pager_hint(true);
} else {
let title = window.get_title();
if (title == null) {
title = "";
}
if (modal) {
title = title + '@!HTD';
title = title + ' ';
} else {
title = title + '@!H';
title = title + ' ';
}
window.set_title(title);
}
......@@ -270,3 +281,11 @@ function windowHidePagerTaskbarModal(window, modal) {
window.grab_focus();
}
}
function waitDelayMs(ms) {
return new Promise( (resolve, reject) => {
GLib.timeout_add(GLib.PRIORITY_DEFAULT, ms, () => {
resolve();
});
});
}
This diff is collapsed.
......@@ -78,18 +78,41 @@ if (desktops.length == 0) {
imports.searchPath.unshift(codePath);
const DBusUtils = imports.dbusUtils;
const Prefs = imports.preferences;
const Gettext = imports.gettext;
Gettext.bindtextdomain("ding", GLib.build_filenamev([codePath, "locale"]));
let localePath = GLib.build_filenamev([codePath, "locale"]);
if (Gio.File.new_for_path(localePath).query_exists(null)) {
Gettext.bindtextdomain("ding", localePath);
}
const DesktopManager = imports.desktopManager;
var desktopManager = null;
if (!errorFound) {
Gtk.init(null);
Prefs.init(codePath);
var desktopManager = new DesktopManager.DesktopManager(desktops, codePath, asDesktop, primaryIndex);
Gtk.main();
// Use different AppIDs to allow to test it from a command line while the main desktop is also running from the extension
const dingApp = new Gtk.Application({application_id: asDesktop ? 'com.rastersoft.ding' : 'com.rastersoft.dingtest',
flags: Gio.ApplicationFlags.FLAGS_NONE});
dingApp.connect('startup', () => {
Prefs.init(codePath);
DBusUtils.init();
});
dingApp.connect('activate', () => {
if (!desktopManager) {
desktopManager = new DesktopManager.DesktopManager(dingApp,
desktops,
codePath,
asDesktop,
primaryIndex);
}
});
dingApp.run(null);
// return value
0;
} else {
......
......@@ -37,10 +37,11 @@ class ManageWindow {
without decorations.
*/
constructor(window, wayland_client) {
constructor(window, wayland_client, changedStatusCB) {
this._wayland_client = wayland_client;
this._window = window;
this._signalIDs = [];
this._changedStatusCB = changedStatusCB;
this._signalIDs.push(window.connect_after('raised', () => {
if (this._keepAtBottom && !this._keepAtTop) {
this._window.lower();
......@@ -54,6 +55,11 @@ class ManageWindow {
this._signalIDs.push(window.connect("notify::title", () => {
this._parseTitle();
}));
this._signalIDs.push(window.connect("notify::above", () => {
if (this._keepAtBottom && this._window.above) {
this._window.unmake_above();
}
}));
this._parseTitle();
}
......@@ -83,6 +89,13 @@ class ManageWindow {
this._fixed = false;
let title = this._window.get_title();
if (title != null) {
if ((title.length > 0) && (title[title.length-1] == ' ')) {
if ((title.length > 1) && (title[title.length-2] == ' ')) {
title = "@!HTD";
} else {
title = "@!H";
}
}
let pos = title.search("@!");
if (pos != -1) {
let pos2 = title.search(";", pos)
......@@ -96,7 +109,7 @@ class ManageWindow {
this._x = parseInt(coords[0]);
this._y = parseInt(coords[1]);
} catch(e) {
print(`Exception ${e.message}`);
global.log(`Exception ${e.message}.\n${e.stack}`);
}
try {
let extra_chars = title.substring(pos+2).trim().toUpperCase();
......@@ -122,7 +135,7 @@ class ManageWindow {
}
}
} catch(e) {
print(`Exception ${e.message}`);
global.log(`Exception ${e.message}.\n${e.stack}`);
}
}
if (this._wayland_client) {
......@@ -145,19 +158,20 @@ class ManageWindow {
if (this._fixed && (this._x !== null) && (this._y !== null)) {
this._window.move_frame(false, this._x, this._y);
}
this._changedStatusCB(this);
}
}
refreshState(checkWorkspace) {
if (this._keepAtBottom) {
this._window.lower();
}
if (checkWorkspace && this._showInAllDesktops) {
let currentWorkspace = global.workspace_manager.get_active_workspace();
if (!this._window.located_on_workspace(currentWorkspace)) {
this._window.change_workspace(currentWorkspace);
}
}
if (this._keepAtBottom) {
this._window.lower();
}
}
get hideFromWindowList() {
......@@ -281,7 +295,9 @@ var EmulateX11WindowType = class {
if (window.get_meta_window) { // it is a MetaWindowActor
window = window.get_meta_window();
}
window.customJS_ding = new ManageWindow(window, this._wayland_client);
window.customJS_ding = new ManageWindow(window, this._wayland_client, () => {
this._refreshWindows(true);
});
this._windowList.push(window);
window.customJS_ding.unmanagedID = window.connect("unmanaged", (window) => {
this._clearWindow(window);
......@@ -305,12 +321,22 @@ var EmulateX11WindowType = class {
if (checkWorkspace) {
// activate the top-most window
let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, global.workspace_manager.get_active_workspace());
let anyActive = false;
for (let window of windows) {
if ((!window.customJS_ding || !window.customJS_ding._keepAtBottom) && !window.minimized) {
Main.activateWindow(window);
anyActive = true;
break;
}
}
if (!anyActive) {
for (let window of this._windowList) {
if (window.customJS_ding && window.customJS_ding._keepAtBottom && !window.minimized) {
Main.activateWindow(window);
break;
}
}
}
}
}
this._activate_window_ID = null;
......
......@@ -153,7 +153,12 @@ function reloadIfSizesChanged() {
let ws = global.workspace_manager.get_workspace_by_index(0);
let area = ws.get_work_area_for_monitor(monitorIndex);
let area2 = data.desktopCoordinates[monitorIndex];
let scale = Main.layoutManager.monitors[monitorIndex].geometry_scale;
let monitor = Main.layoutManager.monitors[monitorIndex];
let scale = monitor.geometry_scale;
if (monitor.inFullscreen)
continue;
if ((area.x != area2.x) ||
(area.y != area2.y) ||
(area.width != area2.width) ||
......@@ -354,10 +359,10 @@ var LaunchSubprocess = class {
} else {
this.subprocess = this._launcher.spawnv(argv);
}
/* This is for GLib 2.68
// This is for GLib 2.68 or greater
if (this._launcher.close) {
this._launcher.close();
}*/
}
this._launcher = null;
if (this.subprocess) {
/*
......
This diff is collapsed.
/* DING: Desktop Icons New Generation for GNOME Shell
*
* Copyright (C) 2021 Sergio Costas (rastersoft@gmail.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
const DBusUtils = imports.dbusUtils;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const TemplatesScriptsManager = imports.templatesScriptsManager;
const DesktopIconsUtil = imports.desktopIconsUtil;
const Prefs = imports.preferences;
const ShowErrorPopup = imports.showErrorPopup;
const Gettext = imports.gettext.domain('ding');
const _ = Gettext.gettext;
var FileItemMenu = class {
constructor(desktopManager) {
this._desktopManager = desktopManager;
this._decompressibleTypes = [];
this._getExtractionSupportedTypes();
this._scriptsMonitor = new TemplatesScriptsManager.TemplatesScriptsManager(
DesktopIconsUtil.getScriptsDir(),
TemplatesScriptsManager.TemplatesScriptsManagerFlags.ONLY_EXECUTABLE,
this._onScriptClicked.bind(this));
}
_getExtractionSupportedTypes() {
DBusUtils.GnomeArchiveManagerProxy.GetSupportedTypesRemote('extract',
(result, error) => {
if (error) {
throw new Error('Error getting extractable Types' + error.message);
}
for (let key of result.values()) {
for (let type of key.values()) {
this._decompressibleTypes.push(Object.values(type)[0]);
}
}
}
);
}
_onScriptClicked(menuItemPath) {
let pathList = [];
let uriList = [];
for (let item of this._desktopManager.getCurrentSelection(false) ) {
if (!item.isSpecial) {
pathList.push("'" + item.file.get_path() + "\n'");
uriList.push("'" + item.file.get_uri() + "\n'");
}
}
pathList = pathList.join("");
uriList = uriList.join("");
let deskTop = "'" + DesktopIconsUtil.getDesktopDir().get_uri() + "'";
let execline = `/bin/bash -c "`;
execline += `NAUTILUS_SCRIPT_SELECTED_FILE_PATHS=${pathList} `;
execline += `NAUTILUS_SCRIPT_SELECTED_URIS=${uriList} `;
execline += `NAUTILUS_SCRIPT_CURRENT_URI=${deskTop} `;
execline += `'${menuItemPath}'"`;
DesktopIconsUtil.spawnCommandLine(execline);
}
showMenu(fileItem, event) {
let addElementToMenu = function(label, action = null) {
let element = new Gtk.MenuItem({label: label});
this._menu.add(element);
if (action) {
element.connect('activate', action);
}
return element;
}.bind(this);
let addSeparator = function() {
this._menu.add(new Gtk.SeparatorMenuItem());
}.bind(this);
let selectedItemsNum = this._desktopManager.getNumberOfSelectedItems();
this._menu = new Gtk.Menu();
this._menu.connect_after('selection-done', () => {
this._menu.destroy();
this._menu = null;
});
addElementToMenu(
selectedItemsNum > 1 ? _("Open All...") : _("Open"),
this._doMultiOpen.bind(this)
);
// fileExtra == NONE
if (fileItem.isAllSelectable) {
let submenu = this._scriptsMonitor.createMenu();
if (submenu !== null) {
addElementToMenu(_("Scripts")).set_submenu(submenu);
addSeparator();
}
if (!fileItem.isDirectory) {
addElementToMenu(
selectedItemsNum > 1 ? _("Open All With Other Application...") : _("Open With Other Application"),
this._doOpenWith.bind(this)
).set_sensitive(selectedItemsNum > 0);
if (DBusUtils.discreteGpuAvailable && fileItem.trustedDesktopFile) {
addElementToMenu(
_('Launch using Dedicated Graphics Card'),
() => {fileItem.doDiscreteGpu();}
);
}
}
addSeparator();
let allowCutCopyTrash = this._desktopManager.checkIfSpecialFilesAreSelected();
addElementToMenu(
_('Cut'),
() => {this._desktopManager.doCut();}
).set_sensitive(!allowCutCopyTrash);
addElementToMenu(
_('Copy'),
() => {this._desktopManager.doCopy();}
).set_sensitive(!allowCutCopyTrash);
if (fileItem.canRename && (selectedItemsNum == 1)) {
addElementToMenu(
_('Rename…'),
() => {this._desktopManager.doRename(fileItem, false);}
);
}
addElementToMenu(
_('Move to Trash'),
() => {this._desktopManager.doTrash();}
).set_sensitive(!allowCutCopyTrash);
if (Prefs.nautilusSettings.get_boolean('show-delete-permanently')) {
addElementToMenu(
_('Delete permanently'),
() => {this._desktopManager.doDeletePermanently();}
).set_sensitive(!allowCutCopyTrash);
}
if (fileItem.isValidDesktopFile && !this._desktopManager.writableByOthers && !fileItem.writableByOthers && (selectedItemsNum == 1 )) {
addSeparator();
addElementToMenu(
fileItem.trustedDesktopFile ? _("Don't Allow Launching") : _("Allow Launching"),
() => {fileItem.onAllowDisallowLaunchingClicked();}
);
}
}
// fileExtra == TRASH
if (fileItem.isTrash) {
addSeparator();
addElementToMenu(
_('Empty Trash'),
() => {this._desktopManager.doEmptyTrash();}
);
}
// fileExtra == EXTERNAL_DRIVE
if (fileItem.isDrive) {
addSeparator();
if (fileItem.canEject) {
addElementToMenu(
_('Eject'),
() => {fileItem.eject();}
);
}
if (fileItem.canUnmount) {
addElementToMenu(
_('Unmount'),
() => {fileItem.unmount();}
);
}
}
addSeparator();
if (fileItem.isAllSelectable && (!this._desktopManager.checkIfSpecialFilesAreSelected()) && (selectedItemsNum >= 1 )) {
if (selectedItemsNum == 1 && this._getExtractable()) {
addElementToMenu(
_("Extract Here"),
() => {this._extractFileFromSelection(true);}
);
addElementToMenu(
_("Extract To..."),
() => {this._extractFileFromSelection(false);}
);
}
if (!fileItem.isDirectory) {
addElementToMenu(
_('Send to...'),
this._mailFilesFromSelection.bind(this)
);
}
addElementToMenu(
Gettext.ngettext('Compress {0} file', 'Compress {0} files', selectedItemsNum).replace('{0}', selectedItemsNum),
this._doCompressFilesFromSelection.bind(this)
);
addElementToMenu(
Gettext.ngettext('New Folder with {0} item', 'New Folder with {0} items' , selectedItemsNum).replace('{0}', selectedItemsNum),
() => {this._doNewFolderFromSelection(fileItem.savedCoordinates, fileItem);}
);
addSeparator();
}
addElementToMenu(
selectedItemsNum > 1 ? _('Common Properties') : _('Properties'),
this._onPropertiesClicked.bind(this)
);
addSeparator();
addElementToMenu(
selectedItemsNum > 1 ? _('Show All in Files') : _('Show in Files'),
this._onShowInFilesClicked.bind(this)
);
if (fileItem.isDirectory && (fileItem.path != null) && (selectedItemsNum == 1)) {
addElementToMenu(
_('Open in Terminal'),
() => {this._onOpenTerminalClicked();}
);
}
this._menu.show_all();
this._menu.popup_at_pointer(event);
}
_onPropertiesClicked() {
let propertiesFileList = this._desktopManager.getCurrentSelection(true);
DBusUtils.FreeDesktopFileManagerProxy.ShowItemPropertiesRemote(propertiesFileList, '',
(result, error) => {
if (error)
log('Error showing properties: ' + error.message);
}
);
}
_onShowInFilesClicked() {
let showInFilesList = this._desktopManager.getCurrentSelection(true);
DBusUtils.FreeDesktopFileManagerProxy.ShowItemsRemote(showInFilesList, '',
(result, error) => {
if (error)
log('Error showing file on desktop: ' + error.message);
}
);
}
_doMultiOpen() {
for (let fileItem of this._desktopManager.getCurrentSelection(false)) {
fileItem.unsetSelected();
fileItem.doOpen() ;
}
}
_doOpenWith() {
let fileItems = this._desktopManager.getCurrentSelection(false);
if (fileItems) {
let mimetype = Gio.content_type_guess(fileItems[0].fileName, null)[0];
let chooser = Gtk.AppChooserDialog.new_for_content_type(null,
Gtk.DialogFlags.MODAL + Gtk.DialogFlags.USE_HEADER_BAR,
mimetype);
chooser.show_all();
let retval = chooser.run();
chooser.hide();
if (retval == Gtk.ResponseType.OK) {
let appInfo = chooser.get_app_info();
if (appInfo) {
let fileList = [];
for (let item of fileItems) {
fileList.push(item.file);
}
appInfo.launch(fileList, null);
}
}
}
}
_extractFileFromSelection(extractHere) {
let extractFileItem = '';
let folder = ''
for (let fileItem of this._desktopManager.getCurrentSelection(false)) {
extractFileItem = fileItem.file.get_uri();
fileItem.unsetSelected();
}
if (extractHere) {
folder = DesktopIconsUtil.getDesktopDir().get_uri();
} else {
let dialog = new Gtk.FileChooserDialog({title: _('Select Extract Destination')});
dialog.set_action(Gtk.FileChooserAction.SELECT_FOLDER);
dialog.add_button(_('Cancel'), Gtk.ResponseType.CANCEL);
dialog.add_button(_('Select'), Gtk.ResponseType.ACCEPT);
DesktopIconsUtil.windowHidePagerTaskbarModal(dialog, true);
let response = dialog.run();
if (response === Gtk.ResponseType.ACCEPT) {
folder = dialog.get_uri();
}
dialog.destroy();
}
if (folder) {
DBusUtils.GnomeArchiveManagerProxy.ExtractRemote(extractFileItem, folder, true,
(result, error) => {
if (error) {
throw new Error('Error extracting files: ' + error.message);
}
}
);
}
}
_getExtractable() {
for (let item of this._desktopManager.getCurrentSelection(false)) {
return this._decompressibleTypes.includes(item._attributeContentType);
}
}
_mailFilesFromSelection() {
if (this._desktopManager.checkIfDirectoryIsSelected()) {
let WindowError = new ShowErrorPopup.ShowErrorPopup(_("Can not email a Directory"),
_("Selection includes a Directory, compress the directory to a file first."),
null,
false);
WindowError.run();
return;
}
let xdgEmailCommand = [];
xdgEmailCommand.push('xdg-email')
for (let fileItem of this._desktopManager.getCurrentSelection(false)) {
fileItem.unsetSelected;
xdgEmailCommand.push('--attach');
xdgEmailCommand.push(fileItem.file.get_path());
}
DesktopIconsUtil.trySpawn(null, xdgEmailCommand);
}
_doCompressFilesFromSelection() {
let compressFileItems = this._desktopManager.getCurrentSelection(true);
this._desktopManager.unselectAll();
let desktopFolder = DesktopIconsUtil.getDesktopDir().get_uri();
if (desktopFolder) {
DBusUtils.GnomeArchiveManagerProxy.CompressRemote(compressFileItems, desktopFolder, true,
(result, error) => {
if (error) {
throw new Error('Error compressing files: ' + error.message);
}
}
);
}
}
_doNewFolderFromSelection(position, clickedItem) {
let newFolderFileItems = this._desktopManager.getCurrentSelection(true);
this._desktopManager.unselectAll();
clickedItem.removeFromGrid(true);
let newFolder = this._desktopManager.doNewFolder(position);
if (newFolder) {
DBusUtils.NautilusFileOperations2Proxy.MoveURIsRemote(
newFolderFileItems, newFolder,
DBusUtils.NautilusFileOperations2Proxy.platformData(),
(result, error) => {
if (error) {
throw new Error('Error moving files: ' + error.message);
}
}
);
}
}
}
project('ding',
version: '0.20.0',
version: '0.23.0',
license: 'GPL3'
)
......@@ -13,8 +13,6 @@ schema_dir = join_paths(datadir, 'glib-2.0', 'schemas')
extensions_dir = join_paths(prefix, 'share', 'gnome-shell', 'extensions', 'ding@rastersoft.com')
install_data([
# 'createFolderDialog.js',
'askNamePopup.js',
'askRenamePopup.js',
'createThumbnail.js',
'dbusUtils.js',
......@@ -26,12 +24,14 @@ install_data([
'enums.js',
'extension.js',
'fileItem.js',
'fileItemMenu.js',
'metadata.json',
'prefs.js',
'preferences.js',
'showErrorPopup.js',
'stylesheet.css',
'templateManager.js'
'templatesScriptsManager.js',
'thumbnails.js'
],
install_dir: extensions_dir
)
......
askNamePopup.js
askRenamePopup.js
createThumbnail.js
dbusUtils.js
......@@ -6,11 +5,12 @@ desktopGrid.js
desktopIconsUtil.js
desktopManager.js
ding.js
emulateX11WindowType.js
enums.js
extension.js
fileItem.js
preferences.js
prefs.js
showErrorPopup.js
templateManager.js
templatesScriptsManager.js
schemas/org.gnome.shell.extensions.ding.gschema.xml
......@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-07-18 14:10+0200\n"
"POT-Creation-Date: 2021-09-21 20:21+0200\n"
"PO-Revision-Date: 2019-07-22 10:24+0200\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <info@softcatala.org>\n"
......@@ -16,268 +16,274 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n"
#: askNamePopup.js:36
msgid "OK"
msgstr "D'acord"
#: askNamePopup.js:37 desktopIconsUtil.js:211 desktopManager.js:1668
msgid "Cancel"
msgstr "Cancel·la"
#: askRenamePopup.js:40
#: askRenamePopup.js:41
msgid "Folder name"
msgstr "Nom de la carpeta"
#: askRenamePopup.js:40
#: askRenamePopup.js:41
msgid "File name"
msgstr "Nom del fitxer"
#: askRenamePopup.js:47
#: askRenamePopup.js:48 desktopManager.js:661
msgid "OK"
msgstr "D'acord"
#: askRenamePopup.js:48
msgid "Rename"
msgstr "Canvia el nom"
#: desktopIconsUtil.js:80
#: desktopIconsUtil.js:88
msgid "Command not found"
msgstr "No s'ha trobat l'ordre"
#: desktopIconsUtil.js:202
#: desktopIconsUtil.js:210
msgid "Do you want to run “{0}”, or display its contents?"
msgstr "Voleu executar «{0}» o mostrar el seu contingut?"
#: desktopIconsUtil.js:203
#: desktopIconsUtil.js:211
msgid "“{0}” is an executable text file."
msgstr "«{0}» és un fitxer de text executable."
#: desktopIconsUtil.js:207
#: desktopIconsUtil.js:215
msgid "Execute in a terminal"
msgstr "Obre al Terminal"
#: desktopIconsUtil.js:209
#: desktopIconsUtil.js:217
msgid "Show"
msgstr "Mostra"
#: desktopIconsUtil.js:213
#: desktopIconsUtil.js:219 desktopManager.js:663 desktopManager.js:1766
msgid "Cancel"
msgstr "Cancel·la"
#: desktopIconsUtil.js:221
msgid "Execute"
msgstr "Executa"
#: desktopManager.js:137
#: desktopManager.js:163
msgid "Nautilus File Manager not found"
msgstr "No s'ha trobat el gestor de fitxers del Nautilus"
#: desktopManager.js:138
#: desktopManager.js:164
msgid "The Nautilus File Manager is mandatory to work with Desktop Icons NG."
msgstr ""
"El gestor de fitxers Nautilus és obligatori per a treballar amb les icones "
"de l'escriptori NG."
#: desktopManager.js:592
#: desktopManager.js:626
msgid "Clear Current Selection before New Search"
msgstr ""
#: desktopManager.js:665
msgid "Find Files on Desktop"
msgstr ""
#: desktopManager.js:735 desktopManager.js:1399
msgid "New Folder"
msgstr "Carpeta nova"
#: desktopManager.js:596
#: desktopManager.js:739
msgid "New Document"
msgstr "Document nou"
#: desktopManager.js:601
#: desktopManager.js:744
msgid "Paste"
msgstr "Enganxa"
#: desktopManager.js:605
#: desktopManager.js:748
msgid "Undo"
msgstr "Desfés"
#: desktopManager.js:609
#: desktopManager.js:752
msgid "Redo"
msgstr "Refés"
#: desktopManager.js:615
msgid "Select all"
#: desktopManager.js:758
#, fuzzy
msgid "Select All"
msgstr "Selecciona-ho tot"
#: desktopManager.js:623
#: desktopManager.js:766
msgid "Show Desktop in Files"
msgstr "Mostra l'escriptori al Fitxers"
#: desktopManager.js:627 fileItem.js:1002
#: desktopManager.js:770 fileItem.js:1035
msgid "Open in Terminal"
msgstr "Obre al Terminal"
#: desktopManager.js:633
#: desktopManager.js:776
msgid "Change Background…"
msgstr "Canvia el fons de l'escriptori…"
#: desktopManager.js:642
#: desktopManager.js:785
msgid "Display Settings"
msgstr "Paràmetres de la pantalla"
#: desktopManager.js:649
msgid "Desktop Icons settings"
#: desktopManager.js:792
#, fuzzy
msgid "Desktop Icons Settings"
msgstr "Paràmetres de les icones de l'escriptori"
#: desktopManager.js:660
msgid "Scripts"
msgstr "Scripts"
#: desktopManager.js:1310
msgid "New folder"
msgstr "Carpeta nova"
#: desktopManager.js:1385
#: desktopManager.js:1484
msgid "Can not email a Directory"
msgstr "No es pot enviar un directori per correu electrònic"
#: desktopManager.js:1386
#: desktopManager.js:1485
msgid "Selection includes a Directory, compress the directory to a file first."
msgstr ""
"La selecció inclou un directori, comprimeix-hi el directori en un fitxer."
#: desktopManager.js:1407
#: desktopManager.js:1506
msgid "Arrange Icons"
msgstr ""
#: desktopManager.js:1411
#: desktopManager.js:1510
msgid "Arrange By..."
msgstr ""
#: desktopManager.js:1420
#: desktopManager.js:1519
msgid "Keep Arranged..."
msgstr ""
#: desktopManager.js:1425
#: desktopManager.js:1524
msgid "Sort Home/Drives/Trash..."
msgstr ""
#: desktopManager.js:1431
#: desktopManager.js:1530
msgid "Sort by Name"
msgstr ""
#: desktopManager.js:1433
#: desktopManager.js:1532
msgid "Sort by Name Descending"
msgstr ""
#: desktopManager.js:1436
#: desktopManager.js:1535
msgid "Sort by Modified Time"
msgstr ""
#: desktopManager.js:1439
#: desktopManager.js:1538
msgid "Sort by Type"
msgstr ""
#: desktopManager.js:1442
#: desktopManager.js:1541
msgid "Sort by Size"
msgstr ""
#: desktopManager.js:1666
#: desktopManager.js:1764
msgid "Select Extract Destination"
msgstr ""
#: desktopManager.js:1669
#: desktopManager.js:1767
#, fuzzy
msgid "Select"
msgstr "Selecciona-ho tot"
#. TRANSLATORS: "Home" is the text that will be shown in the user's personal folder
#: fileItem.js:196
#: fileItem.js:223
msgid "Home"
msgstr "Inici"
#: fileItem.js:898
#: fileItem.js:925
msgid "Open All..."
msgstr "Obre-ho tot..."
#: fileItem.js:898
#: fileItem.js:925
msgid "Open"
msgstr "Obre"
#: fileItem.js:905
#: fileItem.js:930
msgid "Scripts"
msgstr "Scripts"
#: fileItem.js:938
msgid "Open All With Other Application..."
msgstr "Obre amb una altra aplicació..."
#: fileItem.js:905
#: fileItem.js:938
msgid "Open With Other Application"
msgstr "Obre amb una altra aplicació..."
#: fileItem.js:909
#: fileItem.js:942
msgid "Launch using Dedicated Graphics Card"
msgstr "Llança usant targeta gràfica dedicada"
#: fileItem.js:917
#: fileItem.js:950
msgid "Cut"
msgstr "Retalla"
#: fileItem.js:920
#: fileItem.js:953
msgid "Copy"
msgstr "Copia"
#: fileItem.js:924
#: fileItem.js:957
msgid "Rename…"
msgstr "Canvia el nom…"
#: fileItem.js:928
#: fileItem.js:961
msgid "Move to Trash"
msgstr "Mou a la paperera"
#: fileItem.js:932
#: fileItem.js:965
msgid "Delete permanently"
msgstr "Suprimeix permanentment"
#: fileItem.js:938
#: fileItem.js:971
msgid "Don't Allow Launching"
msgstr "No permetis que s'iniciï"
#: fileItem.js:938
#: fileItem.js:971
msgid "Allow Launching"
msgstr "Permet que s'iniciï"
#: fileItem.js:945
#: fileItem.js:978
msgid "Empty Trash"
msgstr "Buida la paperera"
#: fileItem.js:952
#: fileItem.js:985
msgid "Eject"
msgstr "Expulsa"
#: fileItem.js:959
#: fileItem.js:992
msgid "Unmount"
msgstr "Desmunta"
#: fileItem.js:974
#: fileItem.js:1007
msgid "Extract Here"
msgstr "Extreu aquí"
#: fileItem.js:977
#: fileItem.js:1010
msgid "Extract To..."
msgstr "Extreu a..."
#: fileItem.js:982
#: fileItem.js:1015
msgid "Send to..."
msgstr "Envia a..."
#: fileItem.js:986
#: fileItem.js:1019
msgid "Compress {0} file"
msgid_plural "Compress {0} files"
msgstr[0] "Comprimeix {0} fitxer"
msgstr[1] "Comprimeix {0} fitxers"
#: fileItem.js:989
#: fileItem.js:1022
msgid "New Folder with {0} item"
msgid_plural "New Folder with {0} items"
msgstr[0] "Carpeta nova amb {0} element"
msgstr[1] "Carpeta nova amb {0} elements"
#: fileItem.js:994
#: fileItem.js:1027
msgid "Common Properties"
msgstr "Propietats comunes"
#: fileItem.js:994
#: fileItem.js:1027
msgid "Properties"
msgstr "Propietats"
#: fileItem.js:998
#: fileItem.js:1031
msgid "Show All in Files"
msgstr "Mostra al Fitxers"
#: fileItem.js:998
#: fileItem.js:1031
msgid "Show in Files"
msgstr "Mostra al Fitxers"
......@@ -503,6 +509,9 @@ msgstr ""
msgid "Icons Arranged by this property"
msgstr ""
#~ msgid "New folder"
#~ msgstr "Carpeta nova"
#~ msgid "Delete"
#~ msgstr "Suprimeix"
......
......@@ -3,283 +3,287 @@
# This file is distributed under the same license as the desktop-icons package.
# Marek Černocký <marek@manet.cz>, 2018.
# Milan Zink <zeten30@gmail.com>, 2018.
# panmourovaty <dominikhejl@yahoo.com>, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: desktop-icons master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-07-18 14:10+0200\n"
"PO-Revision-Date: 2021-06-15 18:20+0200\n"
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
"POT-Creation-Date: 2021-09-21 20:21+0200\n"
"PO-Revision-Date: 2021-09-24 12:49+0200\n"
"Last-Translator: panmourovaty <dominikhejl@yahoo.com>\n"
"Language-Team: Czech <zeten30@gmail.com>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Poedit 2.4.2\n"
"X-Generator: Poedit 3.0\n"
#: askNamePopup.js:36
msgid "OK"
msgstr "Budiž"
#: askNamePopup.js:37 desktopIconsUtil.js:211 desktopManager.js:1668
msgid "Cancel"
msgstr "Zrušit"
#: askRenamePopup.js:40
#: askRenamePopup.js:41
msgid "Folder name"
msgstr "Název nové složky"
#: askRenamePopup.js:40
#: askRenamePopup.js:41
msgid "File name"
msgstr "Přejmenovat soubor"
#: askRenamePopup.js:47
#: askRenamePopup.js:48 desktopManager.js:661
msgid "OK"
msgstr "Budiž"
#: askRenamePopup.js:48
msgid "Rename"
msgstr "Přejmenovat"
#: desktopIconsUtil.js:80
#: desktopIconsUtil.js:88
msgid "Command not found"
msgstr "Příkaz nebyl nalezen"
#: desktopIconsUtil.js:202
#: desktopIconsUtil.js:210
msgid "Do you want to run “{0}”, or display its contents?"
msgstr "Chcete spustit “{0}” nebo chcete zobrazit obsah?"
#: desktopIconsUtil.js:203
#: desktopIconsUtil.js:211
msgid "“{0}” is an executable text file."
msgstr "“{0}” je spustitelný soubor."
#: desktopIconsUtil.js:207
#: desktopIconsUtil.js:215
msgid "Execute in a terminal"
msgstr "Spustit v terminálu"
#: desktopIconsUtil.js:209
#: desktopIconsUtil.js:217
msgid "Show"
msgstr "Zobrazit"
#: desktopIconsUtil.js:213
#: desktopIconsUtil.js:219 desktopManager.js:663 desktopManager.js:1766
msgid "Cancel"
msgstr "Zrušit"
#: desktopIconsUtil.js:221
msgid "Execute"
msgstr "Spustit"
#: desktopManager.js:137
#: desktopManager.js:163
msgid "Nautilus File Manager not found"
msgstr "Správce souborů Nautilus nebyl nalezen"
#: desktopManager.js:138
#: desktopManager.js:164
msgid "The Nautilus File Manager is mandatory to work with Desktop Icons NG."
msgstr "Správce Souborů Nautilus je nezbytný pro práci s Desktop Icons NG."
#: desktopManager.js:592
#: desktopManager.js:626
msgid "Clear Current Selection before New Search"
msgstr "Vymazat aktuální výběr před novým hledáním"
#: desktopManager.js:665
msgid "Find Files on Desktop"
msgstr "Najít soubory na Ploše"
#: desktopManager.js:735 desktopManager.js:1399
msgid "New Folder"
msgstr "Nová složka"
#: desktopManager.js:596
#: desktopManager.js:739
msgid "New Document"
msgstr "Nový Dokument"
#: desktopManager.js:601
#: desktopManager.js:744
msgid "Paste"
msgstr "Vložit"
#: desktopManager.js:605
#: desktopManager.js:748
msgid "Undo"
msgstr "Zpět"
#: desktopManager.js:609
#: desktopManager.js:752
msgid "Redo"
msgstr "Znovu"
#: desktopManager.js:615
msgid "Select all"
#: desktopManager.js:758
msgid "Select All"
msgstr "Vybrat vše"
#: desktopManager.js:623
#: desktopManager.js:766
msgid "Show Desktop in Files"
msgstr "Zobrazit plochu v Souborech"
#: desktopManager.js:627 fileItem.js:1002
#: desktopManager.js:770 fileItem.js:1035
msgid "Open in Terminal"
msgstr "Otevřít v terminálu"
#: desktopManager.js:633
#: desktopManager.js:776
msgid "Change Background…"
msgstr "Změnit pozadí…"
#: desktopManager.js:642
#: desktopManager.js:785
msgid "Display Settings"
msgstr "Zobrazit nastavení"
#: desktopManager.js:649
msgid "Desktop Icons settings"
#: desktopManager.js:792
msgid "Desktop Icons Settings"
msgstr "Nastavení ikon na ploše"
#: desktopManager.js:660
msgid "Scripts"
msgstr "Skripty"
#: desktopManager.js:1310
msgid "New folder"
msgstr "Nová složka"
#: desktopManager.js:1385
#: desktopManager.js:1484
msgid "Can not email a Directory"
msgstr "Nemůžete poslat složku emailem"
#: desktopManager.js:1386
#: desktopManager.js:1485
msgid "Selection includes a Directory, compress the directory to a file first."
msgstr "Výběr obsahuje Složku, nejdříve musíte zkomprimovat složku do souboru."
#: desktopManager.js:1407
#: desktopManager.js:1506
msgid "Arrange Icons"
msgstr ""
msgstr "Uspořádat Ikony"
#: desktopManager.js:1411
#: desktopManager.js:1510
msgid "Arrange By..."
msgstr ""
msgstr "Uspořádat podle..."
#: desktopManager.js:1420
#: desktopManager.js:1519
msgid "Keep Arranged..."
msgstr ""
msgstr "Nechat uspořádané..."
#: desktopManager.js:1425
#: desktopManager.js:1524
msgid "Sort Home/Drives/Trash..."
msgstr ""
msgstr "Seřadit Domovská složka/Jednotky/Koš..."
#: desktopManager.js:1431
#: desktopManager.js:1530
msgid "Sort by Name"
msgstr ""
msgstr "Seřadit podle Jména"
#: desktopManager.js:1433
#: desktopManager.js:1532
msgid "Sort by Name Descending"
msgstr ""
msgstr "Seřadit podle Jména sestupně"
#: desktopManager.js:1436
#: desktopManager.js:1535
msgid "Sort by Modified Time"
msgstr ""
msgstr "Seřadit podle Času úpravy"
#: desktopManager.js:1439
#: desktopManager.js:1538
msgid "Sort by Type"
msgstr ""
msgstr "Seřadit podle Typu"
#: desktopManager.js:1442
#: desktopManager.js:1541
msgid "Sort by Size"
msgstr ""
msgstr "Seřadit podle Velikosti"
#: desktopManager.js:1666
#: desktopManager.js:1764
msgid "Select Extract Destination"
msgstr ""
msgstr "Vybrat místo k extrahování"
#: desktopManager.js:1669
#, fuzzy
#: desktopManager.js:1767
msgid "Select"
msgstr "Vybrat vše"
#. TRANSLATORS: "Home" is the text that will be shown in the user's personal folder
#: fileItem.js:196
#: fileItem.js:223
msgid "Home"
msgstr "Domovská Složka"
#: fileItem.js:898
#: fileItem.js:925
msgid "Open All..."
msgstr "Otevřít vše..."
#: fileItem.js:898
#: fileItem.js:925
msgid "Open"
msgstr "Otevřít"
#: fileItem.js:905
#: fileItem.js:930
msgid "Scripts"
msgstr "Skripty"
#: fileItem.js:938
msgid "Open All With Other Application..."
msgstr "Otevřít vše v jiné aplikaci..."
#: fileItem.js:905
#: fileItem.js:938
msgid "Open With Other Application"
msgstr "Otevřít pomocí jiné aplikace"
#: fileItem.js:909
#: fileItem.js:942
msgid "Launch using Dedicated Graphics Card"
msgstr "Spustit pomocí dedikované grafické karty"
#: fileItem.js:917
#: fileItem.js:950
msgid "Cut"
msgstr "Vyjmout"
#: fileItem.js:920
#: fileItem.js:953
msgid "Copy"
msgstr "Kopírovat"
#: fileItem.js:924
#: fileItem.js:957
msgid "Rename…"
msgstr "Přejmenovat…"
#: fileItem.js:928
#: fileItem.js:961
msgid "Move to Trash"
msgstr "Přesunout do koše"
#: fileItem.js:932
#: fileItem.js:965
msgid "Delete permanently"
msgstr "Odstranit nadobro"
#: fileItem.js:938
#: fileItem.js:971
msgid "Don't Allow Launching"
msgstr "Nepovolit spouštění"
#: fileItem.js:938
#: fileItem.js:971
msgid "Allow Launching"
msgstr "Povolit spouštění"
#: fileItem.js:945
#: fileItem.js:978
msgid "Empty Trash"
msgstr "Vyprázdnit koš"
#: fileItem.js:952
#: fileItem.js:985
msgid "Eject"
msgstr "Vysunout"
#: fileItem.js:959
#: fileItem.js:992
msgid "Unmount"
msgstr "Odpojit"
#: fileItem.js:974
#: fileItem.js:1007
msgid "Extract Here"
msgstr "Rozbalit sem"
#: fileItem.js:977
#: fileItem.js:1010
msgid "Extract To..."
msgstr "Rozbalit do…"
#: fileItem.js:982
#: fileItem.js:1015
msgid "Send to..."
msgstr "Poslat..."
#: fileItem.js:986
#: fileItem.js:1019
msgid "Compress {0} file"
msgid_plural "Compress {0} files"
msgstr[0] "Zkomprimovat {0} soubor"
msgstr[1] "Zkomprimovat {0} soubory"
msgstr[2] "Zkomprimovat {0} souborů"
#: fileItem.js:989
#: fileItem.js:1022
msgid "New Folder with {0} item"
msgid_plural "New Folder with {0} items"
msgstr[0] "Nová složka s {0} položkou"
msgstr[1] "Nová složka s {0} položkami"
msgstr[2] "Nová složka s {0} položkami"
#: fileItem.js:994
#: fileItem.js:1027
msgid "Common Properties"
msgstr "Vlastnosti"
#: fileItem.js:994
#: fileItem.js:1027
msgid "Properties"
msgstr "Vlastnosti"
#: fileItem.js:998
#: fileItem.js:1031
msgid "Show All in Files"
msgstr "Zobrazit vše v Souborech"
#: fileItem.js:998
#: fileItem.js:1031
msgid "Show in Files"
msgstr "Zobrazit v Souborech"
......@@ -417,7 +421,7 @@ msgstr ""
#: showErrorPopup.js:37
msgid "Close"
msgstr ""
msgstr "Zavřít"
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:25
msgid "Icon size"
......@@ -481,29 +485,34 @@ msgstr ""
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:65
msgid "Sort Special Folders - Home/Trash Drives."
msgstr ""
msgstr "Seřadit speciální složky - Domovská složka/Jednotky/Koš."
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:66
msgid ""
"When arranging Icons on desktop, to sort and change the position of the "
"Home, Trash and mounted Network or External Drives"
msgstr ""
"Při uspořádání ikon na ploše můžete třídit a měnit polohu Domácí složky, "
"koše a připojených síťových nebo externích jednotek"
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:70
msgid "Keep Icons Arranged"
msgstr ""
msgstr "Nechat Ikony uspořádané"
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:71
msgid "Always keep Icons Arranged by the last arranged order"
msgstr ""
msgstr "Vždy nechat Ikony seřazené podle posledního řazení"
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:75
msgid "Arrange Order"
msgstr ""
msgstr "Pořadí seřazené"
#: schemas/org.gnome.shell.extensions.ding.gschema.xml:76
msgid "Icons Arranged by this property"
msgstr ""
msgstr "Ikony seřazené podle této vlastnosti"
#~ msgid "New folder"
#~ msgstr "Nová složka"
#~ msgid "Delete"
#~ msgstr "Odstranit"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.