diff --git a/stardict/patches/001-fix-compile-error.patch b/stardict/patches/001-fix-compile-error.patch new file mode 100644 index 0000000..fc264c4 --- /dev/null +++ b/stardict/patches/001-fix-compile-error.patch @@ -0,0 +1,394 @@ +fix compile error + +From: Xiangfu Liu + + +--- + + src/gconf_file.cpp | 2 ++ + src/inifile.cpp | 1 + + src/lib/common.cpp | 2 ++ + src/lib/data.cpp | 1 + + src/lib/http_client.cpp | 1 + + src/lib/pluginmanager.cpp | 2 +- + src/lib/stardict_client.cpp | 1 + + src/lib/treedict.cpp | 1 + + src/pangoview.cpp | 2 ++ + src/prefsdlg.cpp | 1 + + src/readword.cpp | 1 + + src/sigc++/signal.h | 2 +- + src/utils.cpp | 2 ++ + src/x11_iskeyspressed.hpp | 2 ++ + .../stardict_dictdotcn.cpp | 2 +- + .../stardict-espeak-tts-plugin/stardict_espeak.cpp | 1 + + .../stardict_gucharmap.cpp | 3 ++- + .../stardict_html_parsedata.cpp | 2 ++ + .../stardict-man-plugin/stardict_man.cpp | 2 +- + .../stardict_powerword_parsedata.cpp | 1 + + .../stardict-qqwry-plugin/stardict_qqwry.cpp | 3 ++- + .../stardict-spell-plugin/stardict_spell.cpp | 1 + + .../stardict_wiki2xml.cpp | 1 + + .../stardict_wiki_parsedata.cpp | 1 + + .../stardict-wordnet-plugin/court_widget.cpp | 1 + + .../stardict-wordnet-plugin/stardict_wordnet.cpp | 1 + + .../stardict_wordnet_parsedata.cpp | 1 + + .../stardict_xdxf_parsedata.cpp | 1 + + tests/t_config_file.cpp | 1 + + tests/t_xml.cpp | 1 + + 30 files changed, 38 insertions(+), 6 deletions(-) + + +diff --git a/src/gconf_file.cpp b/src/gconf_file.cpp +index a5b81c6..e1d43aa 100644 +--- a/src/gconf_file.cpp ++++ b/src/gconf_file.cpp +@@ -22,6 +22,8 @@ + # include "config.h" + #endif + ++#include ++ + #include + + #include "gconf_file.hpp" +diff --git a/src/inifile.cpp b/src/inifile.cpp +index 2f73f7b..e652709 100644 +--- a/src/inifile.cpp ++++ b/src/inifile.cpp +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/src/lib/common.cpp b/src/lib/common.cpp +index 6575ad9..29faf9e 100644 +--- a/src/lib/common.cpp ++++ b/src/lib/common.cpp +@@ -24,6 +24,8 @@ + # include "config.h" + #endif + ++#include ++#include + #include "common.hpp" + + static void parse_description(const char *p, long len, std::string &description) +diff --git a/src/lib/data.cpp b/src/lib/data.cpp +index 45c7d1a..1b29ec3 100644 +--- a/src/lib/data.cpp ++++ b/src/lib/data.cpp +@@ -22,6 +22,7 @@ + # include "config.h" + #endif + ++#include + #include "kmp.h" + + #include "data.hpp" +diff --git a/src/lib/http_client.cpp b/src/lib/http_client.cpp +index 802a469..732f205 100644 +--- a/src/lib/http_client.cpp ++++ b/src/lib/http_client.cpp +@@ -2,6 +2,7 @@ + # include "config.h" + #endif + ++#include + #include "http_client.h" + #include "sockets.hpp" + +diff --git a/src/lib/pluginmanager.cpp b/src/lib/pluginmanager.cpp +index de3e92d..28a46c4 100644 +--- a/src/lib/pluginmanager.cpp ++++ b/src/lib/pluginmanager.cpp +@@ -1,6 +1,6 @@ + #include "pluginmanager.h" + #include "file.hpp" +-#include ++#include + + StarDictPluginBaseObject::StarDictPluginBaseObject(const char *filename, GModule *module_, plugin_configure_func_t configure_func_): + plugin_filename(filename), module(module_), configure_func(configure_func_) +diff --git a/src/lib/stardict_client.cpp b/src/lib/stardict_client.cpp +index dcae5ce..c3d2511 100644 +--- a/src/lib/stardict_client.cpp ++++ b/src/lib/stardict_client.cpp +@@ -25,6 +25,7 @@ + #include + #include + ++#include + #include "sockets.hpp" + #include "md5.h" + #include "getuint32.h" +diff --git a/src/lib/treedict.cpp b/src/lib/treedict.cpp +index 01fa89a..f0b3322 100644 +--- a/src/lib/treedict.cpp ++++ b/src/lib/treedict.cpp +@@ -25,6 +25,7 @@ + # include "config.h" + #endif + ++#include + #include "file.hpp" + #include "getuint32.h" + +diff --git a/src/pangoview.cpp b/src/pangoview.cpp +index eb5d34d..e400ac3 100644 +--- a/src/pangoview.cpp ++++ b/src/pangoview.cpp +@@ -22,6 +22,8 @@ + # include "config.h" + #endif + ++#include ++ + #include "gtktextviewpango.h" + #include "utils.h" + #include "skin.h"//for SkinCursor definition +diff --git a/src/prefsdlg.cpp b/src/prefsdlg.cpp +index 33648ed..14e3f15 100644 +--- a/src/prefsdlg.cpp ++++ b/src/prefsdlg.cpp +@@ -21,6 +21,7 @@ + # include "config.h" + #endif + ++#include + #include + #include + +diff --git a/src/readword.cpp b/src/readword.cpp +index 340fbb6..f6efb2c 100644 +--- a/src/readword.cpp ++++ b/src/readword.cpp +@@ -3,6 +3,7 @@ + #endif + + #include ++#include + #include + + #include +diff --git a/src/sigc++/signal.h b/src/sigc++/signal.h +index 282a5b1..b103dbf 100644 +--- a/src/sigc++/signal.h ++++ b/src/sigc++/signal.h +@@ -18,7 +18,7 @@ + //Compilers, such as older versions of SUN Forte C++, that do not allow this also often + //do not allow a typedef to have the same name as a class in the typedef's definition. + //For Sun Forte CC 5.7 (SUN Workshop 10), comment this out to fix the build. +- #define SIGC_TYPEDEF_REDEFINE_ALLOWED 1 ++// #define SIGC_TYPEDEF_REDEFINE_ALLOWED 1 + #endif + + namespace sigc { +diff --git a/src/utils.cpp b/src/utils.cpp +index 4a09f30..2ce059b 100644 +--- a/src/utils.cpp ++++ b/src/utils.cpp +@@ -22,6 +22,8 @@ + # include "config.h" + #endif + ++#include ++ + #include + #include + #include +diff --git a/src/x11_iskeyspressed.hpp b/src/x11_iskeyspressed.hpp +index 9b0d375..f7391ad 100644 +--- a/src/x11_iskeyspressed.hpp ++++ b/src/x11_iskeyspressed.hpp +@@ -1,6 +1,8 @@ + #ifndef _X11_ISKEYSPRESSED_HPP_ + #define _X11_ISKEYSPRESSED_HPP_ + ++#include ++ + #include + #include + #include +diff --git a/stardict-plugins/stardict-dictdotcn-plugin/stardict_dictdotcn.cpp b/stardict-plugins/stardict-dictdotcn-plugin/stardict_dictdotcn.cpp +index b779046..f608fb1 100644 +--- a/stardict-plugins/stardict-dictdotcn-plugin/stardict_dictdotcn.cpp ++++ b/stardict-plugins/stardict-dictdotcn-plugin/stardict_dictdotcn.cpp +@@ -1,6 +1,6 @@ + #include "stardict_dictdotcn.h" + #include +-#include ++#include + #include + + #ifdef _WIN32 +diff --git a/stardict-plugins/stardict-espeak-tts-plugin/stardict_espeak.cpp b/stardict-plugins/stardict-espeak-tts-plugin/stardict_espeak.cpp +index 08d6f91..340cf5c 100644 +--- a/stardict-plugins/stardict-espeak-tts-plugin/stardict_espeak.cpp ++++ b/stardict-plugins/stardict-espeak-tts-plugin/stardict_espeak.cpp +@@ -1,4 +1,5 @@ + #include "stardict_espeak.h" ++#include + #include + #include + +diff --git a/stardict-plugins/stardict-gucharmap-plugin/stardict_gucharmap.cpp b/stardict-plugins/stardict-gucharmap-plugin/stardict_gucharmap.cpp +index f522e07..855c5fd 100644 +--- a/stardict-plugins/stardict-gucharmap-plugin/stardict_gucharmap.cpp ++++ b/stardict-plugins/stardict-gucharmap-plugin/stardict_gucharmap.cpp +@@ -1,7 +1,8 @@ + #include "stardict_gucharmap.h" + #include + #include +-#include ++#include ++#include + + static char *build_dictdata(char type, const char *definition) + { +diff --git a/stardict-plugins/stardict-html-parsedata-plugin/stardict_html_parsedata.cpp b/stardict-plugins/stardict-html-parsedata-plugin/stardict_html_parsedata.cpp +index 8bb78e8..1803299 100644 +--- a/stardict-plugins/stardict-html-parsedata-plugin/stardict_html_parsedata.cpp ++++ b/stardict-plugins/stardict-html-parsedata-plugin/stardict_html_parsedata.cpp +@@ -1,4 +1,6 @@ + #include "stardict_html_parsedata.h" ++#include ++#include + #include + + #ifdef _WIN32 +diff --git a/stardict-plugins/stardict-man-plugin/stardict_man.cpp b/stardict-plugins/stardict-man-plugin/stardict_man.cpp +index 1587e46..dfd7560 100644 +--- a/stardict-plugins/stardict-man-plugin/stardict_man.cpp ++++ b/stardict-plugins/stardict-man-plugin/stardict_man.cpp +@@ -1,6 +1,6 @@ + #include "stardict_man.h" + #include +-#include ++#include + + static const StarDictPluginSystemInfo *plugin_info = NULL; + static bool need_prefix; +diff --git a/stardict-plugins/stardict-powerword-parsedata-plugin/stardict_powerword_parsedata.cpp b/stardict-plugins/stardict-powerword-parsedata-plugin/stardict_powerword_parsedata.cpp +index 068ebbe..4da5c81 100644 +--- a/stardict-plugins/stardict-powerword-parsedata-plugin/stardict_powerword_parsedata.cpp ++++ b/stardict-plugins/stardict-powerword-parsedata-plugin/stardict_powerword_parsedata.cpp +@@ -1,4 +1,5 @@ + #include "stardict_powerword_parsedata.h" ++#include + #include + + #ifdef _WIN32 +diff --git a/stardict-plugins/stardict-qqwry-plugin/stardict_qqwry.cpp b/stardict-plugins/stardict-qqwry-plugin/stardict_qqwry.cpp +index 65234dc..b5a7046 100644 +--- a/stardict-plugins/stardict-qqwry-plugin/stardict_qqwry.cpp ++++ b/stardict-plugins/stardict-qqwry-plugin/stardict_qqwry.cpp +@@ -1,7 +1,8 @@ + #include "stardict_qqwry.h" + #include + #include +-#include ++#include ++#include + + #ifdef _WIN32 + #include +diff --git a/stardict-plugins/stardict-spell-plugin/stardict_spell.cpp b/stardict-plugins/stardict-spell-plugin/stardict_spell.cpp +index af3e8ae..d5e66af 100644 +--- a/stardict-plugins/stardict-spell-plugin/stardict_spell.cpp ++++ b/stardict-plugins/stardict-spell-plugin/stardict_spell.cpp +@@ -1,4 +1,5 @@ + #include "stardict_spell.h" ++#include + #include + #include + #include +diff --git a/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki2xml.cpp b/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki2xml.cpp +index 0cfade9..f1a0277 100644 +--- a/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki2xml.cpp ++++ b/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki2xml.cpp +@@ -1,5 +1,6 @@ + #include "stardict_wiki2xml.h" + #include "WIKI2XML.h" ++#include + #include + + std::string wiki2xml(std::string &str) +diff --git a/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki_parsedata.cpp b/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki_parsedata.cpp +index fdf5270..8a6f7b0 100644 +--- a/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki_parsedata.cpp ++++ b/stardict-plugins/stardict-wiki-parsedata-plugin/stardict_wiki_parsedata.cpp +@@ -1,5 +1,6 @@ + #include "stardict_wiki_parsedata.h" + #include "stardict_wiki2xml.h" ++#include + #include + + #ifdef _WIN32 +diff --git a/stardict-plugins/stardict-wordnet-plugin/court_widget.cpp b/stardict-plugins/stardict-wordnet-plugin/court_widget.cpp +index 37b227e..1e49f90 100644 +--- a/stardict-plugins/stardict-wordnet-plugin/court_widget.cpp ++++ b/stardict-plugins/stardict-wordnet-plugin/court_widget.cpp +@@ -1,4 +1,5 @@ + #include "court_widget.h" ++#include + #include + #include + +diff --git a/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet.cpp b/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet.cpp +index 043afaf..bc4c9ff 100644 +--- a/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet.cpp ++++ b/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet.cpp +@@ -1,5 +1,6 @@ + #include "stardict_wordnet.h" + #include "court_widget.h" ++#include + #include + + #ifdef _WIN32 +diff --git a/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet_parsedata.cpp b/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet_parsedata.cpp +index 9f9ab9f..c5397e1 100644 +--- a/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet_parsedata.cpp ++++ b/stardict-plugins/stardict-wordnet-plugin/stardict_wordnet_parsedata.cpp +@@ -1,4 +1,5 @@ + #include "stardict_wordnet_parsedata.h" ++#include + #include + + #ifdef _WIN32 +diff --git a/stardict-plugins/stardict-xdxf-parsedata-plugin/stardict_xdxf_parsedata.cpp b/stardict-plugins/stardict-xdxf-parsedata-plugin/stardict_xdxf_parsedata.cpp +index 905a01d..b143b90 100644 +--- a/stardict-plugins/stardict-xdxf-parsedata-plugin/stardict_xdxf_parsedata.cpp ++++ b/stardict-plugins/stardict-xdxf-parsedata-plugin/stardict_xdxf_parsedata.cpp +@@ -1,4 +1,5 @@ + #include "stardict_xdxf_parsedata.h" ++#include + #include + + #ifdef _WIN32 +diff --git a/tests/t_config_file.cpp b/tests/t_config_file.cpp +index 73e2a52..24715cf 100644 +--- a/tests/t_config_file.cpp ++++ b/tests/t_config_file.cpp +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + + #include "config_file.hpp" +diff --git a/tests/t_xml.cpp b/tests/t_xml.cpp +index a20422d..29b3d2a 100644 +--- a/tests/t_xml.cpp ++++ b/tests/t_xml.cpp +@@ -5,6 +5,7 @@ + #include + #include + #include ++#include + + + static void xml_decode(const char *str, std::string& decoded) diff --git a/stardict/patches/002-dont-need-hotkey-in-nanonote.patch b/stardict/patches/002-dont-need-hotkey-in-nanonote.patch new file mode 100644 index 0000000..42430ca --- /dev/null +++ b/stardict/patches/002-dont-need-hotkey-in-nanonote.patch @@ -0,0 +1,504 @@ +don't need hotkey in nanonote + +From: Xiangfu Liu + + +--- + + configure.in | 2 + src/class_factory.cpp | 2 + src/conf.cpp | 6 - + src/stardict.cpp | 6 - + src/x11_iskeyspressed.cpp | 351 --------------------------------------------- + src/x11_iskeyspressed.hpp | 65 -------- + 6 files changed, 8 insertions(+), 424 deletions(-) + + +diff --git a/configure.in b/configure.in +index 83d3d95..3676e2c 100644 +--- a/configure.in ++++ b/configure.in +@@ -428,7 +428,7 @@ LDFLAGS="$LDFLAGS $X_EXTRA_LIBS" + fi + + # Checks for libraries. +-AC_CHECK_LIB([X11], [main], , [AC_MSG_ERROR([X11 lib not found])]) ++#AC_CHECK_LIB([X11], [main], , [AC_MSG_ERROR([X11 lib not found])]) + + AC_SUBST(STARDICT_LIBS) + AC_SUBST(STARDICT_CFLAGS) +diff --git a/src/class_factory.cpp b/src/class_factory.cpp +index 8bff538..d1dddc2 100644 +--- a/src/class_factory.cpp ++++ b/src/class_factory.cpp +@@ -54,7 +54,7 @@ void *PlatformFactory::create_class_by_name(const std::string& name, void *param + #ifdef _WIN32 + return new win32_hotkeys(); + #else +- return new x11_hotkeys(GTK_WINDOW(param)); ++ return NULL; //new x11_hotkeys(GTK_WINDOW(param)); + #endif + } + return NULL; +diff --git a/src/conf.cpp b/src/conf.cpp +index 2d0f89d..a35bc5c 100644 +--- a/src/conf.cpp ++++ b/src/conf.cpp +@@ -34,9 +34,9 @@ const int DEFAULT_WINDOW_WIDTH=238; + const int DEFAULT_WINDOW_HEIGHT=279; + const int DEFAULT_HPANED_POS=79; + #else +-const int DEFAULT_WINDOW_WIDTH=463; +-const int DEFAULT_WINDOW_HEIGHT=321; +-const int DEFAULT_HPANED_POS=127; ++const int DEFAULT_WINDOW_WIDTH=320; ++const int DEFAULT_WINDOW_HEIGHT=240; ++const int DEFAULT_HPANED_POS=79; + #endif + + std::auto_ptr conf; +diff --git a/src/stardict.cpp b/src/stardict.cpp +index 326ca4a..4c51d61 100644 +--- a/src/stardict.cpp ++++ b/src/stardict.cpp +@@ -351,9 +351,9 @@ void AppCore::Create(gchar *queryword) + oTopWin.Create(vbox); + oMidWin.Create(vbox); + oBottomWin.Create(vbox); +- unlock_keys.reset(static_cast(PlatformFactory::create_class_by_name("hotkeys", +- GTK_WINDOW(window)))); +- unlock_keys->set_comb(combnum2str(conf->get_int_at("dictionary/scan_modifier_key"))); ++ //unlock_keys.reset(static_cast(PlatformFactory::create_class_by_name("hotkeys", ++ // GTK_WINDOW(window)))); ++ //unlock_keys->set_comb(combnum2str(conf->get_int_at("dictionary/scan_modifier_key"))); + oFloatWin.Create(); + bool scan=conf->get_bool_at("dictionary/scan_selection"); + oDockLet.reset(PlatformFactory::create_tray_icon(window, scan, +diff --git a/src/x11_iskeyspressed.cpp b/src/x11_iskeyspressed.cpp +index 15e8fb0..8b13789 100644 +--- a/src/x11_iskeyspressed.cpp ++++ b/src/x11_iskeyspressed.cpp +@@ -1,352 +1 @@ +-/* +- * This file part of StarDict - A international dictionary for GNOME. +- * http://stardict.sourceforge.net +- * +- * Copyright (C) 2005 Evgeniy +- * +- * 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 program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU Library General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +- */ + +-/* +- * goal: react on key press even if there are window +- * have no focus in XWindows. This code based on xbindkeys. +- */ +- +-#ifdef HAVE_CONFIG_H +-# include "config.h" +-#endif +- +-#include "gtk_iskeyspressed.hpp" +- +-#include "x11_iskeyspressed.hpp" +- +- +- +-unsigned int x11_hotkeys::numlock_mask, x11_hotkeys::scrolllock_mask, +- x11_hotkeys::capslock_mask; +- +-void x11_hotkeys::get_offending_modifiers(Display * dpy) +-{ +- int i; +- XModifierKeymap *modmap; +- KeyCode nlock, slock; +- static int mask_table[8] = { +- ShiftMask, LockMask, ControlMask, Mod1Mask, +- Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask +- }; +- +- nlock = XKeysymToKeycode (dpy, XK_Num_Lock); +- slock = XKeysymToKeycode (dpy, XK_Scroll_Lock); +- +- /* +- * Find out the masks for the NumLock and ScrollLock modifiers, +- * so that we can bind the grabs for when they are enabled too. +- */ +- modmap = XGetModifierMapping (dpy); +- +- if (modmap != NULL && modmap->max_keypermod > 0) { +- for (i = 0; i < 8 * modmap->max_keypermod; i++) { +- if (modmap->modifiermap[i] == nlock && nlock != 0) +- numlock_mask = mask_table[i / modmap->max_keypermod]; +- else if (modmap->modifiermap[i] == slock && slock != 0) +- scrolllock_mask = mask_table[i / modmap->max_keypermod]; +- } +- } +- +- capslock_mask = LockMask; +- +- if (modmap) +- XFreeModifiermap (modmap); +-} +- +-void x11_hotkeys::my_grab_key(Display * dpy, KeyCode keycode, +- unsigned int modifier, Window win) +-{ +- modifier &= ~(numlock_mask | capslock_mask | scrolllock_mask); +- +- +- XGrabKey(dpy, keycode, modifier, (win ? win : DefaultRootWindow(dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (modifier == AnyModifier) +- return; +- +- if (numlock_mask) +- XGrabKey (dpy, keycode, modifier | numlock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (capslock_mask) +- XGrabKey (dpy, keycode, modifier | capslock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (scrolllock_mask) +- XGrabKey (dpy, keycode, modifier | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (numlock_mask && capslock_mask) +- XGrabKey (dpy, keycode, modifier | numlock_mask | capslock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (numlock_mask && scrolllock_mask) +- XGrabKey (dpy, keycode, modifier | numlock_mask | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (capslock_mask && scrolllock_mask) +- XGrabKey (dpy, keycode, modifier | capslock_mask | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, GrabModeAsync, GrabModeAsync); +- +- if (numlock_mask && capslock_mask && scrolllock_mask) +- XGrabKey (dpy, keycode, +- modifier | numlock_mask | capslock_mask | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), False, GrabModeAsync, +- GrabModeAsync); +- +-} +- +- +-void x11_hotkeys::my_grab_button(Display * dpy, unsigned int button, +- unsigned int modifier, Window win) +-{ +- modifier &= ~(numlock_mask | capslock_mask | scrolllock_mask); +- +- XGrabButton (dpy, button, modifier, (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- if (modifier == AnyModifier) +- return; +- +- if (numlock_mask) +- XGrabButton (dpy, button, modifier | numlock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- +- if (capslock_mask) +- XGrabButton (dpy, button, modifier | capslock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- if (scrolllock_mask) +- XGrabButton (dpy, button, modifier | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- if (numlock_mask && capslock_mask) +- XGrabButton (dpy, button, modifier | numlock_mask | capslock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- if (numlock_mask && scrolllock_mask) +- XGrabButton (dpy, button, modifier | numlock_mask | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- if (capslock_mask && scrolllock_mask) +- XGrabButton (dpy, button, modifier | capslock_mask | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), +- False, ButtonPressMask | ButtonReleaseMask, +- GrabModeAsync, GrabModeAsync, None, None); +- +- if (numlock_mask && capslock_mask && scrolllock_mask) +- XGrabButton (dpy, button, +- modifier | numlock_mask | capslock_mask | scrolllock_mask, +- (win ? win : DefaultRootWindow (dpy)), False, +- ButtonPressMask | ButtonReleaseMask, GrabModeAsync, +- GrabModeAsync, None, None); +-} +- +-bool x11_hotkeys::grab_keys(Display *dpy, Keys_t keys[], int nb_keys) +-{ +- int i; +- int min, max; +- int screen; +- +- +- XDisplayKeycodes(dpy, &min, &max); +- +-#ifdef DEBUG +- printf("\n"); +- printf("min_keycode=%d max_keycode=%d (ie: know keycodes)\n", +- min, max); +-#endif +- +- +- for (i = 0; i < nb_keys; i++) { +-#ifdef DEBUG +- print_key(dpy, &keys[i]); +-#endif +- if (keys[i].type == SYM) { +- for (screen = 0; screen < ScreenCount (dpy); screen++) { +- my_grab_key(dpy, XKeysymToKeycode(dpy, keys[i].key.sym), +- keys[i].modifier, RootWindow(dpy, screen)); +- } +- } else if (keys[i].type == BUTTON) { +- for (screen = 0; screen < ScreenCount (dpy); screen++) { +- my_grab_button(dpy, keys[i].key.button, keys[i].modifier, +- RootWindow (dpy, screen)); +- } +- } else { +- if (keys[i].key.code >= min && keys[i].key.code <= max) { +- for (screen = 0; screen < ScreenCount (dpy); screen++) { +- my_grab_key (dpy, keys[i].key.code, keys[i].modifier, +- RootWindow (dpy, screen)); +- } +- } else { +-#ifdef DEBUG +- print_key (dpy, &keys[i]); +- +- +- fprintf (stderr, +- " The keycode %d cannot be used, as it's not between the\n" +- " min(%d) and max(%d) keycode of your keyboard.\n" +- " Please increase the 'maximum' value in\n" +- " /usr/X11R6/lib/X11/xkb/keycodes/xfree86,\n" +- " then restart X.\n", keys[i].key.code, min, max); +-#endif +- return false; +- } +- } +- } +- +- return true; +-} +- +- +-x11_hotkeys::x11_hotkeys(GtkWindow *win_) : +- win(win_), +- pressed(false), +- def_hot_keys(new gtk_hotkeys(win_)) +-{ +- possb_combs=def_hot_keys->possible_combs(); +- possb_combs.push_back("Ctrl+e"); +- possb_combs.push_back("F1"); +- possb_combs.push_back("F2"); +- possb_combs.push_back("F3"); +- possb_combs.push_back("F4"); +- display=gdk_x11_display_get_xdisplay(gdk_screen_get_display(gtk_window_get_screen(win))); +- get_offending_modifiers(display); +- gdk_window_add_filter(NULL, GdkFilterFunc(key_filter), this); +-} +- +-x11_hotkeys::~x11_hotkeys() +-{ +- ungrabkeys(); +-} +- +-const std::list& x11_hotkeys::possible_combs() +-{ +- return possb_combs; +-} +- +-void x11_hotkeys::set_comb(const std::string& val) +-{ +- if (comb==val) +- return; +- +- unsigned int modifier=0; +- KeySym key=0; +- std::string::size_type pos=std::string::npos; +- +- do { +- std::string::size_type prev_pos=pos; +- pos=val.find('+', pos+1); +- std::string cur; +- if (pos!=std::string::npos) +- cur.assign(val, prev_pos+1, pos-prev_pos-1); +- else +- cur.assign(val, prev_pos+1, val.length()-prev_pos-1); +- if (cur=="Ctrl") { +- modifier|=ControlMask; +- } else if (cur=="Alt") { +- modifier|=Mod1Mask; +- } else if (cur=="Shift") { +- modifier|=ShiftMask; +- } else if (cur=="Win") { +- modifier|=Mod4Mask; +- } else { +- key=XStringToKeysym(cur.c_str()); +- } +- } while (pos!=std::string::npos); +- +- comb=val; +- pressed=false; +- grab_key.key.sym=0; +- if (key!=0) { +- ungrabkeys(); +- grab_key.type=SYM; +- grab_key.event_type=PRESS; +- grab_key.key.sym=key; +- grab_key.modifier=modifier; +- grab_keys(display, &grab_key, 1); +- } else +- def_hot_keys->set_comb(val); +-} +- +-bool x11_hotkeys::is_pressed() +-{ +- if (grab_key.key.sym!=0) +- return pressed; +- +- return def_hot_keys->is_pressed(); +-} +- +-void x11_hotkeys::ungrabkeys() +-{ +- if (grab_key.key.sym==0) +- return; +- Display *d=display; +- +- for (int screen = 0; screentype; +- KeySym keysym = XKeycodeToKeysym(GDK_DISPLAY(), ((XKeyEvent *)xevent)->keycode, 0); +- unsigned int state=xevent->state; +- state &= ~(numlock_mask | capslock_mask | scrolllock_mask); +- if (type == KeyPress) { +- if (keysym==th->grab_key.key.sym && state==th->grab_key.modifier) { +- th->pressed=true; +- } +- } else if (type==KeyRelease) { +- if (keysym==th->grab_key.key.sym) { +- th->pressed=false; +- } +- } +- +- return GDK_FILTER_CONTINUE; +-} +diff --git a/src/x11_iskeyspressed.hpp b/src/x11_iskeyspressed.hpp +index f7391ad..8b13789 100644 +--- a/src/x11_iskeyspressed.hpp ++++ b/src/x11_iskeyspressed.hpp +@@ -1,66 +1 @@ +-#ifndef _X11_ISKEYSPRESSED_HPP_ +-#define _X11_ISKEYSPRESSED_HPP_ + +-#include +- +-#include +-#include +-#include +- +-#include "iskeyspressed.hpp" +- +-typedef enum { SYM, CODE, BUTTON } KeyType_t; +-typedef enum { PRESS, RELEASE } EventType_t; +- +-struct Keys_t { +- +- KeyType_t type; +- +- EventType_t event_type; +- +- union { +- KeySym sym; +- KeyCode code; +- unsigned int button; +- } key; +- +- unsigned int modifier; +- +- Keys_t(KeyType_t t=SYM, EventType_t et=PRESS, KeySym s=0, unsigned int m=0) : +- type(t), event_type(et), modifier(m) +- { +- key.sym=s; +- } +-}; +- +-class x11_hotkeys : public hotkeys { +-public: +- x11_hotkeys(GtkWindow *win_); +- ~x11_hotkeys(); +- const std::list& possible_combs(); +- void set_comb(const std::string& comb); +- bool is_pressed(); +-private: +- std::string comb; +- GtkWindow *win; +- bool pressed; +- Keys_t grab_key; +- std::list possb_combs; +- std::auto_ptr def_hot_keys;/*I don't want to duplicate work, +- so hold here pointer to default +- object of this class*/ +- Display *display; +- static unsigned int numlock_mask, scrolllock_mask, capslock_mask; +- +- static GdkFilterReturn key_filter(GdkXEvent *gdk_xevent, +- GdkEvent *event, x11_hotkeys *th); +- void ungrabkeys(void); +- static void get_offending_modifiers(Display * dpy); +- static void my_grab_key(Display * dpy, KeyCode keycode, +- unsigned int modifier, Window win); +- static void my_grab_button(Display * dpy, unsigned int button, +- unsigned int modifier, Window win); +- static bool grab_keys(Display *dpy, Keys_t keys[], int nb_keys); +-}; +- +-#endif//!_X11_ISKEYSPRESSED_HPP_