Compare commits

..

49 Commits

Author SHA1 Message Date
Jesper
7c0bcbb5b7 simplificaiton + removal of fuzzy 2024-06-13 22:18:01 +02:00
Jesper
f9325f2870 Bring back scrollintoview 2024-06-13 08:12:41 +02:00
Jesper
4ab8d2120c Fix capitalization 2024-06-12 13:25:05 +02:00
Jesper
b0ab8320da Bring back apt search suggestions 2024-06-12 12:40:00 +02:00
Jesper
a31731f127 appGenericName, appComment and appExec to the fuzzysearch function 2024-06-12 12:19:05 +02:00
Jesper
2e0f503d08 Add appGenericName, appComment and appExec search 2024-06-12 11:51:31 +02:00
Jesper
3feda3af08 Exact search 2024-06-12 11:42:47 +02:00
Jesper
90ad278098 Remove whitespace 2024-06-12 10:38:27 +02:00
Jesper
cf76c4837e Fuzzy Search 2024-06-12 10:37:26 +02:00
Jesper
d8820edd7d Fuzzy search setting 2024-06-12 10:35:31 +02:00
Jesper
185b925b6b schema for fuzzysearch 2024-06-12 10:32:13 +02:00
Clement Lefebvre
7c034738de 6.1.7 2023-06-26 11:08:01 +02:00
Michael Webster
c3bea70396
Add our own 'all applications' icon for consistency.
Fixes linuxmint/mint21.2-beta#12
2023-06-23 14:35:49 -04:00
Clement Lefebvre
9976deca28 6.1.6 2023-06-05 13:40:20 +01:00
Michael Webster
e4eab43d06
Use XAppGpuOffloadHelper for gpu offloading, respect
PrefersNonDefaultGPU desktop entry key.

XApp.util_gpu_offload_supported() is still used as a fallback
for older libxapp versions.
2023-05-10 11:52:02 -04:00
Clement Lefebvre
90688a9c9f 6.1.5 2022-11-21 11:57:44 +00:00
monsta
63e9034896
remove mint-common dependency (#274)
not needed after c293d485d9
2022-11-21 11:57:04 +00:00
Clement Lefebvre
d97d912a97 6.1.4 2021-07-01 13:39:21 +01:00
Clement Lefebvre
b08050dfbb Recent: Fix buttons layout
Fixes https://github.com/linuxmint/mint20.2-beta/issues/75
2021-07-01 13:38:23 +01:00
Clement Lefebvre
772a10bb7a 6.1.3 2021-06-25 16:34:28 +01:00
Vincent Vermeulen
9b96af6602 fix recently used documents sorting
recently used documents were incorrectly sorted on when a file was first added to recently-used.xbel file, not reflecting when it was opened again later
this fix changes it so they are sorted correctly on when they were last used (when last their entry was modified in recently-used.xbel)

fixes https://github.com/linuxmint/mint20.2-beta/issues/10
2021-06-23 15:03:21 -04:00
Clement Lefebvre
905b9b1a94 6.1.2 2021-01-02 22:21:46 +00:00
Clement Lefebvre
94dec8415f
Favorites: Add a scrolledwindow (#263)
* Favorites: Add a scrolledwindow

* Remove shadow around scrolledwindow
2021-01-02 22:21:02 +00:00
Vincent Vermeulen
57632a3e30 fix APT search
replace broken cgi.escape with working html.escape
2020-12-30 10:19:23 -05:00
Clement Lefebvre
b807a89b68 6.1.1 2020-06-17 16:31:01 +01:00
Michael Webster
645c941b0b recentHelper.py: Don't try to modify the recent list unless recents
are enabled.

This was throwing an error when launching a program with the recent
plugin disabled.
2020-06-17 10:46:27 -04:00
Michael Webster
30ef26afa0 applications.py: Fix dnd for re-ordering/adding favorites.
Fixes https://github.com/linuxmint/mint20-beta/issues/22
2020-06-17 10:45:10 -04:00
Clement Lefebvre
380e23125c 6.1.0 2020-06-10 16:43:41 +01:00
Michael Webster
8342b85b91 gtk: Fix a couple of deprecations 2020-06-10 11:42:03 -04:00
Michael Webster
23e3eb60df mintMenu.py: Refactor panel button construction to fix padding in
different configurations.
2020-06-10 11:39:03 -04:00
Clement Lefebvre
889771e8ae 6.0.9 2020-06-10 11:53:41 +01:00
Clement Lefebvre
cbdc961115 Add missing dependency 2020-06-10 11:53:23 +01:00
Clement Lefebvre
9365cc4ce0 6.0.8 2020-06-10 11:49:46 +01:00
Clement Lefebvre
e948102e58 Search: Fix searching for accentuated strings 2020-06-10 11:49:10 +01:00
Clement Lefebvre
696603df34 6.0.7 2020-05-14 08:15:27 +01:00
Clement Lefebvre
0606afc825 l10n: Update POT 2020-05-14 08:13:34 +01:00
Michael Webster
a819d570eb Support nvidia on-demand app launching.
Requires linuxmint/xapps@dcb600595d to function correctly.
2020-05-09 12:12:46 -04:00
Clement Lefebvre
b4f6cadcf0 6.0.6 2020-04-24 10:18:10 +01:00
Clement Lefebvre
8e1d467b78 Remove applet text by default 2020-04-24 10:17:26 +01:00
Clement Lefebvre
ad479c18b5 Switch to symbolic panel icon 2020-04-24 10:16:52 +01:00
Clement Lefebvre
9d56931ce0 6.0.5 2020-04-23 11:44:06 +01:00
Clement Lefebvre
1007793670 Fix typo in file path 2020-04-23 11:34:54 +01:00
Clement Lefebvre
4d435b42f1 6.0.4 2020-04-03 12:08:55 +01:00
Michael Webster
a2194beae8 debian: Fix dependencies to require python3 variants. 2020-04-01 15:57:11 -04:00
Clement Lefebvre
4bbd037178
Fix launching pkexec applications (#248)
When launching mintsources, timeshift or an app which Exec field (in the desktop file)
starts with pkexec, nothing happens and the output states:

"Refusing to render service to dead parents."

For some reason this does not happen on fresh LMDE 4 and Mint 19.3 installations,
but it happens on LMDE 3 -> LMDE 4 and 19.1 -> 19.3 upgrades.

Similar bugs were fixed in nemo and cinnamon. Pkexec is known to cause issues
depending on how it's launched.

Specifying DO_NOT_REAP_CHILD in the spawn flags helps here. Afaik it makes it so
we're the parent of the pkexec process during launch. Pkexec fails to launch
otherwise.

gather_pid_callback() does nothing, it's just there to ack the pid callback. Afaik
this helps preventing zombie [defunct] processes when they terminate.
2020-03-31 12:29:07 +01:00
Michael Webster
7a3532a395 about dialog: Fix program name and use a license type. 2020-03-30 19:31:45 -04:00
Michael Webster
ff93497459 recent.py: Allow the clear button to apply to whichever tab is currently
active.
2020-03-30 19:31:45 -04:00
Michael Webster
6f69d0e499 Use gsettings for recent and favorite apps
during migration,
- rename the old favorites file
- delete the old recent file
2020-03-30 19:30:54 -04:00
Michael Webster
d694deb65e all: Use python3 2020-03-30 19:14:05 -04:00
22 changed files with 572 additions and 325 deletions

109
debian/changelog vendored
View File

@ -1,8 +1,113 @@
mintmenu (6.0.3.1) tricia; urgency=medium
mintmenu (6.1.7) victoria; urgency=medium
[ Michael Webster ]
* Add our own 'all applications' icon for consistency.
-- Clement Lefebvre <root@linuxmint.com> Mon, 26 Jun 2023 11:07:53 +0200
mintmenu (6.1.6) victoria; urgency=medium
[ Michael Webster ]
* Use XAppGpuOffloadHelper for gpu offloading, respect PrefersNonDefaultGPU desktop entry key.
-- Clement Lefebvre <root@linuxmint.com> Mon, 05 Jun 2023 13:40:15 +0100
mintmenu (6.1.5) vera; urgency=medium
[ monsta ]
* remove mint-common dependency (#274)
-- Clement Lefebvre <root@linuxmint.com> Mon, 21 Nov 2022 11:57:37 +0000
mintmenu (6.1.4) uma; urgency=medium
* Recent: Fix buttons layout
-- Clement Lefebvre <root@linuxmint.com> Thu, 01 Jul 2021 13:39:07 +0100
mintmenu (6.1.3) uma; urgency=medium
[ Vincent Vermeulen ]
* fix recently used documents sorting
-- Clement Lefebvre <root@linuxmint.com> Fri, 25 Jun 2021 16:34:15 +0100
mintmenu (6.1.2) ulyssa; urgency=medium
[ Vincent Vermeulen ]
* fix APT search
[ Clement Lefebvre ]
* Favorites: Add a scrolledwindow (#263)
-- Clement Lefebvre <root@linuxmint.com> Sat, 02 Jan 2021 22:21:33 +0000
mintmenu (6.1.1) ulyana; urgency=medium
[ Michael Webster ]
* applications.py: Fix dnd for re-ordering/adding favorites.
* recentHelper.py: Don't try to modify the recent list unless recents are enabled.
-- Clement Lefebvre <root@linuxmint.com> Wed, 17 Jun 2020 16:30:48 +0100
mintmenu (6.1.0) ulyana; urgency=medium
[ Michael Webster ]
* mintMenu.py: Refactor panel button construction to fix padding in different configurations.
* gtk: Fix a couple of deprecations
-- Clement Lefebvre <root@linuxmint.com> Wed, 10 Jun 2020 16:43:29 +0100
mintmenu (6.0.9) ulyana; urgency=medium
* Add missing dependency
-- Clement Lefebvre <root@linuxmint.com> Wed, 10 Jun 2020 11:53:29 +0100
mintmenu (6.0.8) ulyana; urgency=medium
* Search: Fix searching for accentuated strings
-- Clement Lefebvre <root@linuxmint.com> Wed, 10 Jun 2020 11:49:34 +0100
mintmenu (6.0.7) ulyana; urgency=medium
[ Michael Webster ]
* Support nvidia on-demand app launching.
[ Clement Lefebvre ]
* l10n: Update POT
-- Clement Lefebvre <root@linuxmint.com> Thu, 14 May 2020 08:14:45 +0100
mintmenu (6.0.6) ulyana; urgency=medium
* Switch to symbolic panel icon
* Remove applet text by default
-- Clement Lefebvre <root@linuxmint.com> Fri, 24 Apr 2020 10:17:57 +0100
mintmenu (6.0.5) ulyana; urgency=medium
* Fix typo in file path
-- Clement Lefebvre <root@linuxmint.com> Thu, 23 Apr 2020 11:43:51 +0100
mintmenu (6.0.4) ulyana; urgency=medium
[ Michael Webster ]
* all: Use python3
* Use gsettings for recent and favorite apps
* recent.py: Allow the clear button to apply to whichever tab is currently active.
* about dialog: Fix program name and use a license type.
[ Clement Lefebvre ]
* Fix launching pkexec applications (#248)
-- Clement Lefebvre <root@linuxmint.com> Tue, 31 Mar 2020 12:33:51 +0100
[ Michael Webster ]
* debian: Fix dependencies to require python3 variants.
-- Clement Lefebvre <root@linuxmint.com> Fri, 03 Apr 2020 12:08:41 +0100
mintmenu (6.0.3) tricia; urgency=medium

19
debian/control vendored
View File

@ -2,22 +2,21 @@ Source: mintmenu
Section: admin
Priority: optional
Maintainer: Clement Lefebvre <root@linuxmint.com>
Build-Depends: debhelper (>= 9), python, dh-python,
Build-Depends: debhelper (>= 9), python3, dh-python,
Standards-Version: 3.9.5
Package: mintmenu
Architecture: all
Depends:
${python:Depends},
${misc:Depends},
mint-common,
python (>= 2.4), python (<< 3),
python-apt,
python-configobj,
python-gi-cairo,
python-setproctitle,
python-xlib,
python-xdg,
python3,
python3-apt,
python3-configobj,
python3-gi-cairo,
python3-setproctitle,
python3-unidecode,
python3-xlib,
python3-xdg,
python3-xapp,
python3-xlib,
xdg-utils,

2
debian/postinst vendored
View File

@ -19,7 +19,7 @@ set -e
case "$1" in
configure)
glib-compile-schemas /usr/share/glib-2.0/schemas
python -m compileall -qf /usr/lib/linuxmint/mintMenu/
python3 -m compileall -qf /usr/lib/linuxmint/mintMenu/
;;
abort-upgrade|abort-remove|abort-deconfigure)

2
debian/rules vendored
View File

@ -3,7 +3,7 @@
DEB_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')
%:
dh ${@} --with-python2
dh ${@} --with-python3
# Inject version number in the code
override_dh_installdeb:

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-19 14:00+0000\n"
"POT-Creation-Date: 2020-05-14 08:12+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -49,23 +49,23 @@ msgstr ""
msgid "Couldn't initialize plugin"
msgstr ""
#: usr/lib/linuxmint/mintMenu/mintMenu.py:592
#: usr/lib/linuxmint/mintMenu/mintMenu.py:587
msgid "Advanced MATE Menu"
msgstr ""
#: usr/lib/linuxmint/mintMenu/mintMenu.py:703
#: usr/lib/linuxmint/mintMenu/mintMenu.py:698
msgid "Preferences"
msgstr ""
#: usr/lib/linuxmint/mintMenu/mintMenu.py:707
#: usr/lib/linuxmint/mintMenu/mintMenu.py:702
msgid "Edit menu"
msgstr ""
#: usr/lib/linuxmint/mintMenu/mintMenu.py:711
#: usr/lib/linuxmint/mintMenu/mintMenu.py:706
msgid "Reload plugins"
msgstr ""
#: usr/lib/linuxmint/mintMenu/mintMenu.py:714
#: usr/lib/linuxmint/mintMenu/mintMenu.py:709
msgid "About"
msgstr ""
@ -374,134 +374,133 @@ msgstr ""
msgid "Path"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:624
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:625
#, python-format
msgid "Search DuckDuckGo for %s"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:626
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:627
#, python-format
msgid "Search Wikipedia for %s"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:629
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:630
#, python-format
msgid "Lookup %s in Dictionary"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:631
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:632
#, python-format
msgid "Search Computer for %s"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:689
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:731
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:690
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:732
#, python-format
msgid "Install package '%s'"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:835
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:906
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:836
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:911
msgid "Add to desktop"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:836
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:907
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:837
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:912
msgid "Add to panel"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:838
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:884
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:839
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:889
msgid "Insert space"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:839
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:885
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:840
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:890
msgid "Insert separator"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:841
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:910
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:842
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:915
msgid "Launch when I log in"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:843
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:912
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:844
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:917
msgid "Launch"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:844
msgid "Remove from favorites"
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:845
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:918
msgid "Run with NVIDIA GPU"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:846
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:916
msgid "Remove from favorites"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:848
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:922
msgid "Edit properties"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:883
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:888
msgid "Remove"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:909
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:914
msgid "Show in my favorites"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:913
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:919
msgid "Uninstall"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:914
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:920
msgid "Delete from menu"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:979
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:988
msgid "Search DuckDuckGo"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:980
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:989
msgid "Search Wikipedia"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:982
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:991
msgid "Search Dictionary"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:983
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:992
msgid "Search Computer"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:985
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:994
msgid "Find Software"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:986
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:995
msgid "Find Tutorials"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:987
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:996
msgid "Find Hardware"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:988
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:997
msgid "Find Ideas"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:989
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:998
msgid "Find Users"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:1395
msgid ""
"Couldn't save favorites. Check if you have write access to ~/.linuxmint/"
"mintMenu"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:1617
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:1642
msgid "All"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:1619
#: usr/lib/linuxmint/mintMenu/plugins/applications.py:1644
msgid "Show all applications"
msgstr ""
@ -530,17 +529,11 @@ msgstr ""
msgid "Empty trash"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/recentHelper.py:40
msgid ""
"Couldn't save recent apps. Check if you have write access to ~/.linuxmint/"
"mintMenu"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/recent.py:39
#: usr/lib/linuxmint/mintMenu/plugins/recent.py:41
msgid "Recently used"
msgstr ""
#: usr/lib/linuxmint/mintMenu/plugins/recent.py:169
#: usr/lib/linuxmint/mintMenu/plugins/recent.py:192
msgid "The file or location could not be opened."
msgstr ""

View File

@ -1,13 +1,13 @@
#!/usr/bin/python2
#!/usr/bin/python3
import sys, os
if len(sys.argv) > 1:
if (sys.argv[1] in ["help", "h", "-?", "--help", "-h", "?"]):
print "mintMenu - the advanced MATE menu\n"
print "options:"
print " [--]help, [-]h Display this help."
print " [--]clean, [--]clear, [--]reset Restore settings to default.\n"
print("mintMenu - the advanced MATE menu\n")
print("options:")
print(" [--]help, [-]h Display this help.")
print(" [--]clean, [--]clear, [--]reset Restore settings to default.\n")
elif (sys.argv[1] in ["clean", "clear", "reset", "--clean", "--clear", "--reset"]):
os.system("gsettings reset-recursively com.linuxmint.mintmenu")
os.system("gsettings reset-recursively com.linuxmint.mintmenu.plugins.places")
@ -15,6 +15,6 @@ if len(sys.argv) > 1:
os.system("gsettings reset-recursively com.linuxmint.mintmenu.plugins.recent")
os.system("gsettings reset-recursively com.linuxmint.mintmenu.plugins.system_management")
os.system("rm -rf ~/.linuxmint/mintMenu")
print "All mintMenu settings are now restored to default"
print("All mintMenu settings are now restored to default")
else:
os.system("/usr/lib/linuxmint/mintMenu/mintMenu.py")

View File

@ -1,4 +1,4 @@
#!/usr/bin/python2
#!/usr/bin/python3
# -*- coding: utf-8; -*-
# Copyright (C) 2013 Ozcan Esen <ozcanesen@gmail.com>
@ -118,7 +118,7 @@ class GlobalKeyBinding(GObject.GObject, threading.Thread):
self.grab(self.keytext)
def get_mask_combinations(self, mask):
return [x for x in xrange(mask+1) if not (x & ~mask)]
return [x for x in range(mask+1) if not (x & ~mask)]
def idle(self):
self.emit("activate")

View File

@ -1,4 +1,4 @@
#!/usr/bin/python2
#!/usr/bin/python3
import locale
import gc
@ -10,6 +10,7 @@ import traceback
import gi
gi.require_version("Gtk", "3.0")
gi.require_version('MatePanelApplet', '4.0')
gi.require_version('XApp', '1.0')
from gi.repository import Gtk, GdkPixbuf, Gdk, GObject
from gi.repository import MatePanelApplet
from gi.repository import Gio
@ -21,8 +22,6 @@ import pointerMonitor
import setproctitle
from plugins.execute import Execute
GObject.threads_init()
# Rename the process
setproctitle.setproctitle('mintmenu')
@ -131,7 +130,7 @@ class MainWindow(object):
try:
X = __import__(plugin)
# If no parameter passed to plugin it is autonomous
if X.pluginclass.__init__.func_code.co_argcount == 1:
if X.pluginclass.__init__.__code__.co_argcount == 1:
MyPlugin = X.pluginclass()
else:
# pass mintMenu and togglebutton instance so that the plugin can use it
@ -329,10 +328,11 @@ class MenuWin(object):
self.detect_desktop_environment()
self.settings = Gio.Settings.new("com.linuxmint.mintmenu")
self.icon_theme = Gtk.IconTheme.get_default()
self.button_icon = Gtk.Image()
self.button_icon = Gtk.Image(no_show_all=True)
self.loadSettings()
self.createPanelButton()
self.button_box = None
self.updatePanelButton()
self.mate_settings = Gio.Settings.new("org.mate.interface")
self.mate_settings.connect("changed::gtk-theme", self.changeTheme)
@ -346,7 +346,7 @@ class MenuWin(object):
self.applet.set_flags(MatePanelApplet.AppletFlags.EXPAND_MINOR)
self.applet.connect("button-press-event", self.showMenu)
self.applet.connect("change-orient", self.changeOrientation)
self.applet.connect("change-orient", self.updatePanelButton)
self.applet.connect("enter-notify-event", self.enter_notify)
self.applet.connect("leave-notify-event", self.leave_notify)
@ -427,36 +427,69 @@ class MenuWin(object):
else:
self.button_icon.set_from_surface(self.surface)
def createPanelButton(self):
def updatePanelButton(self):
if self.button_box != None:
self.button_box.destroy()
self.set_applet_icon()
self.systemlabel = Gtk.Label(label= "%s " % self.buttonText)
self.systemlabel = Gtk.Label(label= "%s" % self.buttonText, no_show_all=True)
if os.path.isfile("/etc/linuxmint/info"):
with open("/etc/linuxmint/info") as info:
for line in info:
line = line.decode("utf-8")
if line.startswith("DESCRIPTION="):
tooltip = line.split("=",1)[1].strip('"\n')
self.systemlabel.set_tooltip_text(tooltip)
self.button_icon.set_tooltip_text(tooltip)
break
self.button_icon.props.margin = 0
self.systemlabel.props.margin = 0
self.systemlabel.props.visible = show_text = self.buttonText != ""
self.button_icon.props.visible = self.showIcon
if self.applet.get_orient() == MatePanelApplet.AppletOrient.UP or self.applet.get_orient() == MatePanelApplet.AppletOrient.DOWN:
self.button_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.button_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5)
self.button_box.pack_start(self.button_icon, False, False, 0)
self.button_box.pack_start(self.systemlabel, False, False, 0)
self.button_icon.set_padding(5, 0)
if self.showIcon and not show_text:
self.button_icon.props.margin_start = 5
self.button_icon.props.margin_end = 5
elif show_text and not self.showIcon:
self.systemlabel.props.margin_start = 5
self.systemlabel.props.margin_end = 5
else:
self.button_icon.props.margin_start = 5
self.systemlabel.props.margin_end = 5
# if we have a vertical panel
elif self.applet.get_orient() == MatePanelApplet.AppletOrient.LEFT:
self.button_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.button_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
self.systemlabel.set_angle(270)
self.button_box.pack_start(self.button_icon , False, False, 0)
self.button_box.pack_start(self.systemlabel , False, False, 0)
self.button_icon.set_padding(0, 5)
if self.showIcon and not show_text:
self.button_icon.props.margin_top = 5
self.button_icon.props.margin_bottom = 5
elif show_text and not self.showIcon:
self.systemlabel.props.margin_top = 5
self.systemlabel.props.margin_bottom = 5
else:
self.button_icon.props.margin_top = 5
self.systemlabel.props.margin_bottom = 5
elif self.applet.get_orient() == MatePanelApplet.AppletOrient.RIGHT:
self.button_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.button_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
self.systemlabel.set_angle(90)
self.button_box.pack_start(self.systemlabel , False, False, 0)
self.button_box.pack_start(self.button_icon , False, False, 0)
self.button_icon.set_padding(0, 5)
if self.showIcon and not show_text:
self.button_icon.props.margin_top = 5
self.button_icon.props.margin_bottom = 5
elif show_text and not self.showIcon:
self.systemlabel.props.margin_top = 5
self.systemlabel.props.margin_bottom = 5
else:
self.button_icon.props.margin_bottom = 5
self.systemlabel.props.margin_top = 5
self.button_box.set_homogeneous(False)
self.button_box.show_all()
@ -512,53 +545,11 @@ class MenuWin(object):
except:
style_settings.set_property("gtk-theme-name", desktop_theme)
def changeOrientation(self, *args, **kargs):
if self.applet.get_orient() == MatePanelApplet.AppletOrient.UP or self.applet.get_orient() == MatePanelApplet.AppletOrient.DOWN:
tmpbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.systemlabel.set_angle(0)
self.button_box.reorder_child(self.button_icon, 0)
self.button_icon.set_padding(5, 0)
elif self.applet.get_orient() == MatePanelApplet.AppletOrient.LEFT:
tmpbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.systemlabel.set_angle(270)
self.button_box.reorder_child(self.button_icon, 0)
self.button_icon.set_padding(0, 5)
elif self.applet.get_orient() == MatePanelApplet.AppletOrient.RIGHT:
tmpbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.systemlabel.set_angle(90)
self.button_box.reorder_child(self.button_icon, 1)
self.button_icon.set_padding(0, 5)
tmpbox.set_homogeneous(False)
# reparent all the hboxes to the new tmpbox
for i in self.button_box:
i.reparent(tmpbox)
self.button_box.destroy()
self.button_box = tmpbox
self.button_box.show()
# this call makes sure width stays intact
self.updateButton()
self.applet.add(self.button_box)
def updateButton(self):
self.systemlabel.set_text(self.buttonText)
self.set_applet_icon()
self.sizeButton()
def hotkeyChanged (self, schema, key):
self.hotkeyText = self.settings.get_string("hot-key")
self.keybinder.rebind(self.hotkeyText)
def sizeButton(self):
if self.showIcon:
self.button_icon.show()
else:
self.button_icon.hide()
# This code calculates width and height for the button_box
# and takes the orientation and scale factor in account
bi_req = self.button_icon.get_preferred_size()[1]
@ -567,28 +558,24 @@ class MenuWin(object):
sl_scale = self.systemlabel.get_scale_factor()
if self.applet.get_orient() == MatePanelApplet.AppletOrient.UP or self.applet.get_orient() == MatePanelApplet.AppletOrient.DOWN:
if self.showIcon:
self.applet.set_size_request(sl_req.width / sl_scale + bi_req.width / bi_scale + 5, bi_req.height)
self.applet.set_size_request(sl_req.width / sl_scale + bi_req.width / bi_scale, bi_req.height)
else:
self.applet.set_size_request(sl_req.width / sl_scale + 2, bi_req.height)
self.applet.set_size_request(sl_req.width / sl_scale, bi_req.height)
else:
if self.showIcon:
self.applet.set_size_request(bi_req.width, sl_req.height / sl_scale + bi_req.height / bi_scale + 5)
self.applet.set_size_request(bi_req.width, sl_req.height / sl_scale + bi_req.height / bi_scale)
else:
self.applet.set_size_request(bi_req.width, sl_req.height / sl_scale + 2)
self.applet.set_size_request(bi_req.width, sl_req.height / sl_scale)
def reloadSettings(self, *args):
self.loadSettings()
self.updateButton()
self.updatePanelButton()
def showAboutDialog(self, action, userdata = None):
about = Gtk.AboutDialog()
about.set_name("mintMenu")
about.set_program_name("mintMenu")
about.set_version("__DEB_VERSION__")
try:
gpl = open('/usr/share/common-licenses/GPL','r').read()
about.set_license(gpl)
except Exception as e:
print(e)
about.set_license_type(Gtk.License.GPL_3_0)
about.set_comments(_("Advanced MATE Menu"))
# about.set_authors(["Clement Lefebvre <clem@linuxmint.com>", "Lars-Peter Clausen <lars@laprican.de>"])
about.set_translator_credits(("translator-credits"))

View File

@ -1 +1 @@
#!/usr/bin/python2
#!/usr/bin/python3

View File

@ -1,18 +1,19 @@
#!/usr/bin/python2
#!/usr/bin/python3
import cgi
import html
import filecmp
import gettext
import locale
import os
import subprocess
import threading
import urllib
import urllib.request, urllib.parse, urllib.error
import gi
gi.require_version("Gtk", "3.0")
gi.require_version("MateMenu", "2.0")
from gi.repository import Gtk, Gdk, GdkPixbuf, Gio, GLib, MateMenu
gi.require_version("XApp", "1.0")
from gi.repository import Gtk, Gdk, GdkPixbuf, Gio, GLib, MateMenu, XApp
import plugins.recentHelper as RecentHelper
from plugins.easybuttons import (ApplicationLauncher, CategoryButton,
@ -173,11 +174,11 @@ class pluginclass(object):
toButton = (Gtk.TargetEntry.new("text/uri-list", 0, TARGET_TYPE_TEXT),
Gtk.TargetEntry.new("text/uri-list", 0, TARGET_TYPE_TEXT))
TARGET_TYPE_FAV = 81
toFav = (Gtk.TargetEntry.new("FAVORITES", Gtk.TargetFlags.SAME_APP, 81),
toFav = (Gtk.TargetEntry.new("text/plain", Gtk.TargetFlags.SAME_APP, 81),
Gtk.TargetEntry.new("text/plain", 0, 100),
Gtk.TargetEntry.new("text/uri-list", 0, 101))
fromFav = (Gtk.TargetEntry.new("FAVORITES", Gtk.TargetFlags.SAME_APP, 81),
Gtk.TargetEntry.new("FAVORITES", Gtk.TargetFlags.SAME_APP, 81))
fromFav = (Gtk.TargetEntry.new("text/plain", Gtk.TargetFlags.SAME_APP, 81),
Gtk.TargetEntry.new("text/plain", Gtk.TargetFlags.SAME_APP, 81))
#@print_timing
def __init__(self, mintMenuWin, toggleButton, de):
@ -188,6 +189,17 @@ class pluginclass(object):
self.menuFiles = []
self.de = de
self.canOffload = False
try:
helper = XApp.GpuOffloadHelper.get_sync()
self.canOffload = helper.is_offload_supported()
except AttributeError:
try:
self.canOffload = XApp.util_gpu_offload_supported()
except AttributeError:
print("Could not check for gpu offload support - maybe xapps isn't up to date.");
# Detect the locale (this is used for the Wikipedia search)
self.lang = "en"
lang = os.getenv('LANG')
@ -245,6 +257,9 @@ class pluginclass(object):
try:
# GSettings stuff
self.settings = Gio.Settings("com.linuxmint.mintmenu.plugins.applications")
self.migrate_favorites()
self.GetGSettingsEntries()
self.settings.connect("changed::icon-size", self.changeIconSize)
self.settings.connect("changed::favicon-size", self.changeFavIconSize)
@ -264,6 +279,7 @@ class pluginclass(object):
self.settings.connect("changed::enable-internet-search", self.GetGSettingsEntries)
self.settings.connect("changed::search-command", self.GetGSettingsEntries)
self.settings.connect("changed::default-tab", self.GetGSettingsEntries)
self.settings.connect("changed::favorite-apps-list", self.favoriteAppsChanged)
except Exception as e:
print(e)
@ -519,16 +535,6 @@ class pluginclass(object):
def RebuildPlugin(self):
self.content_holder.set_size_request(self.width, self.height)
def checkMintMenuFolder(self):
if os.path.exists(os.path.join(os.path.expanduser("~"), ".linuxmint", "mintMenu", "applications")):
return True
try:
os.makedirs(os.path.join(os.path.expanduser("~"), ".linuxmint", "mintMenu", "applications"))
return True
except:
pass
return False
def onShowMenu(self):
if self.favorites:
if self.defaultTab == -1:
@ -618,7 +624,7 @@ class pluginclass(object):
self.suggestions.append(item)
def add_search_suggestions(self, text):
text = "<b>%s</b>" % cgi.escape(text)
text = "<b>%s</b>" % html.escape(text)
if self.enableInternetSearch:
self.add_suggestion("/usr/lib/linuxmint/mintMenu/search_engines/ddg.svg",
_("Search DuckDuckGo for %s") % text, None, self.search_ddg)
@ -767,16 +773,24 @@ class pluginclass(object):
i.hide()
else:
shownList.append(i)
#if this is the first matching item
#focus it
if(not showns):
i.grab_focus()
self.applicationsBox.remove(i)
showns = True
if not showns:
if len(text) >= 3:
self.add_search_suggestions(text)
if self.useAPT:
GLib.timeout_add(300, self.add_apt_filter_results, text)
else:
# Sort applications by relevance, and alphabetical within that
shownList = sorted(shownList, key=lambda app: app.appName)
shownList = sorted(shownList, key=lambda app: app.relevance, reverse=True)
focused = False
for i in shownList:
self.applicationsBox.add(i)
if not focused:
# Grab focus of the first app shown
i.grab_focus()
focused = True
for i in self.categoriesBox.get_children():
i.released()
i.set_relief(Gtk.ReliefStyle.NONE)
@ -841,6 +855,7 @@ class pluginclass(object):
startupMenuItem = Gtk.CheckMenuItem(_("Launch when I log in"))
separator3 = Gtk.SeparatorMenuItem()
launchMenuItem = Gtk.MenuItem(_("Launch"))
launchOffloadedMenuItem = Gtk.MenuItem(_("Run with NVIDIA GPU"))
removeFromFavMenuItem = Gtk.MenuItem(_("Remove from favorites"))
separator4 = Gtk.SeparatorMenuItem()
propsMenuItem = Gtk.MenuItem(_("Edit properties"))
@ -856,6 +871,7 @@ class pluginclass(object):
startupMenuItem.set_active(False)
startupMenuItem.connect("toggled", self.onAddToStartup, widget)
launchMenuItem.connect("activate", self.onLaunchApp, widget)
launchOffloadedMenuItem.connect("activate", self.onLaunchOffloadedApp, widget)
removeFromFavMenuItem.connect("activate", self.onFavoritesRemove, widget)
propsMenuItem.connect("activate", self.onPropsApp, widget)
@ -869,6 +885,8 @@ class pluginclass(object):
mTree.append(startupMenuItem)
mTree.append(separator3)
mTree.append(launchMenuItem)
if self.canOffload:
mTree.append(launchOffloadedMenuItem)
mTree.append(removeFromFavMenuItem)
mTree.append(separator4)
mTree.append(propsMenuItem)
@ -910,6 +928,7 @@ class pluginclass(object):
startupMenuItem = Gtk.CheckMenuItem(_("Launch when I log in"))
separator2 = Gtk.SeparatorMenuItem()
launchMenuItem = Gtk.MenuItem(_("Launch"))
launchOffloadedMenuItem = Gtk.MenuItem(_("Run with NVIDIA GPU"))
uninstallMenuItem = Gtk.MenuItem(_("Uninstall"))
deleteMenuItem = Gtk.MenuItem(_("Delete from menu"))
separator3 = Gtk.SeparatorMenuItem()
@ -924,6 +943,8 @@ class pluginclass(object):
mTree.append(startupMenuItem)
mTree.append(separator2)
mTree.append(launchMenuItem)
if self.canOffload:
mTree.append(launchOffloadedMenuItem)
mTree.append(uninstallMenuItem)
if home in widget.desktopFile:
mTree.append(deleteMenuItem)
@ -935,6 +956,7 @@ class pluginclass(object):
desktopMenuItem.connect("activate", self.add_to_desktop, widget)
panelMenuItem.connect("activate", self.add_to_panel, widget)
launchMenuItem.connect("activate", self.onLaunchApp, widget)
launchOffloadedMenuItem.connect("activate", self.onLaunchOffloadedApp, widget)
propsMenuItem.connect("activate", self.onPropsApp, widget)
uninstallMenuItem.connect("activate", self.onUninstallApp, widget)
@ -997,17 +1019,17 @@ class pluginclass(object):
self.focusSearchEntry(clear = False)
def search_ddg(self, widget):
text = urllib.quote_plus(self.searchEntry.get_text().strip())
text = urllib.parse.quote_plus(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://duckduckgo.com/?q=%s" % text])
self.mintMenuWin.hide()
def search_google(self, widget):
text = urllib.quote_plus(self.searchEntry.get_text().strip())
text = urllib.parse.quote_plus(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://www.google.com/search?q=%s" % text])
self.mintMenuWin.hide()
def search_wikipedia(self, widget):
text = urllib.quote_plus(self.searchEntry.get_text().strip())
text = urllib.parse.quote_plus(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://en.wikipedia.org/wiki/Special:Search?search=%s" % text])
self.mintMenuWin.hide()
@ -1017,27 +1039,27 @@ class pluginclass(object):
self.mintMenuWin.hide()
def search_mint_tutorials(self, widget):
text = urllib.quote(self.searchEntry.get_text().strip())
text = urllib.parse.quote(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://community.linuxmint.com/index.php/tutorial/search/0/%s" % text])
self.mintMenuWin.hide()
def search_mint_ideas(self, widget):
text = urllib.quote(self.searchEntry.get_text().strip())
text = urllib.parse.quote(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://community.linuxmint.com/index.php/idea/search/0/%s" % text])
self.mintMenuWin.hide()
def search_mint_users(self, widget):
text = urllib.quote(self.searchEntry.get_text().strip())
text = urllib.parse.quote(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://community.linuxmint.com/index.php/user/search/0/%s" % text])
self.mintMenuWin.hide()
def search_mint_hardware(self, widget):
text = urllib.quote(self.searchEntry.get_text().strip())
text = urllib.parse.quote(self.searchEntry.get_text().strip())
subprocess.Popen(["xdg-open", "https://community.linuxmint.com/index.php/hardware/search/0/%s" % text])
self.mintMenuWin.hide()
def search_mint_software(self, widget):
text = urllib.quote(self.searchEntry.get_text())
text = urllib.parse.quote(self.searchEntry.get_text())
subprocess.Popen(["xdg-open", "https://community.linuxmint.com/index.php/software/search/0/%s" % text])
self.mintMenuWin.hide()
@ -1076,6 +1098,10 @@ class pluginclass(object):
widget.execute()
self.mintMenuWin.hide()
def onLaunchOffloadedApp(self, menu, widget):
widget.execute(offload=True)
self.mintMenuWin.hide()
def onPropsApp(self, menu, widget):
newFileFlag = False
sysPaths = get_system_item_paths()
@ -1245,26 +1271,44 @@ class pluginclass(object):
return None
def buildFavorites(self):
try:
def migrate_favorites(self):
if self.settings.get_strv("favorite-apps-list") != []:
return
default_path = os.path.join("/usr/lib/linuxmint/mintMenu/applications.list")
path = os.path.join(home, ".linuxmint/mintMenu/applications.list")
if os.path.isdir(path):
# dir created by a bug in mint 19.2 beta
os.system("rm -rf %s" % path)
return
if not os.path.exists(path):
os.system("mkdir -p ~/.linuxmint/mintMenu")
os.system("cp /usr/lib/linuxmint/mintMenu/applications.list " + path)
path = default_path
applicationsList = open(path).readlines()
with open(path) as f:
self.settings.set_strv("favorite-apps-list", f.readlines())
self.favorites = []
try:
os.replace(path, path + ".deprecated_uses_dconf_now")
except:
# This will fail if it was the default path, ignore it.
pass
def favoriteAppsChanged(self, setting, key):
self.buildFavorites()
def buildFavorites(self):
try:
faves = self.settings.get_strv("favorite-apps-list")
for child in self.favoritesBox:
child.destroy()
position = 0
self.favorites = []
for app in applicationsList:
for app in faves:
try:
app = app.strip()
@ -1296,7 +1340,6 @@ class pluginclass(object):
print("Can't add favorite: %s" % app)
print (e)
self.favoritesSave()
except Exception as e:
print(e)
@ -1382,20 +1425,15 @@ class pluginclass(object):
self.favoritesRemove(fav.position)
def favoritesSave(self):
try:
self.checkMintMenuFolder()
with open(os.path.join(home, ".linuxmint/mintMenu/applications.list") , "w") as appListFile:
new_faves = []
for favorite in self.favorites:
if favorite.type == "location":
appListFile.write("location:" + favorite.desktopFile + "\n")
new_faves.append("location:" + favorite.desktopFile)
else:
appListFile.write(favorite.type + "\n")
except Exception as e:
msgDlg = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
_("Couldn't save favorites. Check if you have write access to ~/.linuxmint/mintMenu") +
"\n(" + e.__str__() + ")")
msgDlg.run()
msgDlg.destroy()
new_faves.append(favorite.type)
self.settings.set_strv("favorite-apps-list", new_faves)
def isLocationInFavorites(self, location):
for fav in self.favorites:
@ -1406,12 +1444,11 @@ class pluginclass(object):
def on_drag_data_get(self, widget, context, selection, info, time):
if info == self.TARGET_TYPE_FAV:
self.drag_origin = widget.position
# FIXME: This fails in python3:
selection.set(selection.get_target(), 8, str(widget.position))
selection.set_text(str(widget.position), -1)
def on_drag_data_received(self, widget, context, x, y, selection, info, time):
if info == self.TARGET_TYPE_FAV:
self.favoritesReorder(int(selection.get_data()), widget.position)
self.favoritesReorder(int(selection.get_data().decode()), widget.position)
# def on_icon_theme_changed(self, theme):
# print("on_icon_theme_changed")
@ -1615,7 +1652,7 @@ class pluginclass(object):
# Build a list of all categories in the menu ([{"name", "icon", tooltip"}]
def buildCategoryList(self):
newCategoryList = [{"name": _("All"),
"icon": "start-here-symbolic",
"icon": "mintmenu-all-applications-symbolic",
"tooltip": _("Show all applications"),
"filter":"", "index": 0}]
num = 1

View File

@ -1,7 +1,8 @@
#!/usr/bin/python2
#!/usr/bin/python3
import os.path
import shutil
import unidecode
import xdg.DesktopEntry
import xdg.Menu
@ -128,7 +129,7 @@ class easyButton(Gtk.Button):
if labels:
for label in labels:
if isinstance(label, basestring):
if isinstance(label, str):
self.addLabel(label)
elif isinstance(label, list):
self.addLabel(label[0], label[1])
@ -233,6 +234,7 @@ class ApplicationLauncher(easyButton):
self.desktopFile = desktopFile
self.startupMonitorId = 0
self.relevance = 0
self.loadDesktopEntry(desktopItem)
@ -258,15 +260,16 @@ class ApplicationLauncher(easyButton):
def loadDesktopEntry(self, desktopItem):
try:
self.appName = self.strip_accents(desktopItem.getName())
self.appGenericName = self.strip_accents(desktopItem.getGenericName())
self.appComment = self.strip_accents(desktopItem.getComment())
self.appExec = self.strip_accents(desktopItem.getExec().replace('\\\\', '\\'))
self.appName = desktopItem.getName()
self.appGenericName = desktopItem.getGenericName()
self.appComment = desktopItem.getComment()
self.appExec = desktopItem.getExec().replace('\\\\', '\\')
self.appIconName = desktopItem.getIcon()
self.appCategories = desktopItem.getCategories()
self.appMateDocPath = desktopItem.get("X-MATE-DocPath") or ""
self.useTerminal = desktopItem.getTerminal()
self.appPath = desktopItem.getPath()
self.prefersOffload = desktopItem.get("PrefersNonDefaultGPU", "Desktop Entry", type="boolean")
if not self.appMateDocPath:
self.appKdeDocPath = desktopItem.getDocPath() or ""
@ -303,24 +306,39 @@ class ApplicationLauncher(easyButton):
self.addLabel(self.appName)
def filterText(self, text):
keywords = text.lower().split()
appName = self.appName.lower()
appGenericName = self.appGenericName.lower()
appComment = self.appComment.lower()
appExec = self.appExec.lower()
keywords = self.strip_case_and_accents(text).split()
self.relevance = 0
appName = self.strip_case_and_accents(self.appName)
appGenericName = self.strip_case_and_accents(self.appGenericName)
appComment = self.strip_case_and_accents(self.appComment)
appExec = self.strip_case_and_accents(self.appExec)
for keyword in keywords:
keyw = self.strip_accents(keyword)
if keyw != "" and appName.find(keyw) == -1 and appGenericName.find(keyw) == -1 and appComment.find(keyw) == -1 and appExec.find(keyw) == -1:
if appName == keyword:
self.relevance += 32
elif appName.find(keyword) == 0:
self.relevance += 16
elif appName.find(keyword) != -1:
self.relevance += 8
if appExec.find(keyword) != -1:
self.relevance += 4
if appComment.find(keyword) != -1:
self.relevance += 2
if appGenericName.find(keyword) != -1:
self.relevance += 1
if keyword != "" and appName.find(keyword) == -1 and appGenericName.find(keyword) == -1 and appComment.find(keyword) == -1 and appExec.find(keyword) == -1:
self.hide()
return False
self.show()
return True
def strip_accents(self, string):
value = string
if isinstance(string, unicode):
def strip_case_and_accents(self, string):
if isinstance(string, str):
try:
value = string.encode('UTF8', 'ignore')
value = unidecode.unidecode(string.lower())
except:
pass
return value
@ -341,7 +359,7 @@ class ApplicationLauncher(easyButton):
else:
selection.set_uris(["file://" + self.desktopFile])
def execute(self, *args):
def execute(self, *args, **kwargs):
if self.appExec:
if self.useTerminal:
cmd = "x-terminal-emulator -e \"" + self.appExec + "\""
@ -349,7 +367,17 @@ class ApplicationLauncher(easyButton):
cmd = "mate-terminal -e \"" + self.appExec + "\""
Execute(cmd, self.appPath)
else:
Execute(None, desktopFile=self.desktopFile)
offload = False
try:
offload = kwargs["offload"]
except KeyError:
pass
if self.prefersOffload:
offload = True
Execute(None, desktopFile=self.desktopFile, offload=offload)
def uninstall(self, *args):
Execute("mint-remove-application " + self.desktopFile)
@ -385,13 +413,6 @@ class ApplicationLauncher(easyButton):
if os.path.exists(self.startupFilePath):
os.remove(self.startupFilePath)
def addToFavourites(self):
favouritesDir = os.path.join(os.path.expanduser("~"), ".linuxmint/mintMenu/applications")
if not os.path.exists(favouritesDir):
os.makedirs(favouritesDir)
shutil.copyfile(self.desktopFile, self.favouritesFilePath)
def removeFromFavourites(self):
if os.path.exists(self.favouritesFilePath):
os.remove(self.favouritesFilePath)
@ -468,12 +489,12 @@ class MenuApplicationLauncher(ApplicationLauncher):
else:
self.addLabel(appName)
def execute(self, *args):
def execute(self, *args, **kwargs):
self.highlight = False
for child in self.labelBox:
child.destroy()
self.setupLabels()
return super(MenuApplicationLauncher, self).execute(*args)
return super(MenuApplicationLauncher, self).execute(*args, **kwargs)
def setShowComment(self, showComment):
self.showComment = showComment

View File

@ -1,7 +1,7 @@
#!/usr/bin/python2
#!/usr/bin/python3
import os
from gi.repository import Gio, GLib
from gi.repository import Gio, GLib, Gdk, XApp
def RemoveArgs(Execline):
@ -25,12 +25,37 @@ def gather_pid_callback(appinfo, pid, data):
GLib.child_watch_add(pid, dummy_child_watch, None)
# Actually execute the command
def Execute(cmd , commandCwd=None, desktopFile=None):
def Execute(cmd , commandCwd=None, desktopFile=None, offload=False):
if desktopFile:
launcher = Gio.DesktopAppInfo.new_from_filename(desktopFile)
retval = launcher.launch_uris_as_manager(uris=[], launch_context=None, spawn_flags=GLib.SpawnFlags.SEARCH_PATH|GLib.SpawnFlags.DO_NOT_REAP_CHILD, \
user_setup=None, user_setup_data=None, pid_callback=gather_pid_callback, pid_callback_data=None)
context = Gdk.Display.get_default().get_app_launch_context()
if offload:
print("Offloading '%s' to discrete gpu." % launcher.get_name());
try:
helper = XApp.GpuOffloadHelper.get_sync()
infos = helper.get_offload_infos()
if infos:
i = 0
env_strv = infos[0].env_strv
while i < len(env_strv):
context.setenv(env_strv[i], env_strv[i + 1])
i += 2
except AttributeError:
context.setenv("__NV_PRIME_RENDER_OFFLOAD", "1")
context.setenv("__GLX_VENDOR_LIBRARY_NAME", "nvidia");
try:
retval = launcher.launch_uris_as_manager(uris=[],
launch_context=context,
spawn_flags=GLib.SpawnFlags.SEARCH_PATH|GLib.SpawnFlags.DO_NOT_REAP_CHILD,
user_setup=None, user_setup_data=None,
pid_callback=gather_pid_callback, pid_callback_data=None)
return retval
except GLib.Error as e:
print("Error launching %s: %s" % (launcher.get_name(), e.message))
return False
cwd = os.path.expanduser("~")

View File

@ -1,4 +1,4 @@
#!/usr/bin/python2
#!/usr/bin/python3
import os
import os.path

View File

@ -1,11 +1,11 @@
#!/usr/bin/python2
#!/usr/bin/python3
import locale
import gettext
import os
import string
from glob import glob
from urllib import unquote
from urllib.parse import unquote
import gi
gi.require_version("Gtk", "3.0")

View File

@ -1,4 +1,4 @@
#!/usr/bin/python2
#!/usr/bin/python3
import gettext
import locale
@ -7,11 +7,13 @@ import subprocess
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio
from gi.repository import Gtk, Gio, Pango
import plugins.recentHelper as RecentHelper
from plugins.execute import Execute
home = os.path.expanduser("~")
# i18n
gettext.install("mintmenu", "/usr/share/linuxmint/locale")
locale.bindtextdomain("mintmenu", "/usr/share/linuxmint/locale")
@ -56,6 +58,9 @@ class pluginclass:
self.icon = 'mate-folder.png'
self.settings = Gio.Settings("com.linuxmint.mintmenu.plugins.recent")
RecentHelper.settings = self.settings
self.migrate_recent_apps()
self.settings.connect('changed', self.RegenPlugin)
self.appSettings = Gio.Settings("com.linuxmint.mintmenu.plugins.applications")
@ -87,6 +92,20 @@ class pluginclass:
def RegenPlugin(self, *args, **kargs):
self.GetGSettingsEntries()
def migrate_recent_apps(self):
if self.settings.get_strv("recent-apps-list") != []:
return
path = os.path.join(home, ".linuxmint/mintMenu/recentApplications.list")
if os.path.exists(path):
with open(path) as f:
self.settings.set_strv("recent-apps-list", f.readlines())
try:
os.unlink(path)
except:
pass
def GetGSettingsEntries(self):
self.recenth = self.settings.get_int("height")
self.recentw = self.settings.get_int("width")
@ -130,7 +149,11 @@ class pluginclass:
return True
def clrmenu(self, *args, **kargs):
if self.builder.get_object("RecentTabs").get_current_page() == 0: # files
self.RecManagerInstance.purge_items()
else: # apps
self.settings.reset("recent-apps-list")
self.DoRecent()
def AddRecentBtn(self, Name, RecentImage):
@ -151,7 +174,7 @@ class pluginclass:
Box1.add(ButtonIcon)
Label1 = Gtk.Label(DispName)
Label1.set_ellipsize(3)
Label1.set_ellipsize(Pango.EllipsizeMode.END)
Box1.add(Label1)
AButton.add(Box1)
@ -174,7 +197,7 @@ class pluginclass:
def GetRecent(self, *args, **kargs):
FileString=[]
IconString=[]
RecentInfo=self.RecManagerInstance.get_items()
RecentInfo=sorted(self.RecManagerInstance.get_items(), key=lambda item: item.get_modified(), reverse=True)
count=0
MaxEntries=self.numentries
if self.numentries == -1:

View File

@ -1,4 +1,4 @@
#!/usr/bin/python2
#!/usr/bin/python3
import os
@ -10,6 +10,8 @@ from plugins.easybuttons import ApplicationLauncher
home = os.path.expanduser("~")
recentApps = []
settings = None # set by recent plugin
mintMenuWin = None
recentAppBox = None
numentries = 10
@ -25,21 +27,15 @@ def recentAppsAdd(recentAppsButton):
counter = counter + 1
def recentAppsSave():
try:
path = os.path.join(home, ".linuxmint/mintMenu/recentApplications.list")
with open(path, "w") as recentAppListFile:
new_recent_apps = []
for recentApp in recentApps:
if not hasattr(recentApp, "type") or recentApp.type == "location":
recentAppListFile.write("location:" + recentApp.desktopFile + "\n")
new_recent_apps.append("location:" + recentApp.desktopFile)
else:
recentAppListFile.write(recentApp.type + "\n")
new_recent_apps.append(recentApp.type)
except Exception as e:
print(e)
msgDlg = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
_("Couldn't save recent apps. Check if you have write access to ~/.linuxmint/mintMenu")+"\n(" + e.__str__() + ")")
msgDlg.run()
msgDlg.destroy()
settings.set_strv("recent-apps-list", new_recent_apps)
def recentAppBuildLauncher(location):
try:
@ -82,13 +78,9 @@ def recentAppBuildLauncher(location):
def buildRecentApps():
del recentApps[:]
try:
path = os.path.join(home, ".linuxmint/mintMenu/recentApplications.list")
if not os.path.exists(path):
recentApplicationsList = []
else:
recentApplicationsList = open(path).readlines()
recent_apps = settings.get_strv("recent-apps-list")
for app in recentApplicationsList :
for app in recent_apps:
app = app.strip()
if app[0:9] == "location:":
@ -123,6 +115,10 @@ def doRecentApps():
def applicationButtonClicked(widget):
mintMenuWin.hide()
if settings == None:
return
recentAppsAdd(widget)
recentAppsSave()
doRecentApps()

View File

@ -1,4 +1,4 @@
#!/usr/bin/python2
#!/usr/bin/python
import threading

View File

@ -49,8 +49,8 @@ class mintMenuPreferences():
def __init__(self):
self.settings = Gio.Settings("com.linuxmint.mintmenu")
self.places_settings = Gio.Settings("com.linuxmint.mintmenu.plugins.places")
self.settings = Gio.Settings(schema_id="com.linuxmint.mintmenu")
self.places_settings = Gio.Settings(schema_id="com.linuxmint.mintmenu.plugins.places")
self.builder = Gtk.Builder()
self.builder.set_translation_domain("mintmenu")

View File

@ -33,7 +33,7 @@
</key>
<key type="s" name="applet-text">
<default>"Menu"</default>
<default>""</default>
<summary></summary>
<description></description>
</key>
@ -51,13 +51,13 @@
</key>
<key type="s" name="applet-icon">
<default>"linuxmint-logo-filled-ring"</default>
<default>"linuxmint-logo-ring-symbolic"</default>
<summary></summary>
<description></description>
</key>
<key type="s" name="default-applet-icon">
<default>"linuxmint-logo-filled-ring"</default>
<default>"linuxmint-logo-ring-symbolic"</default>
<summary></summary>
<description></description>
</key>
@ -291,6 +291,12 @@
<summary></summary>
<description></description>
</key>
<key type="as" name="favorite-apps-list">
<default>[]</default>
<summary>List of absolute desktop file paths</summary>
</key>
</schema>
<schema id="com.linuxmint.mintmenu.plugins.system_management" path="/com/linuxmint/mintmenu/plugins/system_management/">
@ -412,6 +418,11 @@
<description></description>
</key>
<key type="as" name="recent-apps-list">
<default>[]</default>
<summary>List of absolute desktop file paths</summary>
</key>
</schema>
</schemalist>

View File

@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-grid-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
<metadata id='metadata90'>
<rdf:RDF>
<cc:Work rdf:about=''>
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
<dc:title>Cinnamon All Applications</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='84.99158' inkscape:cy='6.64106' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
<inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
</sodipodi:namedview>
<title id='title9167'>Cinnamon All Applications</title>
<defs id='defs7386'/>
<g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0004,-867)'/>
<g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0004,-867)'>
<rect height='2' id='rect13363' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='64.000198' y='870'/>
<rect height='2' id='rect13365' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='68.000198' y='870'/>
<rect height='2' id='rect13367' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='72.000198' y='870'/>
<rect height='2' id='rect13369' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='64.000198' y='874.01562'/>
<rect height='2' id='rect13371' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='68.000198' y='874.01562'/>
<rect height='2' id='rect13373' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='72.000198' y='874.01562'/>
<rect height='2' id='rect13375' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='64.000198' y='878'/>
<rect height='2' id='rect13377' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='68.000198' y='878'/>
<rect height='2' id='rect13379' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='72.000198' y='878'/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<!-- Generated with glade 3.22.2 -->
<interface>
<requires lib="gtk+" version="3.18"/>
<object class="GtkWindow" id="mainWindow">
@ -9,7 +9,7 @@
<property name="window_position">mouse</property>
<property name="gravity">static</property>
<signal name="destroy" handler="on_window1_destroy" swapped="no"/>
<child>
<child type="titlebar">
<placeholder/>
</child>
<child>
@ -121,6 +121,10 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkViewport" id="viewport2">
<property name="visible">True</property>
@ -165,6 +169,8 @@
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<!-- Generated with glade 3.22.2 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="border_width">3</property>
<property name="title" translatable="yes">window1</property>
<child>
<child type="titlebar">
<placeholder/>
</child>
<child>
@ -34,15 +34,19 @@
<object class="GtkViewport" id="viewport1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="margin_left">12</property>
<property name="margin_right">12</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkButtonBox" id="RecentBox">
<object class="GtkBox" id="RecentBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="layout_style">start</property>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
@ -67,15 +71,16 @@
<object class="GtkViewport" id="viewport2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
<property name="margin_left">12</property>
<property name="margin_right">12</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkButtonBox" id="RecentApps">
<object class="GtkBox" id="RecentApps">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">3</property>
<property name="orientation">vertical</property>
<property name="layout_style">start</property>
<child>
<placeholder/>
</child>