diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | debian/changelog | 92 | ||||
-rw-r--r-- | debian/compat | 1 | ||||
-rw-r--r-- | debian/control | 31 | ||||
-rw-r--r-- | debian/copyright | 88 | ||||
-rw-r--r-- | debian/manpages | 1 | ||||
-rw-r--r-- | debian/patches/001-gee-0.8.patch | 29 | ||||
-rw-r--r-- | debian/patches/series | 1 | ||||
-rwxr-xr-x | debian/rules | 5 | ||||
-rw-r--r-- | debian/source/format | 1 | ||||
-rw-r--r-- | debian/source/options | 2 | ||||
-rw-r--r-- | debian/watch | 3 | ||||
-rw-r--r-- | gnome-pie.sublime-project | 22 | ||||
-rwxr-xr-x | make.sh | 2 | ||||
-rw-r--r-- | resources/ui/icon_select.ui | 2 | ||||
-rw-r--r-- | resources/ui/preferences.ui | 4 | ||||
-rw-r--r-- | resources/ui/settings.ui | 2 | ||||
-rw-r--r-- | resources/ui/slice_select.ui | 4 | ||||
-rw-r--r-- | resources/ui/trigger_select.ui | 3 | ||||
-rw-r--r-- | src/deamon.vala | 74 | ||||
-rw-r--r-- | src/gui/indicator.vala | 4 | ||||
-rw-r--r-- | src/renderers/pieWindow.vala | 124 | ||||
-rw-r--r-- | src/renderers/sliceRenderer.vala | 148 | ||||
-rw-r--r-- | src/utilities/bindingManager.vala | 126 | ||||
-rw-r--r-- | src/utilities/paths.vala | 136 |
26 files changed, 568 insertions, 341 deletions
@@ -4,5 +4,3 @@ build/* gnome-pie Makefile .valencia -*~ -gnome-pie.sublime-workspace diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c7729e..9e06bc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,7 +137,7 @@ set(INCLUDE_PATHS ${INDICATOR_INCLUDE_DIRS} ${INDICATOR3_INCLUDE_DIRS} ${XML_INCLUDE_DIRS} - ${XTST_INCLUDE_DIRS} + ${XTST_INCLUDE_DIRS} ${GMENU_INCLUDE_DIRS} ${GMENU3_INCLUDE_DIRS} ${UNIQUE_INCLUDE_DIRS} diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..14715ce --- /dev/null +++ b/debian/changelog @@ -0,0 +1,92 @@ +gnome-pie (0.5.5-1) unstable; urgency=medium + + * New Maintainer (Closes: #755431). + * New upstream release (Closes: #687078). + * Add debian/source/options: + - Set compression to xz & compression-level to 9 to save space. + * debian/control: + - Set myself as maintainer. + - Update Build-Depends: + + replace deprecated libgee-dev with libgee-0.8-dev. + + valac <= 0.16 will be removed. Therefore change + valac release to >= 0.22. + * New patch: + - New debian/patches/001-gee-0.8.patch for new geeAPI 0.8 (Closes: #753863). + * debian/copyright: + - Add myself to the list of authors for debian/*. + + -- Jörg Frings-Fürst <debian@jff-webhosting.net> Wed, 30 Jul 2014 07:25:36 +0200 + +gnome-pie (0.5.4-2) unstable; urgency=medium + + * QA upload + * Bump Standards-Version to 3.9.5 (no changes needed) + * Orphan the package + * Update watch file to point to correct GitHub page + * Fix vcs-field-not-canonical + + -- Alessandro Ghedini <ghedo@debian.org> Sun, 20 Jul 2014 19:52:46 +0200 + +gnome-pie (0.5.4-1) unstable; urgency=low + + * New upstream release + * Bump Standards-Version to 3.9.4 (no changes needed) + * Build depend on unversioned valac (Closes: #675644) + + -- Alessandro Ghedini <ghedo@debian.org> Wed, 07 Nov 2012 18:46:56 +0100 + +gnome-pie (0.5.3-1) unstable; urgency=low + + * New upstream release + * Email change: Alessandro Ghedini -> ghedo@debian.org + * Explicitly build depends on valac-0.14 (Closes: #673591) + + -- Alessandro Ghedini <ghedo@debian.org> Sun, 20 May 2012 20:34:54 +0200 + +gnome-pie (0.5.2-1) unstable; urgency=low + + * New upstream release + - Do not override dh_auto_install anymore + (pt_BR locale has the correct name now) + * Update debian/copyright format as in Debian Policy 3.9.3 + * Bump Standards-Version to 3.9.3 + * Bump debhelper compat level to 9 + * Switch to GTK+ 3.0 + + -- Alessandro Ghedini <al3xbio@gmail.com> Mon, 19 Mar 2012 18:41:54 +0100 + +gnome-pie (0.4.2-1) unstable; urgency=low + + * New upstream release + * Update upstream copyright years + + -- Alessandro Ghedini <al3xbio@gmail.com> Fri, 27 Jan 2012 21:44:10 +0100 + +gnome-pie (0.4.0-1) unstable; urgency=low + + * New upstream release + * Explicitly set the build system + * One Build-Depends per line + + -- Alessandro Ghedini <al3xbio@gmail.com> Sun, 22 Jan 2012 14:11:45 +0100 + +gnome-pie (0.3.1-1) unstable; urgency=low + + [ Andrea Veri ] + * debian/control: + - added B-Ds on libwnck-dev, libgnome-menu-dev and + libbamf-dev, they are required in order to build + gnome-pie-0.3 successfully. + + [ Alessandro Ghedini ] + * New upstream release + * Use tarballs provided by upstream instead of git + * Drop manpage (merged upstream) + + -- Alessandro Ghedini <al3xbio@gmail.com> Sun, 20 Nov 2011 15:54:48 +0100 + +gnome-pie (0.2+gitdfdad95-1) unstable; urgency=low + + * Initial release (Closes: #645878) + + -- Alessandro Ghedini <al3xbio@gmail.com> Wed, 19 Oct 2011 13:38:07 +0200 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..93708ff --- /dev/null +++ b/debian/control @@ -0,0 +1,31 @@ +Source: gnome-pie +Section: gnome +Priority: optional +Maintainer: Jörg Frings-Fürst <debian@jff-webhosting.net> +Build-Depends: + debhelper (>= 9), + cmake, + libbamf3-dev, + libcairo2-dev, + libgee-0.8-dev (>= 0.10), + libgnome-menu-3-dev, + libgtk-3-dev, + libunique-3.0-dev, + libwnck-3-dev, + libxml2-dev, + libxtst-dev, + valac (>= 0.22) +Standards-Version: 3.9.5 +Homepage: http://gnome-pie.simonschneegans.de/ +Vcs-Git: git://anonscm.debian.org/collab-maint/gnome-pie.git +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/gnome-pie.git + +Package: gnome-pie +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: visual application launcher for GNOME + gnome-pie is a radial visual application launcher for GNOME. It allows the + user to bind groups of frequently used applications to a ring that appears + when a hot key / mouse binding is triggered. + . + It was inspired by the OPie addon written for the game World of Warcraft. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..eb5cd6e --- /dev/null +++ b/debian/copyright @@ -0,0 +1,88 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: gnome-pie +Source: https://github.com/Simmesimme/Gnome-Pie + +Files: * +Copyright: 2011-2012 Simon Schneegans +License: GPL-3.0+ + +Files: cmake/vala/FindVala.cmake + cmake/vala/ValaPrecompile.cmake + cmake/vala/ValaVersion.cmake +Copyright: 2009-2010 Jakob Westhoff +License: BSD-2-Clause + +Files: vapi/x11.vapi +Copyright: 2009 Jürg Billeter + 2011 Alexander Kurtz +License: LGPL-2.1+ + +Files: vapi/xtst.vapi +Copyright: 2011 Alexander Kurtz +License: LGPL-2.1+ + +Files: debian/* +Copyright: 2011 Alessandro Ghedini <ghedo@debian.org> + 2014 Jörg Frings-Fürst <debian@jff-webhosting.net> +License: GPL-3.0+ + +License: GPL-3.0+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + . + On Debian systems, the complete text of the GNU General Public License version + 3 can be found in "/usr/share/common-licenses/GPL-3". + +License: BSD-2-Clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + . + THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + . + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of Jakob Westhoff + +License: LGPL-2.1+ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + . + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + . + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + . + On Debian systems, the complete text of the GNU Lesser General Public License + version 2.1 can be found in "/usr/share/common-licenses/LGPL-2.1". diff --git a/debian/manpages b/debian/manpages new file mode 100644 index 0000000..78998a6 --- /dev/null +++ b/debian/manpages @@ -0,0 +1 @@ +resources/gnome-pie.1 diff --git a/debian/patches/001-gee-0.8.patch b/debian/patches/001-gee-0.8.patch new file mode 100644 index 0000000..72e3c7a --- /dev/null +++ b/debian/patches/001-gee-0.8.patch @@ -0,0 +1,29 @@ +Description: change gee API to 0.8 +Author: Jörg Frings-Fürst <debian@jff-webhosting.net> +Bug: https://github.com/Simmesimme/Gnome-Pie/issues/77 +Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=753863 +Last-Update: 2014-07-21 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +Index: trunk/CMakeLists.txt +=================================================================== +--- trunk.orig/CMakeLists.txt 2013-03-17 12:15:02.000000000 +0100 ++++ trunk/CMakeLists.txt 2014-07-21 17:44:36.814563290 +0200 +@@ -43,7 +43,7 @@ + + pkg_check_modules(GIO REQUIRED gio-unix-2.0) + pkg_check_modules(CAIRO REQUIRED cairo) +-pkg_check_modules(GEE REQUIRED gee-1.0) ++pkg_check_modules(GEE REQUIRED gee-0.8) + pkg_check_modules(X11 REQUIRED x11) + pkg_check_modules(XML REQUIRED libxml-2.0) + pkg_check_modules(XTST REQUIRED xtst) +@@ -155,7 +155,7 @@ + + set(VALA_PKGS + cairo +- gee-1.0 ++ gee-0.8 + x11 + gio-unix-2.0 + posix diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..eb5e810 --- /dev/null +++ b/debian/patches/series @@ -0,0 +1 @@ +001-gee-0.8.patch diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..bcc9077 --- /dev/null +++ b/debian/rules @@ -0,0 +1,5 @@ +#!/usr/bin/make -f + +%: + dh $@ --buildsystem=cmake + diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/source/options b/debian/source/options new file mode 100644 index 0000000..22a4de9 --- /dev/null +++ b/debian/source/options @@ -0,0 +1,2 @@ +compression = xz +compression-level = 9 diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..dbffcbb --- /dev/null +++ b/debian/watch @@ -0,0 +1,3 @@ +version=3 +opts=filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/mpv-$1.tar.gz/ \ + https://github.com/Simmesimme/Gnome-Pie/tags .*/v?(\d\S*)\.tar\.gz diff --git a/gnome-pie.sublime-project b/gnome-pie.sublime-project deleted file mode 100644 index f56473f..0000000 --- a/gnome-pie.sublime-project +++ /dev/null @@ -1,22 +0,0 @@ -{ - "build_systems": - [ - { - "cmd": - [ - "./make.sh" - ], - "file_regex": "^(..[^:]*):(.*)$", - "name": "gnome-pie-project", - "working_dir": "${project_path}" - } - ], - "folders": - [ - { - "follow_symlinks": true, - "path": ".", - "folder_exclude_patterns": ["build"] - } - ] -} @@ -2,4 +2,4 @@ mkdir build -cd build; cmake ..; make -j8 && ( cd .. ) +cd build; cmake ..; make && ( cd .. ) diff --git a/resources/ui/icon_select.ui b/resources/ui/icon_select.ui index 3aae9f7..b39ea2a 100644 --- a/resources/ui/icon_select.ui +++ b/resources/ui/icon_select.ui @@ -6,7 +6,7 @@ <property name="height_request">425</property> <property name="can_focus">False</property> <property name="title" translatable="yes">Select an icon</property> - <property name="resizable">True</property> + <property name="resizable">False</property> <property name="modal">True</property> <property name="destroy_with_parent">True</property> <property name="type_hint">dialog</property> diff --git a/resources/ui/preferences.ui b/resources/ui/preferences.ui index d6a5686..8ee988c 100644 --- a/resources/ui/preferences.ui +++ b/resources/ui/preferences.ui @@ -6,7 +6,7 @@ <property name="height_request">475</property> <property name="can_focus">False</property> <property name="title" translatable="yes">Gnome-Pie Settings</property> - <property name="resizable">True</property> + <property name="resizable">False</property> <property name="window_position">center</property> <property name="has_resize_grip">False</property> <child> @@ -260,7 +260,7 @@ <property name="ypad">6</property> <property name="label" translatable="yes"><b><big>This Pie is empty!</big> -Start adding Slices to it!</b> This can be done by dragging stuff to the plus sign below. You can try a lot! For example application launchers or folders. Even URLs from your browser are possible... +Start adding Slices to it!</b> This can be done by dragging stuff to the plus sign below. You can try a lot! For example application launchers or folders. Even URLs from your browser are possible... For manual and advanced configuration click on the plus sign.</property> <property name="use_markup">True</property> diff --git a/resources/ui/settings.ui b/resources/ui/settings.ui index 21d1fb5..77e3403 100644 --- a/resources/ui/settings.ui +++ b/resources/ui/settings.ui @@ -7,7 +7,7 @@ <property name="can_focus">False</property> <property name="border_width">5</property> <property name="title" translatable="yes">General Settings</property> - <property name="resizable">True</property> + <property name="resizable">False</property> <property name="modal">True</property> <property name="window_position">center-on-parent</property> <property name="destroy_with_parent">True</property> diff --git a/resources/ui/slice_select.ui b/resources/ui/slice_select.ui index c09adac..6ea5087 100644 --- a/resources/ui/slice_select.ui +++ b/resources/ui/slice_select.ui @@ -4,12 +4,10 @@ <object class="GtkDialog" id="window"> <property name="width_request">550</property> <property name="height_request">450</property> - <property name="default_width">550</property> - <property name="default_height">450</property> <property name="can_focus">False</property> <property name="border_width">5</property> <property name="title" translatable="yes">Slice Options</property> - <property name="resizable">True</property> + <property name="resizable">False</property> <property name="modal">True</property> <property name="window_position">center-on-parent</property> <property name="destroy_with_parent">True</property> diff --git a/resources/ui/trigger_select.ui b/resources/ui/trigger_select.ui index 6ffa4a7..9967997 100644 --- a/resources/ui/trigger_select.ui +++ b/resources/ui/trigger_select.ui @@ -3,11 +3,10 @@ <requires lib="gtk+" version="2.20"/> <object class="GtkDialog" id="window"> <property name="width_request">350</property> - <property name="default_width">350</property> <property name="can_focus">False</property> <property name="border_width">5</property> <property name="title" translatable="yes">Activation Settings</property> - <property name="resizable">True</property> + <property name="resizable">False</property> <property name="modal">True</property> <property name="window_position">center-on-parent</property> <property name="destroy_with_parent">True</property> diff --git a/src/deamon.vala b/src/deamon.vala index fb9618b..8cf95f8 100644 --- a/src/deamon.vala +++ b/src/deamon.vala @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 2011 by Simon Schneegans This program is free software: you can redistribute it and/or modify it @@ -12,17 +12,17 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with -this program. If not, see <http://www.gnu.org/licenses/>. +this program. If not, see <http://www.gnu.org/licenses/>. */ namespace GnomePie { -///////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// /// This class runs in the background. It has an Indicator sitting in the /// user's panel. It initializes everything and guarantees that there is /// only one instance of Gnome-Pie running. ///////////////////////////////////////////////////////////////////////// - + public class Deamon : GLib.Object { ///////////////////////////////////////////////////////////////////// @@ -30,19 +30,19 @@ public class Deamon : GLib.Object { ///////////////////////////////////////////////////////////////////// public static string version; - + ///////////////////////////////////////////////////////////////////// /// The beginning of everything. ///////////////////////////////////////////////////////////////////// public static int main(string[] args) { - version = "0.5.6"; - + version = "0.5.5"; + Logger.init(); Gdk.threads_init(); Gtk.init(ref args); Paths.init(); - + message("Welcome to Gnome-Pie " + version + "!"); // create the Deamon and run it @@ -51,28 +51,28 @@ public class Deamon : GLib.Object { return 0; } - + ///////////////////////////////////////////////////////////////////// /// The AppIndicator of Gnome-Pie. ///////////////////////////////////////////////////////////////////// private Indicator indicator = null; - + ///////////////////////////////////////////////////////////////////// /// Varaibles set by the commend line parser. ///////////////////////////////////////////////////////////////////// - + private static string open_pie = null; private static bool reset = false; - + ///////////////////////////////////////////////////////////////////// /// Available command line options. ///////////////////////////////////////////////////////////////////// - + private const GLib.OptionEntry[] options = { - { "open", 'o', 0, GLib.OptionArg.STRING, out open_pie, + { "open", 'o', 0, GLib.OptionArg.STRING, out open_pie, "Open the Pie with the given ID", "ID" }, - { "reset", 'r', 0, GLib.OptionArg.NONE, out reset, + { "reset", 'r', 0, GLib.OptionArg.NONE, out reset, "Reset all options to default values" }, { null } }; @@ -81,7 +81,7 @@ public class Deamon : GLib.Object { /// C'tor of the Deamon. It checks whether it's the firts running /// instance of Gnome-Pie. ///////////////////////////////////////////////////////////////////// - + public void run(string[] args) { // create command line options var context = new GLib.OptionContext(""); @@ -94,16 +94,16 @@ public class Deamon : GLib.Object { } catch(GLib.OptionError error) { warning(error.message); } - + if (Deamon.reset) { if (GLib.FileUtils.remove(Paths.pie_config) == 0) message("Removed file \"%s\"", Paths.pie_config); if (GLib.FileUtils.remove(Paths.settings) == 0) message("Removed file \"%s\"", Paths.settings); - + return; } - + // create unique application var app = new Unique.App("org.gnome.gnomepie", null); @@ -118,21 +118,21 @@ public class Deamon : GLib.Object { var data = new Unique.MessageData(); data.set_text(open_pie, open_pie.length); app.send_message(Unique.Command.ACTIVATE, data); - + return; - } - + } + message("Gnome-Pie is already running. Sending request to open config menu."); app.send_message(Unique.Command.ACTIVATE, null); - + return; } - + // wait for incoming messages app.message_received.connect((cmd, data, event_time) => { if (cmd == Unique.Command.ACTIVATE) { var pie = data.get_text(); - + if (pie != null && pie != "") PieManager.open_pie(pie); else this.indicator.show_preferences(); @@ -141,43 +141,43 @@ public class Deamon : GLib.Object { return Unique.Response.PASSTHROUGH; }); - + Gdk.threads_enter(); - + // init locale support Intl.bindtextdomain ("gnomepie", Paths.locales); Intl.textdomain ("gnomepie"); - + // init toolkits and static stuff ActionRegistry.init(); GroupRegistry.init(); - + PieManager.init(); Icon.init(); - + // launch the indicator this.indicator = new Indicator(); // connect SigHandlers Posix.signal(Posix.SIGINT, sig_handler); Posix.signal(Posix.SIGTERM, sig_handler); - + // finished loading... so run the prog! message("Started happily..."); - + // open pie if neccessary - if (open_pie != null) + if (open_pie != null) PieManager.open_pie(open_pie); - + Gtk.main(); - + Gdk.threads_leave(); } - + ///////////////////////////////////////////////////////////////////// /// Print a nifty message when the prog is killed. ///////////////////////////////////////////////////////////////////// - + private static void sig_handler(int sig) { stdout.printf("\n"); message("Caught signal (%d), bye!".printf(sig)); diff --git a/src/gui/indicator.vala b/src/gui/indicator.vala index 18d4e68..c334dd1 100644 --- a/src/gui/indicator.vala +++ b/src/gui/indicator.vala @@ -68,7 +68,7 @@ public class Indicator : GLib.Object { public Indicator() { string icon = ""; - + #if HAVE_GTK_3 if (Gdk.X11Screen.get_window_manager_name(Gdk.Screen.get_default()) == "Mutter") #else @@ -77,7 +77,7 @@ public class Indicator : GLib.Object { icon = "gnome-pie"; else icon = "gnome-pie-symbolic"; - + #if HAVE_APPINDICATOR string path = ""; diff --git a/src/renderers/pieWindow.vala b/src/renderers/pieWindow.vala index a95b3e3..66ed863 100644 --- a/src/renderers/pieWindow.vala +++ b/src/renderers/pieWindow.vala @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 2011 by Simon Schneegans This program is free software: you can redistribute it and/or modify it @@ -12,14 +12,14 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with -this program. If not, see <http://www.gnu.org/licenses/>. -*/ +this program. If not, see <http://www.gnu.org/licenses/>. +*/ using GLib.Math; namespace GnomePie { -///////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// /// An invisible window. Used to draw Pies onto. ///////////////////////////////////////////////////////////////////////// @@ -28,54 +28,54 @@ public class PieWindow : Gtk.Window { ///////////////////////////////////////////////////////////////////// /// Signal which gets emitted when the PieWindow is about to close. ///////////////////////////////////////////////////////////////////// - + public signal void on_closing(); - + ///////////////////////////////////////////////////////////////////// /// Signal which gets emitted when the PieWindow is closed. ///////////////////////////////////////////////////////////////////// - + public signal void on_closed(); - + ///////////////////////////////////////////////////////////////////// /// The background image used for fake transparency if /// has_compositing is false. ///////////////////////////////////////////////////////////////////// - + public Image background { get; private set; default=null; } - + ///////////////////////////////////////////////////////////////////// /// The owned renderer. ///////////////////////////////////////////////////////////////////// private PieRenderer renderer; - + ///////////////////////////////////////////////////////////////////// /// True, if the Pie is currently fading out. ///////////////////////////////////////////////////////////////////// - + private bool closing = false; private bool closed = false; - + ///////////////////////////////////////////////////////////////////// /// A timer used for calculating the frame time. ///////////////////////////////////////////////////////////////////// - + private GLib.Timer timer; - + ///////////////////////////////////////////////////////////////////// /// True, if the screen supports compositing. ///////////////////////////////////////////////////////////////////// - + private bool has_compositing = false; - + ///////////////////////////////////////////////////////////////////// /// C'tor, sets up the window. ///////////////////////////////////////////////////////////////////// public PieWindow() { this.renderer = new PieRenderer(); - + this.set_title("Gnome-Pie"); this.set_skip_taskbar_hint(true); this.set_skip_pager_hint(true); @@ -85,8 +85,7 @@ public class PieWindow : Gtk.Window { this.set_resizable(false); this.icon_name = "gnome-pie"; this.set_accept_focus(false); - this.app_paintable = true; - + // check for compositing if (this.screen.is_composited()) { #if HAVE_GTK_3 @@ -96,7 +95,7 @@ public class PieWindow : Gtk.Window { #endif this.has_compositing = true; } - + // set up event filter this.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.KEY_RELEASE_MASK | @@ -108,13 +107,13 @@ public class PieWindow : Gtk.Window { if (e.button == 1 || this.renderer.turbo_mode) this.activate_slice(); return true; }); - + // cancel on right click this.button_press_event.connect ((e) => { if (e.button == 3) this.cancel(); return true; }); - + // remember last pressed key in order to disable key repeat uint last_key = 0; this.key_press_event.connect((e) => { @@ -124,7 +123,7 @@ public class PieWindow : Gtk.Window { } return true; }); - + // activate on key release if turbo_mode is enabled this.key_release_event.connect((e) => { last_key = 0; @@ -134,13 +133,13 @@ public class PieWindow : Gtk.Window { this.handle_key_release(e.keyval); return true; }); - + // notify the renderer of mouse move events this.motion_notify_event.connect((e) => { this.renderer.on_mouse_move(); return true; }); - + this.show.connect_after(() => { Gtk.grab_add(this); FocusGrabber.grab(this.get_window(), true, true, false); @@ -153,7 +152,7 @@ public class PieWindow : Gtk.Window { this.expose_event.connect(this.draw_window); #endif } - + ///////////////////////////////////////////////////////////////////// /// Loads a Pie to be rendered. ///////////////////////////////////////////////////////////////////// @@ -163,14 +162,14 @@ public class PieWindow : Gtk.Window { this.set_window_position(pie); this.set_size_request(renderer.size, renderer.size); } - + ///////////////////////////////////////////////////////////////////// /// Opens the window. load_pie should have been called before. ///////////////////////////////////////////////////////////////////// - + public void open() { this.realize(); - + // capture the background image if there is no compositing if (!this.has_compositing) { int x, y, width, height; @@ -178,7 +177,7 @@ public class PieWindow : Gtk.Window { this.get_size(out width, out height); this.background = new Image.capture_screen(x, y, width+1, height+1); } - + // capture the input focus this.show(); @@ -186,38 +185,38 @@ public class PieWindow : Gtk.Window { this.timer = new GLib.Timer(); this.timer.start(); this.queue_draw(); - + // the main draw loop - GLib.Timeout.add((uint)(1000.0/Config.global.refresh_rate), () => { + GLib.Timeout.add((uint)(1000.0/Config.global.refresh_rate), () => { if (this.closed) return false; - + this.queue_draw(); return this.visible; - }); + }); } - + ///////////////////////////////////////////////////////////////////// /// Gets the center position of the window. ///////////////////////////////////////////////////////////////////// - + public void get_center_pos(out int out_x, out int out_y) { int x=0, y=0, width=0, height=0; this.get_position(out x, out y); this.get_size(out width, out height); - + out_x = x + width/2; out_y = y + height/2; } - + ///////////////////////////////////////////////////////////////////// /// Draw the Pie. ///////////////////////////////////////////////////////////////////// #if HAVE_GTK_3 - private bool draw_window(Cairo.Context ctx) { + private bool draw_window(Cairo.Context ctx) { #else - private bool draw_window(Gtk.Widget da, Gdk.EventExpose event) { + private bool draw_window(Gtk.Widget da, Gdk.EventExpose event) { // clear the window var ctx = Gdk.cairo_create(this.get_window()); #endif @@ -231,29 +230,29 @@ public class PieWindow : Gtk.Window { ctx.set_source_surface(background.surface, -1, -1); ctx.paint(); } - + // align the context to the center of the PieWindow ctx.translate(this.width_request*0.5, this.height_request*0.5); - + // get the mouse position double mouse_x = 0.0, mouse_y = 0.0; this.get_pointer(out mouse_x, out mouse_y); - + // store the frame time double frame_time = this.timer.elapsed(); this.timer.reset(); - + // render the Pie this.renderer.draw(frame_time, ctx, (int)(mouse_x - this.width_request*0.5), (int)(mouse_y - this.height_request*0.5)); - + return true; } - + ///////////////////////////////////////////////////////////////////// /// Activates the currently activate slice. ///////////////////////////////////////////////////////////////////// - + private void activate_slice() { if (!this.closing) { this.closing = true; @@ -261,7 +260,7 @@ public class PieWindow : Gtk.Window { Gtk.grab_remove(this); FocusGrabber.ungrab(); this.renderer.activate(); - + GLib.Timeout.add((uint)(Config.global.theme.fade_out_time*1000), () => { this.closed = true; this.on_closed(); @@ -270,11 +269,11 @@ public class PieWindow : Gtk.Window { }); } } - + ///////////////////////////////////////////////////////////////////// /// Activates no slice and closes the PieWindow. ///////////////////////////////////////////////////////////////////// - + private void cancel() { if (!this.closing) { this.closing = true; @@ -282,7 +281,7 @@ public class PieWindow : Gtk.Window { Gtk.grab_remove(this); FocusGrabber.ungrab(); this.renderer.cancel(); - + GLib.Timeout.add((uint)(Config.global.theme.fade_out_time*1000), () => { this.closed = true; this.on_closed(); @@ -291,21 +290,21 @@ public class PieWindow : Gtk.Window { }); } } - + ///////////////////////////////////////////////////////////////////// /// Sets the position of the window to the center of the screen or to /// the mouse. ///////////////////////////////////////////////////////////////////// - + private void set_window_position(Pie pie) { if(PieManager.get_is_centered(pie.id)) this.set_position(Gtk.WindowPosition.CENTER); else this.set_position(Gtk.WindowPosition.MOUSE); } - + ///////////////////////////////////////////////////////////////////// /// Do some useful stuff when keys are pressed. ///////////////////////////////////////////////////////////////////// - + private void handle_key_press(uint key) { if (Gdk.keyval_name(key) == "Escape") this.cancel(); else if (Gdk.keyval_name(key) == "Return") this.activate_slice(); @@ -317,30 +316,31 @@ public class PieWindow : Gtk.Window { else if (Gdk.keyval_name(key) == "Alt_L") this.renderer.show_hotkeys = true; else { int index = -1; - - if (key >= 48 && key <= 57) index = ((int)key - 39)%10; + + if (key >= 48 && key <= 57) index = (int)key - 48; else if (key >= 97 && key <= 122) index = (int)key - 87; else if (key >= 65 && key <= 90) index = (int)key - 55; - + if (index >= 0 && index < this.renderer.slice_count()) { this.renderer.key_board_control = true; this.renderer.set_highlighted_slice(index); - + if (this.renderer.active_slice == index) { GLib.Timeout.add((uint)(Config.global.theme.transition_time*1000.0), ()=> { this.activate_slice(); return false; }); } + } } } } - + ///////////////////////////////////////////////////////////////////// /// Do some useful stuff when keys are released. ///////////////////////////////////////////////////////////////////// - + private void handle_key_release(uint key) { if (!this.renderer.turbo_mode) { if (Gdk.keyval_name(key) == "Alt_L") this.renderer.show_hotkeys = false; diff --git a/src/renderers/sliceRenderer.vala b/src/renderers/sliceRenderer.vala index 2ecf7c4..743f13e 100644 --- a/src/renderers/sliceRenderer.vala +++ b/src/renderers/sliceRenderer.vala @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 2011 by Simon Schneegans This program is free software: you can redistribute it and/or modify it @@ -12,14 +12,14 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with -this program. If not, see <http://www.gnu.org/licenses/>. +this program. If not, see <http://www.gnu.org/licenses/>. */ using GLib.Math; namespace GnomePie { -///////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// /// Renders a Slice of a Pie. According to the current theme. ///////////////////////////////////////////////////////////////////////// @@ -30,57 +30,57 @@ public class SliceRenderer : GLib.Object { ///////////////////////////////////////////////////////////////////// public bool active {get; private set; default = false;} - + ///////////////////////////////////////////////////////////////////// /// The Image which should be displayed as center caption when this /// slice is active. ///////////////////////////////////////////////////////////////////// - + public Image caption {get; private set;} - + ///////////////////////////////////////////////////////////////////// /// The color which should be used for colorizing center layers when /// this slice is active. ///////////////////////////////////////////////////////////////////// - + public Color color {get; private set;} - + ///////////////////////////////////////////////////////////////////// /// The two Images used, when this slice is active or not. ///////////////////////////////////////////////////////////////////// - + private Image active_icon; private Image inactive_icon; - + ///////////////////////////////////////////////////////////////////// /// The Image displaying the associated hot key of this slice. ///////////////////////////////////////////////////////////////////// - + private Image hotkey; - + ///////////////////////////////////////////////////////////////////// /// The Action which is rendered by this SliceRenderer. ///////////////////////////////////////////////////////////////////// - + private Action action; - + ///////////////////////////////////////////////////////////////////// /// The PieRenderer which owns this SliceRenderer. ///////////////////////////////////////////////////////////////////// - private unowned PieRenderer parent; - + private unowned PieRenderer parent; + ///////////////////////////////////////////////////////////////////// /// The index of this slice in a pie. Clockwise assigned, starting /// from the right-most slice. ///////////////////////////////////////////////////////////////////// - + private int position; - + ///////////////////////////////////////////////////////////////////// /// AnimatedValues needed for a slice. ///////////////////////////////////////////////////////////////////// - + private AnimatedValue fade; // for transitions from active to inactive private AnimatedValue scale; // for zoom effect private AnimatedValue alpha; // for fading in/out @@ -94,24 +94,24 @@ public class SliceRenderer : GLib.Object { public SliceRenderer(PieRenderer parent) { this.parent = parent; - + this.fade = new AnimatedValue.linear(0.0, 0.0, Config.global.theme.transition_time); this.wobble = new AnimatedValue.linear(0.0, 0.0, Config.global.theme.transition_time); this.alpha = new AnimatedValue.linear(0.0, 1.0, Config.global.theme.fade_in_time); - this.scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, - 1.0/Config.global.theme.max_zoom, - 1.0/Config.global.theme.max_zoom, - Config.global.theme.transition_time, + this.scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, + 1.0/Config.global.theme.max_zoom, + 1.0/Config.global.theme.max_zoom, + Config.global.theme.transition_time, Config.global.theme.springiness); - this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, - Config.global.theme.fade_in_zoom, 1.0, - Config.global.theme.fade_in_time, + this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, + Config.global.theme.fade_in_zoom, 1.0, + Config.global.theme.fade_in_time, Config.global.theme.springiness); - this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, - Config.global.theme.fade_in_rotation, 0.0, + this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, + Config.global.theme.fade_in_rotation, 0.0, Config.global.theme.fade_in_time); } - + ///////////////////////////////////////////////////////////////////// /// Loads an Action. All members are initialized accordingly. ///////////////////////////////////////////////////////////////////// @@ -119,64 +119,64 @@ public class SliceRenderer : GLib.Object { public void load(Action action, int position) { this.position = position; this.action = action; - - + + if (Config.global.theme.caption) - this.caption = new RenderedText(action.name, + this.caption = new RenderedText(action.name, Config.global.theme.caption_width, Config.global.theme.caption_height, Config.global.theme.caption_font, Config.global.theme.caption_color, Config.global.global_scale); - + this.active_icon = new ThemedIcon(action.name, action.icon, true); this.inactive_icon = new ThemedIcon(action.name, action.icon, false); - + this.color = new Color.from_icon(this.active_icon); - + string hotkey_label = ""; if (position < 10) { - hotkey_label = "%u".printf((position+1)%10); + hotkey_label = "%u".printf(position); } else if (position < 36) { hotkey_label = "%c".printf((char)(55 + position)); } - + this.hotkey = new RenderedText(hotkey_label, (int)Config.global.theme.slice_radius*2, (int)Config.global.theme.slice_radius*2, "sans 20", Config.global.theme.caption_color, Config.global.global_scale); } - + ///////////////////////////////////////////////////////////////////// /// Activaes the Action of this slice. ///////////////////////////////////////////////////////////////////// - + public void activate() { action.activate(); } - + ///////////////////////////////////////////////////////////////////// /// Initiates the fade-out animation by resetting the targets of the /// AnimatedValues to 0.0. ///////////////////////////////////////////////////////////////////// - + public void fade_out() { this.alpha.reset_target(0.0, Config.global.theme.fade_out_time); - this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.IN, - this.fade_scale.val, - Config.global.theme.fade_out_zoom, - Config.global.theme.fade_out_time, + this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.IN, + this.fade_scale.val, + Config.global.theme.fade_out_zoom, + Config.global.theme.fade_out_time, Config.global.theme.springiness); - this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.IN, - this.fade_rotation.val, - Config.global.theme.fade_out_rotation, + this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.IN, + this.fade_rotation.val, + Config.global.theme.fade_out_rotation, Config.global.theme.fade_out_time); } - + ///////////////////////////////////////////////////////////////////// /// Should be called if the active slice of the PieRenderer changes. /// The members activity, caption and color are set accordingly. ///////////////////////////////////////////////////////////////////// - + public void set_active_slice(SliceRenderer? active_slice) { if (active_slice == this) { this.fade.reset_target(1.0, Config.global.theme.transition_time); @@ -184,13 +184,13 @@ public class SliceRenderer : GLib.Object { this.fade.reset_target(0.0, Config.global.theme.transition_time); } } - + ///////////////////////////////////////////////////////////////////// /// Draws all layers of the slice. ///////////////////////////////////////////////////////////////////// public void draw(double frame_time, Cairo.Context ctx, double angle, double distance) { - + // update the AnimatedValues this.scale.update(frame_time); this.alpha.update(frame_time); @@ -198,16 +198,16 @@ public class SliceRenderer : GLib.Object { this.fade_scale.update(frame_time); this.fade_rotation.update(frame_time); this.wobble.update(frame_time); - + double direction = 2.0 * PI * position/parent.slice_count() + this.fade_rotation.val; double max_scale = 1.0/Config.global.theme.max_zoom; double diff = fabs(angle-direction); if (diff > PI) diff = 2 * PI - diff; - + active = ((parent.active_slice >= 0) && (diff < PI/parent.slice_count())); - + if (parent.active_slice >= 0) { double wobble = Config.global.theme.wobble*diff/PI*(1-diff/PI); if ((direction < angle && direction > angle - PI) || direction > PI+angle) { @@ -218,61 +218,61 @@ public class SliceRenderer : GLib.Object { } else { this.wobble.reset_target(0, Config.global.theme.transition_time*0.5); } - + direction += this.wobble.val; if (diff < 2 * PI * Config.global.theme.zoom_range) max_scale = (Config.global.theme.max_zoom/(diff * (Config.global.theme.max_zoom - 1) /(2 * PI * Config.global.theme.zoom_range) + 1)) /Config.global.theme.max_zoom; - - - + + + max_scale = (parent.active_slice >= 0 ? max_scale : 1.0/Config.global.theme.max_zoom); - + if (fabs(this.scale.end - max_scale) > Config.global.theme.max_zoom*0.005) this.scale.reset_target(max_scale, Config.global.theme.transition_time); - + ctx.save(); - + // distance from the center double radius = Config.global.theme.radius; - + // increase radius if there are many slices in a pie if (atan((Config.global.theme.slice_radius+Config.global.theme.slice_gap) /(radius/Config.global.theme.max_zoom)) > PI/parent.slice_count()) { radius = (Config.global.theme.slice_radius+Config.global.theme.slice_gap) /tan(PI/parent.slice_count())*Config.global.theme.max_zoom; } - + // transform the context ctx.scale(scale.val*fade_scale.val, scale.val*fade_scale.val); ctx.translate(cos(direction)*radius, sin(direction)*radius); - + ctx.push_group(); - + ctx.set_operator(Cairo.Operator.ADD); - + // paint the images if (fade.val > 0.0) active_icon.paint_on(ctx, this.alpha.val*this.fade.val); if (fade.val < 1.0) inactive_icon.paint_on(ctx, this.alpha.val*(1.0 - fade.val)); - + if (this.parent.show_hotkeys) { ctx.set_operator(Cairo.Operator.ATOP); ctx.set_source_rgba(0, 0, 0, 0.5); ctx.paint(); } - + ctx.set_operator(Cairo.Operator.OVER); - - + + ctx.pop_group_to_source(); ctx.paint(); - + // draw hotkeys if necassary if (this.parent.show_hotkeys) this.hotkey.paint_on(ctx, 1.0); - + ctx.restore(); } } diff --git a/src/utilities/bindingManager.vala b/src/utilities/bindingManager.vala index 0c74ece..255dbfb 100644 --- a/src/utilities/bindingManager.vala +++ b/src/utilities/bindingManager.vala @@ -17,8 +17,8 @@ this program. If not, see <http://www.gnu.org/licenses/>. namespace GnomePie { -///////////////////////////////////////////////////////////////////////// -/// Globally binds key stroke to given ID's. When one of the bound +///////////////////////////////////////////////////////////////////////// +/// Globally binds key stroke to given ID's. When one of the bound /// strokes is invoked, a signal with the according ID is emitted. ///////////////////////////////////////////////////////////////////////// @@ -30,61 +30,61 @@ public class BindingManager : GLib.Object { ///////////////////////////////////////////////////////////////////// public signal void on_press(string id); - + ///////////////////////////////////////////////////////////////////// /// A list storing bindings, which are invoked even if Gnome-Pie /// doesn't have the current focus ///////////////////////////////////////////////////////////////////// - + private Gee.List<Keybinding> bindings = new Gee.ArrayList<Keybinding>(); ///////////////////////////////////////////////////////////////////// /// Ignored modifier masks, used to grab all keys even if these locks /// are active. ///////////////////////////////////////////////////////////////////// - + private static uint[] lock_modifiers = { 0, Gdk.ModifierType.MOD2_MASK, Gdk.ModifierType.LOCK_MASK, Gdk.ModifierType.MOD5_MASK, - + Gdk.ModifierType.MOD2_MASK|Gdk.ModifierType.LOCK_MASK, Gdk.ModifierType.MOD2_MASK|Gdk.ModifierType.MOD5_MASK, Gdk.ModifierType.LOCK_MASK|Gdk.ModifierType.MOD5_MASK, - + Gdk.ModifierType.MOD2_MASK|Gdk.ModifierType.LOCK_MASK|Gdk.ModifierType.MOD5_MASK }; - + ///////////////////////////////////////////////////////////////////// /// Some variables to remember which delayed binding was delayed. /// When the delay passes without another event indicating that the /// Trigger was released, the stored binding will be activated. ///////////////////////////////////////////////////////////////////// - + private uint32 delayed_count = 0; private X.Event? delayed_event = null; private Keybinding? delayed_binding = null; - + ///////////////////////////////////////////////////////////////////// /// Helper class to store keybinding ///////////////////////////////////////////////////////////////////// - + private class Keybinding { - + public Keybinding(Trigger trigger, string id) { this.trigger = trigger; this.id = id; } - + public Trigger trigger { get; set; } public string id { get; set; } } - + ///////////////////////////////////////////////////////////////////// /// C'tor adds the event filter to the root window. ///////////////////////////////////////////////////////////////////// - + public BindingManager() { // init filter to retrieve X.Events Gdk.Window rootwin = Gdk.get_default_root_window(); @@ -92,45 +92,45 @@ public class BindingManager : GLib.Object { rootwin.add_filter(event_filter); } } - + ///////////////////////////////////////////////////////////////////// /// Binds the ID to the given accelerator. ///////////////////////////////////////////////////////////////////// - + public void bind(Trigger trigger, string id) { if(trigger.key_code != 0) { - X.Display display = Gdk.X11.get_default_xdisplay(); - X.ID xid = Gdk.X11.get_default_root_xwindow(); - + X.Display display = Gdk.x11_get_default_xdisplay(); + X.ID xid = Gdk.x11_get_default_root_xwindow(); + Gdk.error_trap_push(); - + foreach(uint lock_modifier in lock_modifiers) { if (trigger.with_mouse) { display.grab_button(trigger.key_code, trigger.modifiers|lock_modifier, xid, false, - X.EventMask.ButtonPressMask | X.EventMask.ButtonReleaseMask, + X.EventMask.ButtonPressMask | X.EventMask.ButtonReleaseMask, X.GrabMode.Async, X.GrabMode.Async, xid, 0); } else { - display.grab_key(trigger.key_code, trigger.modifiers|lock_modifier, + display.grab_key(trigger.key_code, trigger.modifiers|lock_modifier, xid, false, X.GrabMode.Async, X.GrabMode.Async); } } - + Gdk.flush(); - + Keybinding binding = new Keybinding(trigger, id); bindings.add(binding); display.flush(); } } - + ///////////////////////////////////////////////////////////////////// /// Unbinds the accelerator of the given ID. ///////////////////////////////////////////////////////////////////// - + public void unbind(string id) { - X.Display display = Gdk.X11.get_default_xdisplay(); - X.ID xid = Gdk.X11.get_default_root_xwindow(); - + X.Display display = Gdk.x11_get_default_xdisplay(); + X.ID xid = Gdk.x11_get_default_root_xwindow(); + Gee.List<Keybinding> remove_bindings = new Gee.ArrayList<Keybinding>(); foreach(var binding in bindings) { if(id == binding.id) { @@ -139,7 +139,7 @@ public class BindingManager : GLib.Object { display.ungrab_button(binding.trigger.key_code, binding.trigger.modifiers|lock_modifier, xid); } else { display.ungrab_key(binding.trigger.key_code, binding.trigger.modifiers|lock_modifier, xid); - } + } } remove_bindings.add(binding); } @@ -148,68 +148,68 @@ public class BindingManager : GLib.Object { bindings.remove_all(remove_bindings); display.flush(); } - + ///////////////////////////////////////////////////////////////////// /// Returns a human readable accelerator for the given ID. ///////////////////////////////////////////////////////////////////// - + public string get_accelerator_label_of(string id) { foreach (var binding in bindings) { if (binding.id == id) { return binding.trigger.label_with_specials; } } - + return _("Not bound"); } - + ///////////////////////////////////////////////////////////////////// /// Returns the accelerator to which the given ID is bound. ///////////////////////////////////////////////////////////////////// - + public string get_accelerator_of(string id) { foreach (var binding in bindings) { if (binding.id == id) { return binding.trigger.name; } } - + return ""; } - + ///////////////////////////////////////////////////////////////////// /// Returns whether the pie with the given ID is in turbo mode. ///////////////////////////////////////////////////////////////////// - + public bool get_is_turbo(string id) { foreach (var binding in bindings) { if (binding.id == id) { return binding.trigger.turbo; } } - + return false; } - + ///////////////////////////////////////////////////////////////////// /// Returns whether the pie with the given ID opens centered. ///////////////////////////////////////////////////////////////////// - + public bool get_is_centered(string id) { foreach (var binding in bindings) { if (binding.id == id) { return binding.trigger.centered; } } - + return false; } - + ///////////////////////////////////////////////////////////////////// /// Returns the name ID of the Pie bound to the given Trigger. /// Returns "" if there is nothing bound to this trigger. ///////////////////////////////////////////////////////////////////// - + public string get_assigned_id(Trigger trigger) { foreach (var binding in bindings) { var first = binding.trigger.name.replace("[turbo]", "").replace("[delayed]", ""); @@ -218,23 +218,23 @@ public class BindingManager : GLib.Object { return binding.id; } } - + return ""; } ///////////////////////////////////////////////////////////////////// /// Event filter method needed to fetch X.Events. ///////////////////////////////////////////////////////////////////// - - private Gdk.FilterReturn event_filter(Gdk.XEvent gdk_xevent, Gdk.Event gdk_event) { - + + private Gdk.FilterReturn event_filter(Gdk.XEvent gdk_xevent, Gdk.Event gdk_event) { + #if VALA_0_16 || VALA_0_17 X.Event* xevent = (X.Event*) gdk_xevent; #else void* pointer = &gdk_xevent; X.Event* xevent = (X.Event*) pointer; #endif - + if(xevent->type == X.EventType.KeyPress) { foreach(var binding in bindings) { // remove NumLock, CapsLock and ScrollLock from key state @@ -247,7 +247,7 @@ public class BindingManager : GLib.Object { } } } - } + } else if(xevent->type == X.EventType.ButtonPress) { foreach(var binding in bindings) { // remove NumLock, CapsLock and ScrollLock from key state @@ -263,49 +263,49 @@ public class BindingManager : GLib.Object { } else if(xevent->type == X.EventType.ButtonRelease || xevent->type == X.EventType.KeyRelease) { this.activate_delayed(null, *xevent); - } - + } + return Gdk.FilterReturn.CONTINUE; } - + ///////////////////////////////////////////////////////////////////// /// This method is always called when a trigger is activated which is /// delayed. Therefore on_press() is only emitted, when this method /// is not called again within 300 milliseconds. Else a fake event is /// sent in order to simulate the actual key which has been pressed. ///////////////////////////////////////////////////////////////////// - + private void activate_delayed(Keybinding? binding , X.Event event) { // increase event count, so any waiting event will realize that // something happened in the meantime var current_count = ++this.delayed_count; - + if (binding == null && this.delayed_event != null) { // if the trigger is released and an event is currently waiting // simulate that the trigger has been pressed without any inter- // ference of Gnome-Pie - X.Display display = Gdk.X11.get_default_xdisplay(); - + X.Display display = Gdk.x11_get_default_xdisplay(); + // unbind the trigger, else we'll capture that event again ;) unbind(delayed_binding.id); - + if (this.delayed_binding.trigger.with_mouse) { // simulate mouse click X.Test.fake_button_event(display, this.delayed_event.xbutton.button, true, 0); display.flush(); - + X.Test.fake_button_event(display, this.delayed_event.xbutton.button, false, 0); display.flush(); - + } else { // simulate key press X.Test.fake_key_event(display, this.delayed_event.xkey.keycode, true, 0); display.flush(); - + X.Test.fake_key_event(display, this.delayed_event.xkey.keycode, false, 0); display.flush(); } - + // bind it again bind(delayed_binding.trigger, delayed_binding.id); } else if (binding != null) { diff --git a/src/utilities/paths.vala b/src/utilities/paths.vala index 5b39c45..fe8897b 100644 --- a/src/utilities/paths.vala +++ b/src/utilities/paths.vala @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 2011 by Simon Schneegans This program is free software: you can redistribute it and/or modify it @@ -12,12 +12,12 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with -this program. If not, see <http://www.gnu.org/licenses/>. +this program. If not, see <http://www.gnu.org/licenses/>. */ namespace GnomePie { -///////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// /// A static class which stores all relevant paths used by Gnome-Pie. /// These depend upon the location from which the program was launched. ///////////////////////////////////////////////////////////////////////// @@ -28,122 +28,122 @@ public class Paths : GLib.Object { /// The config directory, /// usually ~/.config/gnome-pie/. ///////////////////////////////////////////////////////////////////// - + public static string config_directory { get; private set; default=""; } ///////////////////////////////////////////////////////////////////// /// The log file, /// usually ~/.config/gnome-pie/gnome-pie.log. ///////////////////////////////////////////////////////////////////// - + public static string log { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The statistics file, /// usually ~/.config/gnome-pie/gnome-pie.stats. ///////////////////////////////////////////////////////////////////// - + public static string stats { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The settings file, /// usually ~/.config/gnome-pie/gnome-pie.conf. ///////////////////////////////////////////////////////////////////// - + public static string settings { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The pie configuration file /// usually ~/.config/gnome-pie/pies.conf. ///////////////////////////////////////////////////////////////////// - + public static string pie_config { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The directory containing themes installed by the user /// usually ~/.config/gnome-pie/themes. ///////////////////////////////////////////////////////////////////// - + public static string local_themes { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The directory containing pre-installed themes /// usually /usr/share/gnome-pie/themes. ///////////////////////////////////////////////////////////////////// - + public static string global_themes { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The directory containing locale files /// usually /usr/share/locale. ///////////////////////////////////////////////////////////////////// - + public static string locales { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The directory containing UI declaration files /// usually /usr/share/gnome-pie/ui/. ///////////////////////////////////////////////////////////////////// - + public static string ui_files { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The autostart file of gnome-pie_config /// usually ~/.config/autostart/gnome-pie.desktop. ///////////////////////////////////////////////////////////////////// - + public static string autostart { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The path where all pie-launchers are stored /// usually ~/.config/gnome-pie/launchers. ///////////////////////////////////////////////////////////////////// - + public static string launchers { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// The path to the executable. ///////////////////////////////////////////////////////////////////// - + public static string executable { get; private set; default=""; } - + ///////////////////////////////////////////////////////////////////// /// Initializes all values above. ///////////////////////////////////////////////////////////////////// - + public static void init() { - + // get path of executable try { executable = GLib.File.new_for_path(GLib.FileUtils.read_link("/proc/self/exe")).get_path(); } catch (GLib.FileError e) { warning("Failed to get path of executable!"); } - + // append resources to icon search path to icon theme, if neccasary var icon_dir = GLib.File.new_for_path(GLib.Path.get_dirname(executable)).get_child("resources"); - + if (icon_dir.query_exists()) { string path = icon_dir.get_path(); Gtk.IconTheme.get_default().append_search_path(path); } - + Gtk.IconTheme.get_default().append_search_path("/usr/share/pixmaps/"); - + // get global paths var default_dir = GLib.File.new_for_path("/usr/share/gnome-pie/"); if(!default_dir.query_exists()) { default_dir = GLib.File.new_for_path("/usr/local/share/gnome-pie/"); - + if(!default_dir.query_exists()) { default_dir = GLib.File.new_for_path(GLib.Path.get_dirname( executable)).get_child("resources"); } } - + global_themes = default_dir.get_path() + "/themes"; ui_files = default_dir.get_path() + "/ui"; - + // get locales path var locale_dir = GLib.File.new_for_path("/usr/share/locale/de/LC_MESSAGES/gnomepie.mo"); if(locale_dir.query_exists()) { @@ -155,16 +155,16 @@ public class Paths : GLib.Object { } else { locale_dir = GLib.File.new_for_path(GLib.Path.get_dirname( executable)).get_child("resources/locale/de/LC_MESSAGES/gnomepie.mo"); - + if(locale_dir.query_exists()) { locale_dir = GLib.File.new_for_path(GLib.Path.get_dirname( executable)).get_child("resources/locale"); } } } - + locales = locale_dir.get_path(); - + // get local paths var config_dir = GLib.File.new_for_path( GLib.Environment.get_user_config_dir()).get_child("gnome-pie"); @@ -177,9 +177,9 @@ public class Paths : GLib.Object { error(e.message); } } - + config_directory = config_dir.get_path(); - + // create local themes directory if neccasary var themes_dir = config_dir.get_child("themes"); if(!themes_dir.query_exists()) { @@ -189,9 +189,9 @@ public class Paths : GLib.Object { error(e.message); } } - + local_themes = themes_dir.get_path(); - + // create launchers directory if neccasary var launchers_dir = config_dir.get_child("launchers"); if(!launchers_dir.query_exists()) { @@ -201,17 +201,17 @@ public class Paths : GLib.Object { error(e.message); } } - + launchers = launchers_dir.get_path(); - + // check for config file var config_file = config_dir.get_child("pies.conf"); - + pie_config = config_file.get_path(); settings = config_dir.get_path() + "/gnome-pie.conf"; log = config_dir.get_path() + "/gnome-pie.log"; stats = config_dir.get_path() + "/gnome-pie.stats"; - + if (!GLib.File.new_for_path(log).query_exists()) { try { FileUtils.set_contents(log, ""); @@ -219,7 +219,7 @@ public class Paths : GLib.Object { error(e.message); } } - + if (!GLib.File.new_for_path(stats).query_exists()) { try { FileUtils.set_contents(stats, ""); @@ -227,36 +227,36 @@ public class Paths : GLib.Object { error(e.message); } } - + // autostart file name - autostart = GLib.Path.build_filename(GLib.Environment.get_user_config_dir(), + autostart = GLib.Path.build_filename(GLib.Environment.get_user_config_dir(), "autostart", "gnome-pie.desktop", null); - + // print results - if (!GLib.File.new_for_path(pie_config).query_exists()) + if (!GLib.File.new_for_path(pie_config).query_exists()) warning("Failed to find pie configuration file \"pies.conf\"! (This should only happen when Gnome-Pie is started for the first time...)"); - - if (!GLib.File.new_for_path(settings).query_exists()) + + if (!GLib.File.new_for_path(settings).query_exists()) warning("Failed to find settings file \"gnome-pie.conf\"! (This should only happen when Gnome-Pie is started for the first time...)"); - - if (!GLib.File.new_for_path(log).query_exists()) + + if (!GLib.File.new_for_path(log).query_exists()) warning("Failed to find log file \"gnome-pie.log\"!"); - - if (!GLib.File.new_for_path(stats).query_exists()) + + if (!GLib.File.new_for_path(stats).query_exists()) warning("Failed to find statistics file \"gnome-pie.stats\"!"); - - if (!GLib.File.new_for_path(local_themes).query_exists()) + + if (!GLib.File.new_for_path(local_themes).query_exists()) warning("Failed to find local themes directory!"); - - if (!GLib.File.new_for_path(launchers).query_exists()) + + if (!GLib.File.new_for_path(launchers).query_exists()) warning("Failed to find launchers directory!"); - - if (!GLib.File.new_for_path(global_themes).query_exists()) - warning("Failed to find global themes directory!"); - - if (!GLib.File.new_for_path(ui_files).query_exists()) - warning("Failed to find UI files directory!"); - } + + if (!GLib.File.new_for_path(global_themes).query_exists()) + warning("Failed to find global themes directory!"); + + if (!GLib.File.new_for_path(ui_files).query_exists()) + warning("Failed to find UI files directory!"); + } } } |