Compare commits

..

1 Commits

Author SHA1 Message Date
Clement Lefebvre
29d14c01d1 Fix launching of pkexec applications
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.

This introduces a workaround to wrap the pkexec call within an "sh -c".
2020-03-30 14:40:06 +01:00
22 changed files with 327 additions and 583 deletions

111
debian/changelog vendored
View File

@ -1,114 +1,3 @@
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)
[ 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 mintmenu (6.0.3) tricia; urgency=medium
* Prefer mozo over menulibre * Prefer mozo over menulibre

19
debian/control vendored
View File

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

2
debian/postinst vendored
View File

@ -19,7 +19,7 @@ set -e
case "$1" in case "$1" in
configure) configure)
glib-compile-schemas /usr/share/glib-2.0/schemas glib-compile-schemas /usr/share/glib-2.0/schemas
python3 -m compileall -qf /usr/lib/linuxmint/mintMenu/ python -m compileall -qf /usr/lib/linuxmint/mintMenu/
;; ;;
abort-upgrade|abort-remove|abort-deconfigure) 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 ' ') DEB_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')
%: %:
dh ${@} --with-python3 dh ${@} --with-python2
# Inject version number in the code # Inject version number in the code
override_dh_installdeb: override_dh_installdeb:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
#!/usr/bin/python3 #!/usr/bin/python2
import os import os
from gi.repository import Gio, GLib, Gdk, XApp from gi.repository import Gio
def RemoveArgs(Execline): def RemoveArgs(Execline):
@ -16,46 +16,13 @@ def RemoveArgs(Execline):
return Execline return Execline
def dummy_child_watch (pid, status, data):
# Do nothing, this is just to ensure we don't double fork
# and break pkexec: https://bugzilla.gnome.org/show_bug.cgi?id=675789
pass
def gather_pid_callback(appinfo, pid, data):
GLib.child_watch_add(pid, dummy_child_watch, None)
# Actually execute the command # Actually execute the command
def Execute(cmd , commandCwd=None, desktopFile=None, offload=False): def Execute(cmd , commandCwd=None, desktopFile=None):
if desktopFile: if desktopFile:
launcher = Gio.DesktopAppInfo.new_from_filename(desktopFile) launcher = Gio.DesktopAppInfo.new_from_filename(desktopFile)
context = Gdk.Display.get_default().get_app_launch_context() retval = launcher.launch_uris()
if offload:
print("Offloading '%s' to discrete gpu." % launcher.get_name());
try: return retval
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("~") cwd = os.path.expanduser("~")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,39 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.2 --> <!-- Generated with glade 3.22.1 -->
<interface> <interface>
<requires lib="gtk+" version="3.18"/> <requires lib="gtk+" version="3.18"/>
<object class="GtkWindow" id="mainWindow"> <object class="GtkWindow" id="mainWindow">
@ -9,7 +9,7 @@
<property name="window_position">mouse</property> <property name="window_position">mouse</property>
<property name="gravity">static</property> <property name="gravity">static</property>
<signal name="destroy" handler="on_window1_destroy" swapped="no"/> <signal name="destroy" handler="on_window1_destroy" swapped="no"/>
<child type="titlebar"> <child>
<placeholder/> <placeholder/>
</child> </child>
<child> <child>
@ -122,51 +122,45 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkScrolledWindow"> <object class="GtkViewport" id="viewport2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">queue</property>
<property name="shadow_type">none</property>
<child> <child>
<object class="GtkViewport" id="viewport2"> <object class="GtkGrid" id="favoritesBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="hexpand">True</property>
<property name="resize_mode">queue</property> <property name="vexpand">True</property>
<property name="shadow_type">none</property> <property name="column_homogeneous">True</property>
<child> <child>
<object class="GtkGrid" id="favoritesBox"> <placeholder/>
<property name="visible">True</property> </child>
<property name="can_focus">False</property> <child>
<property name="hexpand">True</property> <placeholder/>
<property name="vexpand">True</property> </child>
<property name="column_homogeneous">True</property> <child>
<child> <placeholder/>
<placeholder/> </child>
</child> <child>
<child> <placeholder/>
<placeholder/> </child>
</child> <child>
<child> <placeholder/>
<placeholder/> </child>
</child> <child>
<child> <placeholder/>
<placeholder/> </child>
</child> <child>
<child> <placeholder/>
<placeholder/> </child>
</child> <child>
<child> <placeholder/>
<placeholder/> </child>
</child> <child>
<child> <placeholder/>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child> </child>
</object> </object>
</child> </child>

View File

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