nemo-6.4.5/0000775000175000017500000000000014757107430011420 5ustar fabiofabionemo-6.4.5/debian/0000775000175000017500000000000014757107430012642 5ustar fabiofabionemo-6.4.5/config.h.meson.in0000664000175000017500000000266414757107430014573 0ustar fabiofabio#pragma once // config.h.in. Generated from configure.ac by autoheader. // Define to the version of this package. #mesondefine VERSION // Enable debug code #mesondefine ENABLE_DEBUG // ***** Enable features // define to enable the empty view that is used for performance measurement #mesondefine ENABLE_EMPTY_VIEW // Define to enable xmp support #mesondefine HAVE_EXEMPI // Define to enable EXIF support #mesondefine HAVE_EXIF // Define if libselinux is available #mesondefine HAVE_SELINUX // Define to enable pango-1.44 fixes #mesondefine HAVE_PANGO_144 // ***** Localisation // always defined to indicate that i18n is enabled #mesondefine ENABLE_NLS #mesondefine HAVE_GETTEXT // the gettext translation domain #mesondefine GETTEXT_PACKAGE // Define to 1 if you have the header file. #mesondefine HAVE_LOCALE_H // path for translations #mesondefine LOCALEDIR #mesondefine LOCALE_DIR // Define to 1 if you have the header file. #mesondefine HAVE_MALLOC_H // Define to 1 if you have the `mallopt' function. #mesondefine HAVE_MALLOPT // Define to 1 if you have the header file. #mesondefine HAVE_SYS_MOUNT_H // Define to 1 if you have the header file. #mesondefine HAVE_SYS_PARAM_H // Define to 1 if you have the header file. #mesondefine HAVE_SYS_VFS_H // Define to 1 if you have the header file. #mesondefine HAVE_X11_XF86KEYSYM_H #mesondefine ENABLE_TRACKER nemo-6.4.5/meson.build0000664000175000017500000001546314757107430013573 0ustar fabiofabio# Meson build file # https://github.com/linuxmint/nemo project('nemo', 'c', version : '6.4.5', meson_version : '>=0.56.0') # 1. If the library code has changed at all since last release, then increment revision. # 2. If any interfaces have been added, then increment current and set revision to 0. # Interface break is not allowed. nemo_extension_current = 5 nemo_extension_revision = 0 # We need to decrement current by one in the calculation of the age because # the library was started with version "1:0:0" instead of "0:0:0" NEMO_EXTENSION_VERSION_INFO = '@0@:@1@:@2@'.format( nemo_extension_current, nemo_extension_revision, nemo_extension_current - 1 ) ################################################################################ conf = configuration_data() gnome = import('gnome') pkgconfig = import('pkgconfig') cc = meson.get_compiler('c') prefix = get_option('prefix') buildtype = get_option('buildtype') # Surround the version in quotes to make it a C string conf.set_quoted('VERSION', meson.project_version()) check_headers = [ 'malloc.h', 'sys/mount.h', 'sys/param.h', 'sys/vfs.h', 'X11/XF86keysym.h', ] foreach h : check_headers conf.set10('HAVE_' + h.underscorify().to_upper(), cc.has_header(h)) endforeach conf.set10('HAVE_MALLOPT', cc.has_function('mallopt', prefix: '#include ')) if not get_option('deprecated_warnings') add_global_arguments([ '-Wno-deprecated-declarations', '-Wno-deprecated', '-Wno-declaration-after-statement', '-DGLIB_DISABLE_DEPRECATION_WARNINGS', ], language: 'c', ) endif if buildtype in ['debug', 'debugoptimized'] conf.set('ENABLE_DEBUG', true) endif if buildtype == 'debug' add_global_arguments('-fno-omit-frame-pointer', language: 'c') endif ################################################################################ # Find dependencies glib_version = '>=2.45.7' math = cc.find_library('m', required: true) gtk = dependency('gtk+-3.0', version: '>=3.10.0') gio = dependency('gio-2.0', version: glib_version) gio_unix= dependency('gio-unix-2.0', version: glib_version) glib = dependency('glib-2.0', version: glib_version) gmodule = dependency('gmodule-no-export-2.0', version: glib_version) gobject = dependency('gobject-2.0', version: '>=2.0') go_intr = dependency('gobject-introspection-1.0', version: '>=1.0') json = dependency('json-glib-1.0', version: '>=1.6') cinnamon= dependency('cinnamon-desktop', version: '>=4.8.0') gail = dependency('gail-3.0') x11 = dependency('x11') xapp = dependency('xapp', version: '>=2.0.0') # Facultative dependencies trackerChoice = get_option('tracker') tracker_enabled = false if trackerChoice != 'false' trackerRequired = (trackerChoice == 'true') # Check all the possible versions tracker_sparql = dependency('tracker-sparql-3.0', required: false) if not tracker_sparql.found() tracker_sparql = dependency('tracker-sparql-2.0', required: false) endif if not tracker_sparql.found() tracker_sparql = dependency('tracker-sparql-1.0', required: false) endif if not tracker_sparql.found() tracker_sparql = dependency('tracker-sparql-0.18', required: false) endif if not tracker_sparql.found() tracker_sparql = dependency('tracker-sparql-0.16', required: trackerRequired) endif tracker_enabled = trackerRequired or tracker_sparql.found() endif conf.set('ENABLE_TRACKER', tracker_enabled) gtkdoc_enabled = get_option('gtk_doc') if gtkdoc_enabled find_program('gtkdoc-scan', required: true) endif libexif_enabled = get_option('exif') if libexif_enabled libexif = dependency('libexif', version: '>=0.6.20') endif conf.set('HAVE_EXIF', libexif_enabled) exempi_enabled = get_option('xmp') if exempi_enabled exempi = dependency('exempi-2.0', version: '>=2.2.0') endif conf.set('HAVE_EXEMPI', exempi_enabled) libselinux_enabled = get_option('selinux') if libselinux_enabled libselinux = dependency('libselinux', version: '>=2.0') endif conf.set('HAVE_SELINUX', libselinux_enabled) # make sure pango development files are installed pango = dependency('pango', version: '>=1.40.0') # check for newer pango for necessary workarounds new_pango = dependency('pango', version: '>=1.44.0', required: false) if new_pango.found() conf.set('HAVE_PANGO_144', true) else message('................using pango @0@ instead'.format(new_pango.version())) endif enableEmptyView = get_option('empty_view') conf.set10('ENABLE_EMPTY_VIEW', enableEmptyView) conf.set_quoted('GETTEXT_PACKAGE', 'nemo') conf.set_quoted('LOCALE_DIR', join_paths(get_option('prefix'), get_option('localedir'))) conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) conf.set('ENABLE_NLS', cc.has_header('libintl.h')) conf.set('HAVE_GETTEXT', true) conf.set('HAVE_LOCALE_H', cc.has_header('locale.h')) configure_file( input : 'config.h.meson.in', output: 'config.h', configuration: conf ) ################################################################################ rootInclude = include_directories('.') nemoDataPath = join_paths(get_option('prefix'), get_option('datadir'), 'nemo') libExecPath = join_paths(get_option('prefix'), get_option('libexecdir')) # Keep this constant, in case some extensions are behind in being updated... nemoExtensionPath = join_paths(get_option('prefix'), get_option('libdir'), 'nemo', 'extensions-3.0') nemo_definitions = [ '-DNEMO_DATADIR="@0@"'.format(nemoDataPath), '-DNEMO_EXTENSIONDIR="@0@"'.format(nemoExtensionPath), '-DLIBEXECDIR="@0@"'.format(libExecPath), '-DG_LOG_DOMAIN="Nemo"' ] po_subdir = join_paths(meson.project_source_root(), 'po') subdir('install-scripts') subdir('cut-n-paste-code/libegg') subdir('data') subdir('eel') subdir('files') subdir('gresources') subdir('libnemo-extension') subdir('libnemo-private') # subdir('po') subdir('src') subdir('search-helpers') subdir('test') subdir('docs') subdir('action-layout-editor') message('\n'.join(['', ' @0@-@1@'.format(meson.project_name(), meson.project_version()), '', ' prefix: @0@'.format(prefix), ' source code location: @0@'.format(meson.project_source_root()), ' compiler: @0@'.format(cc.get_id()), ' libexif support: @0@'.format(libexif_enabled), ' exempi support: @0@'.format(exempi_enabled), ' Tracker support: @0@'.format(tracker_enabled), ' Wayland support: @0@'.format(cc.has_header('gdk/gdkwayland.h', dependencies: gtk)), '', ' nemo-extension documentation: @0@'.format(gtkdoc_enabled), ' nemo-extension introspection: @0@'.format(true), '', ' debugging support: @0@'.format(buildtype), ' perf profiling support: @0@'.format(buildtype == 'debug'), '', ])) nemo-6.4.5/gresources/0000775000175000017500000000000014757107430013601 5ustar fabiofabionemo-6.4.5/gresources/nemo-list-view-ui.xml0000664000175000017500000000021514757107430017613 0ustar fabiofabio nemo-6.4.5/gresources/nemo-style-fallback.css0000664000175000017500000000124014757107430020141 0ustar fabiofabio/* For Places Sidebar diskfull indicators */ .places-treeview { -NemoPlacesTreeView-disk-full-bg-color: shade(@theme_bg_color, .65); -NemoPlacesTreeView-disk-full-fg-color: shade(@theme_selected_bg_color, 1.0); -NemoPlacesTreeView-disk-full-bar-width: 2px; -NemoPlacesTreeView-disk-full-bar-radius: 1px; -NemoPlacesTreeView-disk-full-bottom-padding: 1px; -NemoPlacesTreeView-disk-full-max-length: 70px; } .places-treeview:selected { -NemoPlacesTreeView-disk-full-bg-color: shade(@theme_bg_color, 2.0); -NemoPlacesTreeView-disk-full-fg-color: shade(@theme_fg_color, 2.0); } .places-treeview:hover { } .places-treeview:selected:hover { } nemo-6.4.5/gresources/nemo-icon-view-ui.xml0000664000175000017500000000360314757107430017574 0ustar fabiofabio nemo-6.4.5/gresources/nemo-desktop-icon-grid-view-ui.xml0000664000175000017500000000125514757107430022167 0ustar fabiofabio nemo-6.4.5/gresources/meson.build0000664000175000017500000000060614757107430015745 0ustar fabiofabiogresources = gnome.compile_resources( 'nemo-resources', 'nemo.gresource.xml', source_dir: '.', c_name: 'nemo', install_header: false, install: false ) layout_editor_gresources = gnome.compile_resources( 'nemo-action-layout-editor-resources', 'nemo-action-layout-editor.gresource.xml', source_dir: '.', gresource_bundle: true, install: true, install_dir: nemoDataPath ) nemo-6.4.5/gresources/thumbnail_frame.png0000664000175000017500000000427014757107430017447 0ustar fabiofabioPNG  IHDRxsRGBrIDATx۽jGw%}{8ESl AQoy`,9 .yM༮+{SG|pnosT=T?V_s{Wʿo~V]XֿUoV &` @ @` @ @ @ @ @ @ cCZ,Z @ @  @ @dsXWEK @ @ @ @1!`^m-@ @ V @ @<.{ X@ @ @X@ @  ֺ&` @ @` @ @,lsXWEK @ @ @ @1!`^m-@ @ V @ @<.{ X@ @ @X@ @  ֺ&` @ @` @ @,lsXWEK @ @ @ @1!`^m-@ @ V @ @<.{ X@ @ @X@ @_^uuSWB՘ \~a\=V՗=VOxi>nM~=pf2d˟T}_CuW}_ s6d&3]L{~#1d&3]Loۿ']w`IENDB`nemo-6.4.5/gresources/nemo-directory-view-ui.xml0000664000175000017500000002704214757107430020653 0ustar fabiofabio nemo-6.4.5/gresources/nemo-action-layout-editor.gresource.xml0000664000175000017500000000033414757107430023330 0ustar fabiofabio nemo-action-layout-editor.glade nemo-shortcuts.ui nemo-6.4.5/gresources/nemo-places-sidebar-ui.xml0000664000175000017500000000176714757107430020563 0ustar fabiofabio nemo-6.4.5/gresources/nemo-shell-ui.xml0000664000175000017500000001176214757107430017010 0ustar fabiofabio nemo-6.4.5/gresources/nemo-shortcuts.ui0000664000175000017500000005114514757107430017140 0ustar fabiofabio False True shortcuts 12 True General True New window <Primary>N True Close window or tab <Primary>W True Close all windows <Primary>Q True Toggle extra pane F3 True Search <Primary>F True Bookmark current location <Primary>D True Edit bookmarks <Primary>B True Make link <Primary>M True Pin/Unpin selection <Primary><shift>D True Show help F1 True Shortcuts <Primary>F1 True Opening True Open Return <Primary>O True Open in new tab <Primary><shift>T True Open in new window <Primary><shift>O True Open item location (recent files and search only) <Primary><alt>O True Tabs True New tab <Primary>T True Go to previous tab <Primary>Page_Up True Go to next tab <Primary>Page_Down True Switch to tab <alt>0...8 True Move tab left <shift><Primary>Page_Up True Move tab right <shift><Primary>Page_Down True Navigation True Go back BackSpace <alt>Left True Go forward <alt>Right True Go up <alt>Up True Go down <alt>Down True Go to home folder <alt>Home True Toggle location entry <Primary>L True Dual Pane True Toggle extra pane F3 True Go to other pane's location <alt>S True Focus other pane F6 True View True Zoom in <Primary>plus True Zoom out <Primary>minus True Reset zoom <Primary>0 True Refresh view F5 <Primary>R True Show/hide hidden files <Primary>H True Show/hide sidebar F9 True Show/hide action menu F10 True Icon view <Primary>1 True List view <Primary>2 True Compact view <Primary>3 True Editing True Create folder <shift><Primary>N True Rename F2 True Move to trash Delete True Delete permanently <shift>Delete True Cut <Primary>X True Copy <Primary>C True Paste <Primary>V True Select all <Primary>A True Invert selection <shift><Primary>I True Select items matching <Primary>S True Undo <Primary>z True Redo <Primary>y True Show item properties <Primary>I <alt>Return nemo-6.4.5/gresources/nemo-desktop-icon-view-ui.xml0000664000175000017500000000145714757107430021250 0ustar fabiofabio nemo-6.4.5/gresources/nemo-style-fallback-mandatory.css0000664000175000017500000000213214757107430022136 0ustar fabiofabio/* Things that can traditionally be controlled by the user theme, but that we *must* * have regardless, for a usable application. A couple things that we cannot do without. */ /* Inactive F3 pane shading */ .nemo-window .nemo-inactive-pane .view:not(:selected), .nemo-window .nemo-inactive-pane iconview { background-color: @theme_unfocused_bg_color; } /* Rename box styling in the icon view. */ .nemo-window .nemo-window-pane widget.entry { border: 1px solid; border-radius: 3px; color: @theme_fg_color; border-color: @theme_selected_bg_color; background-color: @theme_bg_color; } .nemo-window .nemo-window-pane widget.entry:selected { border: 1px solid; border-radius: 3px; color: @theme_selected_fg_color; border-color: @theme_selected_bg_color; background-color: @theme_selected_bg_color; } /* Floating bar in the bottom of a file view, used when the 'status bar' is turned off */ .floating-bar { border: 1px solid; border-radius: 3px 3px 0 0; border-bottom-width: 0; color: @theme_selected_fg_color; background-color: @theme_selected_bg_color; } nemo-6.4.5/gresources/nemo-blank-desktop-window-ui.xml0000664000175000017500000000032514757107430021735 0ustar fabiofabio nemo-6.4.5/gresources/nemo-action-layout-editor.glade0000664000175000017500000005044514757107430021617 0ustar fabiofabio True False list-remove-symbolic True False go-up-symbolic True False go-down-symbolic True False vertical True False 4 Customize the layout and appearance of your actions in Nemo's menus True 0 False True 0 True False True False 0 none True False True False vertical 10 True False 4 True True True in True True 0 True False vertical True True True Move up image5 True True 1 True True True Move down image6 True True 2 False True 1 False True 1 True False True False True True False True Add a submenu or a separator True False list-add-symbolic False True 0 True True True Remove image2 False True 1 False True 0 True False 6 True False True True False True True False Icon False True 0 True True Label center 36 edit-delete-symbolic False False Restore the original label Restore the original label True True 1 False True end 0 True False True True Enabled center center False True 2 False True end 1 True True 1 False True 3 True True 0 False True 2 True False 10 6 Save True True True False True end 0 Cancel True True True False True end 1 Restore default layout True True True False True 2 False True end 4 vertical False 10 center 600 400 nemo True False Nemo Actions Layout Editor False True True True False True True False open-menu-symbolic nemo-6.4.5/gresources/nemo-desktop-overlay.glade0000664000175000017500000016505214757107430020674 0ustar fabiofabio both vertical 50 200 100 10 10 75 200 100 10 10 True False 32 nemo-horizontal-layout-symbolic 3 True False 32 nemo-vertical-layout-symbolic 3 True False 32 nemo-auto-arrange-symbolic 3 1 Smaller Desktop Smaller 2 Small Desktop Small 3 Normal Desktop Normal 4 Large Desktop Large 5 Larger Desktop Larger Vertical Vertical Layout Horizontal Horizontal Layout 1 Name Desktop Sort by Name 2 Size Desktop Sort by Size 4 Type Desktop Sort by Type 5 Date Desktop Sort by Date False Current Monitor Layout 650 preferences-desktop True False vertical True False crossfade True False 0 True False vertical True False True True False 80 80 15 30 6 True False 6 vertical 5 True False 10 10 True False start Icon Size True True 0 True False liststore1 0 2 1 False True 1 False True 0 True False Layout 0 False True 1 True False 0 0 in True False True False vertical True False vertical True False True True False False True False 5 20 True False Auto-arrange False True 6 0 True True center False True end 1 False True 0 False True 1 True False vertical True False False True 0 True False True True False False True False 5 20 True False Direction False True 6 0 True False liststore2 0 1 0 False True end 1 False True 1 False True 2 True False vertical True False False True 0 True False True True False False True False 5 20 True False Sort items by False True 6 0 True False liststore3 0 2 1 False True end 1 False True 1 False True 3 True False vertical True False False True 0 True False True True False False True False 5 20 True False Reverse sort False True 6 0 True True center False True end 1 False True 1 False True 4 True False vertical True False False True 0 True False True True False False True False 5 20 Reset grid spacing True True True True True 0 False True 1 False True 5 False True 2 True False 0 0 none True False True False vertical True False vertical button True True True True True 2 False True 5 False True 5 True True 0 -1 True False end 12 25 True False nemo-horizontal-layout-symbolic False True 1 True True Adjust horizontal grid spacing adjustment1 False False False True True 6 2 True False 32 nemo-horizontal-layout-wide-symbolic False True 3 True False end 6 25 vertical True False 5 5 nemo-vertical-layout-symbolic False False 0 True True Adjust vertical grid spacing False vertical adjustment2 False False False True True 1 True False 5 32 nemo-vertical-layout-wide-symbolic False True 2 1 True True 2 substack_enabled page0 True False center vertical 10 True False <b><big>Desktop icons are not currently enabled for this monitor.</big></b> True False True 0 button True True True none False True 2 substack_disabled page1 1 view preferences-desktop-display-symbolic False True 0 nemo-6.4.5/gresources/nemo-statusbar-ui.xml0000664000175000017500000000041714757107430017704 0ustar fabiofabio nemo-6.4.5/gresources/nemo-desktop-preferences.glade0000664000175000017500000007523114757107430021513 0ustar fabiofabio 50 200 100 10 10 75 200 100 10 10 True False 6 vertical 5 True False 10 10 True False start Desktop Layout True True 0 True False end False No desktop icons Show desktop icons on primary monitor only Show desktop icons on non-primary monitor(s) only Show desktop icons on all monitors False True 2 False True 0 True False Desktop Icons 0 False True 1 True False 10 0 0 in True False True False vertical True False vertical True False True True False False True False 20 20 5 20 True False Computer False True 6 0 True True center False True end 1 False True 0 False True 2 True False vertical True False False True 0 True False True True False False True False 20 20 5 20 True False Home False True 6 0 True True center False True end 1 False True 1 False True 3 True False vertical True False False True 0 True False True True False False True False 20 20 5 20 True False Trash False True 6 0 True True center False True end 1 False True 1 False True 4 True False vertical True False False True 0 True False True True False False True False 20 20 5 20 True False Mounted Drives False True 6 0 True True center False True end 1 False True 1 False True 5 True False vertical True False False True 0 True False True True False False True False 20 20 5 20 True False Network False True 6 0 True True center False True end 1 False True 1 False True 6 False True 2 True False Options 0 False True 3 True False 2 0 0 in True False True False vertical True False vertical True False True True False False True False 20 20 5 20 True False Show icons from missing monitors False True 6 0 True True center False True end 1 False True 0 False True 2 False True 4 nemo-6.4.5/gresources/nemo.gresource.xml0000664000175000017500000000205714757107430017262 0ustar fabiofabio nemo-bookmarks-window.glade nemo-desktop-overlay.glade nemo-desktop-preferences.glade nemo-file-management-properties.glade nemo-search-bar.glade nemo-shortcuts.ui nemo-blank-desktop-window-ui.xml nemo-desktop-icon-grid-view-ui.xml nemo-desktop-icon-view-ui.xml nemo-directory-view-ui.xml nemo-icon-view-ui.xml nemo-list-view-ui.xml nemo-places-sidebar-ui.xml nemo-shell-ui.xml nemo-statusbar-ui.xml nemo-tree-sidebar-ui.xml knob.png thumbnail_frame.png nemo-style-fallback.css nemo-style-fallback-mandatory.css nemo-style-application.css nemo-6.4.5/gresources/knob.png0000664000175000017500000000031614757107430015240 0ustar fabiofabioPNG  IHDR PXIDATu1 @п!Hkx /#M6bH,[[8L1f>L8/_p=Ƽ`S+yn ӢMYl)іm~jm٢);L~X6h[6[D+o^Tw=sꎻ~B&AIENDB`nemo-6.4.5/gresources/nemo-tree-sidebar-ui.xml0000664000175000017500000000204514757107430020241 0ustar fabiofabio nemo-6.4.5/gresources/nemo-bookmarks-window.glade0000664000175000017500000004252314757107430021036 0ustar fabiofabio False 5 Edit Bookmarks center normal True False vertical 2 True False spread gtk-sort-ascending True True True True False True 1 gtk-jump-to True True True False True False True 2 gtk-remove True True True False True False True 4 gtk-close True True True False True False True 5 False True end 0 True False 5 18 True True False True False vertical 6 True False <b>_Bookmarks</b> True True bookmark_tree_view 0 False False 0 True False True False False False 0 True True never in True True False True True True 1 True True 1 True True 0 True False True False start vertical 18 True False vertical 6 True False <b>_Name</b> True True 0 False False 0 True False True False False False 0 True False True True 1 True True 1 False True 0 True False vertical 6 True False 2 2 <b>_Location</b> True True 0 False False 0 True False True False False False 0 True False True True 1 True True 1 False True 1 True True 1 True True 1 bookmark_jump_button bookmark_delete_button bookmark_close_button nemo-6.4.5/gresources/nemo-file-management-properties.glade0000664000175000017500000107042114757107430022763 0ustar fabiofabio True True True False go-previous-symbolic True False edit-find-symbolic True False view-grid-symbolic True False view-list-symbolic True False view-compact-symbolic True False xapp-prefs-preview-symbolic True False go-next-symbolic True False go-up-symbolic True False view-refresh-symbolic True False computer-symbolic True False go-home-symbolic True False location-symbolic True False utilities-terminal-symbolic True False folder-new-symbolic Matching monospace font System monospace font Normal font Icon View List View Compact View Always Local Files Only Never Decimal Decimal (long format) Binary Binary (long format) By Name By Size By Type By Detailed Type By Modification Date By Access Date By Trashed Date 33% 50% 66% 100% 150% 200% 400% 33% 50% 66% 100% 150% 200% 400% 33% 50% 66% 100% 150% 200% 400% Always Local Files Only Never 100 KB 500 KB 1 MB 3 MB 5 MB 10 MB 100 MB 1 GB 2 GB 4 GB 8 GB 16 GB 32 GB 64 GB Yes Local Files Only No False File Management Preferences center 800 600 dialog True False vertical True False True False page_stack False True 0 True False crossfade True True True False True False vertical True False 6 vertical 6 True False <b>Default View</b> True 0 False False 0 True False 40 True False vertical 6 True False 12 True False View _new folders using: True default_view_combobox 0 False False 0 True False model1 0 False True 1 False True 0 _Inherit view type from parent True True False True 0 True False False 1 True False 12 True False _Arrange items: True sort_order_combobox 0 False False 0 True False model2 0 False True 1 False True 2 Reverse sort True True False True 0 True False False 3 Sort _folders before files True True False True 0 True False False 4 Sort _favorites before other files True True True True 0 True False False 5 False True 1 False True 0 True False 6 vertical 6 True False <b>Icon View Defaults</b> True 0 False False 0 True False 40 True False vertical 6 True False 12 True False Default _zoom level: True icon_view_zoom_combobox 0 False False 0 True False model3 0 False True 1 False True 0 _Text beside icons True True False True 0 True False False 1 False True 1 False True 1 True False 6 vertical 6 True False <b>Compact View Defaults</b> True 0 False False 0 True False 40 True False vertical 6 True False 12 True False _Default zoom level: True compact_view_zoom_combobox 0 False False 0 True False model4 0 False True 1 False True 0 A_ll columns have the same width True True False True 0 True False False 1 False True 1 False True 2 True False 6 vertical 6 True False <b>List View Defaults</b> True 0 False False 0 True False 40 True False vertical 6 True False 12 True False D_efault zoom level: True list_view_zoom_combobox 0 False False 0 True False model5 0 False True 1 False True 0 False True 1 False True 3 True False 6 vertical 6 True False <b>Tree View Defaults</b> True 0 False False 0 True False 40 True False vertical 6 Show _only folders True True False True 0 True False False 0 False True 1 False True 4 views Views view-grid-symbolic True True True False True False vertical True False 6 vertical 6 True False <b>Behavior</b> True 0 False False 0 True False 40 True False vertical _Single click to open items True True False True 0 True True False False 0 _Double click to open items True True False True 0 True single_click_radiobutton False False 3 1 Click on a file's name twice to rename it True True False True 0 True False False 3 2 Open each _folder in its own window True True False True 0 True False False 3 3 Always start in dual-pane view True True False True 0 True False False 3 4 Ignore per-folder view preferences True True False True 0 True False False 3 5 Disable file operation queueing True True False True 0 True False False 3 6 Double-click on a blank area to go to the parent folder True True False True 0 True False False 3 7 Automatically expand rows during drag-and-drop True True False True 0 True False False 8 False False 1 False True 0 True False 6 vertical 6 True False <b>Executable Text Files</b> True 0 False False 0 True False 40 True False vertical 6 _Run executable text files when they are opened True True False True 0 True True False False 0 _View executable text files when they are opened True True False True 0 True scripts_execute_radiobutton False False 1 _Ask each time True True False True 0 True scripts_execute_radiobutton False False 2 False False 1 False True 1 True False 6 vertical 6 True False <b>Trash</b> True 0 False False 0 True False 40 True False vertical 6 Ask before moving files to the Trash True True False True 0 True False False 0 Ask before _emptying the Trash or deleting files True True False True 0 True False False 1 I_nclude a Delete command that bypasses Trash True True False True 0 True False False 2 Bypass the Trash when the Delete key is pressed True True False 0 True False False 3 False False 1 False True 2 True False 6 vertical 6 True False <b>Media Handling</b> True 0 False False 0 True False 40 True False vertical 6 Automatically mount removable media when inserted and on startup True True False True 0 True False False 0 Automatically open a folder for automounted media True True False True 0 True False False 1 Prompt or autorun/autostart programs when media are inserted True True False True 0 True False False 2 Automatically close the device's tab, pane, or window when a device is unmounted or ejected True True False True 0 True False False 3 Detect content of media and suggest application to open True True False True 0 True False False 4 False False 1 False True 3 True False 6 vertical 6 True False <b>Bulk Rename</b> True 0 False False 0 True False 40 40 True False vertical True False 4 True False Command to invoke when renaming multiple items: 0 False True 0 True True True out False True 1 False True 0 False False 1 False True 4 behavior Behavior xapp-prefs-behavior-symbolic 1 True True True False True False vertical True False 6 vertical 6 True False <b>Icon Captions</b> True 0 False False 0 True False 40 True False vertical 6 True False Choose the order of information to appear beneath icon names. More information will appear when zooming in closer. True 0 False False 0 True False True False False False 0 True False False False 1 False False 1 True False True False True False False 0 True False False False 1 False False 2 True False True False False False 0 True False False False 1 False False 3 False False 1 False True 0 True False 6 vertical 6 True False <b>Date</b> True 0 False False 0 True False 40 True False 12 True False _Format: True date_format_combobox 0 False False 0 True False False False 1 False False 1 True False 40 True False 12 True False Style: True date_format_combobox 0 False False 0 True False liststore1 0 False False 1 False False 2 False False 1 True False 6 vertical 6 True False <b>Window and Tab Titles</b> True 0 False False 0 True False 40 True False vertical 6 Show the full p_ath in the title bar and tab bars True True False True 0 True False False 0 False False 1 False True 2 True False 6 vertical 6 True False <b>File Size</b> True 0 False False 0 True False 40 True False 12 True False _Prefixes: True size_prefixes_combobox False False 0 True False model11 0 False False 1 False False 1 False False 3 True False 6 vertical 6 True False <b>File Properties</b> True 0 False False 0 True False 40 True False vertical 6 Show advanced permissions in the file property dialog True True False True 0 True False False 0 False False 2 False False 4 True False 6 vertical 6 True False <b>Move/Copy To Menu</b> True 0 False False 0 True False 40 True False vertical 6 List bookmarks in the menu True True False True 0 True False False 0 List devices and network locations in the menu True True False True 0 True False False 1 False False 1 False True 5 display Display xapp-prefs-display-symbolic 2 True True True False True False vertical True False 6 vertical 6 True False <b>List Columns</b> True 0 False False 0 True False 12 True False vertical 6 True False Choose the order of information to appear in the list view. True 0 False False 0 True True 1 True True 0 list-columns List Columns view-list-symbolic 3 True True True False True False vertical True False 6 vertical 6 True False <b>Previewable Files</b> True 0 False False 0 True False 40 True False vertical 6 True False 12 True False Show _thumbnails: True preview_image_combobox 0 False False 0 True False model7 0 False False 1 False False 0 _Inherit thumbnail visibility from parent True True False True 0 True False False 1 True False 12 True False _Only for files smaller than: True preview_image_size_combobox 0 False False 0 True False model64 0 False True 1 False True 2 False True 1 False True 0 True False 6 vertical 6 True False <b>Folders</b> True 0 False False 0 True False 40 True False vertical 6 True False 12 True False Count _number of items: True preview_folder_combobox 0 False False 0 True False model10 0 False True 1 False True 0 False True 1 False True 1 True False 6 vertical 6 True False <b>Tooltips</b> True 0 False False 0 True False 40 True False vertical 3 Show tooltips in icon and compact views True True False True 0 True False False 3 0 Show tooltips in list views True True False True 0 True False False 3 1 Show tooltips on the desktop True True False True 0 True False False 3 2 True False <i>By default, a folder tooltip shows the item count, and files display their size. Select additional information to display in the tooltip:</i> True 0 False True 3 3 True False 40 True False vertical 6 Detailed file type True True False 0 True False False 0 Modified date True True False 0 True False False 1 Created date True True False True 0 True False False 2 Accessed date True True False True 0 True False False 3 File or folder location True True False True 0 True False False 4 False True 4 False False 1 False True 2 preview Preview xapp-prefs-preview-symbolic 4 True True True False True False vertical True False 6 vertical 6 True False Visible Buttons 0 False True 0 True False 40 3 6 6 True True True False 6 show_previous_icon_toolbar_togglebutton True True True image1 False True 0 True False Previous False True 1 0 0 True False 6 show_previous_icon_toolbar_togglebutton True True True image2 False True 0 True False Next False True 1 1 0 True False 6 show_previous_icon_toolbar_togglebutton True True True image3 False True 0 True False Up False True 1 0 1 True False 6 show_previous_icon_toolbar_togglebutton True True True image4 False True 0 True False Refresh False True 1 1 1 True False 6 show_previous_icon_toolbar_togglebutton True True True image5 False True 0 True False Computer False True 1 0 2 True False 6 show_previous_icon_toolbar_togglebutton True True True image6 False True 0 True False Home False True 1 1 2 True False 6 show_previous_icon_toolbar_togglebutton True True True image7 False True 0 True False Location entry toggle False True 1 0 3 True False 6 show_previous_icon_toolbar_togglebutton True True True image8 False True 0 True False Open in terminal False True 1 1 3 True False 6 show_previous_icon_toolbar_togglebutton True True True image9 False True 0 True False New folder False True 1 0 4 True False 6 show_previous_icon_toolbar_togglebutton True True True image10 False True 0 True False Search False True 1 1 4 True False 6 show_previous_icon_toolbar_togglebutton True True True image11 False True 0 True False Icon view False True 1 0 5 True False 6 show_previous_icon_toolbar_togglebutton True True True image12 False True 0 True False List view False True 1 1 5 True False 6 show_previous_icon_toolbar_togglebutton True True True image13 False True 0 True False Compact view False True 1 0 6 True False 6 show_show_thumbnails_icon_toolbar_togglebutton True True True image14 False True 0 True False Show Thumbnails False True 1 1 6 False True 2 True True 0 toolbar Toolbar xapp-prefs-toolbar-symbolic 5 True True True False True False 6 vertical True False Visible Entries 0 False True 0 True False True False vertical 5 True False vertical True False Selection False True 5 0 True False True True False _Open True True False 2 2 True True True True False Open in New _Tab True True False 2 2 True True True True False Open in New _Window True True False 2 2 True True True True False _Scripts True True False 2 2 True True True True False Cu_t True True False 2 2 True True True True False _Copy True True False 2 2 True True True True False _Paste True True False 2 2 True True True True False D_uplicate True True False 2 2 True True True True False P_in True True False 2 2 True True True True False Favorite True True False 2 2 True True True True False Ma_ke Link True True False 2 2 True True True True False _Rename... True True False 2 2 True True True True False Cop_y to True True False 2 2 True True True True False M_ove to True True False 2 2 True True True True False Open in Terminal True True False 2 2 True True True False Open as Root True True False 2 2 True True True False Mo_ve to Trash True True False 2 2 True True True True False _Properties True True False 2 2 True True False True 1 False True 2 True False 0 True False vertical 5 True False vertical True False Background False True 5 0 True False True True False Create New _Folder True True False 2 2 True True True True False _Scripts True True False 2 2 True True True True False Open in Terminal True True False 2 2 True True True False Open as Root True True False 2 2 True True True False Show _Hidden Files True True False 2 2 True True True True False _Paste True True False 2 2 True True True True False _Properties True True False 2 2 True True False True 1 False True 4 True False vertical True False Icon View False True 5 0 True False True True False Arran_ge Items True True False 2 2 True True True True False _Organize by Name True True False 2 2 True True False True 1 True False 5 True False vertical True False Desktop False True 5 0 True False True True False _Customize True True False 2 2 True True False True 1 False True 6 True False 1 True False 1 True False Visible action and extension entries can be configured in the Plugins tab True True True end 2 page0 Context Menus open-menu-symbolic 6 True True True False True False vertical plugins Plugins xapp-prefs-plugins-symbolic 7 True True 1 True True 0 Always Local Files Only Never nemo-6.4.5/gresources/nemo-search-bar.glade0000664000175000017500000002676514757107430017562 0ustar fabiofabio True False True other False True 6 end False False 0 False True False True vertical 6 True False 6 True False Search for files: 1 False True 0 True False True True False system-search-symbolic True True 1 True True False True Case sensitive True False xapp-text-case-symbolic False True 2 True True False True Search folders recursively True False nemo-recursive-search-symbolic False True 3 True True 1 False True 0 True False 6 True False Search content: 1 False True 0 True False True True False system-search-symbolic True True 1 True True False True Case sensitive True False xapp-text-case-symbolic False True 2 True True False True Regular expression True False xapp-use-regex-symbolic False True 3 True True 1 False True 1 False True 0 False False 0 nemo-6.4.5/gresources/nemo-style-application.css0000664000175000017500000000401714757107430020712 0ustar fabiofabio/* Desktop text stuff */ .nemo-window.nemo-desktop-window notebook, .nemo-window.nemo-desktop-window paned { background-color: transparent; } .nemo-desktop-window, .nemo-desktop-window:backdrop { box-shadow: none; } NemoDesktopWindow GtkPaned { background-color: transparent; } .nemo-canvas-item { border-radius: 3px; } .nemo-desktop { -NemoIconContainer-activate-prelight-icon-label: true; } .nemo-desktop.nemo-canvas-item { color: #eeeeee; text-shadow: 1px 1px alpha(black, 0.8); } .nemo-desktop.nemo-canvas-item:hover { background-color: alpha(black, 0.5); background-image: none; text-shadow: none; } .nemo-desktop.nemo-canvas-item:selected { background-color: alpha(@theme_selected_bg_color, 0.8); background-image: none; text-shadow: none; color: #f5f5f5; } /* EelEditableLabel (icon labels) */ .nemo-desktop.view .entry, .nemo-desktop.view .entry:active, .nemo-desktop.view .entry:focus, .nemo-desktop.view .entry:backdrop { border-image: none; border-style: solid; border-width: 1px; border-color: #000000; border-radius: 3px; color: #000000; caret-color: #000000; text-shadow: none; background-image: -gtk-gradient(linear, left top, left bottom, from (shade(rgba(255,255,255,1), 0.86)), color-stop (0.15, shade(rgba(255,255,255,1), 0.96)), color-stop (0.50, shade(rgba(255,255,255,1), 0.98)), to (shade(rgba(255,255,255,1), 1.00))); } .nemo-desktop.view .entry:selected, .nemo-desktop.view .entry:focus:selected, .nemo-desktop.view .entry:backdrop:selected { background-color: @theme_selected_bg_color; color: @theme_selected_fg_color; text-shadow: none; } #drop-bar:drop(active) { box-shadow: none; } #drop-bar > revealer > box { background-color: @theme_bg_color; border-bottom: 1px solid @borders; } #drop-bar { opacity: 1.0; }nemo-6.4.5/files/0000775000175000017500000000000014757107430012522 5ustar fabiofabionemo-6.4.5/files/meson.build0000664000175000017500000000043514757107430014666 0ustar fabiofabiomessage('Copying ./files structure') install_subdir('usr/share/gtksourceview-2.0', install_dir: get_option('datadir'), ) install_subdir('usr/share/gtksourceview-3.0', install_dir: get_option('datadir'), ) install_subdir('usr/share/nemo', install_dir: get_option('datadir'), ) nemo-6.4.5/files/usr/0000775000175000017500000000000014757107430013333 5ustar fabiofabionemo-6.4.5/files/usr/share/0000775000175000017500000000000014757107430014435 5ustar fabiofabionemo-6.4.5/files/usr/share/nemo/0000775000175000017500000000000014757107430015373 5ustar fabiofabionemo-6.4.5/files/usr/share/nemo/actions/0000775000175000017500000000000014757107430017033 5ustar fabiofabionemo-6.4.5/files/usr/share/nemo/actions/set-resolution.nemo_action0000664000175000017500000000644114757107430024251 0ustar fabiofabio[Nemo Action] Name=Display Settings Comment=Change the resolution Exec=cinnamon-settings display Selection=None Icon-Name=video-display-symbolic Extensions=any; Dependencies=cinnamon-settings; Conditions=desktop;dbus org.Cinnamon; Name[be]=Налады дысплэя Name[br]=Arventennoù ar skrammañ Name[ca]=Configuració de la pantalla Name[cs]=Nastavení zobrazení Name[cy]=Gosodiadau Dangosydd Name[da]=Skærmindstillinger Name[de]=Anzeigeeinstellungen Name[el]=Ρυθμίσεις Προβολής Name[en_GB]=Display Settings Name[eo]=Agordoj de montrado Name[es]=Configuración de pantalla Name[et]=Monitoride seadistus Name[eu]=Pantailaren ezarpenak Name[fa]=تنظیمات نمایش Name[fi]=Näytön asetukset Name[fr]=Paramètres d’affichage Name[fr_CA]=Réglages de l'affichage Name[he]=הגדרות תצוגה Name[hi]=प्रदर्शन सेटिंग्स Name[hr]=Postavke zaslona Name[hu]=Megjelenítés beállításai Name[ia]=Configurationes de visualisation Name[id]=Pengaturan Tampilan Name[is]=Stillingar skjás Name[it]=Impostazioni schermo Name[ja]=ディスプレイの設定 Name[ka]=ეკრანის მორგება Name[ko]=디스플레이 설정 Name[nb]=Innstillinger for visning Name[nl]=Scherminstellingen Name[pl]=Ustawienia ekranu Name[pt]=Definições de ecrã Name[pt_BR]=Configurações de exibição Name[ro]=Configurări de afișare Name[ru]=Настройки экрана Name[sk]=Nastavenia displejov Name[sl]=Prikaži nastavitve Name[sr]=Поставке приказа Name[sv]=Bildskärmsinställningar Name[tr]=Ekran Ayarları Name[uk]=Параметри екрану Name[uz]=Koʻrsatish moslamalari Name[vi]=Cài đặt hiển thị Name[zh_CN]=显示设置 Name[zh_TW]=顯示設定 Comment[be]=Змяніць разрозненне Comment[ca]=Canvia la resolució Comment[cs]=Změna rozlišení Comment[cy]=Newid y cydraniad Comment[da]=Ændr opløsningen Comment[de]=Das Bildformat ändern Comment[el]=Αλλαγή της ανάλυσης Comment[en_GB]=Change the resolution Comment[eo]=Ŝanĝi la distingivon Comment[es]=Cambiar la resolución Comment[et]=Muuda ekraanilahutust Comment[eu]=Aldatu bereizmena Comment[fa]=تغییر دادن وضوح Comment[fi]=Vaihda resoluutiota Comment[fr]=Modifier la résolution Comment[fr_CA]=Modifier la résolution Comment[he]=שינוי רמת הפרדה Comment[hi]=संकल्प बदलें Comment[hr]=Promijeni razlučivost Comment[hu]=Felbontás módosítása Comment[ia]=Cambiar le resolution Comment[id]=Ubah resolusi Comment[is]=Breyta upplausninni Comment[it]=Cambia la risoluzione Comment[ja]=解像度を変更します Comment[ko]=해상도 변경 Comment[nb]=Endre oppløsningen Comment[nl]=Wijzig de beeldverhouding Comment[pl]=Zmień rozdzielczość Comment[pt]=Alterar a resolução Comment[pt_BR]=Defina a resolução Comment[ro]=Schimbă rezoluția Comment[ru]=Изменить разрешение Comment[sk]=Zmena rozlíšenia Comment[sl]=Spremenite ločljivost Comment[sr]=Промените резолуцију Comment[sv]=Ändra upplösningen Comment[tr]=Çözünürlüğü değiştir Comment[uk]=Змінити роздільну здатність Comment[uz]=Rezolyutsiyani o'zgartirish Comment[vi]=Thay đổi độ phân giải Comment[zh_CN]=更改分辨率 Comment[zh_TW]=更改解析度 nemo-6.4.5/files/usr/share/nemo/actions/sample.nemo_action0000664000175000017500000001377114757107430022542 0ustar fabiofabio[Nemo Action] ############################################# #### DEBUGGING: #### #### Run Nemo in debug mode using with ### NEMO_DEBUG set to include 'Actions' #### #### i.e. $ nemo --quit #### $ NEMO_DEBUG=Actions nemo --debug ############################################# # Whether this action is active. For troubleshooting. # Optional - if this field is omitted, the action will be active Active=false # Standard tokens that can be used in the Name, Comment (tooltip) and Exec fields: # # %U - insert URI list of selection # %F - insert path list of selection # %P - insert path of parent (current) directory # %f or %N (deprecated) - insert display name of first selected file # %p - insert display name of parent directory # %D - insert device path of file (i.e. /dev/sdb1) # %e - insert display name of first selected file with the extension stripped # %% - insert a literal percent sign, don't treat the next character as a token # %X - insert the XID for the NemoWindow this action is being activated in. # The name to show in the menu, locale supported with standard desktop spec. # **** REQUIRED **** Name=Test Custom Action applied to %N # Tool tip, locale supported (Appears in the status bar) Comment=This is a test for Nemo actions. Action will be applied to %N # What to run. Enclose in < > to run an executable that resides in the actions folder. # **** REQUIRED **** #Exec=gedit %F Exec= # Icon name to use in the menu - must be a theme icon name Icon-Name=folder # Gtk Stock ID to use for the icon. Note if both Icon-name and Stock-Id are # defined, the Stock-Id takes precedence. #Stock-Id=gtk-cdrom # What type selection: [s]ingle, [m]ultiple, any, notnone, none (background click), or # a number representing how many files must be selected to display. # ****** REQUIRED ******* Selection=m # What extensions to display on - this is an array, end with a semicolon # Single entry options, ending in a semicolon: # "dir" for directory selection # "none" for no extension. # "nodirs" for any selection, but not including directories. # "any" for any file type, including directories. # Individual specific extensions can be a semicolon-terminated list # Extensions are NOT case sensitive. jpg will match JPG, jPg, jpg, etc.. # **** EITHER EXTENSIONS OR MIMETYPES IS REQUIRED ***** Extensions=any; # What mime-types to display on - this is an array, end with a semicolon # **** EITHER EXTENSIONS OR MIMETYPES IS REQUIRED ***** #Mimetypes=text/plain; # Separator to use (if any) - add a string to insert between path/url entries # in the exec line. Optional - if you leave this out, a space is inserted. # Note you can have trailing spaces here. #Separator=, # Quote type to use (if any) - enclose paths/urls with quotes. Optional - defaults # to no quotes. # Can be: single, double, backtick #Quote=double # Dependencies - program executables required for this action to work. Nemo will # Search in the path for these program(s) and not display the action if any are missing. # You can also supply an absolute path to a file (i.e. /usr/lib/gvfs/gvfsd-archive) to check # instead of or in addition to an executable in the path. # This is an array, separate entries with semi-colon, and terminate with a semicolon. # # v3.0: Reverse dependencies: Prefixing a program with '!' will reverse the logic - if # the program exists, the check will FAIL. #Dependencies=xed;!gedit; # Conditions - semicolon-separated array of special conditions: # "desktop" current (parent) folder is desktop # "removable" target (first selection) is removable # "gsettings " is true # "gsettings <[eq|ne|gt|lt]> " # "dbus " exists # "exec " run program and check its exit code (0 is pass, non-0 is fail). # Enclose in < > if the program resides in the action's folder. #Conditions=desktop; # Escape Spaces (deprecated) # # This field is deprecated and does nothing - paths with spaces, as well as other special # shell characters, will now be passed on correctly no matter what, even when Quote is not set. # # Optional - by default this is false #EscapeSpaces=true # Run in terminal - set to true to execute the Exec line in a spawned terminal window. # # Generally if you use this you should not have Quotes defined, as that will be taken care # of during converting the expanded command string into an arg vector. # # Optional - by default this is false #Terminal=false # Uri scheme - provide a uri scheme that the current location's scheme must match # For example: # ... # UriScheme=sftp # ... # sftp://joe@10.0.0.200/ matches # file:///home/joe/.bashrc does not #UriScheme=file # Locations and Files - semicolon-separated arrays of globs, filenames and paths to be tested # against the current location or selection, respectively. # # - Globs and paths can be relative or absolute. # - ~ will be expanded at runtime to the user's home directory. # - Absolute paths will be tested against the file/location's full path. Otherwise it is tested # against the filename only. # - A glob with a leading * will be matched against the full path, whether it contains additional # path parts or is just a partial filename. # - If a condition is prefixed with a ! it will be considered an opposing condition (If the file # passes this test, action is forbidden). # - Allowed patterns are considered before forbidden ones. This allows behaviors such as: # # # Allow any dot-file except .config # Locations=.*;!.config # # Locations - semicolon-separated array of globs to check against the currently location. # # The current location must match at least one 'allowed' pattern, path or name for the action # to be considered valid. # # Optional #Locations=.*;!.config; # Files - semicolon-separated array of globs to check against the currently selected files. # # All files in the selection must match at least one 'allowed' pattern, path or name for # the action to be considered valid. # # Optional #Files=.bash*;!.bashrc; nemo-6.4.5/files/usr/share/nemo/actions/91_delete-workspace.nemo_action0000664000175000017500000001340114757107430025016 0ustar fabiofabio[Nemo Action] Name=Remove workspace Comment=Remove the currently active workspace Exec=sh -c 'dbus-send --dest=org.Cinnamon --print-reply /org/Cinnamon org.Cinnamon.RemoveCurrentWorkspace >/dev/null' Selection=None Extensions=any; Conditions=desktop;dbus org.Cinnamon;gsettings org.cinnamon number-workspaces i gt 1; Active=false Name[am]=የ ስራ ቦታ ማስወገጃ Name[ar]=إزالة مساحة العمل Name[be]=Выдаліць працоўную прастору Name[bg]=Премахване на работно място Name[br]=Dilemel an dachenn-labour Name[ca]=Elimina espai de treball Name[cs]=Odstranit pracovní plochu Name[cy]=Dileu gweithle Name[da]=Fjern arbejdsområde Name[de]=Arbeitsfläche entfernen Name[el]=Απομακρύνση/Αφαίρεση του χώρου εργασίας Name[en_GB]=Remove workspace Name[eo]=Forigi laborspacon Name[es]=Eliminar el área de trabajo Name[et]=Kustuta tööala Name[eu]=Kendu laneko area Name[fa]=حذف فضای کاری Name[fi]=Poista työtila Name[fr]=Supprimer l'espace de travail Name[fr_CA]=Supprimer l’espace de travail Name[gd]=Thoir an rum-obrach air falbh Name[gl]=Eliminar o espazo de traballo Name[he]=הסרת סביבת עבודה Name[hi]=कार्यस्थल हटाएँ Name[hr]=Ukloni radni prostor Name[hu]=Munkaterület eltávolítása Name[ia]=Remover le spatio de labor Name[id]=Hapus ruang kerja Name[ie]=Remover li labor-spacie Name[is]=Fjarlægja vinnusvæði Name[it]=Rimuovi spazio di lavoro Name[ja]=ワークスペースを削除 Name[kab]=Kkes isekkilen ilmawen Name[ko]=작업 공간 제거 Name[la]=Aream laboris remove Name[lt]=Šalinti darbo sritį Name[ms]=Hapus kawasan kerja Name[nb]=Fjern arbeidsområde Name[nl]=Werkblad verwijderen Name[pl]=Usuń przestrzeń roboczą Name[pt]=Remover área de trabalho Name[pt_BR]=Remover espaço de trabalho Name[ro]=Elimină spaţiu de lucru Name[ru]=Удалить рабочее место Name[sk]=Odstrániě pracovnú plochu Name[sl]=Odstrani delovno površino Name[sr]=Уклони радни простор Name[sr@latin]=Ukloni radni prostor Name[sv]=Ta bort arbetsyta Name[ta]=பணிதளத்தை நீக்கு Name[th]=ลบพื้นที่ทำงาน Name[tr]=Çalışma alanını sil Name[uk]=Видалити робочий простір Name[ur]=ورک سپیس ہٹادیں Name[uz]=Ish joyini olib tashlash Name[vi]=Bỏ vùng làm việc Name[zh_CN]=移除工作区 Name[zh_HK]=移除工作區 Name[zh_TW]=移除工作區 Comment[am]=የ አሁኑን ንቁ የ ስራ ቦታ ማስወገጃ Comment[ar]=إزالة مساحة العمل النشطة حالياً Comment[be]=Выдаліць актыўную зараз працоўную прастору Comment[bg]=Премахване на актовното работно място Comment[ca]=Elimina l'espai de treball actiu Comment[cs]=Odstranit pracovní plochu, na které se nacházíte Comment[cy]=Tynnu gweithle gweithredol cyfredol Comment[da]=Fjern det nuværende aktive arbejdsområde Comment[de]=Die aktuell aktive Arbeitsfläche entfernen Comment[el]=Απομακρύνση/Αφαίρεση του τρέχοντος ενεργού χώρου εργασίας Comment[en_GB]=Remove the currently active workspace Comment[eo]=Forigi la nun aktivan laborspacon Comment[es]=Eliminar el área de trabajo activa Comment[et]=Hetkel aktiivse tööala eemaldamine Comment[eu]=Kendu uneko laneko area aktiboa Comment[fa]=حذف فضای‌کاریِ فعالِ فعلی Comment[fi]=Poista nykyinen aktiivinen työtila Comment[fr]=Supprimer l'espace de travail actif Comment[fr_CA]=Supprimer l’espace de travail actif Comment[gd]=Thoir air falbh an rum-obrach a tha gnìomhach an-dràsta Comment[gl]=Eliminar o espazo de traballo activo Comment[he]=מחיקת סביבת העבודה הפעילה הנוכחית Comment[hi]=वर्तमान में सक्रिय कार्यस्थल हटाएँ Comment[hr]=Ukloni trenutno aktivni radni prostor Comment[hu]=Aktív munkaterület eltávolítása Comment[ia]=Remover le spatio de labor currentemente active Comment[id]=Hapus ruang kerja aktif saat ini Comment[is]=Fjarlægja vinnusvæðið sem er virkt núna Comment[it]=Rimuovi lo spazio di lavoro corrente Comment[ja]=現在のアクティブなワークスペースを削除します Comment[kab]=Kkes tallunt n umahil turmidt Comment[ko]=현재 사용 중인 작업 공간을 제거합니다 Comment[la]=Hanc aream laboris remove Comment[lt]=Šalinti esamą aktyvią darbo sritį Comment[ms]=Hapus kawasan kerja semasa Comment[nb]=Fjern det gjeldende aktive arbeidsområdet Comment[nl]=Verwijder het thans actieve werkblad Comment[pl]=Usuń obecnie aktywną przestrzeń roboczą Comment[pt]=Remover a área de trabalho ativa no momento Comment[pt_BR]=Remove o espaço de trabalho ativo no momento Comment[ro]=Elimină spaţiul de lucru activ în acest moment Comment[ru]=Удалить текущее рабочее место Comment[sk]=Odstrániť momentálne aktívnu plochu Comment[sl]=Odstrani trentno aktivno delovno površino Comment[sr]=Уклоните тренутно активан радни простор Comment[sr@latin]=Ukloni trenutno aktivni radni prostor Comment[sv]=Ta bort den nuvarande aktiva arbetsytan Comment[th]=ลบพื้นที่ทำงานที่ใช้งานอยู่ตอนนี้ Comment[tr]=Şu an aktif olan çalışma alanını sil Comment[uk]=Видалити поточний робочий простір Comment[ur]=موجودہ زیر عمل ورک سپیس کو ہٹا دیں Comment[uz]=Hozirgi faol ish joyini olib tashlash Comment[vi]=Bỏ vùng làm việc hiện hoạt Comment[zh_CN]=移除当前活跃的工作区 Comment[zh_HK]=移除目前作用中的工作區 Comment[zh_TW]=移除目前使用中的工作區 nemo-6.4.5/files/usr/share/nemo/actions/add-desklets.nemo_action0000664000175000017500000000645714757107430023630 0ustar fabiofabio[Nemo Action] Name=Add Desklets Comment=Add Cinnamon desklets Exec=cinnamon-settings desklets Selection=None Extensions=any; Icon-Name=cs-desklets-symbolic Dependencies=cinnamon-settings; Conditions=desktop;dbus org.Cinnamon; Name[af]=Voeg Desklets By Name[am]=ዴስክሌትስ መጨመሪያ Name[ar]=إضافة تطبيق مكتبي Name[be]=Дадаць дэсклеты Name[bg]=Добавяне на десклети Name[bn]=ডেস্কলেট যুক্ত করুন Name[br]=Ouzhpennañ arloadigoù burev Name[bs]=Dodaj Desklet-e Name[ca]=Afegeix miniaplicacions d'escriptori Name[cs]=Přidat miniaplikace plochy Name[cy]=Ychwanegu Desgledi Name[da]=Tilføj skrivebordsprogrammer Name[de]=Desklets hinzufügen Name[el]=Προσθήκη εφαρμογών οθόνης Name[en_AU]=Add Desklets Name[en_GB]=Add Desklets Name[eo]=Aldoni labortablaĵojn Name[es]=Añadir miniaplicaciones al escritorio Name[et]=Lisa töölauavidinaid Name[eu]=Gehitu desklet-ak Name[fa]=افزودن رومیزی‌ها Name[fi]=Lisää työpöytäsovelmia Name[fr]=Ajouter des desklets Name[fr_CA]=Ajouter des desklets Name[ga]=Cuir le Deiscíní Name[gd]=Cuir desktlets ris Name[gl]=Engadir trebellos Name[he]=הוספת יישומונים Name[hi]=डेस्क्लेट जोड़ें Name[hr]=Dodaj desklete Name[hu]=Asztalkalmazások hozzáadása Name[ia]=Adder desklets Name[id]=Tambah Desklet Name[is]=Bæta við skjáborðsgræjum (desklets) Name[it]=Aggiungi desklet Name[ja]=デスクレットを追加 Name[jv]=Kabeh Desklet Name[kab]=Rnu isnasen n tnarit Name[ko]=데스크릿 추가 Name[la]=Desklet Adde Name[lt]=Pridėti ekrano programėles Name[mo]=Адэугаря десклетурилор Name[ms]=Tambah Desklet Name[nb]=Legg til skrivebordsprogrammer Name[nl]=Bureaubladmini's toevoegen Name[nn]=Legg til miniprogram Name[pl]=Dodaj desklety Name[pt]=Adicionar Mini-aplicações Name[pt_BR]=Adicionar desklets Name[ro]=Adaugă deskleturi Name[ru]=Добавить десклеты Name[sk]=Pridať Desklet Name[sl]=Dodaj aplete namizja Name[sr]=Додај справице Name[sr@latin]=Dodajte desklete Name[sv]=Lägg till skrivbordsprogram Name[tg]=Илова кардани барномаҳои мизи корӣ Name[th]=เพิ่มเดสก์เล็ต Name[tr]=Masaüstü Uygulamacıkları Ekle Name[uk]=Додати десклети Name[ur]=ڈیسک لیٹ شامل کریں Name[uz]=Deskletlarni qo‘shish Name[vi]=Thêm Desklet Name[zh_CN]=添加桌面小工具 Name[zh_HK]=新增桌面小工具 Name[zh_TW]=加入桌面小程式 Comment[ca]=Afegeix miniaplicacions de Cinnamon Comment[cs]=Přidat Cinnamon desklety Comment[cy]=Ychwanegu desgledau Cinnamon Comment[da]=Tilføj Cinnamon-skrivebordsprogrammer Comment[de]=Cinnamon-Desklets hinzufügen Comment[en_GB]=Add Cinnamon desklets Comment[es]=Añadir desklets de Cinnamon Comment[fi]=Lisää Cinnamon sovelmia Comment[fr]=Ajouter des desklets Cinnamon Comment[it]=Aggiungi desklet di Cinnamon Comment[nl]=Bureaubladmini's van Cinnamon toevoegen Comment[pl]=Dodaj desklety Cinnamona Comment[pt]=Adicionar desklets do Cinnamon Comment[pt_BR]=Adicionar desklets do Cinnamon Comment[ro]=Adaugă deskleturi Cinnamon Comment[sk]=Pridať desklety prostredia Cinnamon Comment[sv]=Lägg till skrivbordsprogram för Cinnamon Comment[zh_CN]=添加Cinnamon桌面小程序 nemo-6.4.5/files/usr/share/nemo/actions/myaction.py0000775000175000017500000000033214757107430021231 0ustar fabiofabio#! /usr/bin/python3 -OOt import sys command = sys.argv[0] print("Running " + command) print("With the following arguments:") for arg in sys.argv: if command == arg: continue else: print(arg) nemo-6.4.5/files/usr/share/nemo/actions/mount-archive.nemo_action0000664000175000017500000001322714757107430024036 0ustar fabiofabio[Nemo Action] Name=Mount archive Comment=Mount %f to browse its contents Exec=gnome-disk-image-mounter %U Selection=s Mimetypes=application/x-7z-compressed;application/x-cd-image;application/x-cpio;application/x-rar;application/x-rar-compressed;application/x-7z-compressed-tar;application/x-bzip-compressed-tar;application/x-compressed-tar;application/x-tar;application/zip; Icon-Name=mount-archive-symbolic Dependencies=gnome-disk-image-mounter; Selection=s Name[am]=ማህደር መጫኛ Name[ar]=تحميل الأرشيف Name[ast]=Montar archivu Name[be]=Падключыць архіў Name[bg]=Монтиране на архив Name[bs]=Montiraj arhivu Name[ca]=Munta l'arxiu Name[cs]=Připojit archiv Name[cy]=Arosod Archif Name[da]=Montér arkiv Name[de]=Archive einhängen Name[el]=Αρχείο προσάρτησης Name[en_GB]=Mount archive Name[eo]=Surmeti arkivon Name[es]=Montar el archivo Name[et]=Haagi arhiiv Name[eu]=Muntatu fitxategia Name[fa]=سوارکردن بایگانی Name[fi]=Liitä arkisto Name[fr]=Monter l'archive Name[fr_CA]=Monter l’archive Name[ga]=Feistigh an Cartlann Name[gd]=Munntaich tasglann Name[gl]=Montar o ficheiro Name[he]=עיגון ארכיון Name[hi]=संग्रह माउंट करें Name[hr]=Montiraj arhivu Name[hu]=Archívum csatolása Name[ia]=Montar le archivo Name[id]=Pasang archive Name[ie]=Monter li archive Name[is]=Tengja safnskrá Name[it]=Monta l'archivio Name[ja]=アーカイブをマウント Name[kab]=serkeb aɣbar Name[ko]=보관함에 마운트 하기 Name[la]=Tabularium colliga Name[lt]=Prijungti archyvą Name[ms]=Pautkan arkib Name[nb]=Monter arkiv Name[nl]=Archiefbestand aankoppelen Name[pl]=Zamontuj archiwum Name[pt]=Montar ficheiro Name[pt_BR]=Montar arquivo Name[ro]=Montează arhiva Name[ru]=Подключить архив Name[sk]=Pripojiť archív Name[sl]=Priklopi arhiv Name[sr]=Прикачи архиву Name[sr@latin]=Montirajte arhivu Name[sv]=Montera arkiv Name[th]=เมานท์แฟ้มจัดเก็บ Name[tr]=Arşivi bağla Name[uk]=Змонтувати архів Name[ur]=آرکائیوْ ماؤنٹ کریں Name[uz]=Arxivni ulash Name[vi]=Gắn kết bộ lưu trữ Name[zh_CN]=挂载档案 Name[zh_HK]=掛載壓縮檔 Name[zh_TW]=掛載壓縮檔 Comment[am]=መጫኛ %f ይዞታዎችን ለ መቃኘት Comment[ar]=تحميل %f لتصفح محتوياته Comment[ast]=Montar %f pa restolar el so conteníu Comment[be]=Падключыць %f для агляду змесціва Comment[bg]=Монтиране на %f за преглед на съдържанието Comment[bs]=Montirajte %f da pregledate njen sadržaj Comment[ca]=Muntar %f per examinar-ne el contingut Comment[cs]=Připojit %f k prohlížení jeho obsahu Comment[cy]=Arosod %f i bori ei gynnwys Comment[da]=Montér %f for at gennemse indholdet Comment[de]=%f einhängen, um den Inhalt zu durchsuchen Comment[el]=Προσαρτήστε το %f για να περιηγηθείτε στα περιεχόμενά του Comment[en_GB]=Mount %f to browse its contents Comment[eo]=Surmeti %f por foliumi ĝian enhavon Comment[es]=Montar %f para examinar su contenido Comment[et]=%f haakimine sisu sirvimiseks Comment[eu]=Muntatu %f bere edukiak arakatzeko Comment[fa]=برای مرور محتوای %f آنرا سوار کنید Comment[fi]=Liitä %f selataksesi sen sisältöä Comment[fr]=Monter %f pour parcourir son contenu Comment[fr_CA]=Monter %f pour parcourir son contenu Comment[ga]=Feistigh %f chun féachaint ar inneachar Comment[gd]=Munntaich %f gus an susbaint aice a bhrabhsadh Comment[gl]=Montar %f para examinar o seu contido Comment[he]=עיגון %f לסיור בתְּכוּלָתו Comment[hi]=%f की सामग्री देखने हेतु उसे माउंट करें Comment[hr]=Montiraj %f za pregled sadržaja Comment[hu]=„%f” archívum csatolása a tartalom böngészéséhez Comment[ia]=Montar %f pro explorar su contento Comment[id]=Pasang %f untuk menelusuri isinya Comment[ie]=Monter %f por navigar su contenete Comment[is]=Tengja %f til að skoða innihald hennar Comment[it]=Monta %f per esplorarne i contenuti Comment[ja]=%f をマウントし、内容を表示します Comment[kab]=Serkeb %f iwakken ad tesnirmeḍ agbur-ines Comment[ko]=내용을 보기위해 %f를 마운트 합니다 Comment[la]=%f colliga ad navigandum quae continet Comment[lt]=Prijungti %f naršyti po jo turinį Comment[ms]=Pautkan %f untuk layari kandungan Comment[nb]=Monter %f for å bla gjennom innholdet Comment[nl]=Koppel %f aan om zijn inhoud te verkennen Comment[pl]=Zamontuj %f, aby móc przeglądać jego zawartość Comment[pt]=Montar %f para navegar no seu conteúdo Comment[pt_BR]=Montar %f para navegar em seu conteúdo Comment[ro]=Montează %f pentru a-i răsfoi conținutul Comment[ru]=Подключить %f для просмотра Comment[sk]=Pripojiť %f pre prehliadnutie jeho obsahu Comment[sl]=Priklopi %f za brskanje po vsebini Comment[sr]=Прикачите „%f“ да бисте видели садржај Comment[sr@latin]=Montirajte %f da biste pregledali njen sadržaj Comment[sv]=Montera %f för att se dess innehåll Comment[th]=เมานท์ %f เพื่อเรียกดูเนื้อหาของมัน Comment[tr]=İçeriğini açmak için %f öğesini bağla Comment[uk]=Змонтувати %f щоб переглядати вміст Comment[ur]=‏%f کا مواد دیکھنے کے لیے اس کو ماؤنٹ کریں Comment[uz]=Tarkibni ko‘rib chiqish uchun %f ni ulash Comment[vi]=Gắn kết %f để duyệt xem nội dung Comment[zh_CN]=挂载 %f 以浏览其内容 Comment[zh_HK]=掛載 %f 以瀏覽其內容 Comment[zh_TW]=掛載 %f 以瀏覽其內容 nemo-6.4.5/files/usr/share/nemo/actions/92_show-expo.nemo_action0000664000175000017500000002030614757107430023514 0ustar fabiofabio[Nemo Action] Name=Manage workspaces (Expo) Comment=Open Expo to add, remove, or organize workspaces Exec=sh -c 'dbus-send --dest=org.Cinnamon --print-reply /org/Cinnamon org.Cinnamon.ShowExpo >/dev/null' Selection=None Extensions=any; Conditions=desktop;dbus org.Cinnamon; Active=false Name[am]=የ ስራ ቦታ አስተዳዳሪ (Expo) Name[ar]=إدارة مساحات العمل (Expo) Name[be]=Кіраваць працоўнымі прасторамі (экспазіцыя) Name[bg]=Управление на работни места (Експо) Name[br]=Merañ an tachennoù-labour (Expo) Name[ca]=Gestionar espais de treball (Expo) Name[cs]=Spravovat pracovní plochy (přehled ploch) Name[cy]=Rheoli mannau gwaith (Expo) Name[da]=Håndtér arbejdsområder (oversigt) Name[de]=Arbeitsflächenübersicht Name[el]=Διαχείριση χώρων εργασίας (Expo) Name[en_GB]=Manage workspaces (Expo) Name[eo]=Administri laborspacojn (Ekspo) Name[es]=Gestionar las áreas de trabajo (vista de exposición) Name[et]=Halda tööalasid (Expo) Name[eu]=Kudeatu laneko areak (Expo) Name[fa]=مدیریت فضاهای کار (Expo) Name[fi]=Hallitse työtiloja Name[fr]=Gérer les espaces de travail (Expo) Name[fr_CA]=Gérer les espaces de travail (Expo) Name[gd]=Rianaich rumannan-obrach (Expo) Name[gl]=Administrar os espazos de traballo (Expo) Name[he]=ניהול מרחבי עבודה (Expo) Name[hi]=कार्यस्थल प्रबंधन (एक्सपो) Name[hr]=Upravljanje radnim prostorima (Prikaz radnih prostora) Name[hu]=Munkaterületek kezelése (Közszemle) Name[ia]=Administrar le spatios de labor (Expo) Name[id]=Kelola ruang kerja (Expo) Name[is]=Sýsla með vinnusvæði (Expo) Name[it]=Gestisci spazi di lavoro (Expo) Name[ja]=ワークスペースを管理 (エキスポ) Name[kab]=Sefrek tallunin n umahil (Expo) Name[ko]=작업 공간 관리 (Expo) Name[la]=Areas laboris administra (Expo) Name[lt]=Tvarkyti darbo sritis (Expo) Name[ms]=Mengurus kawasan kerja (Expo) Name[nb]=Behandle arbeidsområder (Expo) Name[nl]=Werkbladen beheren (Expo) Name[pl]=Zarządzaj przestrzeniami roboczymi (Expo) Name[pt]=Gerir áreas de trabalho (Expo) Name[pt_BR]=Gerenciar espaços de trabalho (Modo Expo) Name[ro]=Gestionează spațiile de lucru (Expo) Name[ru]=Менеджер рабочих мест (Expo) Name[sk]=Spravuje pracovné priestory (Expo) Name[sl]=Upravljaj delovne površine (Expo) Name[sr]=Управљај радним просторима (експо) Name[sr@latin]=Upravljanje pregledom radnih prostora (Ekspo) Name[sv]=Hantera arbetsytor (Expo) Name[ta]=பணிதளங்களை நிர்வகி Name[th]=จัดการพื้นที่ทำงาน (Expo) Name[tr]=Çalışma alanlarını yönet (Sergi-Expo) Name[uk]=Керування робочими просторами (Expo) Name[ur]=ورک سپیس کا انتظام کریں(ایکسپو) Name[uz]=Ish joylarini boshqarish (Expo) Name[vi]=Quản lý vùng làm việc (Expo) Name[zh_CN]=管理工作区(即Expo模式) Name[zh_HK]=管理工作區 (Expo) Name[zh_TW]=工作區管理 (Expo) Comment[am]=መክፈቻ ለ Expo ለ መጨመር: ለ ማስወገድ: ወይንም የ ስራ ቦታዎች ለ ማደራጀት Comment[ar]=فتح Expo لإضافة أو إزالة أو تنظيم مساحات العمل Comment[be]=Адкрыць экспазіцыю для дадання, выдалення ці арганізацыі працоўных прастор Comment[bg]=Отваряне на Експо за добавяне, премахване или организиране на работните места Comment[br]=Digeriñ Expo evit ouzhpennañ, dilemel pe aozañ tachennoù-labour Comment[ca]=Obre Expo per afegir, treure o organitzar espais de treball Comment[cs]=Otevřít Expo k přidání, odstranění nebo organizaci pracovních ploch Comment[cy]=Agor Expo i ychwanegu, dileu, neu drefnu'r gweithleoedd Comment[da]=Åbn visning af arbejdsområder for at tilføje, fjerne eller organisere arbejdsområder Comment[de]=Arbeitsflächenübersicht öffnen, um Arbeitsflächen hinzuzufügen, zu entfernen oder zu organisieren Comment[el]=Άνοιγμα Expo για προσθήκη, κατάργηση ή οργάνωση των χώρων εργασίας Comment[en_GB]=Open Expo to add, remove, or organise workspaces Comment[eo]=Malfermi Ekspo por aldoni, forigi aŭ organizi laborspacojn Comment[es]=Abrir la vista de exposición para añadir, eliminar u organizar áreas de trabajo Comment[et]=Tööalade lisamiseks, eemaldamiseks või korraldamiseks ava Expo Comment[eu]=Ireki Expo laneko areak gehitu, kendu edo antolatzeko Comment[fa]=Expo را برای افزودن، حذف، یا مرتب کردن فضاهای‌کاری باز کنید Comment[fi]=Avaa Expo lisätäksesi, poistaaksesi tai järjestääksesi työtiloja Comment[fr]=Ouvrir Expo pour gérer les espaces de travail Comment[fr_CA]=Ouvrir Expo pour gérer les espaces de travail Comment[gd]=Fosgail Expo gus rumannan-obrach a chur ris, a thoirt air falbh no a rianachadh Comment[gl]=Abrir Expo para engadir, retirar ou organizar espazos de traballo Comment[he]=פתיחת Expo כדי להוסיף, למחוק ולנהל סביבות עבודה Comment[hi]=कार्यस्थल जोड़ने, हटाने या प्रबंधन हेतु एक्सपो खोलें Comment[hr]=Otvorite prikaz radnih postora za dodavanje, uklanjanje ili organizaciju radnih prostora Comment[hu]=Közszemle megnyitása a munkaterületek hozzáadásához, eltávolításához és kezeléséhez Comment[ia]=Aperir Expo pro adder, remover, o organisar le spatios de labor Comment[id]=Buka Expo untuk menambah, menghapus, atau mengatur ruang kerja Comment[is]=Opna Expo til að bæta við, fjarlægja eða skipuleggja vinnusvæði Comment[it]=Apri Expo per aggiungere, togliere o organizzare gli spazi di lavoro Comment[ja]=エキスポを開き、ワークスペースを追加・削除・整理します Comment[kab]=Ldi Expo iwakken ad tesferkeḍ tallunin n umahil Comment[ko]=작업 공간의 추가, 제거, 또는 구성을 위해 Expo 열기 Comment[la]=Expo pelle ad areas laboris addendas, removendas aut curandas Comment[lt]=Atverti Expo, kad pridėtumėte, šalintumėte ar tvarkytumėte darbo sritis Comment[ms]=Buka Expo ke tambah, hapus, atau uruskan kawasan kerja Comment[nb]=Åpne Expo for å legge til, fjerne eller organisere arbeidsområder Comment[nl]=Open Expo om werkbladen toe te voegen, te verwijderen of te organiseren Comment[pl]=Otwórz Expo, aby dodawać, usuwać i organizować przestrzenie robocze Comment[pt]=Abrir Expo para adicionar, remover ou organizar áreas de trabalho Comment[pt_BR]=Abre o modo Expo para adicionar, remover ou organizar espaços de trabalho Comment[ro]=Deschide Expo pentru a adăuga, a șterge sau pentru a organiza spațiile de lucru Comment[ru]=Открыть Expo для добавления, удаления и организации рабочих мест Comment[sk]=Otvoriť Expo pre pridávanie, odstraňovanie a organizovanie pracovných plôch Comment[sl]=Odpri Expo za dodajanje, odstranjevanje ali organiziranje delovnih površin Comment[sr]=Отворите експо да додате, уклоните или уредите радне просторе Comment[sr@latin]=Otvorite Ekspo da biste dodali, uklonili ili organizovali radne prostore Comment[sv]=Öppna Expo för att lägga till, ta bort, eller ordna arbetsytor Comment[th]=เปิด Expo เพื่อเพิ่ม ลบ หรือจัดระเบียบพื้นที่ทำงาน Comment[tr]=Çalışma alanları eklemek, silmek ya da organize etmek için Sergi görünümünü aç Comment[uk]=Відкрити Expo для керування робочими просторами Comment[ur]=ورک سپیسوں کو شامل، ہٹانے یا منظم کرنے کے لیے ایکسپو کھولیں Comment[uz]=Ish joylarini qo‘shish, olib tashlash yoki tartibga solish uchun Exponi oching Comment[vi]=Mở Expo để thêm, bỏ, quản lý vùng làm việc Comment[zh_CN]=打开 Expo 以添加,移除或整理工作区 Comment[zh_HK]=開啟 Expo 以新增、移除或組織工作區 Comment[zh_TW]=開啟工作區管理 (Expo) 以加入,移除,或組織工作區 nemo-6.4.5/files/usr/share/nemo/actions/90_new-workspace.nemo_action0000664000175000017500000001514314757107430024351 0ustar fabiofabio[Nemo Action] Name=Jump to new workspace Comment=Create a new workspace and activate it Exec=sh -c 'dbus-send --dest=org.Cinnamon --print-reply /org/Cinnamon org.Cinnamon.JumpToNewWorkspace >/dev/null' Selection=None Extensions=any; Conditions=desktop;dbus org.Cinnamon; Active=false Name[am]=ወደ አዲስ የ ስራ ቦታ መዝለያ Name[ar]=اذهب إلى مساحة العمل الجديدة Name[be]=Перайсці на новую прастору Name[bg]=Върви на ново работно място Name[ca]=Vés a un espai de treball nou Name[cs]=Přejít na novou pracovní plochu. Name[cy]=Neidio i weithle newydd Name[da]=Hop til nyt arbejdsområde Name[de]=Zu neuer Arbeitsfläche wechseln Name[el]=Μετάβαση σε νέο χώρο εργασίας Name[en_GB]=Jump to new workspace Name[eo]=Salti al nova laborspaco Name[es]=Ir a un área de trabajo nueva Name[et]=Uuele tööalale liikumine Name[eu]=Joan laneko area berrira Name[fa]=پَرش به فضای کاری جدید Name[fi]=Siirry uuteen työtilaan Name[fr]=Aller vers un nouvel espace de travail Name[fr_CA]=Aller vers un nouvel espace de travail Name[gd]=Gearr leum tu rum-obrach ùr Name[gl]=Cambiar a un espazo de traballo novo Name[he]=דילוג לסביבת עבודה חדשה Name[hi]=नया कार्यस्थल उपयोग करें Name[hr]=Skoči u novi radni prostor Name[hu]=Ugrás az új munkaterületre Name[ia]=Saltar a un nove spatio de labor Name[id]=Pindah ke ruang kerja baru Name[ie]=Ear a un nov labor-spacie Name[is]=Hoppa á nýtt vinnusvæði Name[it]=Salta a nuovo spazio di lavoro Name[ja]=新しいワークスペースにジャンプ Name[kab]=Ddu ɣer tallunt n umahil tamaynutt Name[ko]=새 작업 공간으로 가기 Name[la]=I ad novam aream laboris Name[lt]=Pereiti į naują darbo sritį Name[ms]=Lompat ke kawasan kerja baru Name[nb]=Hopp til nytt arbeidsområde Name[nl]=Spring naar nieuw werkblad Name[pl]=Przejdź do nowej przestrzeni roboczej Name[pt]=Ir para nova área de trabalho Name[pt_BR]=Ir para novo espaço de trabalho Name[ro]=Sari la un spaţiu de lucru nou Name[ru]=Перейти на новое рабочее место Name[sk]=Skočiť na novú plochu Name[sl]=Skoči na novo delovno površino Name[sr]=Пређи у нови радни простор Name[sr@latin]=Skoči na novi radni prostor Name[sv]=Hoppa till ny arbetsyta Name[ta]=புதிய பணிதளத்திற்கு தாவு Name[th]=ข้ามไปพื้นที่ทำงานใหม่ Name[tr]=Yeni çalışma alanına git Name[uk]=Перейти на новий робочий простір Name[ur]=نئی ورک سپیس میں منتقل ہوں Name[uz]=Yangi ish joyiga o‘tish Name[vi]=Chuyển qua vùng làm việc mới Name[zh_CN]=跳到新的工作区 Name[zh_HK]=跳至新工作區 Name[zh_TW]=跳至新工作區 Comment[am]=አዲስ የ ስራ ቦታ መፍጠሪያ እና ማስጀመሪያ Comment[ar]=إنشاء مساحة عمل جديدة وتنشيطها Comment[be]=Стварыць новую працоўную прастору і зрабіць актыўнай Comment[bg]=Създаване и активиране на ново работно място Comment[ca]=Crea un nou espai de treball i activa'l Comment[cs]=Vytvořit novou pracovní plochu a aktivovat ji Comment[cy]=Creu gweithle newydd a'i roi ar waith Comment[da]=Opret et nyt arbejdsområde og aktivér det Comment[de]=Eine neue Arbeitsfläche erstellen und diese aktivieren Comment[el]=Δημιουργία νέου χώρου εργασίας και ενεργοποίηση Comment[en_GB]=Create a new workspace and activate it Comment[eo]=Krei novan laborspacon kaj ĝin aktivigi Comment[es]=Crear un área de trabajo nueva y activarla Comment[et]=Tööala loomine ja aktiveerimine Comment[eu]=Laneko area berri bat sortu eta aktibatzen du Comment[fa]=ایجاد فضای کاری جدید و فعال کردنِ آن Comment[fi]=Luo uusi työtila ja aktivoi se Comment[fr]=Créer et activer un nouvel espace de travail Comment[fr_CA]=Créer et activer un nouvel espace de travail Comment[gd]=Cruthaich rum-obrach ùr is gnìomhaich e Comment[gl]=Crear un novo espazo de traballo e activalo Comment[he]=יצירת סביבת עבודה חדשה והפעל אותה Comment[hi]=नया कार्यस्थल बनाकर उसे सक्रिय करें Comment[hr]=Stvori novi radni prostor i aktiviraj ga Comment[hu]=Új munkaterület létrehozása és aktiválása Comment[ia]=Crear un nove spatio de labor e activar lo Comment[id]=Buat ruang kerja baru dan langsung aktifkan Comment[ie]=Crear un nov labor-spacie e activar it Comment[is]=Búa til nýtt vinnusvæði og virkja það Comment[it]=Crea un nuovo spazio di lavoro e attivalo Comment[ja]=新しいワークスペースを作成し、それをアクティブ化します Comment[kab]=Snulfu-d u sermed tallunt n umahil tamaynutt Comment[ko]=새로운 작업 공간을 만들고 사용합니다 Comment[la]=Novam aream laboris crea atque utere Comment[lt]=Sukurti naują darbo sritį ir ją aktyvuoti Comment[ms]=Cipta kawasan kerja baru dan aktifkan ia. Comment[nb]=Opprett et nytt arbeidsområde og aktiver det Comment[nl]=Maak een nieuw werkblad en activeer het Comment[pl]=Utwórz nową przestrzeń roboczą i aktywuj ją Comment[pt]=Criar uma nova área de trabalho e ativá-la Comment[pt_BR]=Criar um novo espaço de trabalho e ativá-lo Comment[ro]=Creează un spaţiu de lucru nou şi activează-l Comment[ru]=Создать рабочее место и сделать активным Comment[sk]=Vytvoriť novú pracovnú plochu a aktivovať ju Comment[sl]=Ustvari novo delovno površino in jo aktiviraj Comment[sr]=Направите нови радни простор и активирајте га Comment[sr@latin]=Napravi novi radni prostor i aktiviraj ga Comment[sv]=Skapa en ny arbetsyta och aktivera den Comment[ta]=புதிய பணித்தளத்தை உருவாக்கி அதை உயிர்ப்பி Comment[th]=สร้างพื้นที่ทำงานใหม่และใช้งานพื้นที่ทำงานนั้น Comment[tr]=Yeni bir çalışma alanı oluştur ve etkinleştir Comment[uk]=Створити й активувати новий робочий простір Comment[ur]=نیا مقام کار بنائیں اور اسے چالو کریں Comment[uz]=Yangi ish joyini yaratishva uni faollashtirish Comment[vi]=Tạo và kích hoạt vùng làm việc mới Comment[zh_CN]=创建新的工作区并激活它 Comment[zh_HK]=建立新工作區並將其啟動 Comment[zh_TW]=建立新工作區並啟用 nemo-6.4.5/files/usr/share/nemo/actions/90_new-launcher.nemo_action0000664000175000017500000001526014757107430024154 0ustar fabiofabio[Nemo Action] Name=Create a new l_auncher here... Comment=Create a new launcher in this folder Exec=cinnamon-desktop-editor -mnemo-launcher -d"%P" Selection=None Icon-Name=list-add-symbolic Extensions=any; Dependencies=cinnamon-desktop-editor; Conditions=desktop; Name[am]=አዲስ ማ_ስነሻ እዚህ መፍጠሪያ... Name[ar]=إنشاء منصة _إطلاق جديدة هنا ... Name[ast]=Crear un ll_anzador nuevu equí... Name[be]=Стварыць новую праграму _запуску тут... Name[bg]=Създаване на нов с_тартер тук... Name[br]=Krouiñ ul loc'her _nevez amañ... Name[bs]=Napravi novi p_okretač ovdje... Name[ca]=Crea aquí un l_lançador nou... Name[cs]=Vytvořit zde nový s_pouštěč… Name[cy]=Creu C_ychwynnwr yma... Name[da]=Opret en ny _programstarter her … Name[de]=Neuen _Starter hier erstellen … Name[el]=Δημιουργία ενός νέου ε_κκινητή εδώ... Name[en_GB]=Create a new l_auncher here... Name[eo]=Krei novan l_anĉilon ĉi tie... Name[es]=Crear un _lanzador nuevo aquí... Name[et]=Uue käivitaja _loomine... Name[eu]=Sortu _abiarazle berri bat hemen... Name[fa]=ایجادِ ا_جراگرِ جدید در اینجا... Name[fi]=_Luo uusi käynnistin... Name[fr]=Créer un nouveau l_anceur ici… Name[fr_CA]=Créer un nouveau l_anceur Name[gd]=Cruthaich lòinsear ùr an-seo... Name[gl]=Crear aquí un novo _iniciador Name[he]=יצירת מ_שגר חדש כאן.. Name[hi]=यहाँ नया लॉन्चर बनाएँ (_a)... Name[hr]=Stvori novi p_okretač ovdje... Name[hu]=In_dító létrehozása… Name[ia]=Crear un nove l_anceator ci... Name[id]=Buat sebuah pel_uncur disini... Name[ie]=Crear un nov l_ansator ci... Name[is]=Búa til nýjan _forritaræsi hér... Name[it]=Crea un nuovo l_anciatore qui... Name[ja]=ここに新しいランチャーを作成 (_A)... Name[kab]=Snulfu-d am_sekker amaynut dagi... Name[ko]=여기에 새 런처 만들기(_A)... Name[lt]=Sukurti čia n_aują leistuką Name[ms]=Cipta pe_lancar baru disini... Name[nb]=L_ag en ny programstarter her Name[nl]=Maak hier een nieuwe starter... Name[pl]=Utwórz nowy _aktywator tutaj... Name[pt]=Criar um novo l_ançador aqui... Name[pt_BR]=Criar novo l_ançador aqui... Name[ro]=Creează un l_ansator nou aici... Name[ru]=Создать к_нопку запуска здесь... Name[sk]=Vytvoriť nový _spúšťač sem... Name[sl]=Ustvari nov z_aganjalnik tukaj ... Name[sr]=Овде направи нови _покретач... Name[sr@latin]=Napravi novi pokre_tač ovde... Name[sv]=Skapa en ny progr_amstartare här... Name[tg]=Эҷод кардани о_ғозкунандаи нав дар ин ҷо... Name[th]=_สร้างลอนเชอร์ใหม่ที่นี่... Name[tr]=Burada yeni bir b_aşlatıcı oluştur... Name[uk]=Створити пус_кач тут... Name[ur]=یہاں نیا لا_نچر بنائیں... Name[uz]=Bu yerda yangi ishga _tushirgich yaratish... Name[vi]=Tạo trình _khởi chạy mới ở đây... Name[zh_CN]=在此新建启动器(_A) Name[zh_HK]=在此建立新啟動器(_A)... Name[zh_TW]=在此建立新啟動器(_A)... Comment[am]=በዚህ ፎልደር ውስጥ ማስጀመሪያ መፍጠሪያ Comment[ar]=إنشاء منصة إطلاق جديدة في هذا المجلد Comment[ast]=Crea un llanzador nuevu nesta carpeta Comment[be]=Стварыць новую праграму запуску ў гэтай папцы Comment[bg]=Създаване на нов стартер в тази папка Comment[br]=Krouiñ ul loc'her _nevez e-barzh an teuliad-mañ... Comment[bs]=Napravi novi p_okretač u ovom direktoriju Comment[ca]=Crear un nou llançador en aquesta carpeta Comment[cs]=Vytvoří nový spouštěč v této složce Comment[cy]=Creu cychwynnwr newydd yn y ffolder Comment[da]=Opret en ny programstarter i denne mappe Comment[de]=Einen neuen Starter in diesem Ordner erstellen Comment[el]=Δημιουργία ενός νέου εκκινητή σε αυτό το φάκελο Comment[en_GB]=Create a new launcher in this folder Comment[eo]=Krei novan lanĉilon en ĉi tiu dosierujo Comment[es]=Crear un lanzador nuevo en esta carpeta Comment[et]=Sellesse kausta uue käivitaja loomine Comment[eu]=Sortu abiarazle berri bat karpeta honetan Comment[fa]=ایجادِ اجراگرِ جدید در این پوشه Comment[fi]=Luo uusi käynnistin tähän kansioon Comment[fr]=Créer un nouveau lanceur dans ce dossier Comment[fr_CA]=Créer un nouveau lanceur dans ce dossier Comment[gd]=Cruthaich lòinsear ùr anns a' phasgan seo Comment[gl]=Crear un novo iniciador neste cartafol Comment[he]=יצירת משגר חדש בתיקייה זו Comment[hi]=इस फोल्डर में नया लॉन्चर बनाएँ Comment[hr]=Stvori novi pokretač u ovoj mapi Comment[hu]=Új indító létrehozása ebben a mappában Comment[ia]=Crear un nove lanceator in iste dossier Comment[id]=Buat sebuah peluncur baru didalam folder ini Comment[ie]=Crear un nov lansator in ti-ci fólder Comment[is]=Búa til nýjan forritaræsi í þessari möppu Comment[it]=Crea un nuovo lanciatore in questa cartella Comment[ja]=このフォルダーに新しいランチャーを作成します Comment[kab]=Snulfu-d amsekker amaynut deg ukaram Comment[ko]=이 폴더에 새 런처 만들기 Comment[lt]=Sukurti šiame aplanke naują leistuką Comment[ms]=Cipta pelancar baru dalam folder ini Comment[nb]=Lag en ny programstarter i denne mappen Comment[nl]=Maak een nieuwe starter in deze map Comment[pl]=Utwórz nowy aktywator w tym katalogu Comment[pt]=Criar um novo lançador neste diretório Comment[pt_BR]=Criar um novo lançador nesta pasta Comment[ro]=Creează un lansator nou în acest dosar Comment[ru]=Создать _кнопку запуска в текущей папке Comment[sk]=Vytvoriť nový spúšťač do tohto priečinka Comment[sl]=Ustvari nov zaganjalnik v tej mapi Comment[sr]=Направи нови покретач у овој фасцикли Comment[sr@latin]=Napravi novi pokretač u ovom direktorijumu Comment[sv]=Skapa en ny programstartare i denna mapp Comment[tg]=Эҷод кардани оғозкунандаи нав дар ин ҷузвдон Comment[th]=สร้างลอนเชอร์ใหม่ในโฟลเดอร์นี้ Comment[tr]=Bu dizin içinde yeni bir başlatıcı oluştur Comment[uk]=Створити пускач у цій теці Comment[ur]=اس فولڈر میں نیا لانچر بنائیں Comment[uz]=Ushbu jildda yangi ishga tushirgich yaratish Comment[vi]=Tạo trình khởi chạy mới trong thư mục này Comment[zh_CN]=在此文件夹新建启动器 Comment[zh_HK]=在此資料夾裏建立新啟動器 Comment[zh_TW]=在此資料夾建立新啟動器 nemo-6.4.5/files/usr/share/nemo/actions/change-background.nemo_action0000664000175000017500000001535614757107430024624 0ustar fabiofabio[Nemo Action] Name=Change Desktop _Background Comment=Change the Cinnamon desktop background Exec=cinnamon-settings backgrounds Selection=None Icon-Name=cs-backgrounds-symbolic Extensions=any; Dependencies=cinnamon-settings; Conditions=desktop;dbus org.Cinnamon; Name[af]=Verander Werkskerm Agtergrond Name[am]=የዴስክቶፕ _መደብ መቀየሪያ Name[ar]=تغيير خلفية _سطح المكتب Name[ast]=Camudar el fon_du d'escritoriu Name[be]=Змяніць _фон працоўнага стала Name[bg]=Промяна на _фона Name[bn]=ডেস্কটপের পটভূমি পরিবর্তন করুন (_B) Name[br]=Cheñch drekleur ar _burev Name[bs]=Promijeni _pozadinu desktopa Name[ca]=Canvia el _fons de l'escriptori Name[cs]=Změnit _pozadí plochy Name[cy]=Newid Cefndir y _Bwrdd Gwaith Name[da]=Skift skrive_bordsbaggrund Name[de]=_Hintergrund des Schreibtisches ändern Name[el]=Αλλαγή _εικόνας επιφάνειας εργασίας Name[en_AU]=Change Desktop _Background Name[en_GB]=Change Desktop _Background Name[eo]=Ŝanĝi fonon de la_bortabla Name[es]=Cambiar el _fondo del escritorio Name[et]=Vaheta töölaua _taust Name[eu]=Aldatu _mahaigainaren atzeko planoa Name[fa]=_تغییر پس‌زمینه میزکار Name[fi]=Vaihda _taustakuva Name[fr]=Modifier l'arrière-plan du _bureau Name[fr_CA]=Modifier l’arrière-plan du _bureau Name[ga]=Athraigh Cúlra_na Deisce Name[gd]=Atharraich _cùlaibh an desktop Name[gl]=Cambiar o _fondo do escritorio Name[he]=שינוי _רקע שולחן העבודה Name[hi]=डेस्कटॉप बैकग्राउंड बदलें (_B) Name[hr]=Promijeni pozadinu _radne površine Name[hu]=Asztal _hátterének módosítása Name[ia]=Cam_biar le fundo del scriptorio Name[id]=Ubah Latar _Belakang Desktop Name[ie]=Alterar li _funde del Pupitre Name[is]=Breyta _bakgrunni skjáborðs Name[it]=Ca_mbia sfondo scrivania Name[ja]=背景を変更 (_B) Name[jv]=Ganti Gambar _Buri Desktop Name[kab]=Beddel a_gilal n tnarit Name[kk]=Ф_он суретін ауыстыру Name[ko]=바탕화면 배경 바꾸기(_B) Name[ku]=Zemîna Sermaseyê Biguherîne Name[la]=_Fundum Scriptorii Muta Name[lt]=Keisti darbalaukio _foną Name[ml]=ഡെസ്ക്ടോപ്പിന്റെ _പശ്ചാത്തലം മാറ്റുക Name[ms]=Tukar Latar _Belakang Desktop Name[nb]=Endre skrivebords_bakgrunn Name[nds]=Desktop_Hintergrund ändern Name[nl]=Werk_bladachtergrond wijzigen Name[oc]=Modificar lo _rèire plan del burèu Name[pl]=Zmień _tło pulpitu Name[pt]=Alterar fundo do am_biente de trabalho Name[pt_BR]=Alterar _plano de fundo Name[ro]=Schim_bă imaginea de fundal Name[ru]=Изменить _фон рабочего стола Name[sk]=Zmeniť _pozadie plochy Name[sl]=Spremeni _ozadje namizja Name[sq]=Ndrysho _sfondin e desktopit Name[sr]=Из_мени позадину Name[sr@latin]=Izmeni pozadinu _radne površine Name[sv]=Byt skrivbordsbak_grund Name[ta]=(_B)பணிமேடை பின்னனியை மாற்று Name[tg]=Тағйир додани пасзаминаи _мизи корӣ Name[th]=_เปลี่ยนพื้นหลังของพื้นโต๊ะ Name[tr]=Masaüstü _Arkaplanını Değiştir Name[uk]=Змінити т_ло Робочого стола Name[ur]=ڈیسک ٹاپ کا _پس منظر بدلیں Name[uz]=_Ish stoli fonini o‘zgartirish Name[vi]=Thay đổi hình nền_màn hình chính Name[zh_CN]=更改桌面背景(_B) Name[zh_HK]=變更桌面背景(_B) Name[zh_TW]=變更桌面背景(_B) Comment[am]=የ ሲናሞን ዴስክቶፕ መደብ መቀየሪያ Comment[ar]=تغيير خلفية سطح مكتب Cinnamon Comment[be]=Змяніць фон працоўнага стала Cinnamon Comment[bg]=Смени фона на работния плот Comment[br]=Cheñch drekleur burev Cinnamon Comment[ca]=Canvia el fons d'escriptori de Cinnamon Comment[cs]=Změnit pozadí plochy Cinnamonu Comment[cy]=Newid cefndir bwrdd gwaith Cinnamon Comment[da]=Skift Cinnamon-skrivebordsbaggrund Comment[de]=Cinnamons Schreibtischhintergrund ändern Comment[el]=Αλλάξτε το φόντο της επιφάνειας εργασίας Comment[en_GB]=Change the Cinnamon desktop background Comment[eo]=Ŝanĝi la fonon de Cinnamon-labortablo Comment[es]=Cambiar el fondo del escritorio de Cinnamon Comment[et]=Cinnamoni töölaua tausta muutmine Comment[eu]=Aldatu Cinnamon mahaigainaren atzeko planoa Comment[fa]=_تغییر پس‌زمینه میزکار Cinnamon Comment[fi]=Vaihda Cinnamon taustakuva Comment[fr]=Changer le fond d'écran de Cinnamon Comment[fr_CA]=Changer le fond d’écran de Cinnamon Comment[gd]=Atharraich cùlaibh an deasg Cinnamon Comment[he]=שינוי רקע שולחן העבודה Comment[hi]=सिनेमन डेस्कटॉप बैकग्राउंड बदलें Comment[hr]=Promijeni pozadinu Cinnamon radne površine Comment[hu]=A Cinnamon asztal hátterének módosítása Comment[ia]=Cambiar le fundo del scriptorio de Cinnamon Comment[id]=Ganti gambar latar belakang desktop Cinnamon Comment[ie]=Alterar li funde del Pupitre de Cinnamon Comment[is]=Breyta bakgrunni skjáborðsins Comment[it]=Cambia lo sfondo della scrivania di Cinnamon Comment[ja]=Cinnamon デスクトップの背景を変更します Comment[kab]=Beddel agilal n tranrit n Cinnamon Comment[ko]=시나몬 데스크톱의 배경화면 바꾸기 Comment[la]=Fundum scriptorii Cinnamonis muta Comment[lt]=Keisti Cinnamon darbalaukio foną Comment[ms]=Tukar latar belakang desktop Cinnamon Comment[nb]=Endre Cinnamon-skrivebordsbakgrunnen Comment[nl]=Verander de bureaubladachtergrond van Cinnamon Comment[pl]=Zmień tło pulpitu Cinnamon Comment[pt]=Mudar o fundo do ambiente de trabalho do Cinnamon Comment[pt_BR]=Altera o plano de fundo da Área de Trabalho do Cinnamon Comment[ro]=Schimbă fundalul desktopului Cinnamon Comment[ru]=Сменить фон рабочего стола Cinnamon Comment[sk]=Zmeniť pozadie pracovnej plochy prostredia Cinnamon Comment[sl]=Spremeni ozadje Cinnamon namizja Comment[sr]=Измените позадину радне површи Comment[sr@latin]=Izmenite pozadinu Cinnamonove radne površine Comment[sv]=Byt bakgrundsbild på skrivbordet i Cinnamon Comment[th]=เปลี่ยนภาพพื้นหลังเดสก์ท็อป Cinnamon Comment[tr]=Cinnamon masaüstü arkaplanını değiştir Comment[uk]=Змінити тло робочого стола Cinnamon Comment[ur]=سنامون ڈیسک ٹاپ پس منظر تبدیل کریں Comment[uz]=Cinnamon ish stoli fonini o‘zgartirish Comment[vi]=Thay đổi hình nền màn hình chính Cinnamon Comment[zh_CN]=更改 Cinnamon 桌面背景 Comment[zh_HK]=變更 Cinnamon 桌面背景 Comment[zh_TW]=變更 Cinnamon 桌面背景 nemo-6.4.5/files/usr/share/nemo/actions/set-as-background.nemo_action0000664000175000017500000001720114757107430024562 0ustar fabiofabio[Nemo Action] Name=Set as Wallpaper... Comment=Set the selected image as your Cinnamon desktop wallpaper Exec=gsettings set org.cinnamon.desktop.background picture-uri "%U" Selection=s Mimetypes=image/*; Conditions=dbus org.Cinnamon; Name[am]=እንደ ግድግዳ ወረቀት ማሰናጃ... Name[ar]=تعيين كخلفية... Name[ast]=Afitar como fondu pantalla... Name[be]=Зрабіць фонавай выявай... Name[bg]=Задаване като тапет... Name[bs]=Postavi kao pozadinu... Name[ca]=Estableix com a fons de pantalla... Name[cs]=Nastavit jako pozadí plochy… Name[cy]=Gosod fel Papur Wal... Name[da]=Anvend som baggrund … Name[de]=Als Hintergrund festlegen … Name[el]=Ορισμός ως Ταπετσαρίας... Name[en_GB]=Set as Wallpaper... Name[eo]=Agordi kiel ekranfono... Name[es]=Configurar como fondo de pantalla... Name[et]=Määra taustapildiks... Name[eu]=Ezarri atzeko plano gisa... Name[fa]=تنظیم به‌عنوان کاغذ‌دیواری... Name[fi]=Aseta taustakuvaksi... Name[fr]=Définir en tant que papier peint… Name[fr_CA]=Définir en tant que fond d’écran... Name[ga]=Socraigh mar Cúlra na Deisce Name[gd]=Suidhich mar phàipear-balla... Name[gl]=Estabelecer como fondo de pantalla Name[he]=הגדרה כתמונת רקע... Name[hi]=वॉलपेपर के रूप में सेट करें... Name[hr]=Postavi kao pozadinu... Name[hu]=Beállítás háttérképként… Name[ia]=Fixar como imagine de fundo... Name[id]=Pasang sebagai Wallpaper... Name[ie]=Assignar quam li _Tapete... Name[is]=Gera að veggfóðri... Name[it]=Imposta come sfondo... Name[ja]=壁紙に設定... Name[kab]=Sbadu am tugna n ugdil... Name[ko]=배경화면으로 설정하기... Name[lt]=Nustatyti kaip darbalaukio foną Name[ml]=പശ്ചാത്തലചിത്രമായി സജ്ജീകരിക്കുക... Name[ms]=Tetapkan sebagai Kertas Dinding... Name[nb]=Sett som bakgrunn... Name[nl]=Gebruik als bureaubladachtergrond... Name[oc]=Definir coma rèireplan Name[pl]=Ustaw jako tło pulpitu... Name[pt]=Definir como fundo do ambiente de trabalho... Name[pt_BR]=Definir como plano de fundo... Name[ro]=Setează ca imagine de fundal... Name[ru]=Сделать фоном... Name[sk]=Nastaviť ako pozadie... Name[sl]=Nastavi kot sliko ozadja ... Name[sr]=Постави као позадину... Name[sr@latin]=Postavi kao pozadinu... Name[sv]=Ange som skrivbordsbakgrund... Name[tg]=Танзим кардан ҳамчун тасвири экран... Name[th]=ตั้งเป็นภาพพื้นหลัง... Name[tr]=Duvarkağıdı olarak ayarla... Name[uk]=Встановити як тло... Name[ur]=بطور وال پیپر سیٹ کریں... Name[uz]=Fon rasmi sifatida sozlash... Name[vi]=Đặt làm Hình nền... Name[zh_CN]=设置为壁纸... Name[zh_HK]=設為桌布... Name[zh_TW]=設為桌布... Comment[am]=የ ተመረጠውን ምስል በ እርስዎ የ ሲናሞን ዴስክቶፕ ውስጥ እንደ ግድግዳ ወረቀት መጠቀሚያ Comment[ar]=تعيين الصورة المحددة كخلفية سطح المكتب لـCinnamon Comment[be]=Усталяваць выбраную выяву як фон для працоўнага стала Cinnamon Comment[bg]=Задай избраното изображение като тапет за Cinnamon Comment[ca]=Estableix la imatge seleccionada com a fons d'escriptori de Cinnamon Comment[cs]=Nastavit vybraný obrázek jako pozadí plochy v Cinnamonu Comment[cy]=Gosod y ddelwedd hon fel eich papur wall bwrdd gwaith Cinnamon Comment[da]=Anvend det markerede billede som din Cinnamon-skrivebordsbaggrund Comment[de]=Ausgewähltes Bild als Cinnamons Schreibtischhintergrund einstellen Comment[el]=Ορίστε την επιλεγμένη εικόνα ως ταπετσαρία της επιφάνειας εργασίας σας Comment[en_GB]=Set the selected image as your Cinnamon desktop wallpaper Comment[eo]=Agordi la elektitan bildon kiel vian Cinnamon-labortablan ekranfonon Comment[es]=Configurar la imagen seleccionada como fondo de pantalla de Cinnamon Comment[et]=Valitud pildi määramine Cinnamoni töölaua taustaks Comment[eu]=Ezarri hautatutako irudia zure Cinnamon mahaigaineko horma-paper bezala Comment[fa]=تنظیم عکس به‌عنوان کاغذدیواری میزکار Cinnamon شما Comment[fi]=Aseta valittu kuva Cinnamon pöydän taustakuvaksi Comment[fr]=Utiliser l'image sélectionnée comme fond d'écran de Cinnamon Comment[fr_CA]=Utiliser l’image sélectionnée comme fond d’écran de Cinnamon Comment[gd]=Suidhich an dealbh a thagh thu mar phàipear-balla an deasg Cinnamon Comment[he]=קביעת התמונה שנבחרה כתמונת רקע לשולחן העבודה Comment[hi]=चयनित चित्र को सिनेमन डेस्कटॉप वॉलपेपर के रूप में सेट करें Comment[hr]=Postavi odabranu sliku kao pozadinu svoje Cinnamon radne površine Comment[hu]=A kiválasztott kép beállítása Cinnamon asztal háttérképként Comment[ia]=Configurar le imagine seligite imagine como imagine de fundo de tu scriptorio Cinnamon Comment[id]=Gunakan gambar yang dipilih sebagai wallpaper desktop Cinnamon Anda Comment[ie]=Assignar li selectet image quam li Tapete de Cinnamon Comment[is]=Setja valda mynd sem bakgrunnsmynd skjáborðs Comment[it]=Imposta l'immagine selezionata come sfondo della scrivania di Cinnamon Comment[ja]=選択した画像を Cinnamon デスクトップの壁紙に設定します Comment[kab]=Sbadu tugna yettwafernen am lqaɛ n ugdil n tnarit n Cinnamon Comment[ko]=선택한 이미지를 시나몬 데스크톱의 배경화면으로 사용하기 Comment[lt]=Nustatyti pasirinktą paveikslą kaip jūsų Cinnamon darbalaukio foną Comment[ms]=Set imej dipilih sebagai wallpaper desktop Cinnamon Comment[nb]=Angi det valgte bildet som Cinnamon-skrivebordsbakgrunn Comment[nl]=Stel de gekozen afbeelding in als uw bureaubladachtergrond voor Cinnamon Comment[pl]=Ustaw wybrany obraz jako Twoje tło pulpitu Cinnamon Comment[pt]=Definir a imagem selecionada como o fundo do ambiente de trabalho do Cinnamon Comment[pt_BR]=Define a imagem selecionada como plano de fundo da Área de Trabalho do Cinnamon Comment[ro]=Setează imaginea selectată ca imagine de fundal pentru desktopul Cinnamon Comment[ru]=Установить выбранное изображение фоном рабочего стола Cinnamon Comment[sk]=Nastaviť vybratý obrázok ako pozadie vašej pracovnej plochy prostredia Cinnamon Comment[sl]=Nastavi izbrano sliko kot ozadje vašega Cinnamon namizja Comment[sr]=Поставите изабрану слику за позадину радне површи Comment[sr@latin]=Postavite izabranu sliku kao Vašu pozadinu na Cinnamon radnoj površini Comment[sv]=Ange den valda bilden som bakgrundsbild för skrivbordet i Cinnamon Comment[th]=ตั้งรูปที่เลือกเป็นภาพพื้นหลังเดสก์ท็อป Cinnamon ของคุณ Comment[tr]=Seçilen görüntüyü Cinnamon masaüstü duvarkağıdı olarak ayarla Comment[uk]=Встановити вибране зображення в як шпалери робочого стола Cinnamon Comment[ur]=منتخب کردہ تصویر کو بطور وال پیپر متعین کریں Comment[uz]=Tanlangan rasmni Cinnamon ish stoli fon rasmi sifatida sozlash Comment[vi]=Đặt hình ảnh đã chọn làm hình nền màn hình chính Cinnamon Comment[zh_CN]=将选中的图片设为您的 Cinnamon 桌面壁纸 Comment[zh_HK]=將選擇的影像設為你的 Cinnamon 桌面桌布 Comment[zh_TW]=將選擇的影像設為您 Cinnamon 桌面的桌布 nemo-6.4.5/files/usr/share/nemo/script-info.md0000664000175000017500000000172414757107430020156 0ustar fabiofabio#### Scripts When executed from a local folder, scripts will be passed the selected file names. When executed from a remote folder (e.g. a folder showing web or ftp content), scripts will be passed no parameters. In all cases, the following environment variables will be set by Nemo, which the scripts may use: - NEMO_SCRIPT_SELECTED_FILE_PATHS: newline-delimited paths for selected files (only if local) - NEMO_SCRIPT_SELECTED_URIS: newline-delimited URIs for selected files - NEMO_SCRIPT_CURRENT_URI: URI for current location - NEMO_SCRIPT_WINDOW_GEOMETRY: position and size of current window - NEMO_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS: newline-delimited paths for selected files in the inactive pane of a split-view window (only if local) - NEMO_SCRIPT_NEXT_PANE_SELECTED_URIS: newline-delimited URIs for selected files in the inactive pane of a split-view window - NEMO_SCRIPT_NEXT_PANE_CURRENT_URI: URI for current location in the inactive pane of a split-view window nemo-6.4.5/files/usr/share/nemo/action-info.md0000664000175000017500000002313314757107430020125 0ustar fabiofabio# Nemo Actions _This documentation is available online at https://github.com/linuxmint/nemo/wiki/Nemo-Actions_ ### About Nemo actions allow the user to add custom menu actions to apply to selected files. These can be one-shot commands or call their own scripts, and can be restricted to specific files by defining various conditions for the action. Action files are just text files that end in `.nemo_action` and are stored in system and user data locations - `/usr/share/nemo/actions`, `~/.local/usr/share/nemo/actions` (all of your environment's `XDG_DATA_DIRS` are scanned, though typically only the aforementioned are used). These files are structured as follows (this is a standard keyfile syntax also used in application .desktop and config files): ``` [Nemo Action] Name=Test action on file %f Comment=If you click this menu entry, %F will be acted upon! Exec=notify-send "Hey there" "This is the result of an action you ran on the file '%F' - well done" Selection=s Extensions=any; Terminal=true Icon-Name=face-smile ``` If you add this to a newly created file `~/.local/share/nemo/actions/my-test-action.nemo_action`, and right-click on a single file in Nemo, this will appear in the menu. You should get the system notification immediately after you activate it. --- ### Troubleshooting For debugging actions, you can run Nemo as follows: ```bash # First, kill any existing instances nemo --quit # Then relaunch with debugging enabled NEMO_DEBUG=Actions nemo --debug ``` > **Tip**: When debugging actions, it's usually a good idea to temporarily disable all but the action you're working with, to reduce the amount of logging output generated With debugging enabled, you should get output that looks something like this when testing your action: ```bash Nemo-DEBUG: nemo_action_update_display_state: ../libnemo-private/nemo-action.c:2011: Action 'new-sample' determined VISIBLE Nemo-DEBUG: get_final_label: ../libnemo-private/nemo-action.c:1538: Action Label: Test action on file Documents Nemo-DEBUG: get_final_tt: ../libnemo-private/nemo-action.c:1563: Action Tooltip: If you click this menu entry, /home/mtwebster/Documents will be acted upon! Nemo-DEBUG: nemo_action_activate: ../libnemo-private/nemo-action.c:1462: Action Spawning: notify-send "Hey there" "This is the result of an action you ran on the file '/home/mtwebster/Documents' - well done" ``` --- ### Reference ##### Field descriptions: **Name** (mandatory): The label to display in the menu. This can include selection tokens and can be localized (see below). ` Name=Test action on file %f ` **Exec** (mandatory): The command to execute when the action is activated ` Exec=notify-send "Hey there" "This is the result of an action you ran on the file '%F' - well done" ` If you have a custom script to run, you can enclose it in `<...>` to have it executed from the action's directory. This is handy because it removes the need for the script to either be in the user's PATH or require an absolute path. Instead, the file or relative path within the brackets will be appended to the action's path. So, if your action is in `~/.local/share/actions/nemo/my-action.nemo_action` and you put `` as the Exec line, Nemo will assume that script is at `~/.local/share/actions/nemo/my-action/my-action-script.sh`. **Selection** (mandatory): Provides a condition based on how many files are selected. ` Selection=s ` Displays the action if: - `s`: one single file is selected. - `m`: multiple files are selected. - `any`: any number of files is selected (including no files). - `notnone`: any number of files is selected (excluding no files). - `none`: a click against the view's background. - `42`: an integer specifying exactly how many files must be selected. **Extensions** (mandatory if **Mimetypes** is not defined): What file extension(s) to match with. ` Extensions=pdf;ps; ` Displays the action if: - `dir`: only directories are selected. - `none`: only files with no extension are selected. - `nodirs`: only files with no selection are selected, or if there is no selection. - `any`: any file is selected. or - `pdf;txt;png;`: all files match a semicolon-separated list of file extensions. **Mimetypes** (mandatory if **Extensions** is not defined): What file mimetypes to match with. ` Mimetypes=text/plain; ` Displays the action if all selected files have a mimetype included in this semicolon-separated list. **Comment** (optional): The tooltip to display in Nemo's bottom status bar. This can include selection tokens and can be localized (see below). ` Comment=If you click this menu entry, %F will be acted upon! ` **Icon-Name** (optional): The name of the icon to display in Nemo's context menu next to the action entry. This must be an icon that is part of the GtkIconTheme. Symbolic icons are supported. ` Icon-Name=folder ` **Separator** (optional): Character(s) to separate multiple filenames if more than a single file is selected. By default a space is used. ` Separator=, ` **Quote** (optional): Quote type to use (if any) around individual selected files. ` Quote=double ` Can be one of: - `single`: single quotations (' ') - `double`: double quotations (" ") - `backtick`: backticks (` `) **Dependencies** (optional): Semicolon-separated list of executable programs required for this action to display. ` Dependencies=notify-send;zenity; ` - If just a filename is provided, the PATH will be searched for it (/usr/bin, etc...). - Absolute paths are valid. - Prefixing a filename with ! will reverse the dependency - if the program exists, the dependency check will *fail*. **UriScheme** (optional): a uri scheme (file, smb, sftp, ...) that the current location's scheme must match. ` UriScheme=sftp ` **Conditions** (optional): a semicolon-separated list of special visibility conditions, all of which must be met for the action to be visible. ` Conditions=desktop;dbus org.Cinnamon; ` Can be one or more of: - `desktop`: The selection must be the desktop (not the 'Desktop' folder in Nemo's bookmarks, but *the* desktop). - `removable`: The selection must be some sort of removable device. - `dbus `: must be a well-known DBus name, and be owned. - `gsettings `: The boolean key in the given schema must be true. - `gsettings <[eq|ne|gt|lt]> `: The value of `` is [`equal|not equal|greater than|less than`] ``. The `` must match, but the comparisons are not clearly defined for non-numerical types. - `exec `: Run `` (absolute path or PATH executable) and interpret its exit code as 0 for passing, and non-0 for failure. **Terminal** (optional): Set to true to execute the Exec line in a spawned terminal window. ` Terminal=false ` - Generally you should not define **Quotes** when **Terminal** is true, as that should be handled during the conversion to terminal arguments. **Files** (optional): A semicolon-separated list of globs, filenames and paths to be tested against the current *selection*. All files in the selection must match *at least one* 'allowed' pattern, path or name for the action to be considered valid. ` Files=.bash*;!.bashrc; ` **Locations** (optional): A semicolon-separated list of globs, filenames and paths to be tested against the current *location*. The current location must match *at least one* 'allowed' pattern, path or name for the action to be considered valid. ` Locations=.*;!.config; ` ##### Additional details about Locations and Files: - Globs and paths can be relative or absolute. - ~ (tilde) will be expanded at runtime to the user's home directory. - Absolute paths will be tested against the file/location's full path. Otherwise it is tested against the filename only. - A glob with a leading * will be matched against the full path, whether it contains additional path parts or is just a partial filename. - If a condition is prefixed with a ! it will be considered an opposing condition (If the file passes this test, action is forbidden). - Allowed patterns are considered before forbidden ones. This allows behaviors such as: - Allow any dot-file except .config: `Locations=.*;!.config` ##### Deprecated fields **Stock-Id** (optional): A Gtk Stock ID to use for the icon. Note that if both **Icon-Name** and **Stock-Id** are defined, **Stock-Id** takes priority. ` Stock-Id=gtk-ok ` **Active** (optional): Whether or not the action is visible to Nemo. This really is never necessary, as actions can be enabled/disabled in preferences. ` Active=true ` --- ##### Tokens used in the Name, Comment and Exec fields: - `%U`: insert URI list of selection. - `%F`: insert path list of selection. - `%P`: insert path of parent (current) directory. - `%f`: insert display name of first selected file. - `%p`: insert display name of parent directory. - `%D`: insert device path of file (i.e. /dev/sdb1). - `%e`: insert display name of first selected file with the extension stripped. - `%%`: insert a literal percent sign, don't treat the next character as a token. - `%X`: insert the XID for the NemoWindow this action is being activated in. - `%N`: (deprecated) - same as `%f`. --- #### Cheat Sheet ```markdown [Nemo Action] # Mandatory fields Name=Menu item label Exec=program_to_run or Selection=s|m|any|notnone|none|42 Extensions=[dir|none|nodirs|any] | pdf;ps; # and/or Mimetypes=text/plain; # Optional fields Comment=If you click this menu entry, %F will be acted upon! Icon-Name=folder-symbolic Separator=, Quote=single|double|backtick Dependencies=notify-send;!zenity; UriScheme=sftp Conditions=desktop;dbus ;gsettings foo_schema foo_boolkey;removable;exec ; Terminal=true|false Files=.bash*;!.bashrc; Locations=.*;!.config; ``` ---nemo-6.4.5/generate_additional_file0000775000175000017500000000252514757107430016333 0ustar fabiofabio#!/usr/bin/python3 import os os.chdir("data/nemo-actions/") os.system("./merge_action_strings") os.chdir("../..") DOMAIN = "nemo" PATH = "/usr/share/locale" import os, gettext, sys from mintcommon import additionalfiles os.environ['LANGUAGE'] = "en_US.UTF-8" gettext.install(DOMAIN, PATH) prefix = """[Desktop Entry] """ suffix = """Exec=nemo %U Icon=system-file-manager # Translators: these are keywords of the file manager Keywords=folders;filesystem;explorer; Terminal=false Type=Application StartupNotify=false Categories=GNOME;GTK;Utility;Core; MimeType=inode/directory;application/x-gnome-saved-search; Actions=open-home;open-computer;open-trash; """ additionalfiles.generate(DOMAIN, PATH, "data/nemo.desktop.in", prefix, _("Files"), _("Access and organize files"), suffix) prefix = """ [Desktop Action open-home] """ suffix = """Exec=nemo %U """ additionalfiles.generate(DOMAIN, PATH, "data/nemo.desktop.in", prefix, _("Home"), None, suffix, append=True) prefix = """ [Desktop Action open-computer] """ suffix = """Exec=nemo computer:/// """ additionalfiles.generate(DOMAIN, PATH, "data/nemo.desktop.in", prefix, _("Computer"), None, suffix, append=True) prefix = """ [Desktop Action open-trash] """ suffix = """Exec=nemo trash:/// """ additionalfiles.generate(DOMAIN, PATH, "data/nemo.desktop.in", prefix, _("Trash"), None, suffix, append=True) nemo-6.4.5/search-helpers/0000775000175000017500000000000014757107430014325 5ustar fabiofabionemo-6.4.5/search-helpers/odf.nemo_search_helper0000664000175000017500000000042014757107430020635 0ustar fabiofabio[Nemo Search Helper] TryExec=nemo-odf-to-txt; Exec=nemo-odf-to-txt %s MimeType=application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.graphics; Priority=100 nemo-6.4.5/search-helpers/meson.build0000664000175000017500000000156214757107430016473 0ustar fabiofabiolibgsf = dependency('libgsf-1', required: true) mso_to_txt_sources = [ 'nemo-mso-to-txt.c' ] mso_to_txt = executable('nemo-mso-to-txt', mso_to_txt_sources, dependencies: [libgsf, gio, glib], install: true ) ppt_to_txt_sources = [ 'nemo-ppt-to-txt.c' ] ppt_to_txt = executable('nemo-ppt-to-txt', ppt_to_txt_sources, dependencies: [gio, glib], install: true ) install_data( ['nemo-xls-to-txt', 'nemo-odf-to-txt'], install_dir: join_paths(get_option('prefix'), get_option('bindir')), install_mode: 'rwxr-xr-x' ) install_data( 'epub2text.nemo_search_helper', 'mso.nemo_search_helper', 'mso-ppt.nemo_search_helper', 'mso-xls.nemo_search_helper', 'odf.nemo_search_helper', install_dir: join_paths(nemoDataPath, 'search-helpers') ) install_data( 'nemo-epub2text', install_dir: get_option('bindir') ) subdir('third-party')nemo-6.4.5/search-helpers/nemo-ppt-to-txt.c0000664000175000017500000001541514757107430017473 0ustar fabiofabio/* Nemo 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; either version 2 of the * License, or (at your option) any later version. * * Nemo 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; see the file COPYING. If not, * write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, * Boston, MA 02110-1335, USA. */ #include #include #include #include static void cleanup_tmp_dir (const gchar *tmp_dir, GFile *xml_file) { if (tmp_dir == NULL || xml_file == NULL) { return; } GFile *parent; parent = g_file_get_parent (xml_file); g_file_delete (xml_file, NULL, NULL); g_file_delete (parent, NULL, NULL); g_object_unref (parent); } static gchar * get_tmp_dir (GError **error) { gchar *tmp_dir = NULL; // Create our temp dir in /dev/shm if it's available, // otherwise use whatever glib ends up with (/tmp probably). if (g_file_test ("/dev/shm", G_FILE_TEST_IS_DIR)) { gchar *old_env_tmp; old_env_tmp = g_strdup (g_getenv ("TMPDIR")); if (g_setenv ("TMPDIR", "/dev/shm", TRUE)) { tmp_dir = g_dir_make_tmp ("nemo-search-helper-XXXXXX", NULL); if (old_env_tmp != NULL) { g_setenv ("TMPDIR", old_env_tmp, TRUE); g_free (old_env_tmp); } else { g_unsetenv ("TMPDIR"); } } } if (tmp_dir != NULL) { return tmp_dir; } return g_dir_make_tmp ("nemo-search-helper-XXXXXX", error); } gchar * run_regex_replace (const gchar *pattern, gchar *input, const gchar *replacement, GError **error) { GRegex *re; gchar *out; out = NULL; re = g_regex_new (pattern, G_REGEX_OPTIMIZE, 0, error); if (re == NULL) { return NULL; } out = g_regex_replace_literal (re, input, -1, 0, replacement, 0, error); g_free (input); g_regex_unref (re); return out; } int main (int argc, char *argv[]) { if (argc < 2) { g_printerr ("Need a filename\n"); return 1; } GSubprocess *lo_proc; GFile *xml_file; GError *error; gchar *tmp_dir = NULL; gchar *name_only = NULL; gchar *ptr; gchar *orig_file_path = NULL, *orig_basename = NULL; gchar *xml_file_path = NULL, *xml_basename = NULL; gchar *content = NULL; gint retval; gsize length; orig_file_path = g_strdup (argv[1]); orig_basename = g_path_get_basename (orig_file_path); ptr = g_strrstr (orig_basename, "."); name_only = g_strndup (orig_basename, ptr - orig_basename); g_free (orig_basename); retval = 0; xml_file = NULL; error = NULL; tmp_dir = get_tmp_dir (&error); if (tmp_dir == NULL) { if (error != NULL) { g_warning ("Could not create a temp dir for conversion: %s", error->message); g_clear_error (&error); } retval = 1; goto out; } gchar *lo_args[7] = { "libreoffice", "--convert-to", "xml", "--outdir", tmp_dir, orig_file_path, NULL }; lo_proc = g_subprocess_newv ((const gchar * const *) lo_args, G_SUBPROCESS_FLAGS_STDERR_SILENCE | G_SUBPROCESS_FLAGS_STDOUT_SILENCE, &error); if (lo_proc == NULL) { if (error != NULL) { g_warning ("Could not launch headless libreoffice for conversion: %s", error->message); g_clear_error (&error); } retval = 1; goto out; } g_subprocess_wait (lo_proc, NULL, &error); g_object_unref (lo_proc); g_free (orig_file_path); if (error != NULL) { g_warning ("LibreOffice was unable to convert ppt to xml: %s", error->message); g_clear_error (&error); retval = 1; goto out; } xml_basename = g_strconcat (name_only, ".xml", NULL); xml_file_path = g_build_filename (tmp_dir, xml_basename, NULL); xml_file = g_file_new_for_path (xml_file_path); if (!g_file_load_contents (xml_file, NULL, &content, &length, NULL, &error)) { if (error != NULL) { g_warning ("Unable to read xml file: %s", error->message); g_clear_error (&error); retval = 1; goto out; } } // remove doc settings which has content but is uninteresting content = run_regex_replace ("[\\s\\S]*?", content, "", &error); if (content == NULL) { goto out; } // remove any binary data content like embedded images content = run_regex_replace ("[\\s\\S]*?", content, "", &error); if (content == NULL) { goto out; } // remove any escaped markup as content content = run_regex_replace ("<[\\s\\S]*?>", content, "", &error); if (content == NULL) { goto out; } // remove all remaining markup content = run_regex_replace ("<[^>]+>", content, " ", &error); if (content == NULL) { goto out; } // remove excess whitespace, replace with a single space content = run_regex_replace ("\\s+", content, " ", &error); if (content == NULL) { goto out; } g_printf ("%s", content); out: g_free (content); g_free (name_only); g_free (xml_basename); g_free (xml_file_path); if (error != NULL) { g_critical ("Could not extract strings from ppt file: %s", error->message); g_error_free (error); retval = 1; } cleanup_tmp_dir (tmp_dir, xml_file); g_clear_object (&xml_file); g_free (tmp_dir); return retval; } nemo-6.4.5/search-helpers/nemo-mso-to-txt.c0000664000175000017500000001213514757107430017462 0ustar fabiofabio/* Nemo 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; either version 2 of the * License, or (at your option) any later version. * * Nemo 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; see the file COPYING. If not, * write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, * Boston, MA 02110-1335, USA. */ #include #include #include static const gchar *SKIPFILES[] = { "styles.xml", "theme", "_rels", "printerSettings", "media", "drawings" // docx "settings.xml", "app.xml", "theme1.xml", "[Content_Types].xml", "fontTable.xml", "webSettings.xml", // xlsx "worksheets", "calcChain.xml", // pptx "slideLayouts", "slideMasters", "presProps.xml", "tableStyles.xml", "viewProps.xml", "presentation.xml", NULL }; static void process_file (GString *collective, GsfInfile *file) { GString *contents; gsf_off_t remaining; contents = g_string_new (NULL); remaining = gsf_input_size (GSF_INPUT (file)); do { gint size = MIN (remaining, 1024); guint8 chunk[size]; gsf_input_read (GSF_INPUT (file), size, chunk); if (chunk != NULL) { remaining -= size; contents = g_string_append_len (contents, (const gchar *) chunk, size); } } while (remaining > 0); g_string_append (contents, " "); g_string_append (collective, contents->str); g_string_free (contents, TRUE); } static void iterate_thru_levels (GString *collective, GsfInfile *infile) { gint n_children, i; n_children = gsf_infile_num_children (infile); for (i = 0; i < n_children; i++) { GsfInfile *child; const gchar *name; gint n_child_children; child = GSF_INFILE (gsf_infile_child_by_index (infile, i)); name = gsf_infile_name_by_index (infile, i); if (g_strv_contains (SKIPFILES, name)) { g_object_unref (child); continue; } n_child_children = gsf_infile_num_children (child); if (n_child_children < 0 && g_str_has_suffix (name, ".xml")) { process_file (collective, child); } else if (n_child_children > 0) { iterate_thru_levels (collective, child); } g_object_unref (child); } } gchar * run_regex_replace (const gchar *pattern, gchar *input, const gchar *replacement, GError **error) { GRegex *re; gchar *out; out = NULL; re = g_regex_new (pattern, G_REGEX_OPTIMIZE, 0, error); if (re == NULL) { return NULL; } out = g_regex_replace_literal (re, input, -1, 0, replacement, 0, error); g_free (input); g_regex_unref (re); return out; } int main (int argc, char *argv[]) { GsfInput *input; GsfInfile *toplevel; GString *collective; GError *error; GFile *file; gchar *filename; gchar *content; if (argc < 2) { g_printerr ("Need a filename\n"); return 1; } filename = g_strdup (argv[1]); file = g_file_new_for_path (filename); g_free (filename); error = NULL; input = gsf_input_gio_new (file, &error); g_object_unref (file); if (error != NULL) { g_critical ("Could not open mso file for reading: %s", error->message); g_error_free (error); return 1; } toplevel = gsf_infile_zip_new (input, &error); if (error != NULL) { g_critical ("Could not load mso file: %s", error->message); g_object_unref (input); g_error_free (error); return 1; } collective = g_string_new (NULL); iterate_thru_levels (collective, GSF_INFILE (toplevel)); g_object_unref (toplevel); g_object_unref (input); content = g_string_free (collective, FALSE); if (content == NULL) { goto out; } content = run_regex_replace ("<[^>]+>", content, "", &error); if (content == NULL) { goto out; } content = run_regex_replace ("\\s+", content, " ", &error); if (content == NULL) { goto out; } g_printf ("%s", content); g_free (content); out: if (error != NULL) { g_critical ("Could not extract strings from mso 2003+ file: %s", error->message); g_error_free (error); return 1; } return 0; } nemo-6.4.5/search-helpers/third-party/0000775000175000017500000000000014757107430016574 5ustar fabiofabionemo-6.4.5/search-helpers/third-party/ps2ascii.nemo_search_helper0000664000175000017500000000013714757107430024056 0ustar fabiofabio[Nemo Search Helper] TryExec=ps2ascii; Exec=ps2ascii %s MimeType=application/ps; Priority=100; nemo-6.4.5/search-helpers/third-party/pdf2txt.nemo_search_helper0000664000175000017500000000013514757107430023732 0ustar fabiofabio[Nemo Search Helper] TryExec=pdf2txt; Exec=pdf2txt %s MimeType=application/pdf; Priority=100 nemo-6.4.5/search-helpers/third-party/meson.build0000664000175000017500000000050214757107430020733 0ustar fabiofabiohelpers = [ 'untex.nemo_search_helper', 'exif.nemo_search_helper', 'id3.nemo_search_helper', 'mso-doc.nemo_search_helper', 'pdf2txt.nemo_search_helper', 'pdftotext.nemo_search_helper', 'ps2ascii.nemo_search_helper' ] install_data( helpers, install_dir: join_paths(nemoDataPath, 'search-helpers') ) nemo-6.4.5/search-helpers/third-party/untex.nemo_search_helper0000664000175000017500000000012414757107430023500 0ustar fabiofabio[Nemo Search Helper] TryExec=untex; Exec=untex %s MimeType=text/x-tex; Priority=100 nemo-6.4.5/search-helpers/third-party/mso-doc.nemo_search_helper0000664000175000017500000000013614757107430023701 0ustar fabiofabio[Nemo Search Helper] TryExec=catdoc; Exec=catdoc %s MimeType=application/msword; Priority=100 nemo-6.4.5/search-helpers/third-party/exif.nemo_search_helper0000664000175000017500000000017614757107430023277 0ustar fabiofabio[Nemo Search Helper] TryExec=exif; Exec=exif -m %s MimeType=image/jpeg;image/png;image/gif;image/bmp;image/tiff; Priority=100 nemo-6.4.5/search-helpers/third-party/pdftotext.nemo_search_helper0000664000175000017500000000014314757107430024357 0ustar fabiofabio[Nemo Search Helper] TryExec=pdftotext; Exec=pdftotext %s - MimeType=application/pdf; Priority=200 nemo-6.4.5/search-helpers/third-party/id3.nemo_search_helper0000664000175000017500000000012314757107430023013 0ustar fabiofabio[Nemo Search Helper] TryExec=id3; Exec=id3 -l %s MimeType=audio/mpeg; Priority=100 nemo-6.4.5/search-helpers/nemo-epub2text0000775000175000017500000000124714757107430017135 0ustar fabiofabio#!/usr/bin/env bash # Requires unzip package # ================================== # 1. Get a list of all xhtml/html/htm files, exclude titlepage.xhtml (if present) # It appears that the zipped files _never_ contain problem characters such as spaces... # 2. Extract the html files and convert to text (UTF-8 output is available). # ================================== # 1. Get a list of xhtml/html/htm files [using unzip's weird regular expression] - and exclude any named titlepage/toc/copyright files=$(unzip -Z1 "$1" \*.*htm* | egrep -v 'titlepage.*|toc.*|copyright.*') # 2. Uncompress each of the files and process with html2text. unzip -cqq "$1" $files | html2text -o - nemo-6.4.5/search-helpers/nemo-xls-to-txt0000775000175000017500000000145314757107430017255 0ustar fabiofabio#!/usr/bin/python3 import sys import xlrd import locale path = sys.argv[1] try: book = xlrd.open_workbook(path) except Exception as e: print("Can't read '%s': %s" % (path, e)) exit(1) date_format = locale.nl_langinfo(locale.D_FMT) for sheet in book.sheets(): for row in sheet.get_rows(): had_content = False for cell in row: if cell.ctype == xlrd.XL_CELL_TEXT: print(cell.value, end=" ") had_content = True elif cell.ctype == xlrd.XL_CELL_DATE: dt = xlrd.xldate_as_datetime(cell.value, 0) print(dt.strftime(date_format), end=" ") had_content = True if had_content: # end of row newline (but only if the row wasn't blank) print("") exit(0)nemo-6.4.5/search-helpers/README.md0000664000175000017500000000413714757107430015611 0ustar fabiofabio### Search Helpers Nemo's file and content search utilizes a plugin-type system to allow content search for additional file types. The only requirements for a helper is the ability to extract text from a given file type and print it to stdout. A definition file provides details necessary to use the helper. ##### Example definition file (note: text/plain support is built-in to nemo, this is only to illustrate): ``` [Nemo Search Helper] TryExec=cat Exec=cat %s MimeType=text/plain; Priority=100 ``` The `Nemo Search Helper` group name is mandatory. - The filename must end in `.nemo_search_helper`. - `TryExec` should be a list executables required. When the helpers are loaded, Nemo will check that the program(s) a) exist and b) are executable. If these checks fail, the helper will be skipped. If only a program name is provided, it must exist in the user's path. This can also be an absolute path. - `Exec` should provide the full command line necessary to extract the text from the file. The `%s` argument will be replaced by the file name being processed during content search. Note, uris are not supported, only paths (local files). - `MimeType`is a semicolon (`;`)-separated list of mimetypes that this search helper should be used with. It should be semicolon-terminated (even if there's only a single item). - `Priority` is a value used to break a tie when multiple helpers support the same mimetype. The higher value wins. In the event of a tie, the last helper processed is used (the order of files processed is undefined). If the `Priority` entry is missing, the value is assumed to be 100. - The `TryExec`, `Exec` and `MimeType` keys are mandatory. These definition files can be placed in `/nemo/search-helpers` where `` can be some directory in XDG_DATA_DIRS or under the user's data directory (`~/.local/share/namo/search-helpers`). The user directory is *always* processed last. ##### Debugging: If something doesn't seem to be working, you can run nemo with debugging enabled: ``` NEMO_DEBUG=Search nemo --debug ``` This will print out a bit of extra information related to searches. nemo-6.4.5/search-helpers/mso-xls.nemo_search_helper0000664000175000017500000000016614757107430021476 0ustar fabiofabio[Nemo Search Helper] TryExec=nemo-xls-to-txt; Exec=nemo-xls-to-txt %s MimeType=application/vnd.ms-excel; Priority=100 nemo-6.4.5/search-helpers/mso-ppt.nemo_search_helper0000664000175000017500000000020714757107430021467 0ustar fabiofabio[Nemo Search Helper] TryExec=nemo-ppt-to-txt;libreoffice; Exec=nemo-ppt-to-txt %s MimeType=application/vnd.ms-powerpoint; Priority=100 nemo-6.4.5/search-helpers/nemo-odf-to-txt0000775000175000017500000000241614757107430017217 0ustar fabiofabio#!/usr/bin/python3 import sys import zipfile from pathlib import Path from html.parser import HTMLParser class Parser(HTMLParser): parsed = [] get_next_data = False concat_next_data = False def handle_starttag(self, tag, attrs): if tag.startswith("text") or tag.startswith("meta"): if tag == "text:s": self.concat_next_data = True self.get_next_data = True def handle_endtag(self, tag): pass def handle_data(self, data): if self.get_next_data: if data != "\n": if self.concat_next_data: self.parsed[-1] += " " + data self.concat_next_data = False else: self.parsed.append(data.strip()) self.get_next_data = False path = sys.argv[1] parser = Parser() zipfile = zipfile.ZipFile(path) files = zipfile.infolist() for f in files: if f.filename in ("meta.xml", "content.xml"): contents = zipfile.read(f.filename).decode() parser.feed(contents) if len(parser.parsed) == 0: continue out_str = ", ".join(parser.parsed) print(f"{Path(f.filename).stem}: {out_str}\n", flush=True, file=sys.stdout) parser.parsed = [] exit(0) nemo-6.4.5/search-helpers/mso.nemo_search_helper0000664000175000017500000000046114757107430020670 0ustar fabiofabio[Nemo Search Helper] TryExec=nemo-mso-to-txt; Exec=nemo-mso-to-txt %s MimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.presentationml.presentation; Priority=100 nemo-6.4.5/search-helpers/epub2text.nemo_search_helper0000664000175000017500000000020014757107430022003 0ustar fabiofabio[Nemo Search Helper] TryExec=unzip;html2text;nemo-epub2text; Exec=nemo-epub2text %s MimeType=application/epub+zip; Priority=100 nemo-6.4.5/cut-n-paste-code/0000775000175000017500000000000014757107430014470 5ustar fabiofabionemo-6.4.5/cut-n-paste-code/libegg/0000775000175000017500000000000014757107430015721 5ustar fabiofabionemo-6.4.5/cut-n-paste-code/libegg/meson.build0000664000175000017500000000036014757107430020062 0ustar fabiofabio egg_lib = static_library('egg', 'eggtreemultidnd.c', dependencies: [ gtk, ], install: false ) egg = declare_dependency( include_directories: include_directories('..'), link_with: egg_lib, dependencies: [ gtk, ], ) nemo-6.4.5/cut-n-paste-code/libegg/eggtreemultidnd.c0000664000175000017500000002662614757107430021264 0ustar fabiofabio/* eggtreemultidnd.c * Copyright (C) 2001 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street - Suite 500, * Boston, MA 02110-1335, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "eggtreemultidnd.h" #define EGG_TREE_MULTI_DND_STRING "EggTreeMultiDndString" typedef struct { guint pressed_button; gint x; gint y; guint motion_notify_handler; guint button_release_handler; guint drag_data_get_handler; GSList *event_list; } EggTreeMultiDndData; /* CUT-N-PASTE from gtktreeview.c */ typedef struct _TreeViewDragInfo TreeViewDragInfo; struct _TreeViewDragInfo { GdkModifierType start_button_mask; GtkTargetList *source_target_list; GdkDragAction source_actions; GtkTargetList *dest_target_list; guint source_set : 1; guint dest_set : 1; }; GType egg_tree_multi_drag_source_get_type (void) { static GType our_type = 0; if (!our_type) { const GTypeInfo our_info = { sizeof (EggTreeMultiDragSourceIface), /* class_size */ NULL, /* base_init */ NULL, /* base_finalize */ NULL, NULL, /* class_finalize */ NULL, /* class_data */ 0, 0, /* n_preallocs */ NULL }; our_type = g_type_register_static (G_TYPE_INTERFACE, "EggTreeMultiDragSource", &our_info, 0); } return our_type; } /** * egg_tree_multi_drag_source_row_draggable: * @drag_source: a #EggTreeMultiDragSource * @path: row on which user is initiating a drag * * Asks the #EggTreeMultiDragSource whether a particular row can be used as * the source of a DND operation. If the source doesn't implement * this interface, the row is assumed draggable. * * Return value: %TRUE if the row can be dragged **/ gboolean egg_tree_multi_drag_source_row_draggable (EggTreeMultiDragSource *drag_source, GList *path_list) { EggTreeMultiDragSourceIface *iface = EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE (drag_source); g_return_val_if_fail (EGG_IS_TREE_MULTI_DRAG_SOURCE (drag_source), FALSE); g_return_val_if_fail (iface->row_draggable != NULL, FALSE); g_return_val_if_fail (path_list != NULL, FALSE); if (iface->row_draggable) return (* iface->row_draggable) (drag_source, path_list); else return TRUE; } /** * egg_tree_multi_drag_source_drag_data_delete: * @drag_source: a #EggTreeMultiDragSource * @path: row that was being dragged * * Asks the #EggTreeMultiDragSource to delete the row at @path, because * it was moved somewhere else via drag-and-drop. Returns %FALSE * if the deletion fails because @path no longer exists, or for * some model-specific reason. Should robustly handle a @path no * longer found in the model! * * Return value: %TRUE if the row was successfully deleted **/ gboolean egg_tree_multi_drag_source_drag_data_delete (EggTreeMultiDragSource *drag_source, GList *path_list) { EggTreeMultiDragSourceIface *iface = EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE (drag_source); g_return_val_if_fail (EGG_IS_TREE_MULTI_DRAG_SOURCE (drag_source), FALSE); g_return_val_if_fail (iface->drag_data_delete != NULL, FALSE); g_return_val_if_fail (path_list != NULL, FALSE); return (* iface->drag_data_delete) (drag_source, path_list); } /** * egg_tree_multi_drag_source_drag_data_get: * @drag_source: a #EggTreeMultiDragSource * @path: row that was dragged * @selection_data: a #EggSelectionData to fill with data from the dragged row * * Asks the #EggTreeMultiDragSource to fill in @selection_data with a * representation of the row at @path. @selection_data->target gives * the required type of the data. Should robustly handle a @path no * longer found in the model! * * Return value: %TRUE if data of the required type was provided **/ gboolean egg_tree_multi_drag_source_drag_data_get (EggTreeMultiDragSource *drag_source, GList *path_list, GtkSelectionData *selection_data) { EggTreeMultiDragSourceIface *iface = EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE (drag_source); g_return_val_if_fail (EGG_IS_TREE_MULTI_DRAG_SOURCE (drag_source), FALSE); g_return_val_if_fail (iface->drag_data_get != NULL, FALSE); g_return_val_if_fail (path_list != NULL, FALSE); g_return_val_if_fail (selection_data != NULL, FALSE); return (* iface->drag_data_get) (drag_source, path_list, selection_data); } static void stop_drag_check (GtkWidget *widget) { EggTreeMultiDndData *priv_data; GSList *l; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); for (l = priv_data->event_list; l != NULL; l = l->next) gdk_event_free (l->data); g_slist_free (priv_data->event_list); priv_data->event_list = NULL; g_signal_handler_disconnect (widget, priv_data->motion_notify_handler); g_signal_handler_disconnect (widget, priv_data->button_release_handler); } static gboolean egg_tree_multi_drag_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer data) { EggTreeMultiDndData *priv_data; GSList *l; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); for (l = priv_data->event_list; l != NULL; l = l->next) gtk_propagate_event (widget, l->data); stop_drag_check (widget); return FALSE; } static void selection_foreach (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { GList **list_ptr; list_ptr = (GList **) data; *list_ptr = g_list_prepend (*list_ptr, gtk_tree_row_reference_new (model, path)); } static void path_list_free (GList *path_list) { g_list_foreach (path_list, (GFunc) gtk_tree_row_reference_free, NULL); g_list_free (path_list); } static void set_context_data (GdkDragContext *context, GList *path_list) { g_object_set_data_full (G_OBJECT (context), "egg-tree-view-multi-source-row", path_list, (GDestroyNotify) path_list_free); } static GList * get_context_data (GdkDragContext *context) { return g_object_get_data (G_OBJECT (context), "egg-tree-view-multi-source-row"); } /* CUT-N-PASTE from gtktreeview.c */ static TreeViewDragInfo* get_info (GtkTreeView *tree_view) { return g_object_get_data (G_OBJECT (tree_view), "gtk-tree-view-drag-info"); } static void egg_tree_multi_drag_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time) { GtkTreeView *tree_view; GtkTreeModel *model; TreeViewDragInfo *di; GList *path_list; tree_view = GTK_TREE_VIEW (widget); model = gtk_tree_view_get_model (tree_view); if (model == NULL) return; di = get_info (GTK_TREE_VIEW (widget)); if (di == NULL) return; path_list = get_context_data (context); if (path_list == NULL) return; /* We can implement the GTK_TREE_MODEL_ROW target generically for * any model; for DragSource models there are some other targets * we also support. */ if (EGG_IS_TREE_MULTI_DRAG_SOURCE (model)) { egg_tree_multi_drag_source_drag_data_get (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list, selection_data); } } static gboolean egg_tree_multi_drag_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer data) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); if (gtk_drag_check_threshold (widget, priv_data->x, priv_data->y, event->x, event->y)) { GList *path_list = NULL; GtkTreeSelection *selection; GtkTreeModel *model; GdkDragContext *context; TreeViewDragInfo *di; di = get_info (GTK_TREE_VIEW (widget)); if (di == NULL) return FALSE; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); stop_drag_check (widget); gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); path_list = g_list_reverse (path_list); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) { context = gtk_drag_begin (widget, gtk_drag_source_get_target_list (widget), di->source_actions, priv_data->pressed_button, (GdkEvent*)event); set_context_data (context, path_list); gtk_drag_set_icon_default (context); } else { path_list_free (path_list); } } return TRUE; } static gboolean egg_tree_multi_drag_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer data) { GtkTreeView *tree_view; GtkTreePath *path = NULL; GtkTreeViewColumn *column = NULL; gint cell_x, cell_y; GtkTreeSelection *selection; EggTreeMultiDndData *priv_data; tree_view = GTK_TREE_VIEW (widget); priv_data = g_object_get_data (G_OBJECT (tree_view), EGG_TREE_MULTI_DND_STRING); if (priv_data == NULL) { priv_data = g_new0 (EggTreeMultiDndData, 1); g_object_set_data (G_OBJECT (tree_view), EGG_TREE_MULTI_DND_STRING, priv_data); } if (g_slist_find (priv_data->event_list, event)) return FALSE; if (priv_data->event_list) { /* save the event to be propagated in order */ priv_data->event_list = g_slist_append (priv_data->event_list, gdk_event_copy ((GdkEvent*)event)); return TRUE; } if (event->type == GDK_2BUTTON_PRESS) return FALSE; gtk_tree_view_get_path_at_pos (tree_view, event->x, event->y, &path, &column, &cell_x, &cell_y); selection = gtk_tree_view_get_selection (tree_view); if (path && gtk_tree_selection_path_is_selected (selection, path)) { priv_data->pressed_button = event->button; priv_data->x = event->x; priv_data->y = event->y; priv_data->event_list = g_slist_append (priv_data->event_list, gdk_event_copy ((GdkEvent*)event)); priv_data->motion_notify_handler = g_signal_connect (G_OBJECT (tree_view), "motion_notify_event", G_CALLBACK (egg_tree_multi_drag_motion_event), NULL); priv_data->button_release_handler = g_signal_connect (G_OBJECT (tree_view), "button_release_event", G_CALLBACK (egg_tree_multi_drag_button_release_event), NULL); if (priv_data->drag_data_get_handler == 0) { priv_data->drag_data_get_handler = g_signal_connect (G_OBJECT (tree_view), "drag_data_get", G_CALLBACK (egg_tree_multi_drag_drag_data_get), NULL); } gtk_tree_path_free (path); return TRUE; } if (path) { gtk_tree_path_free (path); } return FALSE; } void egg_tree_multi_drag_add_drag_support (GtkTreeView *tree_view) { g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); g_signal_connect (G_OBJECT (tree_view), "button_press_event", G_CALLBACK (egg_tree_multi_drag_button_press_event), NULL); } nemo-6.4.5/cut-n-paste-code/libegg/update-from-egg.sh0000775000175000017500000000062614757107430021247 0ustar fabiofabio#!/bin/sh function die() { echo $* exit 1 } if test -z "$EGGDIR"; then echo "Must set EGGDIR" exit 1 fi if test -z "$EGGFILES"; then echo "Must set EGGFILES" exit 1 fi for FILE in $EGGFILES; do if cmp -s $EGGDIR/$FILE $FILE; then echo "File $FILE is unchanged" else cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE" echo "Updated $FILE" fi done nemo-6.4.5/cut-n-paste-code/libegg/eggtreemultidnd.h0000664000175000017500000000614514757107430021263 0ustar fabiofabio/* eggtreednd.h * Copyright (C) 2001 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street - Suite 500, * Boston, MA 02110-1335, USA. */ #ifndef __EGG_TREE_MULTI_DND_H__ #define __EGG_TREE_MULTI_DND_H__ #include G_BEGIN_DECLS #define EGG_TYPE_TREE_MULTI_DRAG_SOURCE (egg_tree_multi_drag_source_get_type ()) #define EGG_TREE_MULTI_DRAG_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TREE_MULTI_DRAG_SOURCE, EggTreeMultiDragSource)) #define EGG_IS_TREE_MULTI_DRAG_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TREE_MULTI_DRAG_SOURCE)) #define EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), EGG_TYPE_TREE_MULTI_DRAG_SOURCE, EggTreeMultiDragSourceIface)) typedef struct _EggTreeMultiDragSource EggTreeMultiDragSource; /* Dummy typedef */ typedef struct _EggTreeMultiDragSourceIface EggTreeMultiDragSourceIface; struct _EggTreeMultiDragSourceIface { GTypeInterface g_iface; /* VTable - not signals */ gboolean (* row_draggable) (EggTreeMultiDragSource *drag_source, GList *path_list); gboolean (* drag_data_get) (EggTreeMultiDragSource *drag_source, GList *path_list, GtkSelectionData *selection_data); gboolean (* drag_data_delete) (EggTreeMultiDragSource *drag_source, GList *path_list); }; GType egg_tree_multi_drag_source_get_type (void) G_GNUC_CONST; /* Returns whether the given row can be dragged */ gboolean egg_tree_multi_drag_source_row_draggable (EggTreeMultiDragSource *drag_source, GList *path_list); /* Deletes the given row, or returns FALSE if it can't */ gboolean egg_tree_multi_drag_source_drag_data_delete (EggTreeMultiDragSource *drag_source, GList *path_list); /* Fills in selection_data with type selection_data->target based on the row * denoted by path, returns TRUE if it does anything */ gboolean egg_tree_multi_drag_source_drag_data_get (EggTreeMultiDragSource *drag_source, GList *path_list, GtkSelectionData *selection_data); void egg_tree_multi_drag_add_drag_support (GtkTreeView *tree_view); G_END_DECLS #endif /* __EGG_TREE_MULTI_DND_H__ */ nemo-6.4.5/cut-n-paste-code/README0000664000175000017500000000117114757107430015350 0ustar fabiofabioREADME for nemo/cut-n-paste-code The code in this directory hierarchy was cut-n-pasted from somewhere else. In the soon to come, Star Trek future, this code will be available as part of standard libraries. For example, the code in libegg will be one day available as part of Gtk+. Until that happens, DON'T HACK the code, unless you are updating from the original cut-n-paste source. Instead of hacking the code in cut-n-paste-code, create subclasses and put them in libnemo-extensions. If you have any specific questions, comments or complaints about this setup, send mail to the nemo mailing list at: nemo-list@gnome.org nemo-6.4.5/docs/0000775000175000017500000000000014757107430012350 5ustar fabiofabionemo-6.4.5/docs/dnd.txt0000664000175000017500000000612014757107430013655 0ustar fabiofabio Nemo dnd code. ------------------ Nemo dnd code is pretty compilcated, it has a lot of entry points and exit points. Trying to clarify this now. You have to implement: If you are a source: drag_begin drag_end drag_get_data If you are a destination: drag_motion drag_data_received drag_drop drag_leave 1) Source --------- if you are a source, you have to start a drag trough gtk_drag_begin. This will call drag_begin signal in the source. Then, when the destination calls gtk_drag_finish, drag_end will be called in the source. drag_get_data will be called in the source when the destination calls gtk_drag_get_data So, the source is very easy to write: it just needs to implement those 3 signals and it should not have any memory management issue. 2) Destination -------------- Things get a little bit complicated. when the dragging cursor gets in your window, you will get drag_motion events. In nemo, we do many things in this function: - we start auto-scrolling if it is necessary. - we call nemo_*_ensure_data - we prelight what is under the cursor if it can accept the drag. - we try to expand what is under you if it can accept the drop (tree view) nemo_*_ensure_data is vital. It calls gtk_drag_get_data to get the data from the source. this allows the destination to store it in advance and use it to know if what is under the cursor can accept the drag. Then, when the drop occurs, drag_drop is called on the destination. drag_drop calls gtk_drag_get_data to get the data from the source to do its drop. Then, drag_data_received is called when the data is received. There, we can do the actual operation involved by the drop. Also, just before the drag_drop event, a drag_leave event is triggered. If no drop occurs, a drag_leave occurs. So, drag_data_received does 2 things: it is called to get the data when we are in motion and store it. It is also called to do the actual drop operation when a drop happened. So, drag_data_received usually does 2 tests: it tests if the data was received. If it was received, it stores it. Then it tests if the drop occured just before. If so, it does the operation. This schema involves careful memory management: 1) 2 exit points in destination. (drag_leave and drag_data_received) 2) a lot of things are done in the callbacks so you have to take into account all the possible code paths. To solve 1), we should use ONE destroy function which cleans up the drag data. To solve 2), we have to be very careful where we call this fution from. This function has to clean up: - the list of expanded nodes (tree view). - the autoscroll code. - the prelighting code. It also has to set drag_info->need_to_destroy to TRUE so that during the next drag in this widget, the rest of the drag data is destroyed before begening the actual new drag. When we receive a drag_motion, we first test for need_to_destroy and destroy the rest of the data left from the previous drag. This code has to destroy/reset: - the drag data. - the boolean vars used to store the state of the drag. nemo-6.4.5/docs/reference/0000775000175000017500000000000014757107430014306 5ustar fabiofabionemo-6.4.5/docs/reference/meson.build0000664000175000017500000000003414757107430016445 0ustar fabiofabiosubdir('libnemo-extension') nemo-6.4.5/docs/reference/libnemo-extension/0000775000175000017500000000000014757107430017745 5ustar fabiofabionemo-6.4.5/docs/reference/libnemo-extension/meson.build0000664000175000017500000000106014757107430022104 0ustar fabiofabio docConf = configuration_data() docConf.set('NEMO_EXTENSION_VERSION_INFO', NEMO_EXTENSION_VERSION_INFO) configure_file( input : 'version.xml.in', output: 'version.xml', configuration: docConf ) gnome.gtkdoc('libnemo-extension', main_xml: 'libnemo-extension-docs.xml', src_dir: join_paths(meson.project_source_root(), 'libnemo-extension'), dependencies: nemo_extension, install: true, gobject_typesfile: 'libnemo-extension.types', install_dir: 'libnemo-extension', scan_args: [ '--rebuild-types', '--ignore-headers="config.h"' ] ) nemo-6.4.5/docs/reference/libnemo-extension/libnemo-extension-sections.txt0000664000175000017500000000746714757107430026010 0ustar fabiofabio
nemo-location-widget-provider NemoLocationWidgetProvider NemoLocationWidgetProviderInterface nemo_location_widget_provider_get_widget
nemo-menu-provider NemoMenuProvider NemoMenuProviderInterface nemo_menu_provider_get_file_items nemo_menu_provider_get_background_items nemo_menu_provider_emit_items_updated_signal
nemo-menu NEMO_TYPE_MENU_ITEM NEMO_MENU_ITEM NEMO_MENU_ITEM_CLASS NEMO_MENU_IS_ITEM NEMO_MENU_IS_ITEM_CLASS NEMO_MENU_ITEM_GET_CLASS NemoMenuPrivate NemoMenuItemDetails NemoMenu NemoMenu NemoMenuItem NemoMenuItem nemo_menu_new nemo_menu_append_item nemo_menu_get_items nemo_menu_item_list_free nemo_menu_item_get_type nemo_menu_item_new nemo_menu_item_activate nemo_menu_item_set_submenu NEMO_MENU NEMO_IS_MENU NEMO_TYPE_MENU nemo_menu_get_type NEMO_MENU_CLASS NEMO_IS_MENU_CLASS NEMO_MENU_GET_CLASS
nemo-column-provider NemoColumnProvider NemoColumnProviderInterface nemo_column_provider_get_columns
nemo-name-and-desc-provider NemoNameAndDescProvider NemoNameAndDescProviderInterface nemo_name_and_desc_provider_get_name_and_desc
nemo-property-page-provider NemoPropertyPageProvider NemoPropertyPageProviderInterface nemo_property_page_provider_get_pages
nemo-file-info NEMO_FILE_DEFINED NemoFile NemoFileInfo NemoFileInfoIface nemo_file_info_create nemo_file_info_create_for_uri nemo_file_info_getter nemo_file_info_lookup nemo_file_info_lookup_for_uri nemo_file_info_list_copy nemo_file_info_list_free nemo_file_info_is_gone nemo_file_info_get_file_type nemo_file_info_get_location nemo_file_info_get_name nemo_file_info_get_uri nemo_file_info_get_activation_uri nemo_file_info_get_parent_location nemo_file_info_get_parent_uri nemo_file_info_get_mount nemo_file_info_get_uri_scheme nemo_file_info_get_parent_info nemo_file_info_get_mime_type nemo_file_info_is_mime_type nemo_file_info_is_directory nemo_file_info_can_write nemo_file_info_add_emblem nemo_file_info_get_string_attribute nemo_file_info_add_string_attribute nemo_file_info_invalidate_extension_info NEMO_FILE_INFO NEMO_IS_FILE_INFO NEMO_TYPE_FILE_INFO nemo_file_info_get_type NEMO_FILE_INFO_GET_IFACE
nemo-column NemoColumnDetails NemoColumn NemoColumn nemo_column_new NEMO_COLUMN NEMO_IS_COLUMN NEMO_TYPE_COLUMN nemo_column_get_type NEMO_COLUMN_CLASS NEMO_IS_COLUMN_CLASS NEMO_COLUMN_GET_CLASS
nemo-info-provider NemoInfoProvider NemoInfoProviderInterface NemoInfoProviderUpdateComplete nemo_info_provider_update_file_info nemo_info_provider_cancel_update nemo_info_provider_update_complete_invoke
nemo-property-page NemoPropertyPageDetails NemoPropertyPage NemoPropertyPage nemo_property_page_new NEMO_PROPERTY_PAGE NEMO_IS_PROPERTY_PAGE NEMO_TYPE_PROPERTY_PAGE nemo_property_page_get_type NEMO_PROPERTY_PAGE_CLASS NEMO_IS_PROPERTY_PAGE_CLASS NEMO_PROPERTY_PAGE_GET_CLASS
nemo-extension-types NemoOperationHandle NemoOperationResult nemo_module_initialize nemo_module_shutdown nemo_module_list_types
nemo-menu-item
nemo-simple-button NemoSimpleButton NemoSimpleButton nemo_simple_button_new nemo_simple_button_new_from_icon_name nemo_simple_button_new_from_stock nemo_simple_button_new_from_file NEMO_SIMPLE_BUTTON NEMO_IS_SIMPLE_BUTTON NEMO_TYPE_SIMPLE_BUTTON nemo_simple_button_get_type NEMO_SIMPLE_BUTTON_CLASS NEMO_IS_SIMPLE_BUTTON_CLASS NEMO_SIMPLE_BUTTON_GET_CLASS
nemo-6.4.5/docs/reference/libnemo-extension/libnemo-extension-overrides.txt0000664000175000017500000000000014757107430026133 0ustar fabiofabionemo-6.4.5/docs/reference/libnemo-extension/libnemo-extension-docs.xml0000664000175000017500000000247514757107430025064 0ustar fabiofabio ]> Nemo Extension Reference Manual For Nemo-Extension &version; API Reference Extension Interfaces Classes Index nemo-6.4.5/docs/reference/libnemo-extension/version.xml.in0000664000175000017500000000003614757107430022560 0ustar fabiofabio@NEMO_EXTENSION_VERSION_INFO@ nemo-6.4.5/docs/meson.build0000664000175000017500000000040214757107430014506 0ustar fabiofabio install_man( 'nemo.1', 'nemo-desktop.1', 'nemo-connect-server.1', ) if gtkdoc_enabled subdir('reference') endif # Just for Dist extraMans = [ 'dnd.txt', 'key_mouse_navigation.txt', 'load-states.dia', 'nemo-io.txt', 'style-guide.html', ] nemo-6.4.5/docs/nemo-connect-server.10000664000175000017500000000340114757107430016321 0ustar fabiofabio.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH nemo-connect-server 1 "05 Jan 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME nemo-connect-server \- To Access a remote server .SH SYNOPSIS .B nemo-connect-server .RI [ options ] .RI [ URI ] .SH DESCRIPTION This manual page documents briefly the .B nemo-connect-server command. .PP Nemo Connect Server is the connection manager for the GNOME desktop. .PP You can use the file manager to access a remote server, be it an FTP site, a Windows share, a WebDav server or an SSH server. .SH OPTIONS Nemo follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-help Show a summary of options. .TP .B \-\-version Show version. .TP Other standard GNOME options not listed here are also supported. .SH SEE ALSO Nemo Connect Server documentation can be found from the "Help" menu, or by pressing the F1 key. Nemo also has a website at http://www.gnome.org/projects/nemo/ .SH AUTHOR This manual page was written by Julian Andres Klode for the Debian GNU/Linux system (but may be used by others), based on a manpage by Fernando Ribeiro . nemo-6.4.5/docs/load-states.dia0000664000175000017500000000375214757107430015256 0ustar fabiofabio\nF}W++/Q ) @M/%%)ٕ|D*2) ؉zgΙ١޼L[YI] ÷W7qy-pQUףzF]UyrOWy:AUUULo*dR^ydp3j;nyFյӌv92*Zb*/Rݭ4̣~>U l~ǹnZF<q (|m6@a )'(Ay(TōlS΢1C o.?lF\GFwGOtn2rk˧Yui-r.c C'/?]_ Udfu/(E^kҴ"M(>HvD<@< #&^-Lr2ˋ0tlFZ'q8~Kqy/d2_Tvf/zR_砬8Hei4搝q{t1K$JeUyģMi{4K\xC')IR|Sx88v 5Lg4V4X7OJNJW {o:+i8-%b CӹJ=L{(PWZ^%hHSuF _;XXY%`Xq2Bǐz*d/_11&Bߤl&EsfenFv8ˬ36 HNTP¶+']XxJ$@8i.|x\:KYѼro }5lB̥#QUm˜Jf19RZw[3 v'^9q[HGx ABWٯ4XyMq+'qR3yLlQj_ zYlP ETϸ]CW6YulQU8 0ǘ0\m>Ɛss=6C\I(3v"Px./L)7?Aus/@!+'uF,4cw =+c1kiI t곤AR%1ltKeZ&7g;X\ 0k-hB]Y¬xBu, U 6_8\;CjѰ(a5};hBBD]]:D"o a:#}'p$LX>yk&Ff|jTtKfa9 =Lg 뮛;iq7O0X85_UB.jZ G3RDIl{d?@жm|$ΐGbDFkIW  GQ@ `nemo-6.4.5/docs/key_mouse_navigation.txt0000664000175000017500000000753214757107430017337 0ustar fabiofabioThis document describes the keyboard and mouse navigation model used in the default Nemo views in detail. This is useful as a a guide for people implementing a Nemo view or something else that wants to have a feel that is compatible with Nemo. *********** Icon view ******************** Keyboard: ========= Navigation and selection: When the focus is on the icon view you can move the currently selected icon by using: Arrow Keys - moves one step in the direction Tab - moves to the "next" icon in order (i.e. at the end of one row, go to the first icon the next row) Shift Tab - moves to the "previous" icon in order Home - moves to the first icon End - moves to the last icon In order to allow multiple selection the above navigation keys can be combined with the Control key to move the keyboard focus without affecting the current selection. If you use normal movement (not using control) all the previously selected icons will be deselected. If several icons are selected and there is no keyboard focus you press up or left will start navigating from the topmost leftmost icon, while pressing down or right will start from the bottommost rightmost icon. This works the same way if you hold down Control. To select or deselect an icon position the keyboard focus on it and press ctlr-space. ctrl-space with no keyboard focus produces a keyboard focus at the first selected icon, or the first one if none are selected. In manual layout (and especially, on the desktop) the keyboard arrow keys work in a slightly different way. To allow all icons to be reached the closest icon in the quadrant of the direction selected will be used as the "next" icon when navigating. Other keyboard shortcuts: Return, Keypad Return - Activate the selected objects Space (without control) - Activate the selected objects Escape - Undo icon stretching if in progress Alt Left - go back Alt Right - go forward Alt Up - go up a directory Alt Down - enter directory / activate selection Shift-F10 bring up context menu for selection, or the directory context menu if nothing is selected Ctrl-F10 bring up context menu for directory Other key presses are used for typeahead search In rename mode: Escape - Cancel rename Return, Keypad Return - Finish rename Mouse: ====== In double click mode: Clicking on an icon selects it and deselects all others on BUTTON_PRESS. Dragging does the default dnd file operation. Clicking on blank space deselect all selected icons. Doesn't allow dragging. Double clicking (both clicks on the same icon) with no modifiers activates the clicked file. (And deselects the others due to the first click.) Clicking when Control (Shift can also be used, which is not written out below) is held down can be used to do multiple selections. Control-click on empty space does nothing. Control-click on unselected icon selects it on BUTTON_PRESS Control-click on selected icon de-selects it on BUTTON_RELEASE Control-double click does nothing Control can be held down while starting a drag While doing a drag modifers affect the operation the drag causes: Control - Copy the files Shift - Move the files Alt - Open a menu with the available alternatives All the basic clicks are typically done with the left button, but can be done with the other buttons to. [Do we want this?] However some of the buttons also have special operations: Right-click on a selected icon opens the context menu for the selected icons. Right-click on empty space opens the context menu for the directory. Middle-button drag always opens the menu with possible operations on drop. In single click mode: Single click mode work just like double click mode except single clicks on icons activate the icon on button release if you didn't drag, didn't hold down for 1.5 secs or clicked twice within the double-click time. *********** List view ******************** [TODO: Add stuff here] nemo-6.4.5/docs/nemo-desktop.10000664000175000017500000000400114757107430015032 0ustar fabiofabio.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH Nemo 1 "October 2012" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME nemo-desktop \- Nemo's desktop provider .SH SYNOPSIS .B nemo-desktop .RI [ options ] " URIs" ... .br .SH DESCRIPTION This manual page documents briefly the .B nemo-desktop command. .PP Nemo is the file manager for the Cinnamon desktop. .br .SH OPTIONS Nemo-desktop follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-\-debug Enable debugging code. Example usage: 'NEMO_DEBUG=Desktop,Actions nemo-desktop --debug'. Use NEMO_DEBUG=all for more topics. .TP .B \-\-quit Quit Nemo. .TP .B \-\-help Show a summary of options. .TP .B \-\-version Show Nemo's version. .TP Other standard GNOME options not listed here are also supported. .SH NOTE ON THE ROOT USER Ordinarily, nemo and nemo-desktop treat being run as the root user as special, with certain restrictions and UI changes. This behavior can be bypassed via a gsettings key. You can use the following command to enable/disable this override: gsettings set org.nemo.preferences treat-root-as-normal true|false .SH BUG REPORTS Please report bugs and feature requests here: https://github.com/linuxmint/nemo .SH AUTHOR This manual page was originally written for Nautilus by Takuo KITAME and Dafydd Harries for the Debian GNU/Linux system (but may be used by others). nemo-6.4.5/docs/nemo-io.txt0000664000175000017500000003051514757107430014460 0ustar fabiofabioNemo I/O Primer draft ("Better Than Nothing") 2001-08-23 Darin Adler The Nemo shell, and the file manager inside it, does a lot of I/O. Because of this, there are some special disciplines required when writing Nemo code. No I/O on the main thread To be able to respond to the user quickly, Nemo needs to be designed so that the main user input thread does not block. The basic approach is to never do any disk I/O on the main thread. In practice, Nemo code does assume that some disk I/O is fast, in some cases intentionally and in other cases due to programmer sloppiness. The typical assumption is that reading files from the user's home directory and the installed files in the Nemo datadir are very fast, effectively instantaneous. So the general approach is to allow I/O for files that have file system paths, assuming that the access to these files is fast, and to prohibit I/O for files that have arbitrary URIs, assuming that access to these could be arbitrarily slow. Although this works pretty well, it is based on an incorrect assumption, because with NFS and other kinds of abstract file systems, there can be arbitrarily slow parts of the file system that have file system paths. For historical reasons, threading in Nemo is done through the gnome-vfs asynchronous I/O abstraction rather than using threads directly. This means that all the threads are created by gnome-vfs, and Nemo code runs on the main thread only. Thus, the rule of thumb is that synchronous gnome-vfs operations like the ones in are illegal in most Nemo code. Similarly, it's illegal to ask for a piece of information, say a file size, and then wait until it arrives. The program's main thread must be allowed to get back to the main loop and start asking for user input again. How NemoFile is used to do this The NemoFile class presents an API for scheduling this asynchronous I/O and dealing with the uncertainty of when the information will be available. (It also does a few other things, but that's the main service it provides.) When you want information about a particular file or directory, you get the NemoFile object for that item using nemo_file_get. This operation, like most NemoFile operations, is not allowed to do any disk I/O. Once you have a NemoFile object, you can ask it questions like "What is your file type?" by calling functions like nemo_file_get_file_type. However, for a newly created NemoFile object the answer is almost certainly "I don't know." Each function defines a default, which is the answer given for "I don't know." For example, nemo_file_get_type will return GNOME_VFS_FILE_TYPE_UNKNOWN if it doesn't yet know the type. It's worth taking a side trip to discuss the nature of the NemoFile API. Since these classes are a private part of the Nemo implementation, we make no effort to have the API be "complete" in an abstract sense. Instead we add operations as necessary and give them the semantics that are most handy for our purposes. For example, we could have a nemo_file_get_size that returns a special distinguishable value to mean "I don't know" or a separate boolean instead of returning 0 for files where the size is unknown. This is entirely motivated by pragmatic concerns. The intent is that we tweak these calls as needed if the semantics aren't good enough. Back to the newly created NemoFile object. If you actually need to get the type, you need to arrange for that information to be fetched from the file system. There are two ways to make this request. If you are planning to display the type on an ongoing basis then you want to tell the NemoFile that you'll be monitoring the file's type and want to know about changes to it. If you just need one-time information about the type then you'll want to be informed when the type is discovered. The calls used for this are nemo_file_monitor_add and nemo_file_call_when_ready respectively. Both of these calls take a list of information needed about a file. If all you need is the file type, for example, you would pass a list containing just NEMO_FILE_ATTRIBUTE_FILE_TYPE (the attributes are defined in nemo-file-attributes.h). Not every call has a corresponding file attribute type. We add new ones as needed. If you do a nemo_file_monitor_add, you also typically connect to the NemoFile object's changed signal. Each time any monitored attribute changes, a changed signal is emitted. The caller typically caches the value of the attribute that was last seen (for example, what's displayed on screen) and does a quick check to see if the attribute it cares about has changed. If you do a nemo_file_call_when_ready, you don't typically need to connect to the changed signal, because your callback function will be called when and if the requested information is ready. Both a monitor and a callback can be cancelled. For ease of use, neither requires that you store an ID for canceling. Instead, the monitor function uses an arbitrary client pointer, which can be any kind of pointer that's known to not conflict with other monitorers. Usually, this is a pointer to the monitoring object, but it can also be, for example, a pointer to a global variable. The call_when_ready function uses the callback function and callback data to identify the particular callback to cancel. One advantage of the monitor API is that it also lets the NemoFile framework know that the file should be monitored for changes made outside Nemo. This is how we know when to ask FAM to monitor a file or directory for us. Lets review a few of the concepts: 1) Nearly all NemoFile operations, like nemo_file_get_type, are not allowed to do any disk I/O. 2) To cause the actual I/O to be done, callers need to use set up either a monitor or a callback. 3) The actual I/O is done by asynchronous gnome-vfs calls, so the work is done on another thread. To work with an entire directory of files at once, you use a NemoDirectory object. With the NemoDirectory object you can monitor a whole set of NemoFile objects at once, and you can connect to a single "files_changed" signal that gets emitted whenever files within the directory are modified. That way you don't have to connect separately to each file you want to monitor. These calls are also the mechanism for finding out which files are in a directory. In most other respects, they are like the NemoFile calls. Caching, the good and the bad Another feature of the NemoFile class is the caching. If you keep around a NemoFile object, it keeps around information about the last known state of that file. Thus, if you call nemo_file_get_type, you might well get file type of the file found at this location the last time you looked, rather than the information about what the file type is now, or "unknown". There are some problems with this, though. The first problem is that if wrong information is cached, you need some way to "goose" the NemoFile object and get it to grab new information. This is trickier than it might sound, because we don't want to constantly distrust information we received just moments before. To handle this, we have the nemo_file_invalidate_attributes and nemo_file_invalidate_all_attributes calls, as well as the nemo_directory_force_reload call. If some code in Nemo makes a change to a file that's known to affect the cached information, it can call one of these to inform the NemoFile framework. Changes that are made through the framework itself are automatically understood, so usually these calls aren't necessary. The second problem is that it's hard to predict when information will and won't be cached. The current rule that's implemented is that no information is cached if no one retains a reference to the NemoFile object. This means that someone else holding a NemoFile object can subtly affect the semantics of whether you have new data or not. Calling nemo_file_call_when_ready or nemo_file_monitor_add will not invalidate the cache, but rather will return you the already cached information. These problems are less pronounced when FAM is in use. With FAM, any monitored file is highly likely to have accurate information, because changes to the file will be noticed by FAM, and that in turn will trigger new I/O to determine what the new status of the file is. Operations that change the file You'll note that up until this point, I've only discussed getting information about the file, not making changes to it. NemoFile also contains some APIs for making changes. There are two kinds of these. The calls that change metadata are examples of the first kind. These calls make changes to the internal state right away and schedule I/O to write the changes out to the file system. There's no way to detect if the I/O succeeds or fails, and as far as the client code is concerned the change takes place right away. The calls that make other kinds of file system change are examples of of the second kind. These calls take a NemoFileOperationCallback. They are all cancellable, and they give a callback when the operation completes, whether it succeeds or fails. Files that move When a file is moved, and the NemoFile framework knows it, then the NemoFile and NemoDirectory objects follow the file rather than staying stuck to the path. This has a direct influence on the user interface of Nemo -- if you move a directory, already-open windows and property windows will follow the directory around. This means that keeping around a NemoFile object and keeping around a URI for a file have different semantics, and there are cases where one is the better choice and cases where the other is. Icons The current implementation of the Nemo icon factory uses synchronous I/O to get the icons and ignores these guidelines. The only reason this doesn't ruin the Nemo user experience is that it also refuses to even try to fetch icons from URIs that don't correspond to file system paths, which for most cases means it limits itself to reading from the high-speed local disk. Don't ask me what the repercussions of this are for NFS; do the research and tell me instead! Slowness caused by asynchronous operations One danger in all this asynchronous I/O is that you might end up doing repeated drawing and updating. If you go to display a file right after asking for information about it, you might immediately show an "unknown file type" icon. Then, milliseconds later, you may complete the I/O and discover more information about the file, including the appropriate icon. So you end up drawing the icon twice. There are a number of strategies for preventing this problem. One of them is to allow a bit of hysteresis and wait some fixed amount of time after requesting the I/O before displaying the "unknown" state. One strategy that's used in Nemo is to wait until some basic information is available until displaying anything. This might make the program overall be faster, but it might make it seem slower, because you don't see things right away. [What other strategies are used in Nemo now for this?] How to make Nemo slow If you add I/O to the functions in NemoFile that are used simply to fetch cached file information, you can make Nemo incredibly I/O intensive. On the other hand, the NemoFile API does not provide a way to do arbitrary file reads, for example. So it can be tricky to add features to Nemo, since you first have to educate NemoFile about how to do the I/O asynchronously and cache it, then request the information and have some way to deal with the time when it's not yet known. Adding new kinds of I/O usually involves working on the Nemo I/O state machine in nemo-directory-async.c. If we changed Nemo to use threading instead of using gnome-vfs asychronous operations, I'm pretty sure that most of the changes would be here in this file. That's because the external API used for NemoFile wouldn't really have a reason to change. In either case, you'd want to schedule work to be done, and get called back when the work is complete. [We probably need more about nemo-directory-async.c here.] Future direction Some have suggested that by using threading directly in Nemo rather than using it indirectly through the gnome-vfs async. calls, we could simplify the I/O code in Nemo. It's possible this would make a big improvement, but it's also possible that this would primarily affect the internals and implementation details of NemoFile and still leave the rest of the Nemo code the same. That's all for now This is a very rough early draft of this document. Let me know about other topics that would be useful to be covered in here. -- Darin nemo-6.4.5/docs/nemo.10000664000175000017500000000463114757107430013374 0ustar fabiofabio.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH Nemo 1 "October 2012" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME nemo \- the Cinnamon File Manager .SH SYNOPSIS .B nemo .RI [ options ] " URIs" ... .br .SH DESCRIPTION This manual page documents briefly the .B nemo command. .PP Nemo is the file manager for the Cinnamon desktop. .br .SH OPTIONS Nemo follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-g .TP .B \-\-geometry=\fIGEOMETRY\fR Create the initial window with the given geometry. .TP \fB\-t .TP .B \-\-tabs\fR Open URIs in tabs. .TP .B \-\-existing-window\fR Open URIs in an existing window. .TP .B \-n .TP .B \-\-no-default-window Only create windows for explicitly specified URIs. .TP .B \-\-fix-cache Repair the user thumbnail cache - this can be useful if you're having trouble with file thumbnails. Must be run as root. .TP .B \-\-debug Enable debugging code. Example usage: 'NEMO_DEBUG=Actions nemo --debug'. Use NEMO_DEBUG=all for more topics. .TP .B \-q .TP .B \-\-quit Quit Nemo. .TP .B \-\-help Show a summary of options. .TP .B \-\-version Show Nemo's version. .TP Other standard GNOME options not listed here are also supported. .SH NOTE ON THE ROOT USER Ordinarily, nemo and nemo-desktop treat being run as the root user as special, with certain restrictions and UI changes. This behavior can be bypassed via a gsettings key. You can use the following command to enable/disable this override: gsettings set org.nemo.preferences treat-root-as-normal true|false .SH BUG REPORTS Please report bugs and feature requests here: https://github.com/linuxmint/nemo .SH AUTHOR This manual page was originally written for Nautilus by Takuo KITAME and Dafydd Harries for the Debian GNU/Linux system (but may be used by others). nemo-6.4.5/docs/style-guide.html0000664000175000017500000001206014757107430015470 0ustar fabiofabio Nemo Coding Style Guide

To make code written for Nemo look and act in a predictable way, we follow a set of guidelines that specify some details of how we write code. To start, we follow all the guidelines outlined in the GNOME Programming Guidelines.

This document covers both things that are not mentioned in the GNOME Programming Guidelines and things that are mentioned there but need to be re-emphasized because people don't follow them often enough.

I'm just getting started on this document. Feedback is welcome. Eventually I'd like better organization and tons of examples.

- Darin


We use the most-recommended coding style from the GNOME Programming Guidelines. This means that we use the Linux kernel brace style with 8-character tabs (not the GNU brace style), we put spaces before the parentheses that introduce function argument lists, we put the braces that open the block for an if statement on the same line as the if statement (part of Linux kernel brace style).

We prefer to use words rather than acronyms or abbreviations. This means that we name classes with a prefix like Nemo, not Ntl, for example. And we use variables named result rather than retval or rv.

We strive to have a minimum number of local variables. This makes it easier to move pieces of code around. For more on this, read Refactoring.

We use type casts as little as possible. There are many places in GTK programming where you have to cast to make the program work, but we do whatever we can to avoid this. Also, we prefer to cast data pointers, rather than casting function pointers, since there's so much more to get wrong with function pointer casts.

We use typedefs from <glib.h> for things like guint, guchar and gpointer, but not gint, gchar, or gdouble. Using these gives a false sense of portability. In all three cases, using system calls like printf requires knowing that these are the "real" int, char, and double, so there's no reason to use a typedef that's non-standard unless it's a shorter name or clearer in some way.

We avoid in-band signaling. This means that we avoid using special values to indicate errors, for example. This can lead to subtle bugs when a valid result is misinterpreted as an error, and can make it hard to tell if the code handles errors or not.

We code for clarity first. Other concerns like efficiency are secondary. Sometimes they become more important than clarity, but only once they are proven to be a problem.

We use for loops when they make the code easier to read. The alternative is usually to use a while loop. It's true that "easy to read" is a subjective thing.

We declare local variables at the beginning of a block. C99 allows you to declare variables anywhere in a function, but a lot of compilers still do not support C99.

We do not initialize local variables in their declarations. C allows you to initialize a local variable when declaring it. But no other code can run before this, because the other statements in a function must be after all the declarations. If there are lines of code initializing the variables in the declarations, it can be harder to change the function around, since code must move down from the declaration if other code needs to run after it. To avoid this, we just don't use the ability to initialize the variable when it's declared.

We always use braces, even for one-statement "blocks". Our consensus is to do things like this:

if (list != NULL) {
        g_warning ("the list isn't empty");
}

Instead of this:

if (list != NULL)
        g_warning ("the list isn't empty");

This applies to all control structures: if, while, for, do.

We make each header "stand alone". Our concept with C header files is that each one must be written so it can be included without including another file first. To test that the header files we develop have this property, we always include the corresponding header file first in each C source file. The only exception is the include of <config.h>, which goes first. Here's an example:

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
 *
 * nemo-icon-factory.c: Class for obtaining icons for files and other objects.
 *
 * Copyright (C) 1999, 2000 Red Hat Inc.
 * Copyright (C) 1999, 2000 Eazel, Inc.
 *
 * License agreement goes here.
 *
 * Author: John Sullivan <sullivan@eazel.com>
 */

#include <config.h>
#include "nemo-icon-factory.h"

#include <string.h>
#include <stdio.h>
Include statements for other header files go here.

Other declarations and code go here.

nemo-6.4.5/action-layout-editor/0000775000175000017500000000000014757107430015474 5ustar fabiofabionemo-6.4.5/action-layout-editor/meson.build0000664000175000017500000000152614757107430017642 0ustar fabiofabioconf = configuration_data() conf.set_quoted('PKG_DATADIR', nemoDataPath) conf.set_quoted('LOCALE_DIR', join_paths(get_option('prefix'), get_option('localedir'))) conf.set_quoted('PACKAGE', meson.project_name()) conf.set_quoted('VERSION', meson.project_version()) config_py = configure_file( input: 'leconfig.py.in', output: 'leconfig.py', configuration: conf, install: true, install_dir: nemoDataPath / 'layout-editor', ) bin_conf = configuration_data() bin_conf.set('PKG_DATADIR', nemoDataPath) bin = configure_file( input: 'nemo-action-layout-editor.in', output: 'nemo-action-layout-editor', configuration: bin_conf, install: true, install_dir: get_option('bindir'), install_mode: 'rwxr-xr-x' ) install_data( 'nemo_action_layout_editor.py', install_dir: nemoDataPath / 'layout-editor', install_mode: 'rwxr-xr-x' ) nemo-6.4.5/action-layout-editor/leconfig.py.in0000664000175000017500000000022314757107430020236 0ustar fabiofabio# Generated file - DO NOT EDIT. Edit config.py.in instead. LOCALE_DIR=@LOCALE_DIR@ PACKAGE=@PACKAGE@ VERSION=@VERSION@ PKG_DATADIR=@PKG_DATADIR@ nemo-6.4.5/action-layout-editor/actions-tree.md0000664000175000017500000000643014757107430020416 0ustar fabiofabio ## Actions layout JSON format - The layout file is saved as `~/.config/nemo/actions/actions-tree.json`. - A missing or invalid layout will result in a flat list of all actions. - Definition requirements may change... #### Structure and node elements ##### The definition must have a 'toplevel' root object, which contains an array of objects (with these possibly having arrays of children also): ```json { "toplevel": [ ] } ``` ##### Children must adhere to the following definitions: - `'uuid': string` - For valid 'spices'-based actions, this will be their UUID. For legacy/non-spice actions, it will be the action file's basename, suffixed by `@untracked`. For submenus, it will be the submenu's label. - `'type': string` - `action`, `submenu` or `separator` - `'position': integer` - The action or submenu's position at the current tree depth. This is currently for reference only, as the order is preserved when parsing or creating json files, and saved position is ignored. - `'user-label': string` - can be `null` - The action or submenu's label. In the case of actions, this will be `null` initially, and the action's `Name` field will be used. It can be overridden, and the new value is kept here. - `'user-icon': string` - can be `null` or empty - The action or submenu's icon. In the case of actions, this will be `null` initially, and the icon string will be drawn from the action's `Icon-Name` field. It can be overridden - the new value is kept here. The special value of `""` (empty string) will suppress any icon altogether. - `'children': array` (submenu types only) - contains another level of actions and possibly submenus. ##### Example ```json { "toplevel": [ { "uuid": "sample@untracked", "type": "action", "position": 0, "user-label": null, "user-icon": null }, { "uuid": "mint_dev_tool_make_thumbnail@untracked", "type": "action", "position": 1, "user-label": null, "user-icon": null }, { "uuid": "92_show-expo@untracked", "type": "action", "position": 2, "user-label": "Manage workspaces", "user-icon": "address-book-new-symbolic" }, { "uuid": "Test category", "type": "submenu", "position": 3, "user-label": "Test category", "user-icon": "face-smile", "children": [ { "uuid": "change-background@untracked", "type": "action", "position": 0, "user-label": null, "user-icon": null }, { "uuid": "Sub test category", "type": "submenu", "position": 1, "user-label": "Sub test category", "user-icon": null, "children": [ { "uuid": "mint_dev_tool_show_file_metadata@untracked", "type": "action", "position": 0, "user-label": null, "user-icon": null } ] }, { "uuid": "mint_dev_tool_add_shadow@untracked", "type": "action", "position": 2, "user-label": null, "user-icon": null } ] }, { "uuid": "91_delete-workspace@untracked", "type": "action", "position": 4, "user-label": null, "user-icon": null } ] } ``` nemo-6.4.5/action-layout-editor/nemo-action-layout-editor.in0000664000175000017500000000011014757107430023024 0ustar fabiofabio#!/bin/sh exec @PKG_DATADIR@/layout-editor/nemo_action_layout_editor.py nemo-6.4.5/action-layout-editor/nemo_action_layout_editor.py0000664000175000017500000016052614757107430023316 0ustar fabiofabio#!/usr/bin/python3 import gi gi.require_version('Gtk', '3.0') gi.require_version('XApp', '1.0') gi.require_version('Xmlb', '2.0') from gi.repository import Gtk, Gdk, GLib, Gio, XApp, GdkPixbuf, Pango, Xmlb import cairo import json from pathlib import Path import uuid import gettext import locale import subprocess import os import leconfig locale.bindtextdomain("nemo", leconfig.LOCALE_DIR) gettext.bindtextdomain("nemo", leconfig.LOCALE_DIR) gettext.textdomain("nemo") _ = gettext.gettext gresources = Gio.Resource.load(os.path.join(leconfig.PKG_DATADIR, "nemo-action-layout-editor-resources.gresource")) gresources._register() JSON_FILE = Path(GLib.get_user_config_dir()).joinpath("nemo/actions-tree.json") USER_ACTIONS_DIR = Path(GLib.get_user_data_dir()).joinpath("nemo/actions") NON_SPICE_UUID_SUFFIX = "@untracked" ROW_HASH, ROW_UUID, ROW_TYPE, ROW_OBJ = range(4) ROW_TYPE_ACTION = "action" ROW_TYPE_SUBMENU = "submenu" ROW_TYPE_SEPARATOR = "separator" def new_hash(): return uuid.uuid4().hex class BuiltinShortcut(): def __init__(self, label, accel_string): self.key, self.mods = Gtk.accelerator_parse(accel_string) if self.key == 0 and self.mods == 0: self.label = "invalid (%s)" % accel_string self.label = _(label) class Row(): def __init__(self, row_meta=None, keyfile=None, path=None, enabled=True): self.keyfile = keyfile self.row_meta = row_meta self.enabled = enabled self.path = path # PosixPath def get_icon_string(self, original=False): icon_string = None if self.row_meta and not original: user_assigned_name = self.row_meta.get('user-icon', None) if user_assigned_name is not None: icon_string = user_assigned_name if icon_string is None: if self.keyfile is not None: try: icon_string = self.keyfile.get_string('Nemo Action', 'Icon-Name') except GLib.Error: pass return icon_string def get_path(self): return self.path def get_icon_type_and_data(self, original=False): icon_string = self.get_icon_string(original) if icon_string is None: return None if icon_string.startswith("/"): pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(icon_string, 16, 16) surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, self.main_window.get_scale_factor(), None) return ("surface", surface) return ("icon-name", icon_string) def get_label(self): if self.row_meta is not None: if self.row_meta.get("type") == ROW_TYPE_SEPARATOR: return "──────────────────────────────" label = None if self.row_meta is not None: user_assigned_label = self.row_meta.get('user-label', None) if user_assigned_label is not None: label = user_assigned_label if label is None: if self.keyfile is not None: try: label = self.keyfile.get_locale_string('Nemo Action', 'Name', None).replace("_", "") except GLib.Error as e: print(e) pass if label is None: return _("Unknown") return label def get_accelerator_string(self): if self.row_meta is not None: try: accel_string = self.row_meta['accelerator'] if accel_string is not None: return accel_string except KeyError: pass return None def set_custom_label(self, label): if not self.row_meta: self.row_meta = {} self.row_meta['user-label'] = label def set_custom_icon(self, icon): if not self.row_meta: self.row_meta = {} self.row_meta['user-icon'] = icon def set_accelerator_string(self, accel_string): if not self.row_meta: self.row_meta = {} self.row_meta['accelerator'] = accel_string def get_custom_label(self): if self.row_meta: return self.row_meta.get('user-label') return None def get_custom_icon(self): if self.row_meta: return self.row_meta.get('user-icon') return None class NemoActionsOrganizer(Gtk.Box): def __init__(self, window, builder=None): Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL) if builder is None: self.builder = Gtk.Builder.new_from_resource("/org/nemo/action-layout-editor/nemo-action-layout-editor.glade") else: self.builder = builder self.builtin_shortcuts = [] self.load_nemo_shortcuts() self.main_window = window self.layout_editor_box = self.builder.get_object("layout_editor_box") self.add(self.layout_editor_box) self.treeview_holder = self.builder.get_object("treeview_holder") self.save_button = self.builder.get_object("save_button") self.discard_changes_button = self.builder.get_object("discard_changes_button") self.default_layout_button = self.builder.get_object("default_layout_button") self.name_entry = self.builder.get_object("name_entry") self.new_row_button = self.builder.get_object("new_row_button") self.row_controls_box = self.builder.get_object("row_controls_box") self.remove_submenu_button = self.builder.get_object("remove_submenu_button") self.clear_icon_button = self.builder.get_object("clear_icon_button") self.icon_selector_menu_button = self.builder.get_object("icon_selector_menu_button") self.icon_selector_image = self.builder.get_object("icon_selector_image") self.action_enabled_switch = self.builder.get_object("action_enabled_switch") self.selected_item_widgets_group = XApp.VisibilityGroup.new(True, True, [ self.icon_selector_menu_button, self.name_entry ]) self.up_button = self.builder.get_object("up_button") self.up_button.connect("clicked", self.up_button_clicked) self.down_button = self.builder.get_object("down_button") self.down_button.connect("clicked", self.down_button_clicked) self.nemo_plugin_settings = Gio.Settings(schema_id="org.nemo.plugins") # Disabled/Enabled may be toggled in nemo preferences directly, keep us in sync. self.nemo_plugin_settings.connect("changed", self.on_disabled_settings_list_changed) # Icon MenuButton menu = Gtk.Menu() self.blank_icon_menu_item = Gtk.ImageMenuItem(label=_("No icon"), image=Gtk.Image(icon_name="checkbox-symbolic")) self.blank_icon_menu_item.connect("activate", self.on_clear_icon_clicked) menu.add(self.blank_icon_menu_item) self.original_icon_menu_image = Gtk.Image() self.original_icon_menu_item = Gtk.ImageMenuItem(label=_("Use the original icon (if there is one)"), image=self.original_icon_menu_image) self.original_icon_menu_item.connect("activate", self.on_original_icon_clicked) menu.add(self.original_icon_menu_item) item = Gtk.MenuItem(label=_("Choose...")) item.connect("activate", self.on_choose_icon_clicked) menu.add(item) menu.show_all() self.icon_selector_menu_button.set_popup(menu) # New row MenuButton menu = Gtk.Menu() item = Gtk.ImageMenuItem(label=_("New submenu"), image=Gtk.Image(icon_name="pan-end-symbolic")) item.connect("activate", self.on_new_submenu_clicked) menu.add(item) item = Gtk.ImageMenuItem(label=_("New separator"), image=Gtk.Image(icon_name="list-remove-symbolic")) item.connect("activate", self.on_new_separator_clicked) menu.add(item) menu.show_all() self.new_row_button.set_popup(menu) # Tree/model self.path_map = [] self.model = Gtk.TreeStore(str, str, str, object) # (hash, uuid, type, Row) self.treeview = Gtk.TreeView( model=self.model, enable_tree_lines=True, headers_visible=False, visible=True ) # Icon and label column = Gtk.TreeViewColumn() self.treeview.append_column(column) column.set_expand(True) cell = Gtk.CellRendererPixbuf() column.pack_start(cell, False) column.set_cell_data_func(cell, self.menu_icon_render_func) cell = Gtk.CellRendererText() column.pack_start(cell, False) column.set_cell_data_func(cell, self.menu_label_render_func) # Accelerators column = Gtk.TreeViewColumn() column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) column.set_expand(True) self.treeview.append_column(column) cell = Gtk.CellRendererAccel() cell.set_property("editable", True) cell.set_property("xalign", 0) column.pack_end(cell, False) column.set_cell_data_func(cell, self.accel_render_func) layout = self.treeview.create_pango_layout(_("Click to add a shortcut")) w, h = layout.get_pixel_size() column.set_min_width(w + 20) cell.connect("editing-started", self.on_accel_edit_started) cell.connect("accel-edited", self.on_accel_edited) cell.connect("accel-cleared", self.on_accel_cleared) self.editing_accel = False self.treeview_holder.add(self.treeview) self.save_button.connect("clicked", self.on_save_clicked) self.discard_changes_button.connect("clicked", self.on_discard_changes_clicked) self.default_layout_button.connect("clicked", self.on_default_layout_clicked) self.treeview.get_selection().connect("changed", self.on_treeview_position_changed) self.name_entry.connect("changed", self.on_name_entry_changed) self.name_entry.connect("icon-press", self.on_name_entry_icon_clicked) self.remove_submenu_button.connect("clicked", self.on_remove_submenu_clicked) self.action_enabled_switch.connect("notify::active", self.on_action_enabled_switch_notify) self.treeview.connect("row-activated", self.on_row_activated) # DND self.treeview.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, None, Gdk.DragAction.MOVE, ) self.treeview.drag_dest_set( Gtk.DestDefaults.ALL, None, Gdk.DragAction.MOVE, ) self.treeview.drag_source_add_text_targets() self.treeview.drag_dest_add_text_targets() self.treeview.connect("drag-begin", self.on_drag_begin) self.treeview.connect("drag-end", self.on_drag_begin) self.treeview.connect("drag-motion", self.on_drag_motion) self.treeview.connect("drag-data-get", self.on_drag_data_get) self.treeview.connect("drag-data-received", self.on_drag_data_received) self.updating_model = False self.updating_row_edit_fields = False self.dnd_autoscroll_timeout_id = 0 self.monitors = [] self.monitor_action_dirs() self.needs_saved = False self.reload_model() self.update_treeview_state() self.update_arrow_button_states() self.set_needs_saved(False) def load_nemo_shortcuts(self): source = Xmlb.BuilderSource() try: xml = Gio.resources_lookup_data("/org/nemo/action-layout-editor/nemo-shortcuts.ui", Gio.ResourceLookupFlags.NONE) ret = source.load_bytes(xml, Xmlb.BuilderSourceFlags.NONE) builder = Xmlb.Builder() builder.import_source(source) silo = builder.compile(Xmlb.BuilderCompileFlags.NONE, None) except GLib.Error as e: print("Could not load nemo-shortcuts.ui from resource file - we won't be able to detect built-in shortcut collisions: %s" % e.message) return root = silo.query_first("interface") for child in root.query(f"object/child", 0): for section in child.query("object[@class='GtkShortcutsSection']", 0): for group in section.query("child/object[@class='GtkShortcutsGroup']", 0): for shortcut in group.query("child/object[@class='GtkShortcutsShortcut']", 0): label = shortcut.query_text("property[@name='title']") accel = shortcut.query_text("property[@name='accelerator']") self.builtin_shortcuts.append(BuiltinShortcut(label, accel)) def reload_model(self, flat=False): self.updating_model = True self.model.clear() if flat: self.data = { 'toplevel': [] } else: try: with open(JSON_FILE, 'r') as file: try: self.data = json.load(file) except json.decoder.JSONDecodeError as e: print("Could not process json file: %s" % e) raise try: self.validate_tree(self.data) except (ValueError, KeyError) as e: print("Schema validation failed, ignoring saved layout: %s" % e) raise except (FileNotFoundError, ValueError, KeyError, json.decoder.JSONDecodeError): self.data = { 'toplevel': [] } installed_actions = self.load_installed_actions() self.fill_model(self.model, None, self.data['toplevel'], installed_actions) start_path = Gtk.TreePath.new_first() self.treeview.get_selection().select_path(start_path) self.treeview.scroll_to_cell(start_path, None, True, 0, 0) self.update_row_controls() self.updating_model = False def monitor_action_dirs (self): data_dirs = GLib.get_system_data_dirs() + [GLib.get_user_data_dir()] for d in data_dirs: full = os.path.join(d, "nemo", "actions") file = Gio.File.new_for_path(full) try: if not file.query_exists(None): continue monitor = file.monitor_directory(Gio.FileMonitorFlags.WATCH_MOVES | Gio.FileMonitorFlags.SEND_MOVED, None) monitor.connect("changed", self.actions_folder_changed) self.monitors.append(monitor) except GLib.Error as e: print("Error monitoring action directory '%s'" % full) def actions_folder_changed(self, monitor, file, other, event_type, data=None): if not file.get_basename().endswith(".nemo_action"): return self.reload_model() self.update_treeview_state() self.set_needs_saved(False) def save_model(self): # Save the modified model back to the JSON file self.data["toplevel"] = self.serialize_model(None, self.model) with open(JSON_FILE, 'w') as file: json.dump(self.data, file, indent=2) def validate_tree(self, data): # Iterate thru every node in the json tree and validate it for node in data['toplevel']: self.validate_node(node) def validate_node(self, node): # Check that the node has a valid type keys = node.keys() if not ("uuid" in keys and "type" in keys): raise KeyError("Missing required keys: uuid, type") # Mandatory keys # Check that the node has a valid UUID uuid = node['uuid'] if (not isinstance(uuid, str)) or uuid in (None, ""): raise ValueError("Invalid or empty UUID '%s' (must not be a non-null, non-empty string)" % str(uuid)) # Check that the node has a valid type type = node['type'] if (not isinstance(type, str)) or type not in (ROW_TYPE_ACTION, ROW_TYPE_SUBMENU, ROW_TYPE_SEPARATOR): raise ValueError("%s: Invalid type '%s' (must be a string, either 'action' or 'submenu')" % (uuid, str(node['type']))) # Optional keys # Check that the node has a valid label try: label = node['user-label'] if (label is not None and (not isinstance(label, str))) or label == "": raise ValueError("%s: Invalid label '%s' (must be null or a non-zero-length string)" % (uuid, str(label))) except KeyError: # not mandatory pass # Check that the node has a valid icon try: icon = node['user-icon'] if icon is not None and (not isinstance(icon, str)): raise ValueError("%s: Invalid icon '%s' (must be an any-length string or null)" % (uuid, icon)) except KeyError: # not mandatory pass # Check the node has a valid accelerator try: accel_str = node['accelerator'] if accel_str not in ("", None): key, mods = Gtk.accelerator_parse(accel_str) if key == 0 and mods == 0: raise ValueError("%s: Invalid accelerator string '%s'" % (uuid, accel_str)) except KeyError: pass # Check that the node has a valid children list try: children = node['children'] if node["type"] in (ROW_TYPE_ACTION, ROW_TYPE_SEPARATOR): print("%s: Action or separator node has children, ignoring them" % uuid) else: if not isinstance(children, list): raise ValueError("%s: Invalid 'children' (must be a list)") # Check that the node's children are valid for child in children: self.validate_node(child) except KeyError: # not mandatory pass def load_installed_actions(self): # Load installed actions from the system actions = {} data_dirs = GLib.get_system_data_dirs() + [GLib.get_user_data_dir()] for data_dir in data_dirs: actions_dir = Path(data_dir).joinpath("nemo/actions") if actions_dir.is_dir(): for path in actions_dir.iterdir(): file = Path(path) if file.suffix == ".nemo_action": uuid = file.name try: kf = GLib.KeyFile() kf.load_from_file(str(file), GLib.KeyFileFlags.NONE) actions[uuid] = (file, kf) except GLib.Error as e: print("Error loading action file '%s': %s" % (str(file), e.message)) continue return actions def fill_model(self, model, parent, items, installed_actions): disabled_actions = self.nemo_plugin_settings.get_strv("disabled-actions") for item in items: row_type = item.get("type") uuid = item.get('uuid') if row_type == ROW_TYPE_ACTION: try: kf = installed_actions[uuid][1] # (path, kf) tuple path = Path(installed_actions[uuid][0]) except KeyError: print("Ignoring missing installed action %s" % uuid) continue iter = model.append(parent, [new_hash(), uuid, row_type, Row(item, kf, path, path.name not in disabled_actions)]) del installed_actions[uuid] elif row_type == ROW_TYPE_SEPARATOR: iter = model.append(parent, [new_hash(), "separator", ROW_TYPE_SEPARATOR, Row(item, None, None, True)]) else: iter = model.append(parent, [new_hash(), uuid, row_type, Row(item, None, None, True)]) if 'children' in item: self.fill_model(model, iter, item['children'], installed_actions) # Don't run the following code during recursion, only add untracked actions to the root node if parent is not None: return def push_disabled(key): path, kf = installed_actions[key] return path.name in disabled_actions sorted_actions = {uuid: installed_actions[uuid] for uuid in sorted(installed_actions, key=push_disabled)} for uuid, (path, kf) in sorted_actions.items(): enabled = path.name not in disabled_actions model.append(parent, [new_hash(), uuid, ROW_TYPE_ACTION, Row(None, kf, path, enabled)]) def save_disabled_list(self): disabled = [] def get_disabled(model, path, iter, data=None): row = model.get_value(iter, ROW_OBJ) row_type = model.get_value(iter, ROW_TYPE) if row_type == ROW_TYPE_ACTION: if not row.enabled: nonlocal disabled disabled.append(row.get_path().name) return False self.model.foreach(get_disabled) self.nemo_plugin_settings.set_strv("disabled-actions", disabled) def on_disabled_settings_list_changed(self, settings, key, data=None): disabled_actions = self.nemo_plugin_settings.get_strv("disabled-actions") def update_disabled(model, path, iter, data=None): row = model.get_value(iter, ROW_OBJ) row_uuid = model.get_value(iter, ROW_UUID) old_enabled = row.enabled row.enabled = (row_uuid not in disabled_actions) if old_enabled != row.enabled: self.model.row_changed(path, iter) return False self.updating_model = True self.model.foreach(update_disabled) self.updating_model = False self.queue_draw() def serialize_model(self, parent, model): used_uuids = {} result = [] iter = model.iter_children(parent) while iter: row_type = model.get_value(iter, ROW_TYPE) row = model.get_value(iter, ROW_OBJ) raw_uuid = model.get_value(iter, ROW_UUID) uuid = raw_uuid if raw_uuid in used_uuids: uuid = raw_uuid + str(used_uuids[raw_uuid]) used_uuids[raw_uuid] += 1 else: used_uuids[raw_uuid] = 0 item = { 'uuid': uuid, 'type': row_type, 'user-label': row.get_custom_label(), 'user-icon': row.get_custom_icon(), 'accelerator': row.get_accelerator_string() } if row_type == ROW_TYPE_SUBMENU: item['children'] = self.serialize_model(iter, model) result.append(item) iter = model.iter_next(iter) return result def flatten_model(self): self.reload_model(flat=True) self.update_treeview_state() self.set_needs_saved(True) def update_treeview_state(self): self.treeview.expand_all() def get_selected_row_path_iter(self): selection = self.treeview.get_selection() model, paths = selection.get_selected_rows() if paths: path = paths[0] iter = model.get_iter(path) return (path, iter) return (None, None) def set_selection(self, iter): selection = self.treeview.get_selection() selection.select_iter(iter) path, niter = self.get_selected_row_path_iter() def get_selected_row_field(self, field): path, iter = self.get_selected_row_path_iter() return self.model.get_value(iter, field) def selected_row_changed(self, needs_saved=True): if self.updating_model: return path, iter = self.get_selected_row_path_iter() if iter is not None: self.model.row_changed(path, iter) self.update_row_controls() if needs_saved: self.set_needs_saved(True) def on_treeview_position_changed(self, selection): if self.updating_model: return self.update_row_controls() self.update_arrow_button_states() def update_row_controls(self): self.updating_row_edit_fields = True try: row = self.get_selected_row_field(ROW_OBJ) except TypeError: self.row_controls_box.set_sensitive(False) self.name_entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, None) self.icon_selector_image.clear() self.name_entry.set_text("") return self.row_controls_box.set_sensitive(True) if row is not None: row_type = self.get_selected_row_field(ROW_TYPE) self.name_entry.set_text(row.get_label()) self.set_icon_button(row) self.original_icon_menu_item.set_visible(row_type == ROW_TYPE_ACTION) orig_icon = row.get_icon_string(original=True) self.original_icon_menu_item.set_sensitive(orig_icon is not None and orig_icon != row.get_icon_string()) self.selected_item_widgets_group.set_sensitive(row.enabled and row_type != ROW_TYPE_SEPARATOR) self.action_enabled_switch.set_active(row.enabled) self.action_enabled_switch.set_sensitive(row_type == ROW_TYPE_ACTION) self.remove_submenu_button.set_sensitive(row_type in (ROW_TYPE_SUBMENU, ROW_TYPE_SEPARATOR)) if row_type == ROW_TYPE_ACTION and row.get_custom_label() is not None: self.name_entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "edit-delete-symbolic") self.name_entry.set_icon_sensitive(Gtk.EntryIconPosition.SECONDARY, True) else: self.name_entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, None) self.name_entry.set_icon_sensitive(Gtk.EntryIconPosition.SECONDARY, False) self.updating_row_edit_fields = False def on_row_activated(self, path, column, data=None): row_type = self.get_selected_row_field(ROW_TYPE) if row_type != ROW_TYPE_ACTION: return self.action_enabled_switch.set_active(not self.action_enabled_switch.get_active()) def set_icon_button(self, row): for image, use_orig in ([self.icon_selector_image, False], [self.original_icon_menu_image, True]): try: cur_attr, cur_name_or_surface = row.get_icon_type_and_data(original=use_orig) if cur_attr == "surface": image.set_from_surface(cur_name_or_surface) else: image.set_from_icon_name(cur_name_or_surface, Gtk.IconSize.BUTTON) except TypeError: image.props.icon_name = None image.props.surface = None def set_needs_saved(self, needs_saved): if needs_saved: self.save_button.set_sensitive(True) self.discard_changes_button.set_sensitive(True) else: self.save_button.set_sensitive(False) self.discard_changes_button.set_sensitive(False) self.needs_saved = needs_saved def update_arrow_button_states(self): can_up = True can_down = True path, for_iter = self.get_selected_row_path_iter() first_iter = self.model.get_iter_first() if self.same_iter(for_iter, first_iter): can_up = False else: last_iter = None while first_iter: last_iter = first_iter first_iter = self.model.iter_next(first_iter) if self.same_iter(for_iter, last_iter): can_down = False self.up_button.set_sensitive(can_up) self.down_button.set_sensitive(can_down) # Button signal handlers def up_button_clicked(self, button): self.move_selection_up_one() def down_button_clicked(self, button): self.move_selection_down_one() def on_save_clicked(self, button): self.save_model() self.save_disabled_list() self.set_needs_saved(False) def on_discard_changes_clicked(self, button): self.set_needs_saved(False) self.reload_model() self.update_treeview_state() def on_default_layout_clicked(self, button): self.flatten_model() def on_clear_icon_clicked(self, menuitem): row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.set_custom_icon("") self.selected_row_changed() def on_original_icon_clicked(self, menuitem): row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.set_custom_icon(None) self.selected_row_changed() def on_choose_icon_clicked(self, menuitem): chooser = XApp.IconChooserDialog() row = self.get_selected_row_field(ROW_OBJ) if row is not None: icon_name = row.get_icon_string() if icon_name is not None: response = chooser.run_with_icon(icon_name) else: response = chooser.run() if response == Gtk.ResponseType.OK: row.set_custom_icon(chooser.get_icon_string()) self.selected_row_changed() chooser.hide() chooser.destroy() def on_new_submenu_clicked(self, menuitem): # Add on same level as current selection path, selection_iter = self.get_selected_row_path_iter() row_type = self.get_selected_row_field(ROW_TYPE) if row_type == ROW_TYPE_ACTION: parent = self.model.iter_parent(selection_iter) else: parent = selection_iter new_iter = self.model.insert_after(parent, selection_iter, [ new_hash(), _("New submenu"), ROW_TYPE_SUBMENU, Row({"uuid": "New Submenu"}, None, None, True)]) selection = self.treeview.get_selection() selection.select_iter(new_iter) self.selected_row_changed() self.name_entry.grab_focus() def on_new_separator_clicked(self, menuitem): # Add on same level as current selection path, selection_iter = self.get_selected_row_path_iter() row_type = self.get_selected_row_field(ROW_TYPE) if row_type == ROW_TYPE_ACTION: parent = self.model.iter_parent(selection_iter) else: parent = selection_iter new_iter = self.model.insert_after(parent, selection_iter, [ new_hash(), "separator", ROW_TYPE_SEPARATOR, Row({"uuid": "separator", "type": "separator"}, None, None, True)]) selection = self.treeview.get_selection() selection.select_iter(new_iter) self.selected_row_changed() def on_remove_submenu_clicked(self, button): path, selection_iter = self.get_selected_row_path_iter() row_type = self.model.get_value(selection_iter, ROW_TYPE) row_hash = self.model.get_value(selection_iter, ROW_HASH) if row_type == ROW_TYPE_ACTION: return self.updating_model = True if row_type == ROW_TYPE_SUBMENU: parent_iter = self.model.iter_parent(selection_iter) self.move_tree(self.model, selection_iter, parent_iter) self.remove_row_by_hash(self.model, row_hash) self.updating_model = False self.selected_row_changed() def on_name_entry_changed(self, entry): if self.updating_row_edit_fields: return row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.set_custom_label(entry.get_text()) # A submenu's UUID matches its label. Update it when the label is changed. row_type = self.get_selected_row_field(ROW_TYPE) if row_type == ROW_TYPE_SUBMENU: path, iter = self.get_selected_row_path_iter() if iter is not None: self.model.set_value(iter, ROW_UUID, entry.get_text()) self.selected_row_changed() def on_name_entry_icon_clicked(self, entry, icon_pos, event, data=None): if icon_pos != Gtk.EntryIconPosition.SECONDARY: return row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.set_custom_label(None) self.selected_row_changed() def on_action_enabled_switch_notify(self, switch, pspec): if self.updating_row_edit_fields: return row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.enabled = switch.get_active() # The layout file does not track active/inactive actions, # so this shouldn't prompt a layout save. self.selected_row_changed(needs_saved=False) self.save_disabled_list() def on_accel_edited(self, accel, path, key, mods, kc, data=None): if not self.validate_accelerator(key, mods): return row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.set_accelerator_string(Gtk.accelerator_name(key, mods)) self.selected_row_changed() def on_accel_cleared(self, accel, path, data=None): row = self.get_selected_row_field(ROW_OBJ) if row is not None: row.set_accelerator_string(None) self.selected_row_changed() def on_accel_edit_started(self, cell, editable, path, data=None): self.editing_accel = True editable.connect("editing-done", self.accel_editing_done) def accel_editing_done(self, editable, data=None): self.editing_accel = False editable.disconnect_by_func(self.accel_editing_done) def validate_accelerator(self, key, mods): # Check nemo's built-ins (copy, paste, etc...) for shortcut in self.builtin_shortcuts: if shortcut.key == key and shortcut.mods == mods: label = f"{shortcut.label}" dialog = Gtk.MessageDialog( transient_for=self.main_window, modal=True, message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, text=_("This key combination is already in use by Nemo (%s). It cannot be changed.") % label, use_markup=True ) dialog.run() dialog.destroy() return False conflict = False def check_for_action_conflict(iter): foreach_iter = self.model.iter_children(iter) nonlocal conflict while not conflict and foreach_iter is not None: row = self.model.get_value(foreach_iter, ROW_OBJ) accel_string = row.get_accelerator_string() if accel_string is not None: row_key, row_mod = Gtk.accelerator_parse(accel_string) if row_key == key and row_mod == mods: label = f"\n\n{row.get_label()}\n\n" dialog = Gtk.MessageDialog( transient_for=self.main_window, modal=True, message_type=Gtk.MessageType.WARNING, buttons=Gtk.ButtonsType.YES_NO, text=_("This key combination is already in use by another action:") + label + _("Do you want to replace it?"), use_markup=True ) resp = dialog.run() dialog.destroy() # nonlocal conflict if resp == Gtk.ResponseType.YES: row.set_accelerator_string(None) conflict = False else: conflict = True break foreach_type = self.model.get_value(foreach_iter, ROW_TYPE) if foreach_type == ROW_TYPE_SUBMENU: check_for_action_conflict(foreach_iter) foreach_iter = self.model.iter_next(foreach_iter) check_for_action_conflict(None) return not conflict # Cell render functions def menu_icon_render_func(self, column, cell, model, iter, data): row = model.get_value(iter, ROW_OBJ) try: attr, name_or_surface = row.get_icon_type_and_data() cell.set_property(attr, name_or_surface) except TypeError: cell.set_property("icon-name", None) cell.set_property("surface", None) def menu_label_render_func(self, column, cell, model, iter, data): row_type = model.get_value(iter, ROW_TYPE) row = model.get_value(iter, ROW_OBJ) if row_type == ROW_TYPE_SUBMENU: cell.set_property("markup", "%s" % row.get_label()) cell.set_property("weight", Pango.Weight.BOLD) else: cell.set_property("markup", row.get_label()) cell.set_property("weight", Pango.Weight.NORMAL if row.enabled else Pango.Weight.ULTRALIGHT) def accel_render_func(self, column, cell, model, iter, data): row_type = model.get_value(iter, ROW_TYPE) if row_type in (ROW_TYPE_SUBMENU, ROW_TYPE_SEPARATOR): cell.set_property("visible", False) return row = model.get_value(iter, ROW_OBJ) accel_string = row.get_accelerator_string() or "" key, mods = Gtk.accelerator_parse(accel_string) cell.set_property("visible", True) cell.set_property("accel-key", key) cell.set_property("accel-mods", mods) if accel_string == "": spath, siter = self.get_selected_row_path_iter() current_path = model.get_path(iter) if current_path is not None and current_path.compare(spath) == 0: if not self.editing_accel: cell.set_property("text", _("Click to add a shortcut")) else: cell.set_property("text", None) else: cell.set_property("text", " ") # DND def on_drag_begin(self, widget, context): source_path, source_iter = self.get_selected_row_path_iter() width = 0 height = 0 def gather_row_surfaces(current_root_iter, surfaces): foreach_iter = self.model.iter_children(current_root_iter) while foreach_iter is not None: foreach_path = self.model.get_path(foreach_iter) surface = self.treeview.create_row_drag_icon(foreach_path) row_surfaces.append(surface) nonlocal width nonlocal height width = max(width, surface.get_width()) height += surface.get_height() - 1 foreach_type = self.model.get_value(foreach_iter, ROW_TYPE) if foreach_type == ROW_TYPE_SUBMENU: gather_row_surfaces(foreach_iter, surfaces) foreach_iter = self.model.iter_next(foreach_iter) source_row_surface = self.treeview.create_row_drag_icon(source_path) width = source_row_surface.get_width() height = source_row_surface.get_height() - 1 row_surfaces = [source_row_surface] gather_row_surfaces(source_iter, row_surfaces) final_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width + 4, height + 4) scale = self.main_window.get_scale_factor() final_surface.set_device_scale(scale, scale) def sc(v): return v * scale def usc(v): return v / scale cr = cairo.Context(final_surface) y = 2 first = True for s in row_surfaces: cr.save() cr.set_source_surface(s, 2, y) cr.paint() cr.restore() if not first: cr.save() cr.set_source_rgb(1, 1, 1) cr.rectangle(sc(1), y - 2, usc(width) - 2, 4) cr.fill() cr.restore() first = False y += usc(s.get_height()) - 1 cr.show_page() Gtk.drag_set_icon_surface(context, final_surface) def on_drag_end(self, context, data=None): self.dnd_autoscroll_cancel() def dnd_autoscroll(self): AUTO_SCROLL_MARGIN = 20 window = self.treeview.get_bin_window() vadjust = self.treeview_holder.get_vadjustment() seat = Gdk.Display.get_default().get_default_seat() pointer = seat.get_pointer() window, x, y, mask = window.get_device_position(pointer) y += vadjust.get_value() rect = self.treeview.get_visible_rect() offset = y - (rect.y + 2 * AUTO_SCROLL_MARGIN) if offset > 0: offset = y - (rect.y + rect.height - 2 * AUTO_SCROLL_MARGIN); if offset < 0: return value = max(0.0, min(vadjust.get_value() + offset, vadjust.get_upper() - vadjust.get_page_size())) vadjust.set_value(value) self.dnd_autoscroll_start() def dnd_autoscroll_timeout(self, data=None): self.dnd_autoscroll_timeout_id = 0 self.dnd_autoscroll() return GLib.SOURCE_REMOVE def dnd_autoscroll_cancel(self): if self.dnd_autoscroll_timeout_id > 0: GLib.source_remove(self.dnd_autoscroll_timeout_id) self.dnd_autoscroll_timeout_id = 0 def dnd_autoscroll_start(self): if self.dnd_autoscroll_timeout_id > 0: GLib.source_remove(self.dnd_autoscroll_timeout_id) self.dnd_autoscroll_timeout_id = GLib.timeout_add(50, self.dnd_autoscroll_timeout) def on_drag_motion(self, widget, context, x, y, etime): target_row = self.treeview.get_dest_row_at_pos(x, y) if not target_row: Gdk.drag_status(context, 0, etime) return False model = self.treeview.get_model() path, position = target_row i = model.get_iter(path) target_row_type = model.get_value(i, ROW_TYPE) target_row = model.get_value(i, ROW_OBJ) source_path, source_iter = self.get_selected_row_path_iter() source_row_type = model.get_value(source_iter, ROW_TYPE) if source_path.compare(path) == 0 or source_path.is_ancestor(path) and source_row_type == ROW_TYPE_SUBMENU: Gdk.drag_status(context, 0, etime) return False if target_row_type != ROW_TYPE_SUBMENU and position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE, Gtk.TreeViewDropPosition.INTO_OR_AFTER): Gdk.drag_status(context, 0, etime) return False self.treeview.set_drag_dest_row(path, position) action = Gdk.DragAction.MOVE self.dnd_autoscroll_start() Gdk.drag_status(context, action, etime) return True def on_drag_data_get(self, widget, context, selection_data, info, etime): target_atom = selection_data.get_target() target = target_atom.name() if target == "UTF8_STRING": selection = self.treeview.get_selection() model, paths = selection.get_selected_rows() if paths: path = paths[0] iter = model.get_iter(path) item_data = { "hash": model.get_value(iter, ROW_HASH), "uuid": model.get_value(iter, ROW_UUID), 'type': model.get_value(iter, ROW_TYPE) } selection_data.set_text(json.dumps(item_data), -1) def on_drag_data_received(self, widget, context, x, y, selection_data, info, etime): drop_info = self.treeview.get_dest_row_at_pos(x, y) if not drop_info: Gdk.drag_status(context, 0, etime) return path, position = drop_info if selection_data: dropped_data = selection_data.get_text() if path: iter = self.model.get_iter(path) parent = self.model.iter_parent(iter) else: iter = None parent = None if not self.reorder_items(iter, parent, dropped_data, position): Gdk.drag_status(context, 0, etime) return Gtk.drag_finish(context, True, True, etime) self.set_needs_saved(True) self.update_treeview_state() def reorder_items(self, target_iter, parent, dropped_data, position): source_data = json.loads(dropped_data) source_hash = source_data['hash'] source_uuid = source_data['uuid'] source_type = source_data['type'] source_iter = self.lookup_iter_by_hash(self.model, source_hash) if source_iter is None: print("no source row found, cancelling drop") return False target_row_type = self.model.get_value(target_iter, ROW_TYPE) if target_row_type == ROW_TYPE_ACTION and \ position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE, Gtk.TreeViewDropPosition.INTO_OR_AFTER): return False new_iter = None row = self.model.get_value(source_iter, ROW_OBJ) if target_row_type == ROW_TYPE_SUBMENU and \ position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE, Gtk.TreeViewDropPosition.INTO_OR_AFTER, Gtk.TreeViewDropPosition.AFTER): new_iter = self.model.insert(target_iter, 0, [new_hash(), source_uuid, source_type, row]) else: if position == Gtk.TreeViewDropPosition.BEFORE: new_iter = self.model.insert_before(parent, target_iter, [new_hash(), source_uuid, source_type, row]) elif position == Gtk.TreeViewDropPosition.AFTER: new_iter = self.model.insert_after(parent, target_iter, [new_hash(), source_uuid, source_type, row]) # we have to recreate all children to the new menu location. if new_iter is not None: if source_type == ROW_TYPE_SUBMENU: self.move_tree(self.model, source_iter, new_iter) self.remove_row_by_hash(self.model, source_hash) return True # Up/Down button handling def get_new_row_data(self, source_iter): source_hash = self.model.get_value(source_iter, ROW_HASH) source_uuid = self.model.get_value(source_iter, ROW_UUID) source_type = self.model.get_value(source_iter, ROW_TYPE) source_object = self.model.get_value(source_iter, ROW_OBJ) target_hash = new_hash() return ( source_hash, target_hash, source_type, [ target_hash, source_uuid, source_type, source_object ] ) def get_last_at_level(self, model, iter): if model.iter_has_child(iter): foreach_iter = model.iter_children(iter) while foreach_iter is not None: last_iter = foreach_iter foreach_iter = model.iter_next(foreach_iter) continue return self.get_last_at_level(model, last_iter) return iter def same_iter(self, iter1, iter2): if iter1 is None and iter2 is None: return True elif iter1 is None and iter2 is not None: return False elif iter2 is None and iter1 is not None: return False path1 = self.model.get_path(iter1) path2 = self.model.get_path(iter2) return path1.compare(path2) == 0 def path_is_valid(self, path): try: test_iter = self.model.get_iter(path) except ValueError: return False return True def next_path_validated(self, path): path.next() return self.path_is_valid(path) """ The move_selection_up_one and _down_one methods are complicated because there are only up/down arrows (to keep things simple to the user). This navigates the treeview as if it was fully expanded, but movement is by row, *not* by level, so it's possible to reach every node in the tree. """ def move_selection_up_one(self): path, iter = self.get_selected_row_path_iter() if iter is None: return parent = self.model.iter_parent(iter) target_path = path target_iter = None target_parent = None source_hash, target_hash, row_type, inserted_row = self.get_new_row_data(iter) inserted_iter = None if target_path.prev(): target_iter = self.get_last_at_level(self.model, self.model.get_iter(target_path)) target_iter_type = self.model.get_value(target_iter, ROW_TYPE) if target_iter_type == ROW_TYPE_SUBMENU: inserted_iter = self.model.prepend(target_iter, inserted_row) target_parent = target_iter else: target_parent = self.model.iter_parent(target_iter) if self.same_iter(parent, target_parent): inserted_iter = self.model.insert_before(target_parent, target_iter, inserted_row) else: inserted_iter = self.model.insert_after(target_parent, target_iter, inserted_row) elif target_path.up(): if target_path.prev(): target_iter = self.get_last_at_level(self.model, self.model.get_iter(target_path)) target_parent = self.model.iter_parent(target_iter) inserted_iter = self.model.insert_after(target_parent, target_iter, inserted_row) else: # We're at the top? top_iter = self.model.get_iter_first() if not self.same_iter(iter, top_iter): inserted_iter = self.model.insert_before(None, top_iter, inserted_row) source_was_expanded = False if inserted_iter is not None: self.updating_model = True if row_type == ROW_TYPE_SUBMENU: if self.treeview.row_expanded(self.model.get_path(iter)): source_was_expanded = True self.move_tree(self.model, iter, inserted_iter) if target_parent is not None: self.treeview.expand_row(self.model.get_path(target_parent), True) elif source_was_expanded: self.treeview.expand_row(self.model.get_path(inserted_iter), True) self.remove_row_by_hash(self.model, source_hash) self.updating_model = False self.select_row_by_hash(self.model, target_hash) self.treeview.scroll_to_cell(self.model.get_path(inserted_iter), None, False, 0, 0) self.set_needs_saved(True) def move_selection_down_one(self): path, iter = self.get_selected_row_path_iter() if iter is None: return target_path = path target_iter = None target_parent = None source_hash, target_hash, row_type, inserted_row = self.get_new_row_data(iter) inserted_iter = None if self.next_path_validated(target_path): # is it a menu? Add it as its first child maybe_submenu_iter = self.model.get_iter(target_path) maybe_submenu_type = self.model.get_value(maybe_submenu_iter, ROW_TYPE) if maybe_submenu_type == ROW_TYPE_SUBMENU: inserted_iter = self.model.prepend(maybe_submenu_iter, inserted_row) target_parent = maybe_submenu_iter else: # or else add after the test row target_iter = self.model.get_iter(target_path) target_parent = self.model.iter_parent(target_iter) inserted_iter = self.model.insert_after(target_parent, target_iter, inserted_row) else: # path_next_validated modifies target_path directly, reset it to the origin target_path = path if target_path.get_depth() > 1 and target_path.up() and self.path_is_valid(target_path): target_iter = self.model.get_iter(target_path) target_parent = self.model.iter_parent(target_iter) inserted_iter = self.model.insert_after(target_parent, target_iter, inserted_row) source_was_expanded = False if inserted_iter is not None: self.updating_model = True if row_type == ROW_TYPE_SUBMENU: if self.treeview.row_expanded(self.model.get_path(iter)): source_was_expanded = True self.move_tree(self.model, iter, inserted_iter) if target_parent is not None: self.treeview.expand_row(self.model.get_path(target_parent), True) elif source_was_expanded: self.treeview.expand_row(self.model.get_path(inserted_iter), True) self.remove_row_by_hash(self.model, source_hash) self.updating_model = False self.select_row_by_hash(self.model, target_hash) self.treeview.scroll_to_cell(self.model.get_path(inserted_iter), None, False, 0, 0) self.set_needs_saved(True) def move_tree(self, model, source_iter, new_iter): foreach_iter = self.model.iter_children(source_iter) while foreach_iter is not None: row_hash = model.get_value(foreach_iter, ROW_HASH) row_uuid = model.get_value(foreach_iter, ROW_UUID) row_type = model.get_value(foreach_iter, ROW_TYPE) row = model.get_value(foreach_iter, ROW_OBJ) if row is None: print("During prune/paste, could not find row for %s with hash %s" % (row_uuid, row_hash)) continue inserted_iter = self.model.insert(new_iter, -1, [ new_hash(), row_uuid, row_type, row ]) if row_type == ROW_TYPE_SUBMENU: self.move_tree(model, foreach_iter, inserted_iter) foreach_iter = self.model.iter_next(foreach_iter) def lookup_iter_by_hash(self, model, hash): result = None def compare(model, path, iter, data): current = model.get_value(iter, ROW_HASH) if current == hash: nonlocal result result = iter return True return False model.foreach(compare, hash) return result def remove_row_by_hash(self, model, old_hash): iter = self.lookup_iter_by_hash(model, old_hash) if iter is not None: model.remove(iter) def select_row_by_hash(self, model, hash): iter = self.lookup_iter_by_hash(model, hash) if iter is not None: self.set_selection(iter) def quit(self, *args, **kwargs): if self.needs_saved: dialog = Gtk.MessageDialog( transient_for=self.main_window, modal=True, message_type=Gtk.MessageType.OTHER, buttons=Gtk.ButtonsType.YES_NO, text=_("The layout has changed. Save it?") ) dialog.set_title(_("Unsaved changes")) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.DELETE_EVENT: return False if response == Gtk.ResponseType.YES: self.save_model() self.save_disabled_list() for monitor in self.monitors: monitor.cancel() return True class EditorWindow(): def __init__(self): self.builder = Gtk.Builder.new_from_resource("/org/nemo/action-layout-editor/nemo-action-layout-editor.glade") self.main_window = self.builder.get_object("main_window") self.hamburger_button = self.builder.get_object("hamburger_button") self.editor = NemoActionsOrganizer(self.main_window, self.builder) self.main_window.add(self.editor) # Hamburger menu menu = Gtk.Menu() item = Gtk.ImageMenuItem(label=_("Open user actions folder"), image=Gtk.Image(icon_name="folder-symbolic", icon_size=Gtk.IconSize.MENU)) item.connect("activate", self.open_actions_folder_clicked) menu.add(item) item = Gtk.MenuItem(label=_("Quit")) item.connect("activate", self.quit) menu.add(item) menu.show_all() self.hamburger_button.set_popup(menu) self.main_window.connect("delete-event", self.window_delete) self.main_window.show_all() self.main_window.present_with_time(0) def quit(self, button): if self.editor.quit(): Gtk.main_quit() return True return False def window_delete(self, window, event, data=None): if self.editor.quit(): Gtk.main_quit() return Gdk.EVENT_STOP def open_actions_folder_clicked(self, button): subprocess.Popen(["xdg-open", USER_ACTIONS_DIR]) if __name__ == "__main__": import sys EditorWindow() Gtk.main() sys.exit(0)nemo-6.4.5/.gitignore0000664000175000017500000000127514757107430013415 0ustar fabiofabio########################### # Default .gitignore file for Nemo. # By default this ignores the lint from the Eclipse IDE. ################## # Eclipse Output # ################## *.pydevproject .project .metadata bin/** tmp/** tmp/**/* *.tmp *.bak *.swp *~.nib local.properties .classpath .settings/ .loadpath # External tool builders .externalToolBuilders/ # Locally stored "Eclipse launch configurations" *.launch # CDT-specific .cproject # PDT-specific .buildpath debian/tmp/* debian/nemo/* debian/nemo-dbg/* debian/nemo-data/* debian/libnemo-extension*/* debian/gir1.2*/* debian/*.log debian/.debhelper debian/debhelper-build-stamp debian/files *.substvars *.debhelper obj-x86_64-linux-gnu nemo-6.4.5/data/0000775000175000017500000000000014757107430012331 5ustar fabiofabionemo-6.4.5/data/org.nemo.root.policy.in0000664000175000017500000000153114757107430016665 0ustar fabiofabio Nemo Project https://github.com/linuxmint/nemo Run Nemo with elevated privileges Files gksu-root-terminal auth_admin_keep auth_admin_keep auth_admin_keep @bindir@/nemo true nemo-6.4.5/data/meson.build0000664000175000017500000000462514757107430014502 0ustar fabiofabio ################################################################################ dataConf = configuration_data() dataConf.set('VERSION', meson.project_version()) desktopFiles = [ configure_file( input : 'nemo-autorun-software.desktop.in', output: 'nemo-autorun-software.desktop', configuration: dataConf, ), configure_file( input : 'nemo-autostart.desktop.in', output: 'nemo-autostart.desktop', configuration: dataConf, ), configure_file( input : 'nemo.desktop.in', output: 'nemo.desktop', configuration: dataConf, ) ] install_data(desktopFiles, install_dir: join_paths(get_option('datadir'), 'applications') ) ################################################################################ dataConf = configuration_data() dataConf.set('bindir', join_paths(get_option('prefix'), get_option('bindir'))) dbusFiles = [ configure_file( input : 'nemo.service.in', output: 'nemo.service', configuration: dataConf, ), configure_file( input : 'nemo.FileManager1.service.in', output: 'nemo.FileManager1.service', configuration: dataConf, ), ] install_data(dbusFiles, install_dir: join_paths(get_option('datadir'), 'dbus-1', 'services') ) ################################################################################ mimeFile_translated = custom_target('nemo.xml', input : ['nemo.xml.in'], output: 'nemo.xml', command: ['intltool-merge', '--quiet', '--xml-style', '--utf8', po_subdir, '@INPUT@', '@OUTPUT@' ], install: true, install_dir: join_paths(get_option('datadir'), 'mime', 'packages'), build_by_default: true, ) ################################################################################ dataConf = configuration_data() dataConf.set('bindir', join_paths(get_option('prefix'), get_option('bindir'))) rootPolicyFile = configure_file( input : 'org.nemo.root.policy.in', output: 'org.nemo.root.policy', configuration: dataConf, ) install_data(rootPolicyFile, install_dir: join_paths(get_option('datadir'), 'polkit-1', 'actions') ) foreach lang_file: ['nemo_action.lang', 'nemo_search_helper.lang'] foreach sv_dir: ['gtksourceview-2.0', 'gtksourceview-3.0', 'gtksourceview-4'] install_data(lang_file, install_dir: join_paths(get_option('datadir'), sv_dir, 'language-specs') ) endforeach endforeach ################################################################################ subdir('icons') nemo-6.4.5/data/nemo-autostart.desktop.in0000664000175000017500000000034214757107430017312 0ustar fabiofabio[Desktop Entry] Type=Application Name=Nemo Comment=Start Nemo desktop at log in Exec=nemo-desktop OnlyShowIn=X-Cinnamon; AutostartCondition=GSettings org.nemo.desktop show-desktop-icons X-GNOME-AutoRestart=true NoDisplay=true nemo-6.4.5/data/icons/0000775000175000017500000000000014757107430013444 5ustar fabiofabionemo-6.4.5/data/icons/meson.build0000664000175000017500000000666514757107430015623 0ustar fabiofabiopublicIcons = [ 'hicolor/apps/16x16/nemo.png', 'hicolor/apps/22x22/nemo.png', 'hicolor/apps/24x24/nemo.png', 'hicolor/apps/32x32/nemo.png', 'hicolor/apps/scalable/nemo.svg', 'hicolor/actions/16x16/nemo-eject.png', 'hicolor/actions/16x16/menu-bullet.png', 'hicolor/actions/16x16/menu-sort-up.png', 'hicolor/actions/16x16/menu-sort-up-free.png', 'hicolor/actions/16x16/menu-sort-down.png', 'hicolor/actions/16x16/menu-sort-down-free.png', 'hicolor/actions/16x16/menu-sort-right.png', 'hicolor/actions/16x16/menu-sort-right-free.png', 'hicolor/actions/16x16/menu-sort-left.png', 'hicolor/actions/16x16/menu-sort-left-free.png', 'hicolor/actions/16x16/menu-none.png', 'hicolor/actions/32x32/nemo-eject.png', 'hicolor/actions/scalable/view-compact-symbolic.svg', 'hicolor/actions/scalable/location-symbolic.svg', 'hicolor/actions/scalable/location-symbolic-rtl.svg', 'hicolor/actions/scalable/mount-archive-symbolic.svg', 'hicolor/actions/scalable/sidebar-hide-symbolic.svg', 'hicolor/actions/scalable/sidebar-hide-symbolic-rtl.svg', 'hicolor/actions/scalable/sidebar-show-symbolic.svg', 'hicolor/actions/scalable/sidebar-show-symbolic-rtl.svg', 'hicolor/actions/scalable/sidebar-tree-symbolic.svg', 'hicolor/actions/scalable/sidebar-tree-symbolic-rtl.svg', 'hicolor/actions/scalable/sidebar-places-symbolic.svg', 'hicolor/actions/scalable/nemo-auto-arrange-symbolic.svg', 'hicolor/actions/scalable/nemo-desktop-scale-symbolic.svg', 'hicolor/actions/scalable/nemo-horizontal-layout-symbolic.svg', 'hicolor/actions/scalable/nemo-horizontal-layout-wide-symbolic.svg', 'hicolor/actions/scalable/nemo-vertical-layout-symbolic.svg', 'hicolor/actions/scalable/nemo-vertical-layout-wide-symbolic.svg', 'hicolor/actions/scalable/nemo-recursive-search-symbolic.svg', 'hicolor/actions/scalable/nemo-recursive-search-symbolic-rtl.svg', 'hicolor/devices/scalable/drive-removable-media-usb-symbolic.svg', 'hicolor/status/scalable/nemo-progress-0-symbolic.svg', 'hicolor/status/scalable/nemo-progress-10-symbolic.svg', 'hicolor/status/scalable/nemo-progress-20-symbolic.svg', 'hicolor/status/scalable/nemo-progress-30-symbolic.svg', 'hicolor/status/scalable/nemo-progress-40-symbolic.svg', 'hicolor/status/scalable/nemo-progress-50-symbolic.svg', 'hicolor/status/scalable/nemo-progress-60-symbolic.svg', 'hicolor/status/scalable/nemo-progress-70-symbolic.svg', 'hicolor/status/scalable/nemo-progress-80-symbolic.svg', 'hicolor/status/scalable/nemo-progress-90-symbolic.svg', 'hicolor/status/scalable/nemo-progress-100-symbolic.svg', 'hicolor/status/scalable/nemo-bookmark-not-found-symbolic.svg', ] privateIcons = [ 'hicolor/emblems/16x16/emblem-note.png', 'hicolor/emblems/24x24/emblem-note.png', 'hicolor/emblems/48x48/emblem-note.png', ] noInstallIcons = [ 'hicolor/apps/16x16/nemo.svg', 'hicolor/apps/22x22/nemo.svg', 'hicolor/apps/32x32/nemo.svg', ] foreach icon : publicIcons nameParts = icon.split('/') theme = nameParts[0] context = nameParts[1] size = nameParts[2] file = nameParts[3] install_data(icon, install_dir: join_paths(get_option('datadir'), 'icons', theme, size, context) ) endforeach foreach icon : privateIcons nameParts = icon.split('/') theme = nameParts[0] context = nameParts[1] size = nameParts[2] file = nameParts[3] install_data(icon, install_dir: join_paths(get_option('datadir'), 'nemo', 'icons', theme, size, context) ) endforeach nemo-6.4.5/data/icons/hicolor/0000775000175000017500000000000014757107430015103 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/emblems/0000775000175000017500000000000014757107430016527 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/emblems/24x24/0000775000175000017500000000000014757107430017312 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/emblems/24x24/emblem-note.png0000664000175000017500000000162114757107430022224 0ustar fabiofabioPNG  IHDRw=bKGDC pHYs  ~tIME 721M>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XIDATxݖkQt h4<" A'EOhDTTTT$.7/^A0*oC%3@RdTEQYe w/AsfRDuyS>9ox|{[M2%#J@o*Dp XMg n!ik/j3b-՛C8IC!A[klJL9^l0V~a91sZRd3MxCPZ j5$l.Gu¥2"JP {R4Lc'|COsu0 Sh{#(D/}g]iG^uF*(#X+|-b*?Z"Ʃ7GU?$~RծIENDB`nemo-6.4.5/data/icons/hicolor/emblems/48x48/0000775000175000017500000000000014757107430017326 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/emblems/48x48/emblem-note.png0000664000175000017500000000462614757107430022250 0ustar fabiofabioPNG  IHDR00WbKGD pHYs  ~tIME "49rl #IDATxkpT{ޓNHDn^ZpZLm?رXM_tE?؎ЎN;~p2թ(TTJU! $咐͞=~Y\"D!;;gy{`>73. BIiFN3v9$>g` j`Kiif>@G"'@޹lqoyZ`= ĕ kR P_Qy~fRHJK>z %3X=-x{< i8\pp-p[/EJR"@HBy۱gNin\ă˖=Gn>r<(R",|&QlY<&2 $7ڂ!& E")1qFwycp,mn3׍ d4n{rN$.F `6\8=]WtrT'RD T~D2/%,NO[U2@z^ݠgUߙ.8Nt-[N.}v\$u&Jt\\Wx&gI (*.Fo Kcx0'bPH9q)(4\N4,LfΒ (C#9Rrb"'I)KCq jEeј1rP, 9U1("xQxt_?zE!wڝ\[(`)V$N$r9\gP ]Ϻš؉Mރ5ޑ'u)I(o#]Ci!Cc5Q| { H(.`]6uRTRKG8f?'% d2YM# |%7•"4ٞwH̩̿MW.6_,kDuW-N-mx b&ecY6mM\0lL&5#PE PUF#}~;ؼ2l[h߳+?'!g*| uhs EIc~,]3ʡwAeIlK ,F.AG&d8 j6C~1ܻI쥼n%-My!𴗼T| ðw;Rq9ބU^5Mwg{z?X e=QEW{,~3Mb]6S5F6U-1o[VjK(?׆D-D~wT^?'=J>'ŧgbY6`Bf:*;)0(YAzoeߎW;n%W>) <XvhWOEHEyPb)mrDc _(Qdde) Z$\ TE1Vl!Gin%w<|kbS~*ʇG7g'E%sDXH+f]K.}dOeԯFиnLچΨ>܁/XL(:] ^='AIrC ]^;bxYSM-"QـwS&.`k=#G)^]ov4j)5 ;ۍ*Ӝ\c]5#Sx5Vрe&)דǵRG(`*(E$Qov4Nx~<ɺn ;=mw}d~aglvyV _)FN"zUK#g%I-˾7:WeaC- `y /[~5.-嬺WSϐK#9Ӥa2Mt#EHf w |H TQ\eTŵ(J,doZ O[~W" Jo|c#WEKI=ġFK9Nt" >L}3p7~= oKr t*. N D>xH{5~R=/.cD& xVz *7.T?wN<{dC%~Bcd"j[PK?c36c31-9IENDB`nemo-6.4.5/data/icons/hicolor/emblems/16x16/0000775000175000017500000000000014757107430017314 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/emblems/16x16/emblem-note.png0000664000175000017500000000102614757107430022225 0ustar fabiofabioPNG  IHDRh6 pHYs  ~tIME : D>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XkIDATxڝ=K\AsZDB"MJ)@6BU 4VVY6AM ]A Fp\{ubf05S;[QzlktԐ,(mۺBwo4߬u !)j(~ty_7$Eńt*O.?< /=,+R.V :ؒTŇz\i|}${s3#HiR23&‰H*:WHzT;x٣R!J{ P]71%f0,yֱ[yXV$ Nu] nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-vertical-layout-wide-symbolic.svg0000664000175000017500000000501414757107430027657 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/actions/scalable/sidebar-places-symbolic.svg0000664000175000017500000000066514757107430025536 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-recursive-search-symbolic-rtl.svg0000664000175000017500000001335514757107430027665 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/actions/scalable/location-symbolic.svg0000664000175000017500000000346214757107430024466 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/sidebar-tree-symbolic.svg0000664000175000017500000000130214757107430025213 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/sidebar-show-symbolic.svg0000664000175000017500000000066214757107430025244 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/view-compact-symbolic.svg0000664000175000017500000000041614757107430025250 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-vertical-layout-symbolic.svg0000664000175000017500000000454014757107430026734 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-desktop-scale-symbolic.svg0000664000175000017500000000433514757107430026350 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/actions/scalable/mount-archive-symbolic.svg0000664000175000017500000000417114757107430025435 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/actions/scalable/sidebar-tree-symbolic-rtl.svg0000664000175000017500000000367514757107430026031 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-recursive-search-symbolic.svg0000664000175000017500000001334214757107430027062 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-horizontal-layout-symbolic.svg0000664000175000017500000000451414757107430027315 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-auto-arrange-symbolic.svg0000664000175000017500000000413714757107430026177 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme nemo-6.4.5/data/icons/hicolor/actions/scalable/sidebar-hide-symbolic.svg0000664000175000017500000000066114757107430025174 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/sidebar-hide-symbolic-rtl.svg0000664000175000017500000000252514757107430025774 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/location-symbolic-rtl.svg0000664000175000017500000000356614757107430025272 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/actions/scalable/nemo-horizontal-layout-wide-symbolic.svg0000664000175000017500000000523614757107430030245 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/actions/16x16/0000775000175000017500000000000014757107430017330 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-down.png0000664000175000017500000000037114757107430022735 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME 2sIDAT8= 0 sB$mx|!M!}NK `uL)ZkC0l:|;̌Xkݟ$Uk.M,[&PJ s]GFYsQᔤIENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-none.png0000664000175000017500000000035414757107430021741 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME & $OyIDAT81 R^AewZPM.;)mëYYxy$mZkS1}3I;쒙j-IUsU|w/YJAreGf OrilCq*p! !Nu]fr+jp8{,7f^g8??!4M`R[;op zv>|j )RD"hK4oCxubۅ\R7LӼiZw|u:u'cW"D%b^. Ri^ha@u 11Li|ڕIENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-right-free.png0000664000175000017500000000032514757107430024021 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME" ybIDAT8ұ 0 DD^!d\%Cd|@C,l?.@@ 03J)19Ǒ H!lOcW0˭,V~呾lw}IENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-up.png0000664000175000017500000000034214757107430022410 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME ةoIDAT8Q  1&fˑHꨳN~فlRPk5 J& UPDX$fz1fRr{`G~| lU$6IENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-up-free.png0000664000175000017500000000036214757107430023331 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME"6oIDAT8Q }tG`@zhD2)Uڒ(9fg"H~ \z3ZZb2ID"B3{OU5j:m^KH)巛0@!' 4U^ tIENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-down-free.png0000664000175000017500000000040314757107430023650 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME ^IDAT8;1 DCt9BFQp CK X$ڝΉߓ{ I `ERzK\K)YHd&N! lscyEԏL{^yQ/QYG&)IENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-right.png0000664000175000017500000000033314757107430023101 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME .BhIDAT8ұ CQ+;@s[CC0?U(UrJ':4 䜩@)%B֞# s \kZW*c ߈+. ʲF IENDB`nemo-6.4.5/data/icons/hicolor/actions/16x16/menu-sort-left-free.png0000664000175000017500000000033714757107430023641 0ustar fabiofabioPNG  IHDRabKGD pHYs  tIME!BolIDAT8ݒ 0 _lAd쑑XҮ!S t'~! hd!%81`lSJp 0< ay|)"_NZ+DnpD2u}acIENDB`nemo-6.4.5/data/icons/hicolor/actions/32x32/0000775000175000017500000000000014757107430017324 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/actions/32x32/nemo-eject.png0000664000175000017500000000250414757107430022061 0ustar fabiofabioPNG  IHDR szzbKGD pHYs|4ktIME rIDATXWKcW$潘L4[$~7 Epнe]2~UA S(Ih͠HM1cyI1w}i/NSJxd2\2L2N}9555j urrA2|娢(PEa\&ɧ3n;Տ2dXc A(D"Ǘ0Zksƽ־ *jXCi4Mvtt7==~*?>>x)vo|k:&6bZ&L1ox$b!ki  :J)!EcccONk=333#@`BUպƋ"|>"T*A4="Ľ_|ul477QJ)EWWDQD|5X fn8...@$Iztm65Յr\w$Ii4^QyVW<ש7|zdn@xWz466jQ3 (J/-;~0`p466Iv- v[Fw3(.u!ܹ]^^b\'RTRz*R 7JeJ?ZA@$3sxFNlBSS+>i-!Ŏ;yy|,;"T2l8BMWk#R՞AA8Y(B'hln]Q(zύךr땢YA?>dGEQ^~H$~nFRl6K-~mU*VVVB;;;p$`:<< r[%``qq1θ1zoZVmycX 3=oJUωD"w8F ---}57?.\e~e,ndRJ%vvv ?rڟoif3\ 6`wwwt:eYP(|0SJsܺP'K.ȝux_?p7IENDB`nemo-6.4.5/data/icons/hicolor/status/0000775000175000017500000000000014757107430016426 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/status/scalable/0000775000175000017500000000000014757107430020174 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-0-symbolic.svg0000664000175000017500000001377514757107430025506 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-100-symbolic.svg0000664000175000017500000001307214757107430025635 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-10-symbolic.svg0000664000175000017500000001435414757107430025561 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-20-symbolic.svg0000664000175000017500000001500514757107430025554 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-80-symbolic.svg0000664000175000017500000001537314757107430025572 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-40-symbolic.svg0000664000175000017500000001614114757107430025560 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-70-symbolic.svg0000664000175000017500000001755114757107430025571 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-30-symbolic.svg0000664000175000017500000001550714757107430025564 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-90-symbolic.svg0000664000175000017500000001547714757107430025600 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-bookmark-not-found-symbolic.svg0000664000175000017500000001422014757107430027203 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-60-symbolic.svg0000664000175000017500000001711614757107430025565 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/status/scalable/nemo-progress-50-symbolic.svg0000664000175000017500000001652014757107430025562 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/devices/0000775000175000017500000000000014757107430016525 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/devices/scalable/0000775000175000017500000000000014757107430020273 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/devices/scalable/drive-removable-media-usb-symbolic.svg0000664000175000017500000000713314757107430027566 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme nemo-6.4.5/data/icons/hicolor/apps/0000775000175000017500000000000014757107430016046 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/apps/scalable/0000775000175000017500000000000014757107430017614 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/apps/scalable/nemo.svg0000664000175000017500000000747514757107430021310 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/apps/24x24/0000775000175000017500000000000014757107430016631 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/apps/24x24/nemo.png0000664000175000017500000000153214757107430020276 0ustar fabiofabioPNG  IHDRw=sRGBbKGD pHYs B(xtIME  \ +IDATHՕj$U& 'Vܺƽd#2$.BnWJd㢪; 4߹4WdfKzЍ岿?=::ʇ<>>.?x2TI}7e&o#ykONN8;;$lo>h캱$2>3bq8=`3ly%ކ ]?eADt"L!gi,)n)cE# ؂&@B1ȃ 3IՅT(ꨵPQU/n3?=kTXkR;:-Mu0Id08{(,mK-h2ݗ- UB-(*Z]5SC7-/0싯tb}j_ {^I9Yׯ.Xt3f;c7{H6ƞ-2r]Z 1E U+uΡ1ɍDZ'vJ[h5-V6W)r5֘FG^bylQj7$c&fk<FD˲ijK=u)QL' @mlmiJm)N\5B$1l._>ĝ*ƒ CGFRGg|m0 nemo-6.4.5/data/icons/hicolor/apps/16x16/nemo.png0000664000175000017500000000100214757107430020270 0ustar fabiofabioPNG  IHDRasRGBbKGD pHYs B(xtIME 6R?HIDAT8˥nAɝC)ܝ厖xJ*D?YTFD۝8}"\0LN--ȼy0Ny~$I85I]yND\azie{zf< dYoI6܊O_.&ZU0}.NZ__>I@aFQސW"1)oDfc+JQtKOH0n m͔z+Hu,bD F;HkTbΪ\0_\q:t%hwAvD:ՂKH*ʹQ4 ੈ\FA/W'="p\2w4IENDB`nemo-6.4.5/data/icons/hicolor/apps/32x32/0000775000175000017500000000000014757107430016627 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/apps/32x32/nemo.svg0000664000175000017500000000762614757107430020321 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/apps/32x32/nemo.png0000664000175000017500000000206014757107430020271 0ustar fabiofabioPNG  IHDR szzsRGBbKGD pHYs B(xtIME "Q%tIDATXWnd5= $:JYBKXWe]6!!4Nw__Waa_۝00 qdپ}9ex^{~qqq񵻯Dc򫳳O.Ep DWWW ]߇ i0 vyyC{!.NNN>@SSWe2&)>`@DpssǏUAwҝ ӗ_\:g8Z a  aF`h &%$`1iDe"w <B " z%+n:jMa]y55!B DD2uni \s3B5A5M07iVJu2#DP# T df>3P0iyu xTS Nz ׅLs{leuSERFe6 :M&jP.͞Hy^؂1q( H>"p_sg]i0wPtfP@zNVi; `4l|ˡ@HB/:Am; ([S!F= 3 'rf`<9VŤ;"YX S)联f"#ǔb]}ݮsV0Mcn{D@q|p _dpEO6eywB|o立65Og;5_IENDB`nemo-6.4.5/data/icons/hicolor/apps/22x22/0000775000175000017500000000000014757107430016625 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/apps/22x22/nemo.svg0000664000175000017500000000735314757107430020314 0ustar fabiofabio nemo-6.4.5/data/icons/hicolor/apps/22x22/nemo.png0000664000175000017500000000145014757107430020271 0ustar fabiofabioPNG  IHDRĴl;sRGBbKGD pHYs B(xtIME  ((IDAT8Օn$E[H?+"b#ˁIyRH< БW zlOOw?+oDI>u. L9==}wNYRwGGG`礳T}'''?G"bTJ)*~8)ts_VOvwqw2s}h> ٹ;pϘ "dFAFA,n?"32%`//.(c6207< wp7T:r/sw""B)n6kKH 3"sCFFQݰH&[p2C6N*:Pmdk uͪ_Jl2|!i6R6:2N0Uu%%k<nxj$IBAڼAHҶ WYW)x%mgS G(VERuDEm"oȧt461L33 P0W:PD@d{w7#3ݷ`JAl+|{"E6n"uaR+lUg$sRzubVIENDB`nemo-6.4.5/data/icons/hicolor/categories/0000775000175000017500000000000014757107430017230 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/categories/scalable/0000775000175000017500000000000014757107430020776 5ustar fabiofabionemo-6.4.5/data/icons/hicolor/categories/scalable/nemo-prefs-plugins-symbolic.svg0000664000175000017500000000450014757107430027067 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/categories/scalable/nemo-prefs-behavior-symbolic.svg0000664000175000017500000000464114757107430027213 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/categories/scalable/nemo-prefs-preview-symbolic.svg0000664000175000017500000000364214757107430027075 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/icons/hicolor/categories/scalable/nemo-prefs-toolbar-symbolic.svg0000664000175000017500000000230314757107430027047 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme nemo-6.4.5/data/icons/hicolor/categories/scalable/nemo-prefs-display-symbolic.svg0000664000175000017500000000512614757107430027060 0ustar fabiofabio image/svg+xml nemo-6.4.5/data/org.Cinnamon.xml0000664000175000017500000000134514757107430015406 0ustar fabiofabio nemo-6.4.5/data/nemo.service.in0000664000175000017500000000010414757107430015251 0ustar fabiofabio[D-BUS Service] Name=org.Nemo Exec=@bindir@/nemo --no-default-windownemo-6.4.5/data/nemo.FileManager1.service.in0000664000175000017500000000013114757107430017503 0ustar fabiofabio[D-BUS Service] Name=org.freedesktop.FileManager1 Exec=@bindir@/nemo --no-default-window nemo-6.4.5/data/nemo_search_helper.lang0000664000175000017500000000741314757107430017023 0ustar fabiofabio application/nemo-search-helper *.nemo_search_helper #