summaryrefslogtreecommitdiffstats
path: root/khotkeys
diff options
context:
space:
mode:
Diffstat (limited to 'khotkeys')
-rw-r--r--khotkeys/AUTHORS1
-rw-r--r--khotkeys/Makefile.am10
-rw-r--r--khotkeys/README130
-rw-r--r--khotkeys/TODO82
-rw-r--r--khotkeys/app/Makefile.am21
-rw-r--r--khotkeys/app/app.cpp158
-rw-r--r--khotkeys/app/app.h43
-rw-r--r--khotkeys/app/kded.cpp103
-rw-r--r--khotkeys/app/kded.h44
-rw-r--r--khotkeys/app/khotkeys.desktop43
-rw-r--r--khotkeys/arts/Makefile.am11
-rw-r--r--khotkeys/arts/soundrecorder_arts.cpp141
-rw-r--r--khotkeys/arts/soundrecorder_arts.h63
-rw-r--r--khotkeys/arts/voicerecorder_arts.cpp40
-rw-r--r--khotkeys/configure.in.in68
-rw-r--r--khotkeys/data/Makefile.am7
-rw-r--r--khotkeys/data/kde32b1.khotkeys1746
-rw-r--r--khotkeys/data/khotkeys_32b1_update.upd8
-rw-r--r--khotkeys/data/khotkeys_printscreen.upd8
-rw-r--r--khotkeys/data/konqueror_gestures_kde321.khotkeys2042
-rw-r--r--khotkeys/data/konqueror_gestures_kde321_update.upd8
-rw-r--r--khotkeys/data/printscreen.khotkeys198
-rw-r--r--khotkeys/kcontrol/Makefile.am40
-rw-r--r--khotkeys/kcontrol/action_group_tab.cpp94
-rw-r--r--khotkeys/kcontrol/action_group_tab.h46
-rw-r--r--khotkeys/kcontrol/action_list_widget.cpp354
-rw-r--r--khotkeys/kcontrol/action_list_widget.h205
-rw-r--r--khotkeys/kcontrol/actions_listview_widget.cpp189
-rw-r--r--khotkeys/kcontrol/actions_listview_widget.h151
-rw-r--r--khotkeys/kcontrol/activate_window_widget.h28
-rw-r--r--khotkeys/kcontrol/command_url_widget.cpp70
-rw-r--r--khotkeys/kcontrol/command_url_widget.h44
-rw-r--r--khotkeys/kcontrol/condition_list_widget.cpp395
-rw-r--r--khotkeys/kcontrol/condition_list_widget.h165
-rw-r--r--khotkeys/kcontrol/dcop_widget.cpp95
-rw-r--r--khotkeys/kcontrol/dcop_widget.h45
-rw-r--r--khotkeys/kcontrol/general_settings_tab.cpp56
-rw-r--r--khotkeys/kcontrol/general_settings_tab.h39
-rw-r--r--khotkeys/kcontrol/general_tab.cpp136
-rw-r--r--khotkeys/kcontrol/general_tab.h47
-rw-r--r--khotkeys/kcontrol/gesture_triggers_tab.cpp161
-rw-r--r--khotkeys/kcontrol/gesture_triggers_tab.h66
-rw-r--r--khotkeys/kcontrol/gesturedrawer.cpp161
-rw-r--r--khotkeys/kcontrol/gesturedrawer.h50
-rw-r--r--khotkeys/kcontrol/gesturerecorder.cpp67
-rw-r--r--khotkeys/kcontrol/gesturerecorder.h48
-rw-r--r--khotkeys/kcontrol/gesturerecordpage.cpp147
-rw-r--r--khotkeys/kcontrol/gesturerecordpage.h61
-rw-r--r--khotkeys/kcontrol/gestures_settings_tab.cpp76
-rw-r--r--khotkeys/kcontrol/gestures_settings_tab.h37
-rw-r--r--khotkeys/kcontrol/hi16-app-khotkeys.pngbin0 -> 486 bytes
-rw-r--r--khotkeys/kcontrol/hi32-app-khotkeys.pngbin0 -> 1333 bytes
-rw-r--r--khotkeys/kcontrol/info_tab.cpp40
-rw-r--r--khotkeys/kcontrol/info_tab.h35
-rw-r--r--khotkeys/kcontrol/init.cpp47
-rw-r--r--khotkeys/kcontrol/kcmkhotkeys.cpp318
-rw-r--r--khotkeys/kcontrol/kcmkhotkeys.h170
-rw-r--r--khotkeys/kcontrol/keyboard_input_widget.cpp101
-rw-r--r--khotkeys/kcontrol/keyboard_input_widget.h44
-rw-r--r--khotkeys/kcontrol/khotkeys.desktop208
-rw-r--r--khotkeys/kcontrol/main_buttons_widget.cpp51
-rw-r--r--khotkeys/kcontrol/main_buttons_widget.h39
-rw-r--r--khotkeys/kcontrol/menuedit.cpp359
-rw-r--r--khotkeys/kcontrol/menuedit.h44
-rw-r--r--khotkeys/kcontrol/menuentry_widget.cpp70
-rw-r--r--khotkeys/kcontrol/menuentry_widget.h44
-rw-r--r--khotkeys/kcontrol/tab_widget.cpp484
-rw-r--r--khotkeys/kcontrol/tab_widget.h136
-rw-r--r--khotkeys/kcontrol/triggers_tab.cpp366
-rw-r--r--khotkeys/kcontrol/triggers_tab.h206
-rw-r--r--khotkeys/kcontrol/ui/Makefile.am21
-rw-r--r--khotkeys/kcontrol/ui/action_group_tab_ui.ui108
-rw-r--r--khotkeys/kcontrol/ui/action_list_widget_ui.ui171
-rw-r--r--khotkeys/kcontrol/ui/actions_listview_widget_ui.ui83
-rw-r--r--khotkeys/kcontrol/ui/command_url_widget_ui.ui66
-rw-r--r--khotkeys/kcontrol/ui/condition_list_widget_ui.ui170
-rw-r--r--khotkeys/kcontrol/ui/dcop_widget_ui.ui273
-rw-r--r--khotkeys/kcontrol/ui/general_settings_tab_ui.ui117
-rw-r--r--khotkeys/kcontrol/ui/general_tab_ui.ui148
-rw-r--r--khotkeys/kcontrol/ui/gesture_triggers_tab_ui.ui519
-rw-r--r--khotkeys/kcontrol/ui/gestures_settings_tab_ui.ui160
-rw-r--r--khotkeys/kcontrol/ui/info_tab_ui.ui64
-rw-r--r--khotkeys/kcontrol/ui/keyboard_input_widget_ui.ui193
-rw-r--r--khotkeys/kcontrol/ui/main_buttons_widget_ui.ui86
-rw-r--r--khotkeys/kcontrol/ui/menuentry_widget_ui.ui100
-rw-r--r--khotkeys/kcontrol/ui/triggers_tab_ui.ui171
-rw-r--r--khotkeys/kcontrol/ui/voice_input_widget_ui.ui104
-rw-r--r--khotkeys/kcontrol/ui/voice_settings_tab_ui.ui107
-rw-r--r--khotkeys/kcontrol/ui/window_trigger_widget_ui.ui131
-rw-r--r--khotkeys/kcontrol/ui/windowdef_list_widget_ui.ui170
-rw-r--r--khotkeys/kcontrol/ui/windowdef_simple_widget_ui.ui493
-rw-r--r--khotkeys/kcontrol/voice_settings_tab.cpp68
-rw-r--r--khotkeys/kcontrol/voice_settings_tab.h41
-rw-r--r--khotkeys/kcontrol/voicerecorder.cpp203
-rw-r--r--khotkeys/kcontrol/voicerecorder.h73
-rw-r--r--khotkeys/kcontrol/voicerecordpage.cpp124
-rw-r--r--khotkeys/kcontrol/voicerecordpage.h64
-rw-r--r--khotkeys/kcontrol/window_trigger_widget.cpp84
-rw-r--r--khotkeys/kcontrol/window_trigger_widget.h41
-rw-r--r--khotkeys/kcontrol/windowdef_list_widget.cpp239
-rw-r--r--khotkeys/kcontrol/windowdef_list_widget.h160
-rw-r--r--khotkeys/kcontrol/windowdef_simple_widget.cpp183
-rw-r--r--khotkeys/kcontrol/windowdef_simple_widget.h51
-rw-r--r--khotkeys/kcontrol/windowselector.cpp92
-rw-r--r--khotkeys/kcontrol/windowselector.h40
-rw-r--r--khotkeys/khotkeys.desktop2
-rw-r--r--khotkeys/shared/Makefile.am15
-rw-r--r--khotkeys/shared/action_data.cpp378
-rw-r--r--khotkeys/shared/action_data.h446
-rw-r--r--khotkeys/shared/actions.cpp450
-rw-r--r--khotkeys/shared/actions.h305
-rw-r--r--khotkeys/shared/conditions.cpp504
-rw-r--r--khotkeys/shared/conditions.h296
-rw-r--r--khotkeys/shared/gestures.cpp449
-rw-r--r--khotkeys/shared/gestures.h122
-rw-r--r--khotkeys/shared/input.cpp253
-rw-r--r--khotkeys/shared/input.h87
-rw-r--r--khotkeys/shared/khlistbox.cpp103
-rw-r--r--khotkeys/shared/khlistbox.h64
-rw-r--r--khotkeys/shared/khlistview.cpp122
-rw-r--r--khotkeys/shared/khlistview.h69
-rw-r--r--khotkeys/shared/khotkeysglobal.cpp100
-rw-r--r--khotkeys/shared/khotkeysglobal.h59
-rw-r--r--khotkeys/shared/settings.cpp265
-rw-r--r--khotkeys/shared/settings.h61
-rw-r--r--khotkeys/shared/sound.cpp343
-rw-r--r--khotkeys/shared/sound.h58
-rw-r--r--khotkeys/shared/soundrecorder.cpp86
-rw-r--r--khotkeys/shared/soundrecorder.h62
-rw-r--r--khotkeys/shared/triggers.cpp435
-rw-r--r--khotkeys/shared/triggers.h260
-rw-r--r--khotkeys/shared/voices.cpp303
-rw-r--r--khotkeys/shared/voices.h83
-rw-r--r--khotkeys/shared/voicesignature.cpp422
-rw-r--r--khotkeys/shared/voicesignature.h101
-rw-r--r--khotkeys/shared/windows.cpp376
-rw-r--r--khotkeys/shared/windows.h264
-rw-r--r--khotkeys/update/Makefile.am11
-rw-r--r--khotkeys/update/update.cpp62
-rw-r--r--khotkeys/wrk/cpp_template20
-rw-r--r--khotkeys/wrk/header_template23
-rwxr-xr-xkhotkeys/wrk/new14
142 files changed, 22801 insertions, 0 deletions
diff --git a/khotkeys/AUTHORS b/khotkeys/AUTHORS
new file mode 100644
index 000000000..9e7ed1fd0
--- /dev/null
+++ b/khotkeys/AUTHORS
@@ -0,0 +1 @@
+Lubos Lunak <[email protected]>
diff --git a/khotkeys/Makefile.am b/khotkeys/Makefile.am
new file mode 100644
index 000000000..981a8a9b6
--- /dev/null
+++ b/khotkeys/Makefile.am
@@ -0,0 +1,10 @@
+SUBDIRS = shared kcontrol app data update $(KHOTKEYS_ARTS_SUBDIR)
+
+khotkeys_autostart_DATA = khotkeys.desktop
+khotkeys_autostartdir = $(datadir)/autostart
+
+EXTRA_DIST = $(khotkeys_autostart_DATA) COPYING AUTHORS
+
+messages: rc.cpp
+ $(EXTRACTRC) kcontrol/ui/*.ui data/*.khotkeys >> rc.cpp
+ $(XGETTEXT) rc.cpp app/*.cpp shared/*.cpp shared/*.h kcontrol/*.cpp -o $(podir)/khotkeys.pot
diff --git a/khotkeys/README b/khotkeys/README
new file mode 100644
index 000000000..c490cbc5d
--- /dev/null
+++ b/khotkeys/README
@@ -0,0 +1,130 @@
+
+ This README is a bit outdated.
+
+------------------
+
+
+ KHotKeys README
+
+
+ Please read this file carefully.
+
+
+ WARNING !
+ This is an unstable version , and as such it's buggy, poorly documented
+ and there are still features that are not implemented yet. It's aimed
+ mainly at users who used to use the KDE1.x versions of KHotKeys ( or are
+ smart enough to learn something complicated without having good docs
+ for it :) ). Calling it KHotKeys-2.0.0pre2 is a rather cruel joke.
+ You've been warned.
+
+
+ The 2.x version of KHotKeys is a complete rewrite from scratch, and
+ the name KHotKeys is actually rather misleading by now ( and it has never
+ been really correct if I understand what the difference between a hotkey
+ and a keyboard shortcut is ... well, never mind ... ). KHotKeys2.x should
+ be capable of doing everything the 1.x versions could do, and much more,
+ of course.
+
+ In short, KHotKeys is a utility that allows you to bind actions to triggers
+ and conditions. The most common case is where action means launching some
+ command/application/URL, the trigger is some key combination pressed and
+ condition is some window being ( not ) active/existing. There are
+ ( or will be ) more types of actions, triggers and conditions.
+
+ INSTALLATION :
+
+ The recommended KDE version is KDE3.1 ( unreleased yet at this time :-> ),
+ at least snapshot 20020108. I haven't tested it with any older versions,
+ so I don't know if it will work with them or not.
+
+ During installation, the files will replace the ones that are part
+ of the simple version in kdebase. Shortcuts assigned using KMenuEdit
+ should still work, and the config file will be converted to the new format.
+ However, you should backup all files before removing them ( including
+ the config file ), so you will be able to go back in case there will be
+ a serious problem with this version. The files you should remove
+ and backup before installing the new version are :
+ - $KDEDIR/bin/khotkeys
+ - $KDEDIR/lib/libkcm_khotkeys.la
+ - $KDEDIR/lib/libkcm_khotkeys.so
+ - $KDEDIR/lib/kde3/libkcm_khotkeys.la
+ - $KDEDIR/lib/kde3/libkcm_khotkeys.so
+ - $KDEDIR/lib/khotkeys.la
+ - $KDEDIR/lib/khotkeys.so
+ - $KDEDIR/lib/libkhotkeys.la
+ - $KDEDIR/lib/libkhotkeys.so
+ - $KDEDIR/share/autostart/khotkeys.desktop
+ - $KDEHOME/share/config/khotkeysrc
+ Not all these files exist, depending on your KDE and OS version. It's simply
+ all files having 'khotkeys' in their name.
+ Ok, now the standard install ( ./configure && make && make install ), and
+ now you can start you KDE.
+
+ CONFIGURATION :
+
+ The configuration module is started using K-Menu/Settings/System/KHotKeys .
+ If you have used the 1.x version ( you have, haven't you ? ), it will look
+ familiar. On the left, there's a list of all actions, they may be put
+ in groups. On the right, there are several tabs with details for
+ currently selected action, or an info tab when no action is selected ( no,
+ don't bother, the 'Global settings...' button doesn't do anything useful
+ yet, besides going down and up ).
+
+ The first tab ( 'General' ) lets you to select the type of the action.
+ You can either select 'Generic' type, allowing you to create any kind
+ of action, or some simple predefined actions, like launching an application
+ on keyboard shortcut press.
+
+ The second tab is the 'Triggers' tab for the 'Generic' type action,
+ or a tab specifying only the trigger for a specialized action (e.g.
+ a keyboard shortcut). Here you can specify trigger(s) that will start
+ this action, if conditions for it will be met.
+ The types available now are :
+ - Shortcut trigger - a keyboard combination is pressed
+ - Gesture trigger - press middle mouse button and start drawing ...
+ - Window trigger - a window appears, becomes active, ...
+
+ The next tab is settings for the action. ( Just in case you haven't noticed
+ yet, I'm apparently not very good at inventing good fitting names. 'Action'
+ in KHotKeys means either a whole action, e.g. 'run a new Konsole when
+ Ctrl+Alt+T is pressed and the active window is not a Konsole', or it can
+ mean just the resulting action, i.e. only 'run a new Konsole'. Live with it
+ or suggest better names ).
+ - Command/URL tab settings - enter the command or URL to execute ( no,
+ the 'Browse' doesn't do anything useful yet ).
+ - K-Menu entry tab settings - just like the Command/URL tab, only enter
+ a .desktop file from the K-Menu to execute (e.g. 'System/konsole.desktop')
+ - DCOP call tab settings - enter the application, object, DCOP method and
+ arguments (e.g. 'kdesktop', 'KBackgroundIface',
+ 'setWallpaper(QString,int)' and '"/some/pic.jpg" 1')
+ - Keyboard input tab settings - enter the keyboard input you want to be
+ simulated ( no, sorry, the 'Edit' button doesn't really work yet ).
+ The "keypresses" are separated by a colon ( ':' ) and are written
+ in the form the are seen e.g. in the keybindings dialog ( e.g. to enter
+ a colon, you have to type 'Shift+;' ). The 'send to specific window'
+ checkbox and the window definition allow you to specify that the input
+ shouldn't be sent to the currently active window but to a window that
+ matches the definition. Note that certain things, like triggering
+ Ctrl+F1 for going to the first desktop, don't work yet.
+
+ The last tab is 'Conditions'. If there are any conditions specified, the action
+ will be active only if the at least one of the conditions is true. If the action
+ is in a group which also has conditions, at least one of the conditions
+ in the group must be true too.
+ Conditions are mainly specified using window definitions, the only type now
+ available is a simple window definition. You can specify a window title, class,
+ command and type ( again, the 'Autodetect...' button doesn't work yet ). Title
+ is easy, to get the window class and command, run 'xprop' in Konsole and click
+ on a window; then search for WM_CLASS and WM_COMMAND.
+
+ EXAMPLES :
+
+ Ok, as I guess the things written above aren't that good explanation, I've
+ included a sample configuration file. Put it in $KDEHOME/share/config/khotkeysrc.
+ Every action is explained in its comment field. Note that all the actions are
+ disabled, so you'll have to enable them in order to use them.
+
+ KHotKeys Copyright 1999-2002 Lubos Lunak <[email protected]>
+ Distributed under the terms of the GNU General Public License version 2.
+
diff --git a/khotkeys/TODO b/khotkeys/TODO
new file mode 100644
index 000000000..7db646b66
--- /dev/null
+++ b/khotkeys/TODO
@@ -0,0 +1,82 @@
+test
+
+very soon :
+-------------------------------
+-------------------------------
+
+------------
+
+SOON :
+
+pri modify gestures vymazat stav
+nektere simple akce by mely mit i conditions (nebo alespon jedno okno)
+QPtrList -> QValueList
+pouzit Q/KApp( nogui ? ) v daemonu ?
+class Condition + tab 'Windows' -> 'Conditions'
+ - asi rozdelit Command/URL na Command/URL a SwitchToWindow
+ - nebo udelat, ze Command_url_action_data ( atd. ) maji jen jednu shortcut a tak, tj. dalsi zjednoduseni UI ?
+hlaska o uz prirazene kl.kombinaci pro makro se opakuje i vicekrat ( pro kazde uz existujici )
+rucni smazani radku nemaze makro pro editaci v dialogu
+ted uz ten timeout u spusteni funguje ok, ale zase kdyz chci pustit neco 2x naraz, tak se musi cekat ???
+taky to pri jeho rucni editaci neni obcas videt ( je to moc vpravo )
+grrr, to setSelected()/setCurrent() me stve, vsechny ty listboxy a listview obcas spatne detekuji vybrany :(
+ - asi si zkratka udelat vlastni tridy, ktere budou nutit selected==current
+ve windowdef widgetu mit moznost autodetekce, tj. defaultni, kdyz neni nastaven spousteci prikaz
+
+2.x :
+
+XBell() potvrzeni, ze se neco provedlo?
+ - nebo spis neco jako XOSD?
+asi varovani, kdyz neco nema prirazeno hotkey
+pres script at se aktivuje
+at se pri autodetect properties da clicknutim aktivovat dane okno
+neco s tim e->ignore() v KKeyChooser
+ + vypisuje anglicky nazev akce pri konfliktu
+at si okno pamatuje svoji velikost ? - bohuzel nejde :(
+co kdyz se bude editovat spatne ( asfa:afasdf:aff ) macro ?
+ a co to udela v daemonu ?
+udelat v makru i pohyby mysi ?
+co ten napad, ze kdelnk obsahuje taky command/title/class a chova se pri spousteni jako khotkeys ?
+pokec o Win klavese a o tech, co nejdou ( SysReq? atd. )
+asi poznamku, ze to <2> pridavane kwm pri vice stejnych title se ignoruje
+mozna u tech keystrokes zkusit polling na XQueryPointer() ?
+poradne updatovat dokumentaci
+pri pridavani nove polozky v editaci makra na nej nastavit pozici v listboxu ( muze byt mimo obrazovku )
+/usr/X11R6/lib/X11/xkb/compat/mousekeys ???
+drag&drop .kdelnk souboru ?
+mozna by slo pro rozliseni ruznych instanci stejnych app, aby KHotKeys nahodily pri jejich startovani nejakou X property, podle ktere by slo identifikovat
+asi by mela jit akce i pri vice ruznych oknech
+funguje pusteni jen jednou i pri vicenasobnem stisku ?
+asi padne autodetekce okna, kdyz se prepne na prazdny desktop
+mozna ignorovat mac menubary ( jejich wm_name konci "[menu]" )
+nejde F1 -> Help v konfiguraci ( je to chyba obecne ? )
+udelat spusteni kdyz aktivni okno nesouhlasi se zadanym ( napr. chci dalsi browser )
+pouzit XTest extension pro strokes
+pouzit XTest i pro keyboard macros kdyz je ext. pritomna ?
+udelat seznam oken ( + jejich class, command, atd ) a potom u akci z nich jen vybirat
+udelat spusteni jen kdyz na aktivni plose uz takove okno ( prikaz ) jeste neni
+ + mozna spusteni kdyz aktivni okno neni takove
+at jde u spousteni spustit na prave aktivni plose, na plose c.X, nebo na "volne" plose ( o jedno vic nez je uz takove okno )
+pridelat prepinani na definovana okna ? ( z WindowMakeru )
+udelat i nejaky recorder, ktery bude umet presne opakovat klavesy a i mys ?
+ovladani mysi klavesnici ?
+udelat system jako treba v mc, tj. napr. "Ctrl+Alt+X, P" - tech klaves je porad malo :)
+v Tips, ze tak jde zmenit kl.zkratky i u programu, ktere na to nemaji dialog
+nejak poradne ty okna(tridy+title+atd), at jde delat 'jen kdyz je okno aktivni', 'jen kdyz neni okno aktivni', atd
+pri vypusteni verze 2.0 ( 1.9.x ) poslat <[email protected]> mail ( LibStroke )
+mit i delay v macrech
+akce : posledne aktivni okno na jine plose dat na aktivni plochu ( tj. misto mysi davat u vybraneho okna 'na soucasnou plochu' )
+electric borders u KWin zere jen okraje, ale ne primo rohy - pujde to udelat jako trigger akce
+ - pujdou i okraje, kdyz to bude vypnute u WM ( nebo se budou fackovat ? )
+akce : transformace klavesy ( def. Key_Menu ) na RMB do keyboard focusu ( pro kontext menu )
+akce : kdyz se objevi okno, aplikovat na nej veci, ktere dela kstart ( sticky, atd. )
+strokes : kdyz X bere mys pres gpmdata, gpm pekne zasekava u vstupu pri prostrednim tlacitku dole => strokes pak za moc nestoji
+paste pri MMB volitelne jen kdyz MMB neni stisknuto napr. pres 500ms ( kvuli strokes )
+akce : kdyz se stiskne nejaka shortcut a nejaka aplikace nebezi, tak se spusti a pak se ji ta shortcut preda ( napr. pro klipper ? )
+odstranit tu KAccel zmenu, kterou v CVS udelal Coolo - stejne netusim, jestli to ma nebo nema byt i18n, tak at je aspon default
+skupine akci 'KMenuedit entries' by asi nemelo jit zmenit jmeno
+kdyz se v KMenuEdit udela polozka a pak se ten menuentry smaze, asi by se ta shortcut mela aspon disablovat ?!
+at dokaze zvetsovat vsechna 'File Open Dialog' okna
+pamatovat si menuentries i s polohou v K-Menu ? .desktop files by mely byt unique ( ale kmenuedit tohle asi moc nezvlada )
+neudelat to prirazeni klavesy k menuentry nejak jednodussi ? nebo zkratka doporucovat kmenuedit ?
+i18n("","") pro veci jako "New"
diff --git a/khotkeys/app/Makefile.am b/khotkeys/app/Makefile.am
new file mode 100644
index 000000000..274f4b57e
--- /dev/null
+++ b/khotkeys/app/Makefile.am
@@ -0,0 +1,21 @@
+bin_PROGRAMS =
+lib_LTLIBRARIES =
+kdeinit_LTLIBRARIES = khotkeys.la
+kde_module_LTLIBRARIES = kded_khotkeys.la
+
+khotkeys_la_SOURCES = app.cpp app.skel
+khotkeys_la_LIBADD = ../shared/libkhotkeys_shared.la $(LIB_KDECORE)
+khotkeys_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+
+kded_khotkeys_la_SOURCES = kded.cpp kded.skel
+kded_khotkeys_la_LIBADD = ../shared/libkhotkeys_shared.la $(LIB_KDECORE)
+kded_khotkeys_la_LDFLAGS = $(all_libraries) -module -avoid-version
+
+noinst_HEADERS = app.h kded.h
+
+INCLUDES = -I$(srcdir)/../shared $(all_includes)
+
+METASOURCES = AUTO
+
+servicesdir = $(kde_servicesdir)/kded
+services_DATA = khotkeys.desktop
diff --git a/khotkeys/app/app.cpp b/khotkeys/app/app.cpp
new file mode 100644
index 000000000..612977aed
--- /dev/null
+++ b/khotkeys/app/app.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KHOTKEYS_APP_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "app.h"
+
+#include <kcmdlineargs.h>
+#include <kconfig.h>
+#include <klocale.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <X11/Xlib.h>
+
+#include <settings.h>
+#include <input.h>
+#include <action_data.h>
+#include <gestures.h>
+#include <voices.h>
+
+namespace KHotKeys
+{
+
+// KhotKeysApp
+
+KHotKeysApp::KHotKeysApp()
+ : KUniqueApplication( false, true ), // no styles
+ delete_helper( new QObject )
+ {
+ init_global_data( true, delete_helper ); // grab keys
+ // CHECKME triggery a dalsi vytvaret az tady za inicializaci
+ actions_root = NULL;
+ reread_configuration();
+ }
+
+KHotKeysApp::~KHotKeysApp()
+ {
+ // CHECKME triggery a dalsi rusit uz tady pred cleanupem
+ delete actions_root;
+// Many global data should be destroyed while the QApplication object still
+// exists, and therefore 'this' cannot be the parent, as ~Object
+// for 'this' would be called after ~QApplication - use proxy object
+ delete delete_helper;
+ }
+
+void KHotKeysApp::reread_configuration()
+ { // TODO
+ kdDebug( 1217 ) << "reading configuration" << endl;
+ delete actions_root;
+ khotkeys_set_active( false );
+ Settings settings;
+ settings.read_settings( false );
+ gesture_handler->set_mouse_button( settings.gesture_mouse_button );
+ gesture_handler->set_timeout( settings.gesture_timeout );
+ gesture_handler->enable( !settings.gestures_disabled_globally );
+ gesture_handler->set_exclude( settings.gestures_exclude );
+ voice_handler->set_shortcut( settings.voice_shortcut );
+#if 0 // TEST CHECKME
+ settings.write_settings();
+#endif
+ actions_root = settings.actions;
+ khotkeys_set_active( true );
+ actions_root->update_triggers();
+ }
+
+void KHotKeysApp::quit()
+ {
+ kapp->quit();
+ }
+
+} // namespace KHotKeys
+
+
+
+using namespace KHotKeys;
+
+// for multihead
+static int khotkeys_screen_number = 0;
+
+extern "C"
+int KDE_EXPORT kdemain( int argc, char** argv )
+ {
+ {
+ // multiheaded hotkeys
+ QCString multiHead = getenv("KDE_MULTIHEAD");
+ if (multiHead.lower() == "true") {
+ Display *dpy = XOpenDisplay(NULL);
+ if (! dpy) {
+ fprintf(stderr, "%s: FATAL ERROR while trying to open display %s\n",
+ argv[0], XDisplayName(NULL));
+ exit(1);
+ }
+
+ int number_of_screens = ScreenCount(dpy);
+ khotkeys_screen_number = DefaultScreen(dpy);
+ int pos;
+ QCString displayname = XDisplayString(dpy);
+ XCloseDisplay(dpy);
+ dpy = 0;
+
+ if ((pos = displayname.findRev('.')) != -1)
+ displayname.remove(pos, 10);
+
+ QCString env;
+ if (number_of_screens != 1) {
+ for (int i = 0; i < number_of_screens; i++) {
+ if (i != khotkeys_screen_number && fork() == 0) {
+ khotkeys_screen_number = i;
+ // break here because we are the child process, we don't
+ // want to fork() anymore
+ break;
+ }
+ }
+
+ env.sprintf("DISPLAY=%s.%d", displayname.data(), khotkeys_screen_number);
+ if (putenv(strdup(env.data()))) {
+ fprintf(stderr,
+ "%s: WARNING: unable to set DISPLAY environment variable\n",
+ argv[0]);
+ perror("putenv()");
+ }
+ }
+ }
+ }
+
+ QCString appname;
+ if (khotkeys_screen_number == 0)
+ appname = "khotkeys";
+ else
+ appname.sprintf("khotkeys-screen-%d", khotkeys_screen_number);
+
+ // no need to i18n these, no GUI
+ KCmdLineArgs::init( argc, argv, appname, I18N_NOOP( "KHotKeys" ),
+ I18N_NOOP( "KHotKeys daemon" ), KHOTKEYS_VERSION );
+ KUniqueApplication::addCmdLineOptions();
+ if( !KHotKeysApp::start()) // already running
+ return 0;
+ KHotKeysApp app;
+ app.disableSessionManagement();
+ return app.exec();
+ }
+
+
+#include "app.moc"
diff --git a/khotkeys/app/app.h b/khotkeys/app/app.h
new file mode 100644
index 000000000..6166276cb
--- /dev/null
+++ b/khotkeys/app/app.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KHOTKEYS_APP_H_
+#define _KHOTKEYS_APP_H_
+
+#include <kuniqueapplication.h>
+
+namespace KHotKeys
+{
+
+class Action_data_group;
+
+class KHotKeysApp
+ : public KUniqueApplication
+ {
+ Q_OBJECT
+ K_DCOP
+ k_dcop:
+ ASYNC reread_configuration();
+ ASYNC quit();
+ public:
+ KHotKeysApp();
+ virtual ~KHotKeysApp();
+ private:
+ Action_data_group* actions_root;
+ QObject* delete_helper;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/app/kded.cpp b/khotkeys/app/kded.cpp
new file mode 100644
index 000000000..08c9bb487
--- /dev/null
+++ b/khotkeys/app/kded.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KHOTKEYS_KDED_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "kded.h"
+
+#include <kcmdlineargs.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kapplication.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <X11/Xlib.h>
+
+#include <settings.h>
+#include <input.h>
+#include <action_data.h>
+#include <gestures.h>
+#include <voices.h>
+
+extern "C"
+KDE_EXPORT KDEDModule *create_khotkeys( const QCString& obj )
+ {
+ return new KHotKeys::KHotKeysModule( obj );
+ }
+
+namespace KHotKeys
+{
+
+// KhotKeysModule
+
+KHotKeysModule::KHotKeysModule( const QCString& obj )
+ : KDEDModule( obj )
+ {
+ for( int i = 0;
+ i < 5;
+ ++i )
+ {
+ if( kapp->dcopClient()->isApplicationRegistered( "khotkeys" ))
+ {
+ QByteArray data, replyData;
+ QCString reply;
+ // wait for it to finish
+ kapp->dcopClient()->call( "khotkeys*", "khotkeys", "quit()", data, reply, replyData );
+ sleep( 1 );
+ }
+ }
+ client.registerAs( "khotkeys", false ); // extra dcop connection (like if it was an app)
+ init_global_data( true, this ); // grab keys
+ // CHECKME triggery a dalsi vytvaret az tady za inicializaci
+ actions_root = NULL;
+ reread_configuration();
+ }
+
+KHotKeysModule::~KHotKeysModule()
+ {
+ // CHECKME triggery a dalsi rusit uz tady pred cleanupem
+ delete actions_root;
+ }
+
+void KHotKeysModule::reread_configuration()
+ { // TODO
+ kdDebug( 1217 ) << "reading configuration" << endl;
+ delete actions_root;
+ khotkeys_set_active( false );
+ Settings settings;
+ settings.read_settings( false );
+ gesture_handler->set_mouse_button( settings.gesture_mouse_button );
+ gesture_handler->set_timeout( settings.gesture_timeout );
+ gesture_handler->enable( !settings.gestures_disabled_globally );
+ gesture_handler->set_exclude( settings.gestures_exclude );
+ voice_handler->set_shortcut( settings.voice_shortcut );
+#if 0 // TEST CHECKME
+ settings.write_settings();
+#endif
+ actions_root = settings.actions;
+ khotkeys_set_active( true );
+ actions_root->update_triggers();
+ }
+
+void KHotKeysModule::quit()
+ {
+ delete this;
+ }
+
+} // namespace KHotKeys
+
+#include "kded.moc"
diff --git a/khotkeys/app/kded.h b/khotkeys/app/kded.h
new file mode 100644
index 000000000..f136cd6a0
--- /dev/null
+++ b/khotkeys/app/kded.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KHOTKEYS_KDED_H_
+#define _KHOTKEYS_KDED_H_
+
+#include <kdedmodule.h>
+#include <dcopclient.h>
+
+namespace KHotKeys
+{
+
+class Action_data_group;
+
+class KHotKeysModule
+ : public KDEDModule
+ {
+ Q_OBJECT
+ K_DCOP
+ k_dcop:
+ ASYNC reread_configuration();
+ ASYNC quit();
+ public:
+ KHotKeysModule( const QCString& obj );
+ virtual ~KHotKeysModule();
+ private:
+ Action_data_group* actions_root;
+ DCOPClient client;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/app/khotkeys.desktop b/khotkeys/app/khotkeys.desktop
new file mode 100644
index 000000000..c9f983c74
--- /dev/null
+++ b/khotkeys/app/khotkeys.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Exec=khotkeys
+Name=KHotKeys
+Name[af]=KDE Kortpad Sleutels
+Name[be]=Клавішныя скароты KDE
+Name[bg]=Горещи клавиши
+Name[cs]=Horké klávesy KDE
+Name[csb]=Skrodzënë ë gestë
+Name[cy]=BysellauBrysKDE
+Name[eo]=Klavkombinoj
+Name[es]=Teclas rápidas de KDE
+Name[et]=KDE kiirklahvid
+Name[fi]=Pikanäppäimet
+Name[hi]=के-हॉट-कीज़
+Name[hu]=Parancsbeállító (KHotKeys)
+Name[is]=Flýtilyklar KDE
+Name[lt]=KDE klavišų kombinacijos
+Name[lv]=KDE Karstie Taustiņi
+Name[mk]=KDE брзи копчиња
+Name[mn]=КДЭ-халуун тушаал
+Name[nb]=KDE-hurtigtaster
+Name[ne]=केडीई हट कुञ्जी
+Name[nn]=KDE-snøggtastar
+Name[pa]=ਕੇ-ਹਾਟਕੀ
+Name[pl]=Skróty i gesty
+Name[pt_BR]=Teclas de atalho
+Name[ro]=Taste rapide
+Name[ru]=Клавиши быстрого доступа
+Name[se]=KDE jođánisboalut
+Name[sv]=Khotkeys
+Name[ta]=Kஹாட்கீஸ்
+Name[te]=కెహాట్ కీలు
+Name[tg]=Калидҳои тез
+Name[th]=ปุ่มพิมพ์ลัดของ KDE
+Name[uk]=Швидкі клавіші KDE
+Name[vi]=Phím nóng KDE
+Name[zh_TW]=KDE 熱鍵
+Type=Service
+ServiceTypes=KDEDModule
+X-KDE-ModuleType=Library
+X-KDE-Library=khotkeys
+X-KDE-FactoryName=khotkeys
+X-KDE-Kded-autoload=false
diff --git a/khotkeys/arts/Makefile.am b/khotkeys/arts/Makefile.am
new file mode 100644
index 000000000..0aa5929c1
--- /dev/null
+++ b/khotkeys/arts/Makefile.am
@@ -0,0 +1,11 @@
+kde_module_LTLIBRARIES = khotkeys_arts.la
+
+khotkeys_arts_la_SOURCES = soundrecorder_arts.cpp voicerecorder_arts.cpp
+khotkeys_arts_la_LIBADD = ../shared/libkhotkeys_shared.la $(LIB_ARTS)
+khotkeys_arts_la_LDFLAGS = $(all_libraries) $(X_LDFLAGS) -module -avoid-version -no-undefined
+
+INCLUDES = $(all_includes) -I$(srcdir)/../shared/ -I$(srcdir)/../kcontrol -I../kcontrol
+
+noinst_HEADERS = soundrecorder_arts.h
+
+METASOURCES = AUTO
diff --git a/khotkeys/arts/soundrecorder_arts.cpp b/khotkeys/arts/soundrecorder_arts.cpp
new file mode 100644
index 000000000..db3ea77d8
--- /dev/null
+++ b/khotkeys/arts/soundrecorder_arts.cpp
@@ -0,0 +1,141 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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. *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_ARTS
+
+#include "soundrecorder_arts.h"
+
+#include <arts/kaudiorecordstream.h>
+#include <arts/kartsserver.h>
+#include <arts/kartsdispatcher.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <qtimer.h>
+
+
+#define FS 11025
+#define BITS 16
+
+#define ABS(X) ( ((X)>0) ? (X) : -(X) )
+
+extern "C"
+KDE_EXPORT
+KHotKeys::SoundRecorder* khotkeys_soundrecorder_create( QObject* parent, const char* name )
+{
+ return new KHotKeys::SoundRecorderArts( parent, name );
+}
+
+namespace KHotKeys
+{
+
+
+SoundRecorderArts::SoundRecorderArts(QObject *parent, const char *name)
+ : SoundRecorder(parent, name) ,
+ m_dis(new KArtsDispatcher( this) ),
+ m_server( new KArtsServer( this ) ) ,
+ m_recStream( new KAudioRecordStream( m_server, i18n("khotkeys"), m_server ) )
+{
+ create_ptr check = khotkeys_soundrecorder_create; // check the type matches
+ ( void ) check;
+
+ m_recStream->usePolling( false );
+ connect( m_recStream, SIGNAL(data (QByteArray &)), this, SLOT(slotDataReceived(QByteArray& )));
+}
+
+SoundRecorderArts::~SoundRecorderArts()
+{
+ delete m_recStream;
+ delete m_server;
+ delete m_dis;
+}
+
+void SoundRecorderArts::start()
+{
+ m_recStream->start(FS,BITS,2);
+ m_data.resize(0);
+}
+
+void SoundRecorderArts::stop()
+{
+ m_recStream->stop();
+ QTimer::singleShot(400,this,SLOT(slotEmitSignal()));
+}
+
+void SoundRecorderArts::abort()
+{
+ m_recStream->stop();
+ m_data.resize(0);
+}
+
+
+Sound SoundRecorderArts::sound()
+{
+ Sound s;
+ uint BytePS=BITS/8;
+ uint length=m_data.size()/BytePS;
+ QMemArray<Q_INT32> da(length);
+ s.max=0;
+ s._fs=FS;
+ for(uint f=0;f<length; f++)
+ {
+#if BITS==8
+ int nb=(unsigned char)(m_data[f]) -128;
+#elif BITS==16
+ int nb=(m_data[2*f] &0x000000FF ) | ( (m_data[2*f+1] &0x000000FF ) << 8 ) ;
+ if(nb & (1<< 15))
+ nb = nb-(1<<16);
+#else
+ #error BITS is not 16 or 8
+#endif
+ if(s.max < (uint)ABS(nb))
+ {
+ s.max= (uint)ABS(nb);
+ }
+ da[f]=nb;
+ }
+ s.data=da;
+ return s;
+}
+
+void SoundRecorderArts::slotDataReceived(QByteArray & data)
+{
+ uint pos=m_data.size();
+ m_data.resize(pos + data.size());
+ for(uint f=0;f<data.size(); f++)
+ {
+ m_data[pos+f]=data[f];
+ }
+}
+
+void SoundRecorderArts::slotEmitSignal()
+{
+ emit recorded( sound() );
+}
+
+}
+
+#include "soundrecorder_arts.moc"
+
+#endif
diff --git a/khotkeys/arts/soundrecorder_arts.h b/khotkeys/arts/soundrecorder_arts.h
new file mode 100644
index 000000000..33422aff7
--- /dev/null
+++ b/khotkeys/arts/soundrecorder_arts.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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. *
+ ***************************************************************************/
+#ifndef RECORDER_ARTS_H
+#define RECORDER_ARTS_H
+
+#include "soundrecorder.h"
+#include <qmemarray.h>
+#include "sound.h"
+
+class KAudioRecordStream ;
+class KArtsServer;
+
+namespace KHotKeys
+{
+
+
+
+/**
+@author Olivier Goffart
+*/
+class SoundRecorderArts : public SoundRecorder
+{
+Q_OBJECT
+public:
+ SoundRecorderArts(QObject *parent = 0, const char *name = 0);
+ virtual ~SoundRecorderArts();
+
+ virtual void start();
+ virtual void stop();
+ virtual void abort();
+ virtual Sound sound();
+
+private slots:
+ void slotDataReceived(QByteArray &data);
+ void slotEmitSignal();
+
+private:
+ QByteArray m_data;
+ QObject *m_dis;
+ KArtsServer *m_server;
+ KAudioRecordStream *m_recStream;
+};
+
+}
+
+#endif
diff --git a/khotkeys/arts/voicerecorder_arts.cpp b/khotkeys/arts/voicerecorder_arts.cpp
new file mode 100644
index 000000000..39cd38cfa
--- /dev/null
+++ b/khotkeys/arts/voicerecorder_arts.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffgart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include <qcolor.h>
+#include <qevent.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "voicerecorder.h"
+
+#ifdef HAVE_ARTS
+
+#include <arts/kplayobject.h>
+#include <arts/kartsserver.h>
+#include <arts/kartsdispatcher.h>
+#include <arts/kplayobjectfactory.h>
+
+extern "C"
+KDE_EXPORT
+void khotkeys_voicerecorder_arts_play( const QString& file )
+{
+ KHotKeys::VoiceRecorder::arts_play_fun check = khotkeys_voicerecorder_arts_play; // check the type matches
+ ( void ) check;
+ KArtsDispatcher dispatcher;
+ KArtsServer server;
+ KDE::PlayObjectFactory factory( server.server() );
+ KDE::PlayObject* playobj = factory.createPlayObject( file, true );
+ playobj->play();
+}
+
+#endif
diff --git a/khotkeys/configure.in.in b/khotkeys/configure.in.in
new file mode 100644
index 000000000..ad9ab0c55
--- /dev/null
+++ b/khotkeys/configure.in.in
@@ -0,0 +1,68 @@
+dnl ---------------------------------------------------------------------------
+dnl check if compiler compiles correctly something like this :
+dnl class A { virtual A* me(); };
+dnl class X {};
+dnl class B : public X, public A { virtual B* me(); };
+dnl stupid gcc doesn't even bother to warn it can't do it correctly
+dnl ---------------------------------------------------------------------------
+
+AC_MSG_CHECKING(if covariant return works)
+AC_CACHE_VAL(kde_cv_covariant_return,
+ [
+ kde_cv_covariant_return=no
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_RUN(
+ [
+ class A { public: virtual A* me(); };
+ class X { public: int x; virtual void ff() {}; };
+ class B : public X, public A { public: virtual B* me(); };
+ int foo( A* a )
+ {
+ A* aa = a->me();
+ return a == aa;
+ }
+ int main()
+ {
+ B* b = new B;
+ return foo( b ) == 0;
+ }
+ A* A::me() { return this; }
+ B* B::me() { return this; }
+ ],
+ [ kde_cv_covariant_return=yes ])
+ AC_LANG_RESTORE
+ ])
+
+if test "$kde_cv_covariant_return" = "no"; then
+ AC_MSG_RESULT(no)
+ AC_DEFINE(COVARIANT_RETURN_BROKEN, 1,
+ [Define if covariant return in virtual methods works])
+else
+ AC_MSG_RESULT(yes)
+fi
+
+
+dnl ---------------------------------------------------------------------------
+dnl check for arts for speech recognition
+dnl ---------------------------------------------------------------------------
+
+
+artsc_config_test_path=$prefix/bin:$exec_prefix/bin:$KDEDIR/bin:$PATH
+AC_PATH_PROG(ARTSCCONFIG, artsc-config, no, $artsc_config_test_path)
+
+if test "x$build_arts" = "xyes" && test "x$ARTSCCONFIG" != "xno" ; then
+ LIB_ARTS="-lartskde"
+ ARTS_PREFIX=[`$ARTSCCONFIG --arts-prefix`]
+ ARTS_CFLAGS="-I$ARTS_PREFIX/include/arts"
+ AC_DEFINE(HAVE_ARTS, 1, [Defined for arts support in khotkeys])
+ KHOTKEYS_ARTS_SUBDIR=arts
+else
+ LIB_ARTS=""
+ ARTS_CFLAGS=""
+ KHOTKEYS_ARTS_SUBDIR=
+fi
+
+AC_SUBST(LIB_ARTS)
+AC_SUBST(ARTS_CFLAGS)
+AC_SUBST(KHOTKEYS_ARTS_SUBDIR)
diff --git a/khotkeys/data/Makefile.am b/khotkeys/data/Makefile.am
new file mode 100644
index 000000000..543f9309b
--- /dev/null
+++ b/khotkeys/data/Makefile.am
@@ -0,0 +1,7 @@
+khotkeys_data_DATA = kde32b1.khotkeys konqueror_gestures_kde321.khotkeys printscreen.khotkeys
+khotkeys_datadir = $(kde_datadir)/khotkeys
+
+khotkeys_update_DATA = khotkeys_32b1_update.upd konqueror_gestures_kde321_update.upd khotkeys_printscreen.upd
+khotkeys_updatedir = $(kde_datadir)/kconf_update
+
+EXTRA_DIST = $(khotkeys_data_DATA) $(khotkeys_update_DATA)
diff --git a/khotkeys/data/kde32b1.khotkeys b/khotkeys/data/kde32b1.khotkeys
new file mode 100644
index 000000000..46db7521d
--- /dev/null
+++ b/khotkeys/data/kde32b1.khotkeys
@@ -0,0 +1,1746 @@
+[Data]
+DataCount=1
+
+[Data_1]
+Comment=This group contains various examples demonstrating most of the features of KHotkeys. (Note that this group and all its actions are disabled by default.)
+Comment[bg]=Тази група съдържа различни примери, демонстриращи повечето от функциите на горещите клавиши. (Имайте предвид, че групата по подразбиране е изключена.)
+Comment[ca]=Aquest grup té varis exemples que demostren la majoria de les funcionalitats del KHotkeys. (Tingueu en compte que aquest grup i totes les seves accions estan deshabilitades per defecte.)
+Comment[csb]=Ta grëpa zamëkô w se różny przëmiôrë pòkazującë wikszy dzél mòżlewòtów KHotkeys. (Bôczë, że ta grëpa ë ji wszëtczé dzejania są domëslno wëłączoné.)
+Comment[da]=Denne gruppe indeholder forskellige eksempler der demonstrerer de fleste funktioner af KHotkeys. (Bemærk at denne gruppe og alle dens handlinger er deaktiveret som standard.)
+Comment[de]=Diese Gruppe enthält einige Beispiele für die meisten Funktionen von KHotkeys. (Hinweis: Diese Gruppe und alle ihre Aktionen sind in der Voreinstellung deaktiviert.)
+Comment[el]=Αυτή η ομάδα περιέχει διάφορα παραδείγματα των λειτουργιών του KHotkeys. (Σημειώστε ότι αυτή η ομάδα και όλες οι ενέργειές της είναι προκαθορισμένα απενεργοποιημένη.)
+Comment[eo]=Ĉi tiu grupo enhavas plurajn ekzemplojn montrante la plejparton de la eblecoj de KFulmoklavoj. (Notu: la grupo kaj agoj estas malebligitaj defaŭlte)
+Comment[es]=Este grupo contiene varios ejemplos que muestran la mayor parte de las características de KHotKeys. (Observe que este este grupo y todas sus acciones están deshabilitadas por omisión.)
+Comment[et]=See grupp sisaldab mitmeid näiteid, mis selgitavad enamikku KDE kiirklahvide võimalusi. (Pane tähele, et grupp ja kõik toimingud on vaikimisi välja lülitatud.)
+Comment[fr]=Ce groupe contient quelques exemples décrivant les fonctionnalités de KHotkeys. (Remarquez que ce groupe et toutes ses actions sont désactivés par défaut).
+Comment[fy]=Dizze groep befettet ferskillende foarbylden dy de mooglikheden fan KHotkeys werjouwe. (Taljochting: dizze groepo en byhearrende hndelings stean standert útskeakele.)
+Comment[hr]=Ova grupa sadrži različite primjere koji demonstriraju većinu osobina aplikacije KHotkeys. (Napomena: Ova grupa i sve njezine aktivnosti onemogućene su zadanim postavkama.)
+Comment[hu]=Ez a csoport a KHotkeys lehetőségeit bemutató példákat tartalmaz (alapértelmezés szerint ez a csoport ki van kapcsolva).
+Comment[is]=Þessi hópur inniheldur ýmis sýnishorn sem sýna flesta eiginleika KHotkeys. (Athugaðu að hópurinn og allar hans aðgerðir eru sjálfgefið óvirkt)
+Comment[it]=Questo gruppo contiene vari esempi che dimostrano la maggior parte delle funzioni di KHotkeys.(Nota che questo gruppo e tutte le sue azioni sono forniti disabilitati, e devono essere esplicitamente abilitati per usarli.)
+Comment[ja]=このグループには KHotkeys が提供するさまざまな機能の使用例が含まれています (デフォルトではこのグループとそのアクションはすべて無効になっています)。
+Comment[km]=ក្រុម​នេះ​មាន​ឧទាហរណ៍​​ផ្សេងៗគ្នា​ដោយ​បង្ហាញ​​សាកល្បង​នូវ​លក្ខណៈ​របស់ KHotkeys ជា​ច្រើន ។ (ចំណាំ​ថា តាម​លំនាំដើម​ក្រុម​នេះ និង​សកម្មភាព​របស់​វា​ទាំងអស់​ត្រូវ​បាន​បិទ​ ។)
+Comment[ko]=이 그룹에는 KHotkeys의 기능을 보여 주는 다양한 예제가 들어 있습니다. 기본적으로 이 그룹과 그룹 안의 모든 동작은 비활성화되어 있습니다.
+Comment[nb]=Gruppen inneholder eksempler og demonstrasjon av egenskaper til KHotkeys. (Merk at gruppen og alle handlinger er avslått som standard.)
+Comment[nds]=Disse Koppel bargt en Reeg Bispelen, de de mehrsten Funkschonen vun KHotkeys wiest (Beacht bitte, dat disse Koppel un all sien Akschonen standardwies utmaakt sünd).
+Comment[nl]=Deze groep bevat verschillende voorbeelden die de mogelijkheden van KHotkeys tonen. (Opmerking: deze groep en alle bijbehorende handelingen zijn standaard uitgeschakeld.)
+Comment[pl]=Ta grupa zawiera różne przykład demonstrujące większość funkcji programu KHotkeys (proszę zwrócić uwagę, że ta grupa i wszystkie jej akcje są domyślnie wyłączone)
+Comment[pt]=Este grupo contém diversos exemplos que demonstram a maior parte das funcionalidades do KHotkeys. (Repare que este grupo e todas as suas acções estão desactivadas por omissão.)
+Comment[pt_BR]=Este grupo contém diversos exemplos demonstrando as principais funcionalidades do KHotkeys. (Observe que este grupo e todas suas ações estão desativados por padrão.)
+Comment[ro]=Acest grup conține diverse exemple demostrând multe din capabilitățile KHotkey-urile. (De notat că acest grup și toate acțiunile sale sunt inactive în mod implicit.)
+Comment[ru]=Эта группа содержит некоторые примеры, демонстрирующие возможности KHotkeys. По умолчанию все действия в этой группе отключены.
+Comment[sk]=Táto skupina obsahuje rozličné príklady ilustrujúce väčšinu vlastností KHotkeys. (Všimnite si, že táto skupina a všetky jej akcie sú štandardne vypnuté.)
+Comment[sl]=Ta skupina vsebuje razne primere, ki prikazujejo večino funkcij KHotKeys. (Pomnite, da so ta skupina in vsa njena dejanja privzeto onemogočena.)
+Comment[sr]=Ова група садржи разне примере који илуструју скоро све могућности KHotkeys-а. (приметите да су ова група и све њене акције подразумевано искључене.)
+Comment[sr@Latn]=Ova grupa sadrži razne primere koji ilustruju skoro sve mogućnosti KHotkeys-a. (primetite da su ova grupa i sve njene akcije podrazumevano isključene.)
+Comment[sv]=Gruppen innehåller diverse exempel som demonstrerar de flesta funktionerna i Khotkeys. (Observera att gruppen och dess åtgärder inte normalt är aktiverad.)
+Comment[th]=กลุ่มนี้มีตัวอย่างหลากหลายที่จะสาธิตความสามารถส่วนใหญ่ของ KHotKeys (โปรดสังเกตว่า กลุ่มนี้และปฏิบัติการทั้งหมดของกลุ่มจะถูกปิดเอาไว้โดยปริยาย)
+Comment[uk]=Ця група містить різноманітні приклади, які демонструють більшість можливостей гарячих клавіш (KHotkeys). Примітка: типово, цю групу і всі її дії вимкнено.
+Comment[wa]=Ci groupe a sacwants egzimpes ki mostrèt les troes cwårts des usteyes di KHotKeys. (Notez ki ç' groupe totes ses accions sont prémetowes dismetowes.)
+Comment[zh_TW]=這個群組包含了展示 KHotkeys 大部份功能的各種範例。(注意這個群組與其定義的動作預設是關閉的)
+DataCount=8
+Enabled=false
+Name=Examples
+Name[be]=Прыклады
+Name[bg]=Примери
+Name[bn]=উদাহরণ
+Name[br]=Skouerioù
+Name[ca]=Exemples
+Name[cs]=Příklady
+Name[csb]=Przëmiôrë
+Name[da]=Eksempler
+Name[de]=Beispiele
+Name[el]=Παραδείγματα
+Name[eo]=Ekzemploj
+Name[es]=Ejemplos
+Name[et]=Näited
+Name[fr]=Exemples
+Name[fy]=Foarbylden
+Name[hr]=Primjeri
+Name[hu]=Példák
+Name[is]=Sýnishorn
+Name[it]=Esempi
+Name[ja]=使用例
+Name[km]=ឧទាហរណ៍
+Name[ko]=예제
+Name[nb]=Eksempler
+Name[nds]=Bispelen
+Name[nl]=Voorbeelden
+Name[pa]=ਉਦਾਹਰਨਾਂ
+Name[pl]=Przykłady
+Name[pt]=Exemplos
+Name[pt_BR]=Exemplos
+Name[ro]=Exemple
+Name[ru]=Примеры
+Name[sk]=Príklady
+Name[sl]=Primeri
+Name[sr]=Примери
+Name[sr@Latn]=Primeri
+Name[sv]=Exempel
+Name[te]=ఉదాహరణలు
+Name[tg]=Мисолҳо
+Name[th]=ตัวอย่าง
+Name[tr]=Örnekler
+Name[uk]=Приклади
+Name[uz]=Misollar
+Name[uz@cyrillic]=Мисоллар
+Name[wa]=Egzimpes
+Name[zh_TW]=範例
+SystemGroup=0
+Type=ACTION_DATA_GROUP
+
+[Data_1Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_1]
+Comment=After pressing Ctrl+Alt+I, the KSIRC window will be activated, if it exists. Simple.
+Comment[bg]=След като натиснете Ctrl+Alt+I ще се активира KSIRC прозорец, ако има такъв. Просто.
+Comment[ca]=Després de prémer Ctrl+Alt+I, s'activarà la finestra del KSIRC, si existeix. És senzill.
+Comment[csb]=Pò wcësniãcym Ctrl+Alt+I, òkno KSIRC bãdze aktiwòwóné, jeżle le òbstóji. Prosté.
+Comment[da]=Efter tryk på Ctrl+Alt+I, vil KSIRC-vinduet blive aktiveret, hvis det eksisterer. Simpelt.
+Comment[de]=Wenn Sie Strg+Alt+I drücken, wird das KSIRC-Fenster aktiviert (sofern es eines gibt).
+Comment[el]=Μετά το πάτημα του Ctrl+Alt+I, θα ενεργοποιηθεί το παράθυρο KSIRC, αν αυτό υπάρχει.
+Comment[eo]=Post premo de Ctrl+Alt+I, la KSIRC fenestro aktiviĝas, se ekzistas. Simple!
+Comment[es]=Tras pulsar Ctrl+Alt+I, se activará la ventana de KSIRC, en caso de que exista. Sencillo.
+Comment[et]=Klahvidele Ctrl+Alt+I vajutades aktiveeritaksse KSirci aken, kui see on olemas. Lihtne.
+Comment[fr]=Après avoir appuyé sur « Ctrl+Alt+I », la fenêtre KSIRC sera activée si elle existe.
+Comment[fy]=wannear jo op Ctrl+Alt+I drukke sil it KSIRC-finter, as it bestiet, aktivearre wurde.
+Comment[hr]=Nakon pritiska tipki Ctrl+Alt+I aktivirat će se prozor aplikacije KSIRC, ako postoji.
+Comment[hu]=A Ctrl+Alt+I lenyomása után a KSirc ablak aktiválódik, ha van ilyen megnyitva.
+Comment[is]=Þegar ýtt er á Ctrl+Alt+I, mun KSIRC glugginn verða virkjaður, ef hann finnst fyrir.
+Comment[it]=Con la pressione di Ctrl+Alt+I, la finestra di KSIRC sarà attivata, se esiste. Semplice, no?
+Comment[ja]=Ctrl+Alt+I を押すと、存在すれば KSIRC ウィンドウがアクティブになります。これは単純です。
+Comment[km]=បន្ទាប់​ពី​ចុច បញ្ជា(Ctrl)+ជំនួស(Alt)+I បង្អួច​របស់ KSIRC នឹង​ត្រូវ​បាន​ធ្វើ​ឲ្យ​សកម្ម ប្រសិន​បើ​វា​មាន​ស្រាប់ ។ ជា​ការ​ធម្មតា ។
+Comment[nb]=KSIRC-vinduet aktiviseres med Ctrl+Alt+I, om den er installert.
+Comment[nds]=Dat drücken vun Strg+Alt+I maakt dat KSirc-Finster aktiv, wenn dat een gifft. Eenfach.
+Comment[nl]=Wanneer u op Ctrl+Alt+I drukt zal het KSIRC-venster geactiveerd worden, indien aanwezig.
+Comment[pl]=Po wciśnięciu Ctrl+Alt+I pokazane zostanie okno KSIRC, o ile istnieje. Proste.
+Comment[pt]=Depois de carregar em Ctrl+Alt+I, a janela do KSIRC ficará activa, se existir. É simples.
+Comment[pt_BR]=Após pressionar Ctrl+Alt+I, a janela do KSIRC será ativada, se ela existir. Simples.
+Comment[ro]=După ce apăsați Ctrl+Alt+I, fereastra KSIRC va fi activată, dacă există. Simplu.
+Comment[ru]=При нажатии Ctrl+Alt+I активируется существующее окно KSIRC.
+Comment[sk]=Po stlačení Ctrl+Alt+I bude aktivované okno KSIRC, ak existuje. Jednoduché.
+Comment[sl]=Po pritisku Ctrl+Alt+I, se bo aktiviralo okno KSIRC, če obstaja.
+Comment[sr]=Пошто притисните Ctrl+Alt+I, активираће се прозор KSIRC-а ако постоји. Једноставно.
+Comment[sr@Latn]=Pošto pritisnite Ctrl+Alt+I, aktiviraće se prozor KSIRC-a ako postoji. Jednostavno.
+Comment[sv]=Efter att ha tryckt på Ctrl+Alt+I, aktiveras KSIRC-fönstret om det finns. Enkel.
+Comment[th]=หลังจากกด Ctrl+Alt+I, หน้าต่างของ KSIRC จะถูกเปิดขึ้นมา ถ้าหากมีอยู่ เรื่องง่ายๆ
+Comment[uk]=Після натискання Ctrl+Alt+I буде активовано вікно KSIRC, якщо воно існує. Просто.
+Comment[wa]=Après aveur tchôkî CTRL+ALT+I, li purnea KSIRC serè en alaedje, s' il egzistêye. Simpe.
+Comment[zh_TW]=按下 Ctrl+Alt+I 會叫出隱藏的 KSIRC 視窗。就這麼簡單。
+Enabled=false
+Name=Activate KSIRC Window
+Name[bg]=Активиране на KSIRC прозорец
+Name[bn]=KSIRC উইণ্ডো সক্রিয় করো
+Name[ca]=Activa finestra del KSIRC
+Name[cs]=Aktivovat KSIRC okno
+Name[csb]=Aktiwacëjô òkna KSIRC
+Name[da]=Aktivére KSIRC-vindue
+Name[de]=Aktiviert KSIRC-Fenster
+Name[el]=Ενεργοποίηση παραθύρου KSIRC
+Name[eo]=Aktiviĝo de fenestro
+Name[es]=Activar la ventana de KSIRC
+Name[et]=KSirci akna aktiveerimine
+Name[fr]=Activer la fenêtre KSIRC
+Name[fy]=KSIRC finster aktivearje
+Name[hr]=Aktiviraj KSIRC prozor
+Name[hu]=A KSirc ablak aktiválása
+Name[is]=Virkja KSIRC glugga
+Name[it]=Attiva finestra KSIRC
+Name[ja]=KSIRC ウィンドウをアクティブに
+Name[km]=ធ្វើ​ឲ្យ​បង្អួច​របស់ KSIRC សកម្ម
+Name[ko]=KSIRC 창 활성화시키기
+Name[nb]=Skru på KSIRC-vindu
+Name[nds]=KSirc-Finster aktiv maken
+Name[nl]=KSIRC-venster activeren
+Name[pa]=KSIRC ਝਰੋਖਾ ਸਰਗਰਮ ਕਰੋ
+Name[pl]=Aktywacja okna KSIRC
+Name[pt]=Activar a Janela do KSIRC
+Name[pt_BR]=Ativar a Janela do KSIRC
+Name[ro]=Activează fereastra KSIRC
+Name[ru]=Показать окно KSIRC
+Name[sk]=Aktivovať okno KSIRC
+Name[sl]=Aktiviraj okno KDIRC
+Name[sr]=Активирај прозор KSIRC-а
+Name[sr@Latn]=Aktiviraj prozor KSIRC-a
+Name[sv]=Aktivera Ksirc-fönster
+Name[tg]=Фаъоли равзанаи KSIRC
+Name[th]=เรียกหน้าต่าง KSIRC ทำงาน
+Name[tr]=KSIRC Penceresini Etkinleştir
+Name[uk]=Активізувати вікно KSIRC
+Name[uz]=KSIRC oynasini aktivlashtirish
+Name[uz@cyrillic]=KSIRC ойнасини активлаштириш
+Name[wa]=Mete en alaedje li purnea KSIRC
+Name[zh_TW]=叫出 KSIRC 視窗
+Type=ACTIVATE_WINDOW_SHORTCUT_ACTION_DATA
+
+[Data_1_1Actions]
+ActionsCount=1
+
+[Data_1_1Actions0]
+Type=ACTIVATE_WINDOW
+
+[Data_1_1Actions0Window]
+Comment=KSIRC window
+Comment[bg]=KSIRC прозорец
+Comment[bn]=KSIRC উইণ্ডো
+Comment[ca]=Finestra del KSIRC
+Comment[cs]=KSIRC okno
+Comment[csb]=Òkno KSIRC
+Comment[da]=KSIRC-vindue
+Comment[de]=KSIRC-Fenster
+Comment[el]=Παράθυρο KSIRC
+Comment[eo]=KSIRC fenestro
+Comment[es]=Ventana de KSIRC
+Comment[et]=KSirci aken
+Comment[fr]=Fenêtre KSIRC
+Comment[fy]=KSIRC finster
+Comment[hr]=KSIRC prozor
+Comment[hu]=KSirc ablak
+Comment[is]=KSIRC gluggi
+Comment[it]=Finestra KSIRC
+Comment[ja]=KSIRC ウィンドウ
+Comment[km]=បង្អួច​របស់ KSIRC
+Comment[ko]=KSIRC 창
+Comment[nb]=KSIRC-vindu
+Comment[nds]=KSirc-Finster
+Comment[nl]=KSIRC-venster
+Comment[pa]=KSIRC ਝਰੋਖਾ
+Comment[pl]=Okno KSIRC
+Comment[pt]=Janela do KSIRC
+Comment[pt_BR]=Janela do KSIRC
+Comment[ro]=Fereastră KSIRC
+Comment[ru]=Окно KSIRC
+Comment[sk]=Okno KSIRC
+Comment[sl]=Okno KSIRC
+Comment[sr]=Прозор KSIRC-а
+Comment[sr@Latn]=Prozor KSIRC-a
+Comment[sv]=Ksirc-fönster
+Comment[te]=కెసిర్క్ విండొ
+Comment[tg]=Равзанаи KSIRC
+Comment[th]=หน้าต่าง KSIRC
+Comment[tr]=KSIRC penceresi
+Comment[uk]=Вікно KSIRC
+Comment[uz]=KSIRC oynasi
+Comment[uz@cyrillic]=KSIRC ойнаси
+Comment[wa]=Purnea KSIRC
+Comment[zh_TW]=KSIRC 視窗
+WindowsCount=1
+
+[Data_1_1Actions0Window0]
+Class=ksirc
+ClassType=1
+Comment=KSIRC
+Comment[et]=KSirc
+Comment[hu]=KSirc
+Comment[nds]=KSirc
+Comment[sv]=Ksirc
+Comment[te]=కెసిర్క్
+Role=
+RoleType=0
+Title=
+TitleType=0
+Type=SIMPLE
+WindowTypes=33
+
+[Data_1_1Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_1Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_1Triggers0]
+Key=Alt+Ctrl+I
+Type=SHORTCUT
+
+[Data_1_2]
+Comment=After pressing Alt+Ctrl+H, 'Hello' input will be simulated just like if you typed it. Especially useful if you're lazy to type things like 'unsigned'. Every keypress in the input is separated by a colon ':' . Note that the keypresses mean really keypresses, so you have to write what you'd really press on the keyboard. In the table below, left column shows the input and the right column shows what to type.\n\n"enter" (i.e. new line) Enter or Return\na (i.e. small a) A\nA (i.e. capital a) Shift+A\n: (colon) Shift+;\n' ' (space) Space
+Comment[bg]=След натискането на Alt+Ctrl+H ще бъде симулирано "Здравей" ,все едно сте го написали. Това е особено полезно ако ви мързи да пишете неща като "неподписан". Всяко натискане на клавиш се разделя с двоеточие. Натискане на клавиш значи именно това, така че трябва да напишете точно това, което бихте написали с клавиатурата. В таблицата е показано: лявата колона показва въведеното, а дясната - какво да се напише.\n\n"Enter" (напр. нов ред) Enter или Return\na (напр. малко а) A\nA (напр главно А) Shift+A\n: (двоеточие) Shift+;\n' ' (интервал) интервал
+Comment[ca]=Després de prémer Alt+Ctrl+H, se simula l'entrada de 'Hola' com si l'haguéssiu teclejat. És especialment útil si sou mandrós per teclejar coses com 'unsigned'. Cada tecla premuda a l'entrada se separa amb dos punts ':'. Tingueu en compte que tecla premuda significa realment tecla premuda, així que heu d'escriure el què realment heu de prémer en el teclat. A la taula següent, la columna de l'esquerra mostra l'entrada i la columna de la dreta mostra el que teclegeu. \n\n"enter" (p.ex. línia nova) Entrada o Retorn\na (p.ex. a minúscula) A\nA (p.ex. a majúscula) Shift+A\n: (dos punts) Shift+;\n' ' (espai) Espai
+Comment[csb]=Pò wcësniãcym Alt+Ctrl+H, wëskrzëni sã słowò 'Hello' tak jak bë to Të to pisôł. Barô ùżëtnié czej jes za zgniłi bë pisac słowa jak 'unsigned'. Kòżdi wcësniãcé klawisza je przedzéloné dwapùnktã ':'. Bôczë, że nót je przódë napisac to co të bë chcôł wëskrzënic. W tablicë niżi, lewô kòlumna pòkazëjë wprowadzenié a prawô co napisac.\n\n"enter" (np. nowô réza) Enter abò Return\na (np. môłé a) A\nA (np. wiôldżé A) Shift+A\n: (dwapùnkt) Shift+;\n' ' (spacëjô) Spacëjô
+Comment[da]=Efter tryk på Alt+Ctrl+H, vil indskrivning af 'Hello' blive simuleret lige som om hvis du skrev det. Særlig nyttigt hvis du er for doven til at skrive ting så som 'ikke underskrevet'. Hvert tastetryk i inddata adskilles med et kolon ':' . Bemærk at tastetrykkene virkelig betyder tastetryk, så du skal skrive det du virkelig trykker på tastaturet. I tabellen nedenfor, viser venstre søjle inddata og højre søjle viser hvad der skal skrives.\n\n"enter" (dvs ny linje) Enter eller Return\na (dvs lille a) A\nA (dvs stort a) Shift+A\n: (kolon) Shift+;\n' ' (mellemrum) Mellemrum
+Comment[de]=Wenn Sie Strg+Alt+H drücken wird die Tastatureingabe des Wortes "Hello" simuliert. Dies kann nützlich sein, wenn Sie bestimmte Wörter immer wieder eingeben müssen (z. B. muss ein Programmierer öfters "unsigned" eingeben). Jeder Tastendruck in der Eingabe wird durch einen Doppelpunkt getrennt ":". Bitte beachten Sie: Hier ist wirklich von gedrückten Tasten die Rede; Sie müssen das eingeben, was Sie tatsächlich auf der Tastatur eingeben würden. In der folgenden Tabelle sehen Sie in der linken Spalte den auszugebenden Text und zur Rechten die zu drückenden Tasten: \n\n"Eingabe" (neue Zeile) Eingabetaste\na (ein kleines a) A\nA (ein großes a) Umschaltt+A\n: (Doppelpunkt) Umschalt+;\n' ' (Leerzeichen) Leertaste
+Comment[el]=Μετά το πάτημα του Alt+Ctrl+H, θα εξομοιωθεί η είσοδος 'Hello' σαν να την πληκτρολογήσατε. Ιδιαίτερα χρήσιμο αν δεν έχετε χρόνο να πληκτρολογήστε διάφορα όπως 'unsigned'. Κάθε πάτημα πλήκτρου στην είσοδο διαχωρίζεται με ένα ':'. Σημειώστε ότι τα πατήματα πρέπει να είναι πραγματικά στο πληκτρολόγιο. Στον παρακάτω πίνακα, η αριστερή στήλη εμφανίζει την είσοδο και η δεξιά στήλη αυτό που πληκτρολογείτε. \n\n"enter" (π.χ. νέα γραμμή) Enter ή Return\na (π.χ. μικρό a) A\nA (μεγάλο a) Shift+A\n: (άνω κάτω τελεία) Shift+;\n' ' (κενό) Κενό
+Comment[eo]=Post premo de Alt+Ctrl+H, "Saluton" estos enmetita, kvazaŭ vi tajpis la vorton. Utile se vi ne volas tajpi ekz. "nenia subskribo." Ĉiu klavpremo en la enmeto disiĝas per dupunkto ":" . Notu ke la klavpremoj estas efektivaj; oni devas premi la klavon kiun oni efektive tajpus. En la suba tabelo la maldekstra kolumno montras la enmeton kaj la desktra kolumno montras tion, kion oni tajpus.\n\n"eniga klavo" (t.e. nova linio) Eniga aŭ Revena klavo\na (t.e. minuskla a) A\nA (t.e. majuskla a) majuskliga klavo+A\n: (dupunkto) Majuskliga klavo+;\n" " (spaceto) Spaceto
+Comment[es]=Tras pulsar Alt+Ctrl+H, se simulará la escritura de «Hola», exactamente como si la tecleara usted. Es especialmente útil si no quiere molestarse en escribir cosas como «sin firmar». Cada pulsación se separa con dos puntos «:». Observe que las pulsaciones realmente lo son, de modo que debe escribir lo que realmente pulsaría en el teclado. En la tabla inferior, la columna izquierda muestra la entrada y la columna derecha muestra qué teclear.\n\n«enter» (es decir, salto de línea) Intro o Retorno\na (es decir, a minúscula) A\nA (es decir, A mayúscula) Mayúsculas+A\n: (dos puntos) Mayúsculas+;\n« » (espacio) Espacio
+Comment[et]=Klahvidele Alt+Ctrl+H vajutades simuleeritakse 'Hello' sisendit täpselt nii, nagu sa selle kirjutasid. See on eriti kasulik, kui sa ei viitsi kirjutada selliseid asju 'signeerimata'. Iga sisendi klahvivajutus tuleb eraldada kooloniga (:). Pane tähele, et klahvivajutus tähendab tegelikku klahvile vajutamist, nii et kirja tuleb panna just see, mida klaviatuuril tegelikult kirjutad. Allolevas tabelis näitab vasak veerg sisendit ja parem veerg seda, mis tuleb kirjutada.\n\n"enter" (s.t. uus rida) Enter või Return\na (s.t. väike a) A\nA (s.t. suur a) Shift+A\n: (koolon) Shift+;\n' ' (tühik) Space
+Comment[fr]=Après avoir saisi « Alt+Ctrl+H », l'entrée « Hello » sera simulée, comme si vous l'aviez saisi. Ceci est particulièrement utile lorsque vous avez la flemme de saisir un mot. Chaque touche saisie dans l'entrée est séparée par un « : ». Notez que la saisie de touches doit forcément être réelle. Voici un tableau décrivant à gauche l'entrée, et à droite ce qu'il est nécessaire de saisir. \n\n"enter" (une nouvelle ligne) Entrée \na (a minuscule) A\nA (a majuscule) Shift+A\n: (colon) Shift+;\n' ' (espace) Espace
+Comment[fy]=As jo op Alt+Ctrl+H drukke sil de ynfier "Hallo" similearre wurde krekt as jo it typt haw. Hannich as jo te lui binne om dingen as 'unsigned' te typen. Eltse toetsoanslach by de ynfier moat skieden wurde troch in dûbele punt ':'. Tink derom dat in toetsoanslach letterliknommen moat wurde, dus eltse oanslach moat opskreaun wurde. Yn de ûndersteande tabel befettet de lofterkolom de ynfier en rjochts wat jo ynfiere moatte.\n\n"enter" (nij rigel) Enter of Return\na (lytse a) A\nA (haadletter A) Shift+A\n: (dûbele punt) Shift+;\n' ' (spaasje) Space
+Comment[hr]=Nakon pritiska tipki Alt+Ctrl+H simulirat će se unos "Hello", jednako kao da ste ga unijeli. Izuzetno korisno ako ste lijeni utipkivati riječi poput "unsigned". Svaki pritisak tipke u unosu odvojen je znakom dvotočke ":". Napomena: Pritisci tipek su pravi prtisci pa je potrebno zapisati ono što ste azista utipkali. U donjoj tablici lijevi stupac prikazuje unos, a desni potrebne pritiske tipki.\n\n"enter" (tj. novi redak) Enter ili Return\na (tj. malo slovo a) A\nA (tj. veliko slovo a) Shift+A\n: (dvotočka) Shift+;\n" " (razmak) Razmaknica
+Comment[hu]=Az Alt+Ctrl+H megnyomásakor a 'Hello' szöveg úgy íródik be, mintha valaki beírta volna. Hosszabb szövegek egyszerű bevitelére használható. A leütéseket kettősponttal kell elválasztani. A leütéseket úgy kell érteni, ahogy azok ténylegesen bevihetők a billentyűzetről. Az alábbi táblázatban a bal oszlopban a leütések, a jobb oszlopban a beírandó szöveg szerepel.\n\n"enter" (azaz újsor) Enter vagy Return\na (kis a betű) A\nA (nagy A betű) Shift+A\n: (kettőspont) Shift+;\n' ' (szóköz) Szóköz
+Comment[is]=Þegar haldið er niðri Alt+Ctrl+H, verður 'Halló' frasinn settur inn, rétt eins og ef þú hefðir potað honum sjálfur niður á lyklaborðinu. Ákaflega þægilegt fyrir fólk sem er of latt til að vélrita hluti eins og 'undirskrift'. Allir lyklaástuðningar eru aðskildir með tvípunktum ':' . Athugaðu samt að lykilástuðningur þýðir í alvörunni að það þarf þá að styðja fingri á viðkomandi hnapp, þannig að ekki verður hjá því komist að vélrita altént þessa syttingarrunu. Í töflunni hér að neðan, sýna vinstri dálkurinn það sem sett verður inn og sá hægri styttingarrununa.\n\n"enter" (þ.e. ný lína) Enter eða Tilbaka\na (þ.e. lítið a) A\nA (þ.e. stórt a) Shift+A\n: (tvípunktur) Shift+;\n' ' (bilslá) Bil
+Comment[it]=Dopo aver premuto Alt+Ctrl+H, l'inserimento di "Hello" sarà simulato come se lo avessi scritto con la tastiera. È particolarmente utile se sei pigro per scrivere cose come "unsigned". Ogni pressione di un tasto dell'input è separata da un due punti ":" . Nota che le pressioni di tasti indicano vere pressioni di tasti, quindi devi inserire quello che premeresti effettivamente sulla tastiera. Nella tabella seguente, la colonna sinistra mostra l'input e quella destra ciò che devi inserire.\n\n"invio" (cioè, nuova riga) Invio\na (cioè a minuscola) A\nA (cioè A maiuscola) Shift+A\n: (due punti) Shift+;\n" " (spazio) Spazio
+Comment[ja]=Alt+Ctrl+H を押して 'Hello' という文字列を入力します。例えば 'unsigned' のような表現を入力するのが面倒だと思う場合に役立ちます。キーボード入力に登録するキー押下は、それぞれコロン (:) で区切ります。このキー押下とは、押すキーを意味します。つまり、キーによって入力される文字ではなく、あなたが実際に押すキーボード上のキーを登録しなければなりません。以下の例では、左側が入力で、右側がキー押下です。\n\n"enter" (改行) Enter または Return\na (小文字の a) A\nA (大文字の a) Shift+A\n: (コロン) Shift+; (US 配列の場合)\n' ' (スペース) Space
+Comment[km]=បន្ទាប់​ពី​ចុច​ជំនួស(Alt)+បញ្ជា(Ctrl)+H បញ្ចូល 'សួស្ដី'នឹង​ត្រូវ​បាន​ក្លែង​ធ្វើ​ដូច​អ្វី​ដែល​អ្នក​បាន​វាយ​វា ។ ជា​ពិសេស​ មាន​ប្រយោជន៍​ប្រសិន​បើ​អ្នក​ខ្ជិល​វាយ​ពាក្យ​ដូច​ជា 'មិន​បាន​ចុះហត្ថលេខា' ។រាល់​ការ​ចុច​គ្រាប់​ចុច​ទាំងអស់​នៅ​ក្នុង​ការ​បញ្ចូល​ត្រូវ​បាន​បំបែក​ដោយសញ្ញា ':'  ។ ចំណាំ​ថា ការ​ចុច​គ្រាប់​ចុច​មាន​ន័យ​ថា គឺ​ចុច​គ្រាប់​ចុច ដូច្នេះ​អ្នក​ត្រូវ​តែ​សរសេរ​អ្វី​ដែល​អ្នក​ចង់​ចុច​នៅ​លើ​ក្ដារចុច ។ នៅ​ក្នុង​តារាង​ខាង​ក្រោម ជួរឈរ​ខាង​ឆ្វេង បង្ហាញ​ការ​បញ្ចូល និង​ជួរឈរ​ខាង​ស្ដាំ​បង្ហាញ​អ្វី​ដែល​អ្នក​វាយ ។\n\n"បញ្ចូល" (ឧ. បន្ទាត់​ថ្មី) បញ្ចូល ឬ Return\na (ឧ. អក្សរ a តូច) A\nA (ឧ. អក្សរ a ធំ) ប្ដូរ(Shift)+A\n: (សញ្ញា(:) ប្ដូរ(Shift)+;\n' ' (ចន្លោះ) ចន្លោះ
+Comment[nb]=Easting av Alt+Ctrl+H simulerer 'Hallo'-inndata som om det skrevet inn. Nyttig om man er bedagelig og vil slippe å taste ting som 'unsigned'. Hvert tastetrykk inn blir adskilt med et kolon ':' . Merk at tastetrykk virkelig betyr tastetrykk, så man må skrive dette med tastaturet. Tabellen under, venstre kolonne viser inndata og høyre kolonne viser hva som skal skrives..\n\n"enter" (eks. ny linje) Enter or Return\na (eks. liten a) A\nA (eks. stor a) Shift+A\n: (kolon) Shift+;\n' ' (mellomrom) mellomrom
+Comment[nds]=Dat drücken vun Strg+Alt+H maakt de Ingaav vun "Hello" na, jüst so, as wenn Du dat sülven ingeven deist. Dat is t.B. denn goot, wenn Du Saken as "unsigned" nich jümmers heel ingeven wullt. Elk Druck op en Tast warrt mit en Dubbelpunkt scheedt. Beacht bitte, dat "Tastdruck" redig daaldrückt Tasten meent, Du muttst also schrieven, wat Du redig op de Tastatuur drücken deist. In de Tabell nerrn wiest de Striep linkerhand de namaakte Ingaav, de Striep rechterhand, wat Du schrieven muttst.\n\n"Ingaav" (d.h. Reegümbrook) "Enter" oder "Return"\na (en lütt A) "A"\nA (en groot A) "Shift+A"\n: (en Dubbelpunkt) "Shift+."\n" " (en Freeteken) "Space"
+Comment[nl]=Wanneer u op Ctrl+Alt+H drukt zal de invoer "Hallo" gesimuleerd worden alsof u het getypt hebt. Handig wanneer u te lui bent om dingen als 'unsigned' te typen. Iedere toetsaanslag bij de invoer dient gescheiden te worden met een dubbele punt ';'. Merk op dat een toetsaanslag letterlijk genomen dient te worden, dus iedere toets die u indrukt dient opgeschreven te worden. In de onderstaande tabel bevat de linkerkolom de invoer en rechts wat u dient in te typen.\n\n" Enter" (nieuwe regel) Enter of Return\na (kleine a) A\nA (hoofdletter a) Shift+A\n: (dubbele punt) Shift+;\n' ' (spatie) Space
+Comment[pl]=Po wciśnięciu Alt+Ctrl+H zostanie zasymulowane wpisanie 'Hello', dokładnie tak jakby zostało wpisane na klawiaturze. Jest to szczególnie użyteczne jeśli nie chce Ci się wpisywać takich rzeczy jak 'unsigned'. Każde wciśnięcie klawisza jest oddzielone dwukropkiem ':' . Proszę zwrócić uwagę, że naciśnięcia klawisza naprawdę oznaczają naciśnięcia klawisza, więc musisz wpisać to, co naprawdę zostałoby wciśnięte na klawiaturze. W tabeli poniżej lewa kolumna pokazuje klawisz, a prawa pokazuje co należy wpisać. \n\n"enter" (tzn. przejście do nowego wiersza) Enter lub Return\na (tzn. małe "a") A\nA (tzn. duże "a") Shift+A\n: (dwukropek) Shift+;\n' ' (spacja) Spacja
+Comment[pt]=Depois carregar em Alt+Ctrl+H, será simulada a escrita de 'Olá', tal como se tivesse escrito de facto. É especialmente útil se você não quiser estar a escrever coisas do tipo 'unsigned'. Sempre que carregar numa tecla do campo de texto será separado por dois-pontos ':'. Repare que o carregar de teclas é mesmo o carregar de teclas, pelo que terá de escrever realmente o que deseja no teclado. Na tabela abaixo, a coluna esquerda mostra o texto introduzido e a coluna à direita mostra o que é necessário escrever.\n\n"enter" (i.e. mudança de linha) Enter ou Return\na (i.e. 'a' minúsculo) A\nA (i.e. 'a' maiúsculo) Shift+A\n: (dois-pontos) Shift+;\n' ' (espaço) Espaço
+Comment[pt_BR]=Após pressionar Alt+Ctrl+H, será simulada a entrada de 'Hello' como se você o tivesse digitado. Especialmente útil se você está com preguiça de digitar coisas como 'unsigned'. Toda tecla pressionada na entrada é separada por dois-pontos ':'. Observe que teclas pressionadas significa realmente teclas pressionadas, portanto você tem que escrever realmente o que deseja no teclado. Na tabela abaixo, a coluna da esquerda mostra a entrada e a coluna da direita mostra o que digitar.\n\n"enter" (i.e. nova linha) Enter ou Return\na (i.e. a mínusculo) A\nA (i.e. a maiúsculo) Shift+A\n: (dois-pontos) Shift+;\n' ' (espaço) Espaço
+Comment[ro]=După ce apăsați Alt+Ctrl+H, intrarea 'Hello' va fi simulată ca și cum ați fi tastat-o. Este foarte utilă dacă vă este lene să tastați chestii ca 'unsigned'. Fiecare apăsare de tastă în intrare este separată de un caracter ':'. De notat că apăsările de taste înseamnă într-adevăr apăsări de taste, deci trebuie să scrieți ceea ce ați scrie în realitate la tastatură. În tabelul de mai jos, coloana din stânga arată intrarea iar coloana din dreapta arată ce să tastați.\n\n"enter" (adică linie nouă) Enter sau Return\na (adică a mic) A\nA (adică a mare) Shift+A\n: (două puncte) Shift+;\n' ' (spațiu) Space
+Comment[ru]=При нажатии Alt+Ctrl+H будет эмулирован ввод слова "Hello" как будто бы вы набивали его вручную с клавиатуры.
+Comment[sk]=Po stlačení Alt+Ctrl+H bude simulovaný vstup 'Hello' presne tak, ako keby ste ho napísali. Mimoriadne užitočné, ak ste lenivý písať veci ako 'unsigned'. Každé stlačenie klávesu je oddelené dvojbodkou ':'. Všimnite si, že stlačenia klávesu znamenajú skutočné stlačenie, takže musíte napísať, čo v skutočnosti na klávesnici stláčate. V tabuľke nižšie ukazuje ľavý stĺpec vstup a pravý stĺpec, čo treba napísať.\n\n"enter" (t.j. nový riadok) Enter alebo Return\na (t.j. malé a) A\nA (t.j. veľké a) Shift+A\n: (dvojbodka) Shift+;\n' ' (medzera) Medzera
+Comment[sr]=Пошто притиснете Alt+Ctrl+H, биће симулиран унос „Hello“ баш као да сте га сами уписали. Ово је посебно корисно ако сте лењи да стално пишете ствари попут „unsigned“. Сваки притисак тастера за унос раздваја се двотачком, „:“. Пазите, притисак тастера заиста то и значи, тако да морате уписати тачно оно што бисте притиснули на тастатури. У доњој табели, лева колона приказује унос, а десна шта морате за њега уписати.\n\n„enter“ (тј. нова линија) Enter или Return\na (тј. мало a) A\nA (рј. велико a) Shift+A\n: (двотачка) Shift+;\n„ “ (размак) Space
+Comment[sr@Latn]=Pošto pritisnete Alt+Ctrl+H, biće simuliran unos „Hello“ baš kao da ste ga sami upisali. Ovo je posebno korisno ako ste lenji da stalno pišete stvari poput „unsigned“. Svaki pritisak tastera za unos razdvaja se dvotačkom, „:“. Pazite, pritisak tastera zaista to i znači, tako da morate upisati tačno ono što biste pritisnuli na tastaturi. U donjoj tabeli, leva kolona prikazuje unos, a desna šta morate za njega upisati.\n\n„enter“ (tj. nova linija) Enter ili Return\na (tj. malo a) A\nA (rj. veliko a) Shift+A\n: (dvotačka) Shift+;\n„ “ (razmak) Space
+Comment[sv]=Efter att ha tryckt Alt+Ctrl+H, kommer inmatning av 'Hej' simuleras precis som om du skrivit det. Särskilt användbart om du är för lat för att skriva in långa ord. Varje tangentnertrycking i inmatningen åtskiljs av ett kolon ':' . Observera att tangentnedtryckningar verkligen betyder tangentnedtryckningar, så du måste skriva vad du verkligen skulle göra på tangentbordet. I tabellen nedan visar vänster kolumn inmatning och höger kolumn vad du skriver.\n\n"retur" (dvs. nyrad) Enter eller returtangenten\na (dvs. litet a) A\nA (dvs. stort a) Skift+A\n: (kolon) Skift+.\n' ' (mellanslag) Mellanslag
+Comment[th]=หลังจากกด Alt+Ctrl+H, การใส่คำว่า 'Hello' จะถูกจำลองขึ้นเหมือนกับว่า คุณได้พิมพ์มันลงไป ซึ่งมันมีประโยชน์โดยเฉพาะอย่างยิ่งถ้าคุณขี้เกียจพิมพ์อะไรๆ อย่างเช่น 'unsigned' รูปแบบการกดปุ่มทุกๆ อันจะคั่นด้วยเครื่องหมายโคลอน ':' สังเกตว่ารูปแบบการกดปุ่ม หมายถึงการกดปุ่มจริงๆ ดังนั้นคุณต้องเขียนสิ่งที่คุณจะกดจริงๆ บนแป้นพิมพ์ ส่วนในตารางด้านล่าง คอลัมน์ทางด้านซ้ายจะแสดงสิ่งที่ใส่เข้าไป และทางด้านขวาจะแสดง สิ่งที่จะพิมพ์เข้าไป \n\n"enter" (ก็คือขึ้นบรรทัดใหม่) Enter or Return\na (a ตัวเล็ก) A\nA (a ตัวใหญ่) Shift+A\n: (โคลอน) Shift+;\n' ' (แป้นเคาะวรรค) Space
+Comment[wa]=Après aveur tchôkî ALT+CTRL+H, ene intrêye 'Hello' serè forveyowe djusse come vos l' åroz tapé. C' est vormint ahessant si vs estoz nawe di taper des sacwès come 'unsigned'. Tchaeke tape dins l' intrêye est metowe a pårt pa-z ene colone ':'. Notez ki les tapes volèt dire di vraiyès tapes, insi, vos dvoz scrire çou k' vos taprîz vormint sol taprece. Dins l' tåvlea vaici pa dzo, li colone di hintche mostere l' intrêye et l' cene di droete çou k' vos tapez.\n\n"enter" (metans nouve roye) Intrer ou Ritour\na (metans pitit a) A\nA (metans grand a) SHIFT+A\n: (colone) SHIFT+;\n ' ' (espace) Espace
+Comment[zh_TW]=按下 Alt+Ctrl+H 會模擬您在鍵盤上輸入 'Hello'。若是您挺懶得打一些常用的如 'unsigned' 之類的字,這類動作就很好用。輸入的每個按鍵以冒號 : 區隔。注意按鍵就是按鍵,您必須定義您實際要按下的鍵。在底下的表格中,左方的欄位顯示實際輸入,右方的欄位顯示要按的鍵。\n\n"enter"(換行) Enter 或 Return\na (小寫 a) A\nA(大寫 A) Shift+A\n:(冒號) Shift+;\n' '(空白鍵) Space
+Enabled=false
+Name=Type 'Hello'
+Name[bg]=Напишете "Здравей"
+Name[ca]=Tecleja 'Hola'
+Name[csb]=Wpiszë 'Hello'
+Name[da]=Skriv 'Hallo'
+Name[de]='Hello' ausgeben
+Name[el]=Πληκτρολογείστε 'Hello'
+Name[eo]=Tajpi "Saluton"
+Name[es]=Escriba «Hola»
+Name[et]='Hello' kirjutamine
+Name[fr]=Saisir « Hello »
+Name[fy]='Hallo' ynfiere
+Name[hr]=Upiši "Pozdrav"
+Name[hu]='Hello' beírása
+Name[is]=Skrifa 'Hello'
+Name[it]=Scrivi "Hello"
+Name[ja]='Hello' を入力
+Name[km]=វាយល 'Hello'
+Name[ko]='Hello' 입력하기
+Name[nb]=Skriv 'Hallo'
+Name[nds]="Hello" tippen
+Name[nl]='Hallo' typen
+Name[pa]='Hello' ਲਿਖੋ
+Name[pl]=Wpisanie 'Hello'
+Name[pt]=Escrever 'Olá'
+Name[pt_BR]=Digitar 'Hello'
+Name[ro]=Tastați 'Hello'
+Name[ru]=Ввод "Hello"
+Name[sk]=Typ 'Hello'
+Name[sl]=Natipkaj »Hello«
+Name[sr]=Унос „Hello“
+Name[sr@Latn]=Unos „Hello“
+Name[sv]=Skriv 'Hej'
+Name[te]='హెల్లొ' వ్రాయండి
+Name[tg]=Вориди "Hello"
+Name[th]=พิมพ์ 'Hello'
+Name[tr]='Hello' yazın
+Name[uk]=Введіть "Привіт"
+Name[wa]=Tapez 'Hello'
+Name[zh_TW]=輸入 Hello
+Type=KEYBOARD_INPUT_SHORTCUT_ACTION_DATA
+
+[Data_1_2Actions]
+ActionsCount=1
+
+[Data_1_2Actions0]
+Input=Shift+H:E:L:L:O\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_2Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_2Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_2Triggers0]
+Key=Alt+Ctrl+H
+Type=SHORTCUT
+
+[Data_1_3]
+Comment=This action runs Konsole, after pressing Ctrl+Alt+T.
+Comment[bg]=Това действие стартира конзола при натискането на Ctrl+Alt+T.
+Comment[ca]=Aquesta acció executa el Konsole, després de prémer Ctrl+Alt+T.
+Comment[csb]=To dzejani zrëszô Konsolã, pò wcësniãcym Ctrl+Alt+T.
+Comment[da]=Denne handling kører Konsole, efter tryk på Ctrl+Alt+T.
+Comment[de]=Nach dem Drücken von Strg+Alt+T wird das Terminalprogramm "Konsole" gestartet
+Comment[el]=Αυτή η ενέργεια εκτελεί το Konsole, μετά το πάτημα του Ctrl+Alt+T.
+Comment[eo]=Ĉi tiu lanĉas Konzolon, post premo de Ctrl+Alt+T.
+Comment[es]=Esta acción ejecuta Konsole, tras pulsar Ctrl+Alt+T.
+Comment[et]=See toiming käivitab klahvidele Ctrl+Alt+T vajutades Konsooli.
+Comment[fr]=Cette action démarre Konsole, après avoir pressé « Ctrl+Alt+T ».
+Comment[fy]=Dizze aksje fiert Konsole út, neidat jo op Ctrl+Alt+T drukt ha.
+Comment[hr]=Nakon pritiska tipki Ctrl+Alt+T pokrenut će se Konsole.
+Comment[hu]=Elindítja a Konsole-t a Ctrl+Alt+T lenyomásakor.
+Comment[is]=Þessi aðgerð keyrir skjáhermi þegar ýtt er á Ctrl+Alt+T.
+Comment[it]=Questa azione avvia Konsole, dopo la pressione di Ctrl+Alt+T.
+Comment[ja]=Ctrl+Alt+T を押して Konsole を起動します。
+Comment[km]=សកម្មភាព​នេះ​រត់​កុងសូល បន្ទាប់​ពី​ចុចបញ្ជា(Ctrl)+ជំនួស(Alt)+T ។
+Comment[ko]=Ctrl+Alt+T 키를 눌렀을 때 Konsole을 실행시킵니다.
+Comment[nb]=Handlingen kjører Konsole etter tasting av Ctrl+Alt+T.
+Comment[nds]=Disse Akschoon röppt Konsole mit Strg+Alt+T op.
+Comment[nl]=Deze handeling voert Konsole uit, nadat op Ctrl+Alt+T is gedrukt.
+Comment[pl]=Ta akcja uruchamia Konsolę po naciśnięciu Ctrl+Alt+T
+Comment[pt]=Esta acção corre o Konsole, após carregar em Ctrl+Alt+T.
+Comment[pt_BR]=Esta ação executa o Konsole, após pressionar Ctrl+Alt+T.
+Comment[ro]=Această acțiune lansează Konsole, după ce apăsați Ctrl+Alt+T.
+Comment[ru]=Запуск Konsole при нажатии Ctrl+Alt+T.
+Comment[sk]=Táto akcia spustí Konsole po stlačení Ctrl+Alt+T.
+Comment[sl]=To dejanje požene Konzolo, po pritisku Ctrl+Alt+T.
+Comment[sr]=Ова радња покреће Konsole, пошто притиснете Ctrl+Alt+T.
+Comment[sr@Latn]=Ova radnja pokreće Konsole, pošto pritisnete Ctrl+Alt+T.
+Comment[sv]=Åtgärden kör Terminal, när man trycker på Ctrl+Alt+T.
+Comment[th]=การกระทำนี้จะเรียกโปรแกรม Konsole หลังจากกด Ctrl+Alt+T
+Comment[uk]=Ця дія викликає Konsole після натискання Ctrl+Alt+T.
+Comment[wa]=Ciste accion enonde Konsole, après aveur tchôkî CTRL+ALT+T.
+Comment[zh_TW]=這個動作會在按下 Ctrl+Alt+T 時執行 Konsole
+Enabled=false
+Name=Run Konsole
+Name[bg]=Стартиране на конзола
+Name[bn]=কনসোল চালাও
+Name[br]=Seveniñ Konsole
+Name[ca]=Executa el Konsole
+Name[cs]=Spustit Konsoli
+Name[csb]=Zrëszë kònsola
+Name[da]=Kør Konsole
+Name[de]=Konsole starten
+Name[el]=Εκτέλεση Konsole
+Name[eo]=Lanĉi Konzolon
+Name[es]=Ejecutar Konsole
+Name[et]=Konsooli käivitamine
+Name[fr]=Démarrer Konsole
+Name[fy]=Konsole útfiere
+Name[hr]=Pokreni konzolu
+Name[hu]=A Konsole futtatása
+Name[is]=Keyra skjáhermi
+Name[it]=Esegui Konsole
+Name[ja]=Konsole を起動
+Name[km]=រត់​កុងសូល
+Name[ko]=Konsole 실행시키기
+Name[nb]=Kjør Konsoll
+Name[nds]=Konsole opropen
+Name[nl]=Konsole uitvoeren
+Name[pa]=ਕੰਨਸੋਲ ਚਲਾਓ
+Name[pl]=Uruchomienie Konsoli
+Name[pt]=Executar o Konsole
+Name[pt_BR]=Executar o Konsole
+Name[ro]=Lansează Konsole
+Name[ru]=Запустить Konsole
+Name[sk]=Spustiť Konzole
+Name[sl]=Zaženi Konzolo
+Name[sr]=Покрени Konsole
+Name[sr@Latn]=Pokreni Konsole
+Name[sv]=Kör Terminal
+Name[tg]=Оғози Konsole
+Name[th]=เรียกโปรแกรม Konsole
+Name[tr]=Konsole Çalıştır
+Name[uk]=Запуск Konsole
+Name[uz]=Konsole dasturini ishga tushirish
+Name[uz@cyrillic]=Konsole дастурини ишга тушириш
+Name[wa]=Enonder Konsole
+Name[zh_TW]=執行 Konsole
+Type=COMMAND_URL_SHORTCUT_ACTION_DATA
+
+[Data_1_3Actions]
+ActionsCount=1
+
+[Data_1_3Actions0]
+CommandURL=konsole
+Type=COMMAND_URL
+
+[Data_1_3Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_3Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_3Triggers0]
+Key=Alt+Ctrl+T
+Type=SHORTCUT
+
+[Data_1_4]
+Comment=Read the comment on action "Type 'Hello'" first.\n\nQt Designer uses Ctrl+F4 for closing windows (maybe because MS Windows does it that way *shrug*). But Ctrl+F4 in KDE stands for going to virtual desktop 4, so it doesn't work in Qt Designer, and also, Qt Designer doesn't use KDE's standard Ctrl+W for closing the window.\n\nBut the problem can be solved by remaping Ctrl+W to Ctrl+F4 when the active window is Qt Designer. When Qt Designer is active, every time Ctrl+W is pressed, Ctrl+F4 will be sent to Qt Designer instead. In other applications, Ctrl+W remains working the usual way of course.\n\nWe now need to specify three things: A new shortcut trigger on 'Ctrl+W', a new keyboard input action sending Ctrl+F4, and a new condition that the active window is Qt Designer.\nQt Designer seems to always have title 'Qt Designer by Trolltech', so the condition will check for the active window having that title.
+Comment[bg]=Прочетете коментара на действие "Напишете "Здравей".\n\nQt Designer използва Ctrl+F4 за затваряне на прозорците (може би защото и MS Windows прави същото *shrug*). Но Ctrl+F4 в KDE означава отиване на виртуален работен плот 4, следователно не работи в Qt Designer. Също така Qt Designer не използва стандартното Ctrl+W за затваряне на прозорец.\n\nПроблемът може да бъде решен чрез задаване на Ctrl+F4 вместо Ctrl+W когато активният прозорец е Qt Designer. Когато последният е активен, всеки път при натискане на Ctrl+W, ще бъде изпращан Ctrl+F4 до дизайнера. Разбира се, в другите програми Ctrl+W ще работи по обичайния начин.
+Comment[ca]=Primer llegiu el comentari de l'acció "Tecleja 'Hola'".\n\nEl Qt Designer usa Ctrl+F4 per tancar les finestres (potser perquè el MS Windows ho fa d'aquesta manera). Però Ctrl+F4 al KDE representa que porta a l'escriptori virtual 4, de manera que no funciona en el Qt Designer. El Qt Designer tampoc empra l'estàndard del KDE Ctrl+W per tancar la finestra.\n\nPerò el problema es pot solucionar reconvertint Ctrl+W a Ctrl+F4 quan la finestra activa és el Qt Designer. Quan el Qt Designer és actiu, cada vegada que es premi Ctrl+W, en el seu lloc s'enviarà Ctrl+F4 al Qt Designer. En d'altres aplicacions, Ctrl+W continuarà funcionant de la manera habitual.\n\nAra ens cal indicar tres coses: un activador de drecera nou sobre 'Ctrl+W', una acció nova d'entrada de teclat que enviï Ctrl+F4, i una condició nova si la finestra activa és el Qt Designer.\nEl Qt Designer sembla que sempre té el títol 'Qt Designer by Trolltech', així que la condició comprovarà que la finestra activa tingui aquest títol.
+Comment[da]=Læs kommentaren til "Skriv 'Hello'" først.\n\nQt Designer bruger Ctrl+F4 til at lukke vinduer (måske fordi MS Windows gør det på den måde *øv*). Men Ctrl+F4 i KDE står for at gå til virtuel desktop 4, så dette virker ikke i Qt Designer, og Qt Designer bruger heller ikke KDE's standard Ctrl+W for at lukke vinduet.\n\nMen problemet kan løses ved at omdirigere Ctrl+W til Ctrl+F4 når det aktive vindue er Qt Designer. Når Qt Designer er aktivt, så vil hver gang Ctrl+W bliver trykket, Ctrl+F4 blive sendt til Qt Designer i stedet for. I andre programmer, bliver Ctrl+W naturligvis ved med at virke på den sædvanlige måde.\n\nVi skal nu angive tre ting: En ny genvejsudløser for 'Ctrl+W', en ny tastatur inddatahandling, der sender Ctrl+F4, og en ny betingelse at det aktive vindue er Qt Designer.\nQt Designer synes altid at have titlen 'Qt Designer by Trolltech', så betingelsen vi tjekker for er at det aktive vindue har denne titel.
+Comment[de]=Lesen Sie bitte zunächst den Kommentar zu der Aktion "Hello ausgeben".\n\nQt-Designer benutzt die Tastenkombination Strg+F4 zum Schließen von Fenstern (vermutlich, weil dies so auch in Windows üblich ist). In KDE wiederum ist dies die übliche Tastenkombination, um auf die Arbeitsfläche 4 zu wechseln. Das in KDE übliche Strg+W zum Schließen eines Fensters funktioniert ebenfalls nicht in Qt-Designer. Das Problem kann aber umgangen werden: Dazu muss Strg+W auf Strg+F4 umgelegt werden, wenn Qt-Designer das aktive Fenster ist. Immer wenn Sie dann in Qt-Designer Strg+W drücken, wird in Wirklichkeit Strg+F4 an das Programm gemeldet. In anderen Programmen wird Strg+W natürlich wie gewohnt weiter funktionieren.\n\nEs müssen drei Dinge eingestellt werden: Eine neue Tastenkombination für "Strg+W", eine neue Tastaturaktion, die Strg+F4 sendet, und eine neue Bedingung für das aktive Qt-Designer-Fenster.\nDer Fenstertitel von Qt-Designer scheint grundsätzlich "Qt Designer by Trolltech" zu lauten, also wird die Bedingung auf diesen Fenstertitel prüfen.
+Comment[el]=Διαβάστε πρώτα το σχόλιο στην ενέργεια "Πληκτρολογείστε 'Hello'".\n\nΟ σχεδιαστής Qt χρησιμοποιεί το Ctrl+F4 για το κλείσιμο παραθύρων (πιθανότατα γιατί έτσι γίνεται στα MS Windows*shrug*). Αντίθετα το Ctrl+F4 στο KDE εκτελεί μετάβαση στην εικονική επιφάνεια εργασίας 4, οπότε και δεν λειτουργεί με τον σχεδιαστή Qt, καθώς επίσης ο σχεδιαστής Qt δεν χρησιμοποιεί το τυπικό Ctrl+W του KDE για το κλείσιμο του παραθύρου.\n\nΤο πρόβλημα μπορεί να λυθεί με νέα αντιστοίχηση του Ctrl+W στο Ctrl+F4 όταν το ενεργό παράθυρο είναι ο σχεδιαστής Qt. Όταν αυτός θα είναι ενεργός, κάθε φορά που πατιέται το Ctrl+W, θα αποστέλλεται στον σχεδιαστή το Ctrl+F4. Στις άλλες εφαρμογές, το Ctrl+W παραμένει ως έχει.\n\nΘα πρέπει να οριστούν τρία πράγματα: Μια νέα ενεργοποίηση συντόμευσης για το 'Ctrl+W', μια νέα ενέργεια εισόδου πληκτρολογίου με αποστολή του Ctrl+F4 και μια νέα συνθήκη που θα ελέγχει αν το ενεργό παράθυρο είναι ο σχεδιαστής Qt.\n Το παράθυρό του έχει πάντα τίτλο 'Qt Designer by Trolltech', οπότε η συνθήκη θα ελέγχει αυτόν τον τίτλο στο ενεργό παράθυρο.
+Comment[eo]=Legu la komenton pri ago "Tajpu Saluton" unue.\n\nQt-Desegnilo uzas Ctrl+F4 por fermi fenestrojn (eble ĉar MS Vindozo faras tiele). Malfeliĉe, KDE jam uzas tiun fulmoklavaron, por transloki oni al tabulo 4, do ne estas disponebla por Qt-Desegnilo. KDE fermas fenestrojn per Ctrl+W.\n\nLa problemo estas solvita per ĵeti la komandon de Ctrl+W al Ctrl+F4 kiam ajn la aktiva fenestro estas Qt-Desegnilo. Tiel estas, kiam oni premas Ctrl+W, Qt-Desegnilo pensos ke Ctrl+F4 estas premita. Ne aplikas al ia ajn aplikaĵa fenestro.\n\nNi bezonas difini 3 aferojn: novan fulmoklavan lanĉon por "Ctrl+W", novan klavan enmetan agon kiu sendas "Ctrl+F4", kaj novan postulon ke la aktiva fenestro estas Qt-Desegnilo.\nQt-Desegnilo ŝajnas ĉiam havi la titolon "Qt-Designer by Trolltech", do la postulo kontrolos aktivan fenestron de tiu titolo.
+Comment[es]=Lea el comentario sobre la acción «Teclee 'Hola'» primero.\n\nQt Designer usa Ctrl+F4 para cerrar las ventanas (tal vez porque MS Windows también lo hace así). Pero Ctrl+F4 en KDE significa ir al escritorio virutal 4, por lo que no funciona en Qt Designer. Del mismo modo, Qt Designer no usa la secuencia Ctrl+W estándar de KDE para cerrar la ventana.\n\nPero el problema se puede resolver reasignando Ctrl+W a Ctrl+F4 cuando la ventana activa es Qt Designer. Cuando Qt Designer esté activo, cada vez que se pulse Ctrl+W, en su lugar se enviará Ctrl+F4 a QtDesigner. Por supuesto, en otras aplicaciones, Ctrl+W seguirá funcionando de la manera habitual.\n\nAhora es necesario indicar tres cosas: un nuevo atajo de teclado para «Ctrl+W», una nueva acción de entrada de teclado que envíe Ctrl+F4, y una nueva condición de que la ventana activa sea Qt Designer.\nQt Designer siempre parece tener el título «Qt Designer by Trolltech», así que la condición comprobará si la ventana activa tiene ese título.
+Comment[et]=Loe kõigepealt toimingu "'Hello' kirjutamine" kommentaari.\n\nQt Disainer kasutab kombinatsiooni Ctrl+F4 akna sulgemiseks (vahest seepärast, et sama teeb ka MS Windows? :-) ). Kuid KDE-s tähendab Ctrl+F4 liikumist neljandale virtuaalsele töölauale, mistõttu see ei toimi Qt Disaineris, lisaks sellele ei kasuta Qt Disainer akna sulgemiseks KDE tüüpkombinatsiooni Ctrl+W.\n\nKuid probleemi saab lahendada Ctrl+W sidumisega Ctrl+F4 külge, kui Qt Disaineri aken on aktiivne. Sel juhul saadetakse siis, kui Qt Disaineri aken on aktiivne, Ctrl+W vajutamisel aknale tegelikult käsk Ctrl+F4. Teistes rakendustes töötab Ctrl+W mõistagi endiselt samamoodi edasi.\n\nNüüd tuleb ära määrata kolm asja: uus kiirklahvi käivitaja 'Ctrl+W' jaoks, uus klaviatuuritoiming Ctrl+F4 saatmiseks ja uus tingimus, et aktiivne aken peab olema Qt Disaineri aken.\nPaistab, et Qt Disaineri akna tiitel on alati 'Qt Designer by Trolltech', nii et tingimus peab konrollima sellise tiitliga aktiivse akna olemasolu.
+Comment[fr]=Veuillez d'abord lire le commentaire de l'action « Saisir 'Hello' ».\n\nQt Designer utilise le raccourci « Ctrl+F4 » pour fermer des fenêtres (probablement parce que Microsoft Windows fait de même). Cependant pour KDE, « Ctrl+F4 » désigne le déplacement vers le bureau virtuel 4, et cela ne fonctionnera donc pas à l'intérieur de Qt Designer ; en plus, Qt Designer n'utilise pas le raccourci « Ctrl+W » pour fermer les fenêtres (par défaut dans KDE).\n\nCe problème peut être résolu en redéfinissant « Ctrl+W » par « Ctrl+F4 » lorsque la fenêtre active est Qt Designer. Quand Qt Designer est actif, chaque fois que « Ctrl+W » est pressé, « Ctrl+F4 » sera envoyé à Qt Designer à sa place. Dans les autres applications, « Ctrl+W » fonctionnera normalement.\n\nNous avons donc besoin de spécifier trois choses : un nouveau déclencheur d'évènement lors d'un « Ctrl+W », une action d'envoi de touches « Ctrl+F4 », et une condition confirmant que la fenêtre active est Qt Designer.\nQt Designer semble toujours avoir le titre « Qt Designer par Trolltech », la condition à vérifier est donc que la fenêtre active comporte bien ce libellé.
+Comment[fy]=Lês earst it kommentaar fan de aksje "typ 'Hallo'".\n\nQt Designer brûkt Ctrl+F4 om finsters te sluten (miskien omdat Microsoft Windows dat ek docht). Mar yn KDE betekent Ctrl+4 it gean nei it firtuele buroblêd 4. Dêrtroch wurket de fluchtoets net yn Qt Designer en wurdt Ctrl+W, de standert sluttoets yn KDE, net brûkt.\n\nJo kinne dizze swierricgens opslosse troch Ctrl+W nei Ctrl+F4 te wizigjen wannear it aktive finster Qt Designer is. Wannear Qt Designer aktyf is, sil eltse kear as Ctrl+W yndrukt wurdt it sinjaal Ctrl+F4 nei Qt Designer tastjoer wurde. Ctrl+W bliuwt yn oare programma's gewoan deselde betekenis hâlden.\n\nDer moatte trije gegevens ynfierd wurde: de fluchtoets sles, de ferstjoerde fluchtoets en de foarwearde dat it aktive finster Qt Designer wêze moat.\nQt Designer hat altyd de titel 'Qt Designer by Trolltech', dus de foarwearde moat kontrolearje of it finster dy titel hat.
+Comment[hr]=Prvo pročitajte komentar o aktivnosti "Type 'Hello'".\n\nQt Designer za zatvaranje prozora upotrebljava prečac Ctrl+F4 (možda jer i MS Windows upotrebljavaju taj prečac na isti način?). Ali, kako prečac Ctrl+F4 unutar KDE podrazumijeva prelazak na virtualnu radnu površinu broj 4, ovaj prečac ne funkcionira unutar Qt Designera. Također, Qt Designer za zatvaranje prozora ne upotrebljava standardni KDE prečac Ctrl+W.\n\nProblem se može riješiti promjenom mapiranja prečaca Ctrl+W u Ctrl+F4 kad je Qt Designer aktivan prozor. Kad je Qt Designer aktivan, pri svakom pritisku prečava Ctrl+W, Qt Designeru bit će poslan prečac Ctrl+F4.Unutar ostalih aplikacija prečac Ctrl+W nastavit će s uobičajenim načinom funkcioniranja.\n\nU ovom je trenutku potrebno odrediti tri detalja: novi okidač prečaca "Ctrl+W", novi unos putem tipkovnice koji šalje prečac Ctrl+F4 i novi uvjet koji opisuje kako je aktivan prozor Qt Designerov.\nIzgleda kako Qt Designer uvijek sadrži naslov "Qt Designer by Trolltech" pa će uvjet provjeravati ima li aktivan prozor ovakav naslov.
+Comment[hu]=Előbb olvassa el a "'Hello' beírása" bejegyzés leírását.\n\nA Qt Designer a Ctrl+F4-et használja ablak bezárásához (talán az MS Windows hatására). De a Ctrl+F4 lenyomásakor a KDE-ben a 4. asztalra vált át, tehát ez nem működik a Qt Designerben, továbbá a Qt Designer nem a KDE-ben szokásos Ctrl+W-t használja ablak bezárásához.\n\nA probléma megoldható azonban, ha a Ctrl+W-t leképezi a Ctrl+F4-re, ha az aktív ablak a Qt Designerhez tartozik. Amikor a Qt Designer aktív, a Ctrl+W minden lenyomásakor Ctrl+F4 lesz elküldve a Qt Designernek. Más alkalmazásokban a Ctrl+W természetesen a szokott módon működik.\n\nHárom dolgot kell megadni: egy új aktiválót a 'Ctrl+W' kombinációra, egy beviteli műveletet (küldést) a Ctrl+F4-re, és egy új feltételt arra, hogy a Qt Designer az aktív ablak.\nA Qt Designer címsora mindig 'Qt Designer by Trolltech', ezért a feltétel ezt a sztringet fogja keresni az ablak címsorában.
+Comment[is]=Lestu athugasemdina við aðgerðina "Sláðu inn 'Hello'" fyrst.\n\nQt Hönnuðurinn notar Ctrl+F4 til að loka gluggum (kannski vegna þess að MS Windows gerir það á þann mátann *hmmm*). En Ctrl+F4 í KDE stendur fyrir að fara yfir á sýndarskjáborð númer 4, og virkar því ekki í Qt Hönnuðinum, að auki notar Qt hönnuðurinn ekki stöðluðu KDE samsetninguna Ctrl+W til að loka gluggum.\n\nEn vandamálið má leysa með því að endurúthluta Ctrl+W sem Ctrl+F4 þegar virki glugginn er frá Qt Hönnuðinum. Þegar Qt Hönnuðurinn er opinn, í hvert skipti sem ýtt er á Ctrl+W þá er samsetningin Ctrl+F4 send í staðin til Ot Hönnuðarins. Í öðrum forritum virkar Ctrl+W áfram eins og venjulega til að loka gluggum.\n\nNú er gott að hafa þrennt í huga: Búinn er til nýr flýtilykill 'Ctrl+W', sem ræsir lyklaborðssendinguna Ctrl+F4, og tekur með sér skilyrðinguna að glugginn verði að vera frá Qt Hönnuðinum.\nGluggar Qt Hönnuðarins virðast alltaf hafa titilinn 'Qt Designer by Trolltech', þannig að skilyrðingin er sú að athuga hvort virki glugginn hafi þennan titil.
+Comment[it]=Leggi il commento dell'azione "Scrivi 'Hello'" prima.\n\nQt Designer usa Ctrl+F4 per chiudere le finestre (forse perché MS Windows fa in quel modo *alzata di spalle*). Ma Ctrl+F4 in KDE significa "vai al desktop 4", quindi non funziona in Qt Designer e inoltre, Qt Designer non usa la scorciatoia standard di KDE, Ctrl+W, per chiudere la finestra.\n\nMa il problema si può risolvere rimappando Ctrl+W su Ctrl+F4 quando la finestra attiva è Qt Designer. Quando Qt Designer è attivo, ogni volta che si preme Ctrl+W, verrà inviato Ctrl+F4 a Qt Designer. Nelle altre applicazioni Ctrl+W continua a funzionare come al solito, naturalmente.\n\nDobbiamo specificare tre cose: Una nuova scorciatoia su "Ctrl+W", una nuova azione di immissione da tastiera che invia Ctrl+F4, e una nuova condizione che la finestra attiva sia Qt Designer.\nQt Designer apparentemente ha sempre il titolo "Qt Designer by Trolltech", quindi la condizione controllerà che la finestra attiva abbia tale titolo.
+Comment[ja]=まず「'Hello' を入力」の説明をお読みください。\n\nQt デザイナーは Ctrl+F4 でウィンドウを閉じます (おそらく MS Windows がそのようになっているためでしょう、やれやれ)。しかし、KDE では Ctrl+F4 は仮想デスクトップ 4 への切り替えに割り当てられているため、動きません。また、Qt デザイナーは KDE 標準の Ctrl+W でウィンドウを閉じません。\n\nこの問題は、Qt デザイナーがアクティブウィンドウである場合に限って Ctrl+W を Ctrl+F4 に割り当て直すことで解決できます。Qt デザイナーがアクティブなときに Ctrl+W を押すと、Ctrl+F4 が代わりに Qt デザイナーへ送られます。他のアプリケーションでは Ctrl+W が通常どおりに動きます。\n\nこのためには 3 つのことを指定する必要があります。新しいショートカットトリガ 'Ctrl+W'、Ctrl+F4 を送る新しいキーボード入力アクション、そして「アクティブウィンドウは Qt デザイナー」という条件です。\nQt デザイナーは常に 'Qt Designer by Trolltech' というタイトルを持っているようなので、そのタイトルを持つアクティブウィンドウという条件を指定します。
+Comment[km]=អាន​សេចក្ដី​អធិប្បាយ​នៅ​ពេល​មាន​សកម្មភាព "វាយ 'Hello'" ជា​មុន​សិន ។\n\nកម្មវិធី​រចនា Qt ប្រើ​ បញ្ជា (Ctrl)+F4 សម្រាប់​បិទ​បង្អួច (ប្រហែល​ជា​ MS Windows ធ្វើ​វា *ភិតភ័យ*) ។ ប៉ុន្តែ បញ្ជា(Ctrl)+F4 នៅ​ក្នុង KDE ជំនួស​ឲ្យ​ការ​ទៅ​កាន់​ផ្ទៃតុ​និម្មិត ៤ ដូច្នេះ​វា​មិន​ដំណើរការ​នៅ​ក្នុង​កម្មវិធី​រចនា Qt ទេ ហើយ​កម្មវិធី​រចនា Qt ក៏​មិន​​ប្រើបញ្ជា (Ctrl+W) ស្ដង់ដារ​របស់ KDE ដែរ សម្រាប់​បិទ​បង្អួច ។\n\nប៉ុន្តែ​បញ្ហា​អាច​ត្រូវ​បាន​ដោះស្រាយ​ដោយ​ផ្គូផ្គងបញ្ជា (Ctrl)+W ទៅ​ជាបញ្ជា (Ctrl)+F4 នៅ​ពេល​បង្អួច​​សកម្ម​គឺ​ជា​កម្មវិធី​រចនា Qt ។ នៅ​ពេល​កម្មវិធី​រចនា Qt ​សកម្ម គ្រប់​ពេល​ដែល​ចុច បញ្ជា(Ctrl)+W បញ្ជា(Ctrl)+F4 នឹង​ត្រូវ​បាន​ផ្ញើ​ទៅ​កម្មវិធី​រចនា​ Qt ជំនួស​វិញ ។ នៅ​ក្នុង​កម្មវិធី​ផ្សេង​ទៀត បញ្ជា(Ctrl)+W នៅ​តែ​ដំណើរការ​តាម​ធម្មតា ។\n\nឥឡូវ​យើង​ត្រូវ​ការ​បញ្ជាក់​រឿង​បី ៖ កេះ​ផ្លូវកាត់​ថ្មី​នៅ​ពេល​ប្រើ 'បញ្ជា(Ctrl)+W' ការ​ផ្ញើ​សកម្ម​​ភាព​បញ្ចូល​របស់ក្ដារ​ចុច​ថ្មី​ផ្ញើ​ទៅ​បញ្ជា(Ctrl)+F4 ហើយ​លក្ខខណ្ឌ​ថ្មីដែល​​បង្អួច​សកម្ម​គឺ​កម្មវិធី​រចនា Qt ។\nកម្មវិធី​រចនា Qt ហាក់​បី​ដូច​ជា​មាន​ចំណង​ជើង 'កម្មវិធី​រចនា Qt ដោយ Trolltech' ដូច្នេះ​លក្ខខណ្ឌ​នឹង​ពិនិត្យ​មើល​បង្អួ​ចសកម្ម​ដែល​មាន​ចំណង​ជើង​នោះ ។
+Comment[nb]= Les kommentaren på handlinga "Skriv Hello" først. \n\nBruk Ctrl+F4 for å stenge Qt Designer (kanskje fordi MS Windows gjør det slik?). Men Ctrl+F4 i KDE går til virtuelt skrivebord 4. Så den virker ikke i Qt Designer. Så Qt Designer bruker ikke KDEs standard Ctrl+W for å stenge vinduer. \n\nMen problemet løses ved å legge om Ctrl+W med Ctrl+F4 når Qt Designer er aktiv. Når Qt Designer er aktiv, Ctrl+4 blir sent ved å taste Ctrl+W. Andre programmer vil bruke Ctrl+W som vanlig. \n\nNå trenger man å spesifisere tre ting: En hurtigtast til Ctrl+W. Nye inndata for tastaturet som sender Ctrl+F4, og en ny forbetingelse som aktiviserer Qt Designer-vinduet. \nQt Designer passer på å ha tittelen 'Qt Designer by Trolltech', Så man vil sjekke om aktivt vindu har denne tittelen.
+Comment[nds]=Lees bitte eerst den Kommentar för de Akschoon "'Hello' tippen".\n\nQt-Designer bruukt Strg+F4 för't Tomaken vun Finstern (villicht, wiel MS Windows dat so maakt *tuckschuller*), man in KDE maakt Strg+F4 Schriefdisch 4 aktiv. Dat funkscheneert also in Qt-Designer nich, wat ok keen Strg+W bruukt, wat de KDE-Standard för't Tomaken vun Finstern is.\n\nDat Problem lett sik lösen, wenn Een bi aktiv Qt-Designer-Finster Strg+W na Strg+F4 toornt. Is Qt-Designer aktiv un drückst Du Strg+W, kriggt Qt-Designer Strg+F4 ansteed tostüert. In anner Programmen funkscheneert Strg+W as jümmers.\n\nWi mööt nu dree Saken angeven: En nieg Utlöser för Strg+W, en nieg Tastatuur-Ingaavakschoon, de Strg+F4 sendt, un en nieg Bedingen, dat Qt-Designer dat aktive Finster wesen mutt.\nAs't lett hett dat Finster vun Qt-Designer jümmers den Titel "Qt Designer by Trolltech", also pröövt wi in de Bedingen, wat dat aktive Finster dissen Titel hett.
+Comment[nl]=Lees de opmerking over de actie "Hallo typen" eerst.\n\nQt Designer gebruikt Ctrl+F4 om vensters te sluiten (misschien omdat Microsoft Windows dat ook doet). Maar in KDE betekent Ctrl+4 het gaan naar het virtuele bureaublad 4. Daardoor werkt de sneltoets niet in Qt Designer en wordt Ctrl+W, de standaard sluittoets binnen KDE, niet gebruikt.\n\nU kunt dit probleem oplossen door Ctrl+W naar Ctrl+F4 te laten verwijzen wanneer het actieve venster Qt Designer is. Wanneer Qt Designer actief is, zal iedere keer dat Ctrl+W wordt ingedrukt het signaal Ctrl+F4 naar Qt Designer gestuurd worden. Ctrl+W blijft in andere programma's gewoon dezelfde betekenis houden.\n\nEr dienen drie gegevens ingevuld te worden: de sneltoets zelf, de verzonden sneltoets en de voorwaarde dat het actieve venster Qt Designer moet zijn.\nQt Designer heeft altijd de titel 'Qt Designer by Trolltech', dus de voorwaarde zal eerst controleren of het venster die titel heeft.
+Comment[pl]=Przeczytaj najpierw opis akcji "Wpisanie 'Hello'".\n\nQt Designer używa skrótu Ctrl+F4 do zamykania okien (być może dlatego, że robi tak MS Windows). Ale w KDE Ctrl+F4 oznacza przejście do czwartego wirtualnego pulpitu, więc nie działa w Qt Designerze, a z kolei Qt Designer nie używa standardowego skrótu KDE Ctrl+W do zamykania okna.\n\nWięc ten problem można rozwiązać mapując klawisz Ctrl+W do Ctrl+F4 kiedy aktywne jest okno Qt Designera. Kiedy aktywny jest Qt Designer, za każdym razem, gdy wciśnięte zostanie Ctrl+W, do Qt Designera wysłane zostanie zamiast tego Ctrl+F4. W innych programach Ctrl+W będzie działało tak jak do tej pory. \n\nMusimy określić 3 rzeczy: nową akcję dla 'Ctrl+W', nową akcję wysłania klawisza Ctrl+F4 oraz nowy warunek, że aktywnym oknem jest Qt Designer.\nWygląda na to, że okno Qt Designera zawsze ma tytuł 'Qt Designer by Trolltech', więc warunek będzie sprawdzał, czy jest aktywne okno o takim tytule.
+Comment[pt]=Leia o comentário sobre a acção "Escrever 'Olá'" primeiro.\n\nO Qt Designer usa o Ctrl+F4 para fechar as janelas (talvez porque o MS Windows também o faz *shrug*). Mas o Ctrl+F4 no KDE significa ir para o ecrã virtual 4, por isso não funciona no Qt Designer; do mesmo modo, o Qt Designer não usa a sequência Ctrl+W normal do KDE para fechar a janela.\n\nMas o problema poderá ser resolvido se atribuir de novo o Ctrl+W ao Ctrl+F4 quando a janela activa for o Qt Designer. Quando o Qt Designer estiver activo, sempre que carregar no Ctrl+W, o Ctrl+F4 será enviado para o Qt Designer em alternativa. Nas outras aplicações, o Ctrl+W continua a funcionar da forma normal, como é óbvio.\n\nAgora é necessário definir três coisas: Um novo atalho para o 'Ctrl+W', uma nova acção de entrada do teclado que envia o Ctrl+F4 e uma nova condição que a janela seja o Qt Designer.\nO Qt Designer parece ter sempre o título 'Qt Designer by Trolltech', por isso a condição irá procurar a janela activa que tiver esse título.
+Comment[pt_BR]=Leia o comentário sobre a ação "Digitar 'Hello'" primeiro.\n\nO Qt Designer usa Ctrl+F4 para fechar as janelas (talvez porque é assim no MS Windows). Mas Ctrl+F4 no KDE significa ir para a área de trabalho virtual 4, portanto não funciona no Qt Designer, e também, o Qt Designer não usa o Ctrl+W padrão do KDE para fechar a janela.\n\nMas o problema pode ser resolvido remapeando Ctrl+W para Ctrl+F4 quando a janela ativa é o Qt Designer. Quanto o Qt Designer está ativo, toda vez que Ctrl+W é pressionado, Ctrl+F4 será enviado para o Qt Designer. Em outros aplicativos, Ctrl+W continua funcionando da maneira usual é claro.\n\nAgora precisamos especificar três coisas: Um novo atalho para o 'Ctrl+W', uma nova ação de entrada do teclado que envia o Ctrl+F4, e uma nova condição de que a janela ativa é o Qt Designer.\nO Qt Designer parece sempre ter o título 'Qt Designer by Trolltech', portanto a condição irá checar se a janela ativa tem aquele título.
+Comment[ro]=Citiți mai întâi comentariul la acțiunea "Tastați 'Hello'". \n\nQt Designer folosește Ctrl+F4 pentru închiderea ferestrelor (poate pentru că MS Windows o face astfel). Dar Ctrl+F4 în KDE este o scurtătură către desktop-ul virtual nr. 4, așa că nu merge în Qt Designer, iar în plus Qt Designer nu folosește standardul KDE Ctrl+W pentru închiderea ferestrei.\n\nDar problema poate fi rezolvată reasociind Ctrl+W la Ctrl+F4 când fereastra activă este Qt Designer. Când Qt Designer este activ, de fiecare dată dată când este apăsat Ctrl+W, la Qt Designer va fi trimis Ctrl+F4. În alte aplicații Ctrl+W va continua să funcționeze ca de obicei.\n\nAcum trebuie să specificăm trei lucruri: o nouă scurtătură pentru 'Ctrl+W', o nouă acțiune trimițând Ctrl+F4 și o nouă condiție cum că fereastra activă este Qt Designer.\nQt Designer pare să aibă întotdeauna titlul 'Qt Designer by Trolltech', așa că condiția va verifica dacă fereastra activă are acest titlu.
+Comment[ru]=По Ctrl+W будет эмулировано нажатие Ctrl+F4 для закрытия окна Qt Designer.\nПоиск окна Qt Designer осуществляется по заголовку "Qt Designer by Trolltech".
+Comment[sk]=Najprv si prečítajte komentár k akcii "Typ 'Hello'".\n\nQt Designer používa na zatváranie okien Ctrl+F4 (možno preto, že to tak robí MS Windows (?)). Ale Ctrl+F4 v KDE znamená prechod na virtuálnu plochu 4, takže to nefunguje v Qt Designerovi a tiež, Qt Designer nepoužíva KDE štandardné zatváranie okien pomocou Ctrl+W.\n\nProblém však môžete vyriešiť premapovaním Ctrl+W na Ctrl+F4, keď je aktívnym oknom okno Qt Designera. Keď je Qt Designer aktívny, vždy, keď stlačíte Ctrl+W, pošle sa Qt Designeru Ctrl+F4. V iných aplikáciach bude samozrejme Ctrl+W pracovať ako obvykle.\n\nTeraz potrebujeme nastaviť tri veci: nový spúštač klávesovej skratky 'Ctrl+W', novú vstupnú akciu klávesnice posielajúcu Ctrl+F4 a novú podmienku, že aktívne okno je Qt Designer.\nVyzerá, že Qt Designer má vždy titulok 'Qt Designer by Trolltech', takže podmienka bude kontrolovať, či má aktívne okno tento titul.
+Comment[sr]=Прочитајте прво коментар за радњу „Унос ‘Hello’“.\n\nQt Designer користи Ctrl+F4 за затварање прозора (можда зато што је исто тако у MS Windows-у). Али Ctrl+F4 у KDE-у означава одлазак на виртуелну радну површину 4, тако да не ради у Qt Designer-у. Такође, Qt Designer не користи KDE-ово стандардно Ctrl+W за затварање прозора.\n\nОви проблеми могу бити решени другачијим мапирањем за Ctrl+W и Ctrl+F4 када је активан прозор Qt Designer-а. Тада, сваки пут када се притисне Ctrl+W, уместо тога ће Ctrl+F4 бити послато Qt Designer-у. У другим програмима, Ctrl+W наравно наставља да ради као и обично.\n\nЗа ово морамо навести три ствари: Нови окидач пречице за „Ctrl+W“, нову радњу улаза са тастатуре која даје Ctrl+F4, и нови услов да је активан прозор онај Qt Designer-а.\nИзгледа да његов прозор увек има у наслову „Qt Designer by Trolltech“, тако да ће се то проверавати у услову за активан прозор.
+Comment[sr@Latn]=Pročitajte prvo komentar za radnju „Unos ‘Hello’“.\n\nQt Designer koristi Ctrl+F4 za zatvaranje prozora (možda zato što je isto tako u MS Windows-u). Ali Ctrl+F4 u KDE-u označava odlazak na virtuelnu radnu površinu 4, tako da ne radi u Qt Designer-u. Takođe, Qt Designer ne koristi KDE-ovo standardno Ctrl+W za zatvaranje prozora.\n\nOvi problemi mogu biti rešeni drugačijim mapiranjem za Ctrl+W i Ctrl+F4 kada je aktivan prozor Qt Designer-a. Tada, svaki put kada se pritisne Ctrl+W, umesto toga će Ctrl+F4 biti poslato Qt Designer-u. U drugim programima, Ctrl+W naravno nastavlja da radi kao i obično.\n\nZa ovo moramo navesti tri stvari: Novi okidač prečice za „Ctrl+W“, novu radnju ulaza sa tastature koja daje Ctrl+F4, i novi uslov da je aktivan prozor onaj Qt Designer-a.\nIzgleda da njegov prozor uvek ima u naslovu „Qt Designer by Trolltech“, tako da će se to proveravati u uslovu za aktivan prozor.
+Comment[sv]=Läs kommentaren om åtgärden "Skriv 'Hej'" först.\n\nQt Designer använder Ctrl+F4 för att stänga fönster (kanske för att MS Windows gör det). Men Ctrl+F4 i KDE betyder att gå till virtuellt skrivbord 4, så det fungerar inte i Qt Designer, och dessutom använder inte Qt Designer KDE:s standard för att stänga fönster, Ctrl+W.\n\nProblemet kan lösas genom att ändra Ctrl+W till Ctrl+F4 när det aktiva fönstret är Qt Designer. När Qt Designer är aktiverat, skickas Ctrl+F4 till Qt Designer istället, varje gång Ctrl+W trycks ner. Ctrl+W fortsätter förstås att fungera som vanligt i andra program.\n\nNu måste vi ange tre saker: En ny snabbtangent som utlöses med 'Ctrl+W', en ny inmatningsåtgärd för tangentbordet som skickar Ctrl+F4, och ett nytt villkor att det aktiva fönstret är Qt Designer.\nQt Designer verkar alltid ha titeln 'Qt Designer by Trolltech', så villkoret kontrollerar att det aktiva fönstret har den titeln.
+Comment[wa]=Lére li rawete en accion "Taper 'Hello'" aprume.\n\nQt Designer eploye CTRL+F4 po clôre les purneas (kékfeye paski MS Windows fwait l' minme *shrug*). Mins CTRL+F4 e KDE sieve a-z aler å forveyou sicribanne 4, adon ça n' rote nén dins Qt Designer. Ossu, Qt Designer n' eploye nén li standård da KDE CTRL+W po clôre les purneas.\n\nMins l' problinme pout cwante minme esse rezoudou e candjant les tapes CTRL+W viè CTRL+F4 cwand l' purnea en alaedje est Qt Designer. Cwand Qt Designer est en alaedje, a tchaeke côp ki CTRL+W est tchôkî, CTRL+F4 serè evoyî al plaece a Qt Designer. Ezès ôtes programes, CTRL+W dimorrè en ovraedje come d' åbitude.\n\nNos dvans asteure sipecifyî troes sacwès. On novea rascourti di tape so 'CTRL+W', ene novele accion d' intrêye di taprece en evoyant CTRL+F4 et ene nouve condicion kel purnea en alaedje est Qt Designer.\nQt Designer shonne aveur todi l' tite 'Qt Designer by Trolltech', adon l' condicion serè d' trover l' purnea en alaedje avou ç' tite.
+Comment[zh_TW]=請先參考「輸入 Hello」的註解。\n\nQt 設計器用 Ctrl+F4 來關閉視窗(也許是因為微軟用這個鍵?),不過在 KDE 中 Ctrl+F4 是跳到 4 號虛擬桌面,所以在 Qt 設計師中會無法使用。此外,Qt 設計師並未使用 KDE 標準的關閉視窗鍵 Ctrl+W。\n\n不過您可以利用此重新映射的功能來解決這個問題。當 Qt 設計師視窗取得焦點時,每次按下 Ctrl+W 鍵,實際上會送出 Ctrl+F4 給 Qt 設計師。而在其他應用程式中,Ctrl+W 鍵則不受影響。\n\n要使用此功能,要指定三個參數:快捷鍵 Ctrl+W,要做的動作為送出 Ctrl+F4,以及生效條件為目前焦點處於 Qt 設計師視窗。\nQt 設計師的視窗標題是 'Qt Designer by Trolltech',所以生效條件可以檢查視窗的標題是否符合。
+Enabled=false
+Name=Remap Ctrl+W to Ctrl+F4 in Qt Designer
+Name[bg]=Задаване на Ctrl+W за Ctrl+F4 в Qt Designer
+Name[ca]=Coverteix Ctrl+W a Ctrl+F4 en el Qt Designer
+Name[cs]=Změnit Ctrl+W na Ctrl+F4 v Qt Designeru
+Name[csb]=Zmieni Ctrl+w w Ctrl+F4 w QT Designer
+Name[da]=Omdirigér Ctrl+W til Ctrl+F4 i Qt Designer
+Name[de]=Strg+W in Qt-Designer auf Strg+F4 umleiten
+Name[el]=Νέα αντιστοίχηση Ctrl+W στο Ctrl+F4 για τον σχεδιαστή Qt
+Name[eo]=Ĵetu Ctrl+W al Ctrl+F4 por Qt-Desegnilo
+Name[es]=Reasignar Ctrl+W a Ctrl+F4 en Qt Designer
+Name[et]=Ctrl+W asendamine kombinatsiooniga Ctrl+F4 Qt Disaineris
+Name[fr]=Redéfinit « Ctrl+W » en « Ctrl+F4 » dans Qt Designer
+Name[fy]=Ctrl+W omsette nei Ctrl+F4 yn Qt Designer
+Name[hr]=Promjena mapiranja Ctrl+W u Ctrl+F4 unutar Qt Designera
+Name[hu]=A Ctrl+W leképezése a Ctrl+F4-re a Qt Designerben
+Name[is]=Endurúthluta Ctrl+W sem Ctrl+F4 í Qt Hönnuðinum
+Name[it]=Rimappa Ctrl+W su Ctrl+F4 in Qt Designer
+Name[ja]=Qt デザイナーで Ctrl+W を Ctrl+F4 に割り当て直す
+Name[km]=ផ្គូផ្គង​ឡើង​វិញ បញ្ជា(Ctrl)+W ទៅ​ជា បញ្ជា(Ctrl)+F4 នៅ​ក្នុង​កម្មវិធី​រចនា Qt
+Name[ko]=Qt 디자이너에서 Ctrl+W 키를 Ctrl+F4 키로 바꾸기
+Name[nb]=Omdefiner Ctrl+W til Ctrl+F4 i Qt Designer
+Name[nds]=Binnen Qt-Designer Strg+F4 na Strg+W toornen
+Name[nl]=Ctrl+W omzetten naar Ctrl+F4 in Qt Designer
+Name[pl]=Podmiana Ctrl+W na Ctrl+F4 w Qt Designerze
+Name[pt]=Mapear o Ctrl+W para Ctrl+F4 no Qt Designer
+Name[pt_BR]=Remapear Ctrl+W para Ctrl+F4 no Qt Designer
+Name[ro]=Reasociați Ctrl+W la Ctrl+F4 în Qt Designer
+Name[ru]=Замена Ctrl+W на Ctrl+F4 для Qt Designer
+Name[sk]=Premapovať Ctrl+W na Ctrl+F4 v Qt Designerovi
+Name[sr]=Пребаци Ctrl+W на Ctrl+F4 у Qt Designer-у
+Name[sr@Latn]=Prebaci Ctrl+W na Ctrl+F4 u Qt Designer-u
+Name[sv]=Ändra Ctrl+W till Ctrl+F4 i Qt Designer
+Name[uk]=Змінити Ctrl+W на Ctrl+F4 в Дизайнері Qt
+Name[wa]=Candjî les rascourtis CTRL+W viè CTRL+F4 e Qt Designer
+Name[zh_TW]=在 Qt 設計師中重新映射 Ctrl+W 到 Ctrl+F4
+Type=GENERIC_ACTION_DATA
+
+[Data_1_4Actions]
+ActionsCount=1
+
+[Data_1_4Actions0]
+Input=Ctrl+F4
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_4Conditions]
+Comment=
+ConditionsCount=1
+
+[Data_1_4Conditions0]
+Type=ACTIVE_WINDOW
+
+[Data_1_4Conditions0Window]
+Comment=Qt Designer
+Comment[br]=Ergrafer Qt
+Comment[el]=Σχεδιαστής Qt
+Comment[eo]=Qt-Desegnilo
+Comment[et]=Qt Disainer
+Comment[hr]=Qt Dizajner
+Comment[is]=Qt hönnuðurinn
+Comment[ja]=Qt デザイナー
+Comment[km]=កម្មវិធី​រចនា Qt
+Comment[nds]=Qt-Designer
+Comment[pa]=Qt ਡਿਜ਼ਾਇਨਰ
+Comment[te]=క్యుటి డిజైనర్
+Comment[tr]=Qt Tasarımcı
+Comment[uk]=Дизайнер Qt
+Comment[wa]=Qt Designer - Qt Atuzleu
+Comment[zh_CN]=Qt 设计器
+Comment[zh_TW]=Qt 設計師
+WindowsCount=1
+
+[Data_1_4Conditions0Window0]
+Class=
+ClassType=0
+Comment=
+Role=
+RoleType=0
+Title=Qt Designer by Trolltech
+TitleType=2
+Type=SIMPLE
+WindowTypes=33
+
+[Data_1_4Triggers]
+Comment=
+TriggersCount=1
+
+[Data_1_4Triggers0]
+Key=Ctrl+W
+Type=SHORTCUT
+
+[Data_1_5]
+Comment=By pressing Alt+Ctrl+W a DCOP call will be performed that will show the minicli. You can use any kind of DCOP call, just like using the command line 'dcop' tool.
+Comment[bg]=Чрез натискане на Alt+Ctrl+W ще бъде изпълнена заявка към DCOP.
+Comment[ca]=Prement Alt+Ctrl+W s'executarà una crida DCOP que mostrarà el minicli (Alt+F2). Podeu usar qualsevol tipus de crida DCOP, com si estiguéssiu usant l'eina 'dcop' de la línia d'ordres.
+Comment[csb]=Òb wcësniãcé Alt+Ctrl+W wëwòłóny òstanié DCOP, jaczi pòkôżë minicli. Mòżész brëkòwac równojaczégò wëwòłaniô DCOP,tak jakno kònsolowégò pòlétu z nôrzãdza 'dcop'.
+Comment[da]=Ved tryk på Alt+Ctrl+W vil et DCOP-kald blive udført der vil vise minikommandolinjen. Du kan bruge enhver slags DCOP-kald, ligesom ved brug af kommandolinjens 'dcop'-værktøj.
+Comment[de]=Durch Drücken von Strg+Alt+W wird ein DCOP-Aufruf getätigt, der das Fenster "Befehl ausführen" anzeigt. Natürlich können Sie jede Art von DCOP-Aufruf verwenden, genauso als würden Sie das Kommandozeilenprogramm "dcop" verwenden.
+Comment[el]=Πατώντας το Alt+Ctrl+W θα εκτελεστεί μια κλήση DCOP η οποία θα εμφανίσει το minicli. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε κλήση DCOP, όπως ακριβώς και με το εργαλείο της γραμμής εντολών 'dcop'.
+Comment[eo]=Per premo de Alt+Ctrl+W vi lanĉus DCOP-vokon por malfermi etan komandlinion. Oni povas lanĉi ia KCOP-vokon; ĝuste kvazaŭ la komandlinia DCOP-ilo.
+Comment[es]=Al pulsar Alt+Ctrl+W se efectuará una llamada DCOP que mostrará la minilínea de órdenes. Pude usar cualquier tipo de llamada DCOP, examente igual que si usara la herramienta «dcop» de la línea de órdenes.
+Comment[et]=Klahvidele Alt+Ctrl+W vajutades sooritatakse DCOP-väljakutse, mis avab minikäsuakna. Kasutada võib mis tahes DCOP-väljakutse, täpselt nagu käsureatööriistaga 'dcop'.
+Comment[fr]=En appuyant sur « Alt+Ctrl+W », un appel DCOP sera effectué et affichera l'invite de commandes miniature. Vous pouvez utiliser tout type d'appels DCOP, exactement comme lors de l'utilisation de la commande « dcop ».
+Comment[hr]=Pritiskom tipki Alt+Ctrl+W bit će izveden DCOP poziv, a koji će prikazati "minicli". Možete upotrijebiti bilo koju vrstu DCOP poziva, na jednak način kao i upotrebom alata naredbenog retka "dcop".
+Comment[hu]=Az Alt+Ctrl+W lenyomásakor meghívódik egy DCOP-eljárás, mely megjeleníti a minicli vágólapkezelőt. Bármilyen DCOP-hívás megadható, akárcsak a 'dcop' program használatakor.
+Comment[is]=Með því að styðja á Alt+Ctrl+W verður gert DCOP kall sem mun sýna smáskipanalínuna 'minicli'. Þú getur notað hvaða DCOP kall sem er, rétt eins og verið væri að nota skipanalínu 'dcop' tólið.
+Comment[it]=Premendo Alt+Ctrl+W sarà eseguita una chiamata DCOP che mostrerà la minicli. Puoi usare qualsiasi tipo di chiamata DCOP, proprio come se usassi lo strumento "dcop" da riga di comando.
+Comment[ja]=Alt+Ctrl+W を押すと、「コマンドを実行」ダイアログを表示する DCOP 呼び出しが実行されます。コマンドラインの 'dcop' ツールと同様に、あらゆる DCOP 呼び出しが使えます。
+Comment[km]=ដោយ​ចុច​ជំនួស(Alt)+បញ្ជា(Ctrl)+W ការ​ហៅរបស់ DCOP នឹងត្រូវ​បាន​អនុវត្ត​ដែល​នឹង​បង្ហាញ​ minicli ។ អ្នក​អាច​ប្រើ​ការ​ហៅ DCOP ណា​មួយ​ ដូច​ជា​ប្រើ​បន្ទាត់​ពាក្យ​បញ្ជា ឧបករណ៍ 'dcop' ។
+Comment[nb]=Ved å taste Alt+Ctrl+W et DCOP-kall vil utføres som viser minicli. Man kan bruke hvilken som helst DCOP-kalle, akkurat som å kjøre kommandolinja i 'dcop'-verktøyet.
+Comment[nds]=Dat Drücken vun Strg+Alt+W föhrt en DCOP-Oproop ut, de den Dialoog "Befehl utföhren" opröppt. Du kannst all DCOP-Oprööp bruken, jüst as mit dat Konsool-Programm "dcop".
+Comment[nl]=Door Alt+Ctrl+W in te drukken zal er een DCOP-aanroep uitgevoerd worden dat venster "Commando uitvoeren" laat zien. U kunt iedere andere DCOP-aanroep gebruiken, net zoals met de commandoregelvariant 'dcop'.
+Comment[pl]=Naciśnięcie Alt+Ctrl+W spowoduje wykonanie polecenia DCOP pokazującego mini linię poleceń. Można użyć dowolnego wywołania DCOP, tak jak za pomocą programu 'dcop' w konsoli.
+Comment[pt]=Ao carregar em Alt+Ctrl+W, será efectuada uma chamada DCOP que irá mostrar a mini-linha de comandos. Poderá usar qualquer tipo de chamada de DCOP, como se usasse a ferramenta 'dcop' da linha de comandos.
+Comment[pt_BR]=Ao pressionar Alt+Ctrl+W uma chamada DCOP será executada que irá mostrar o diálogo 'Executar Comando...'. Você pode usar qualquer chamada do DCOP, como quando usa a ferramenta 'dcop' na linha de comando.
+Comment[ro]=Apăsând Alt+Ctrl+W va iniția un apel DCOP care va arăta minicli-urile. Puteți folosi orice tip de apel DCOP, ca și cum am folosi utilitarul 'dcop'.
+Comment[ru]=При нажатии Alt+Ctrl+W будет осуществлён вызов DCOP для показа диалога выполнения команд. Вы можете указывать любые вызовы DCOP как при использовании программы "dcop".
+Comment[sk]=Po stlačení Alt+Ctrl+W, bude vykonané DCOP volanie, ktoré zobrazí minicli. Môžete použiť ľubovoľné DCOP volanie, presne tak, ako pri použití príkazu 'dcop' v konzoli.
+Comment[sr]=Притиском на Alt+Ctrl+W, извршиће се DCOP позив који показује мини командну линију. Можете употребити било који DCOP позив, као када користите наредбу „dcop“ у командној линији.
+Comment[sr@Latn]=Pritiskom na Alt+Ctrl+W, izvršiće se DCOP poziv koji pokazuje mini komandnu liniju. Možete upotrebiti bilo koji DCOP poziv, kao kada koristite naredbu „dcop“ u komandnoj liniji.
+Comment[sv]=Genom att trycka på Alt+Ctrl+W utförs ett DCOP-anrop som visar Kör kommando. Du kan använda vilket DCOP-anrop som helst, precis som om kommandoradverktyget 'dcop' användes.
+Comment[uk]=При натисканні Alt+Ctrl+W буде виконано виклик DCOP для показу міні-інтерфейсу для виконання команд. Можна вживати будь-який виклик DCOP, так само як при використанні засобу "dcop" командного рядка.
+Comment[wa]=E tchôcant ALT+CTRL+W on houcaedje DCOP serè fwait ki mosterrè li minicli. Vos ploz eployî telminme sôre d' houcaedje DCOP, li minme k' en eployant l' usteye e roye di comande 'dcop'.
+Comment[zh_TW]=按下 Alt+Ctrl+W 時,會產生一個 DCOP 呼叫來顯示 minicli。您可以使用任何種類的 DCOP 呼叫,就如同在命令列中使用 dcop 一樣。
+Enabled=false
+Name=Perform DCOP call 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[bg]=Заявка към DCOP
+Name[ca]=Executa la crida DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[cs]=Provést DCOP volání 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[csb]=Wëwòłôj DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[da]=Udfør DCOP-kald 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[de]=DCOP-Aufruf ausführen "kdesktop KDesktopIface popupExecuteCommand()"
+Name[el]=Εκτέλεση της κλήσης DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[eo]=Lanĉu DCOP-vokon "kdesktop KDesktopIface popupExecuteCommand()"
+Name[es]=Realizar la llamada DCOP «kdesktop KDesktopIface popupExecuteCommand()»
+Name[et]=DCOP-väljakutse 'kdesktop KDesktopIface popupExecuteCommand()' sooritamine
+Name[fr]=Effectue un appel DCOP à « kdesktop KDesktopIface popupExecuteCommand() »
+Name[fy]=DCOP-oanroep útfiere: 'kdesktop KDesktopIface popupExecuteCommand()'"
+Name[hr]=Izvođenje DCOP poziva "kdesktop KDesktopIface popupExecuteCommand()"
+Name[hu]=DCOP-hívás végrehajtása: 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[is]=Framkvæma DCOP kallið 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[it]=Esegue la chiamata DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[ja]=DCOP 呼び出し 'kdesktop KDesktopIface popupExecuteCommand()' を実行
+Name[km]=អនុវត្តការ​ហៅ DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[ko]=D-Bus 호출 'kdesktop KDesktopIface popupExecuteCommand()'를 실행하기
+Name[nb]=Utfør DCOP-kall 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[nds]=DCOP-Oproop "kdesktop KDesktopIface popupExecuteCommand" utföhren
+Name[nl]=DCOP-aanroep uitvoeren: 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[pl]=Wykonuje wywołanie DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[pt]=Efectuar a chamada de DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[pt_BR]=Executar a chamada DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[ro]=Performează apelul DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[ru]=Вызов DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[sk]=Vykonať DCOP volanie 'kdesktop KDesktopIface popupExecuteCommand()
+Name[sr]=Изврши DCOP позив „kdesktop KDesktopIface popupExecuteCommand()“
+Name[sr@Latn]=Izvrši DCOP poziv „kdesktop KDesktopIface popupExecuteCommand()“
+Name[sv]=Utför DCOP-anropet 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[uk]=Виклик DCOP "kdesktop KDesktopIface popupExecuteCommand()"
+Name[wa]=Fé on houcaedje DCOP 'kdesktop KDesktopIface popupExecuteCommand()'
+Name[zh_TW]=執行 DCOP 呼叫 'kdesktop KDesktopIface popupExecuteCommand()'
+Type=DCOP_SHORTCUT_ACTION_DATA
+
+[Data_1_5Actions]
+ActionsCount=1
+
+[Data_1_5Actions0]
+Arguments=
+Call=popupExecuteCommand
+RemoteApp=kdesktop
+RemoteObj=KDesktopIface
+Type=DCOP
+
+[Data_1_5Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_5Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_5Triggers0]
+Key=Alt+Ctrl+W
+Type=SHORTCUT
+
+[Data_1_6]
+Comment=Read the comment on action "Type 'Hello'" first.\n\nJust like the "Type 'Hello'" action, this one simulates a keyboard input, specifically, after pressing Ctrl+Alt+B, it sends B to XMMS (B in XMMS jumps to the next song). The 'Send to specific window' checkbox is checked and a window with its class containing 'XMMS_Player' is specified; this will make the input always be sent to this window. This way, you can control XMMS even if it's e.g. on a different virtual desktop.\n\n(Run 'xprop' and click on the XMMS window and search for WM_CLASS to see 'XMMS_Player').
+Comment[bg]=Прочетете коментара на действие "Напишете "Здравей".\n\nПодобно на него, това действие симулира въвеждане от клавиатурата. След натискането на Ctrl+Alt+B се изпраща B до XMMS (B в XMMS прескача до следващата песен). Ако отметката "Изпращане до специфичен прозорец" и е посочен прозореца "XMMS_Player", въведеното винаги ще бъде изпращано до този прозорец. Така можете да контролирате XMMS дори когато е на друг работен плот.\n\n(Стартирайте "xprop", щракнете върху прозореца на XMMS и търсете WM_CLASS за да видите "XMMS_Player").
+Comment[ca]=Primer llegiu el comentari de l'acció "Tecleja 'Hola'".\n\nIgual que l'acció "Tecleja 'Hola'", aquesta simula una entrada des del teclat, concretament, després de prémer Ctrl+Alt+B, s'envia B al XMMS (B en el XMMS salta a la cançó següent). La caixa 'Envia a una finestra en concret' esta marcada s'ha indicat una finestra que la seva classe conté 'XMMS_Player'; això farà que l'entrada sempre s'enviï a aquesta finestra. D'aquesta manera podeu controlar el XMMS inclús si p.ex. està en un escriptori virtual diferent.\n\n(Executeu 'xprop' i feu clic a la finestra del XMMS i cerqueu WM_CLASS per veure 'XMMS_Player').
+Comment[da]=Læs kommentaren om handlingen "Skriv 'Hello'" først.\nLigesom "Skriv 'Hello'", simulerer denne handling indtastning fra tastaturet, nærmere bestemt, efter at have trykt Ctrl+Alt+B, sender den B til XMMS (B i XMMS går til næste sang). Afkrydsningsfeltet 'Specifikt vindue' er markeret og et vindue hvis klasse indeholder 'XMMS_Player' er angivet. Dette gør at indtastningen altid sendes til dette vindue. På denne måde kan du styre XMMS også selvom det for eksempel findes på en anden virtuel desktop.\n\n(Kør 'xprop', klik på XMMS-vinduet og led efter WM_CLASS for at se 'XMMS_Player'.)
+Comment[de]=Bitte lesen Sie zunächst die Kommentare zu der Aktion "Hello ausgeben".\n\nGenau wie in "Hello ausgeben" wird auch hier eine Tastatureingabe simuliert. Wenn Sie Strg+Alt+B drücken, wird B an das XMMS-Fenster übergeben (B bewirkt in XMMS einen Wechsel zum nächsten Stück). Das Ankreuzfeld "Eingabe übergeben an ... spezielles Fenster" ist markiert und als Fensterklasse ist "XMMS_Player" eingestellt. Dadurch wird die Eingabe immer nur an dieses Fenster übergeben. Auf diese Weise können Sie XMMS bedienen, selbst wenn es sich auf einer anderen Arbeitsfläche befindet.\n\nDie Fensterklasse finden Sie übrigens mit "xprop" und einem Klick auf das XMMS-Fenster heraus, oder indem Sie auf die Schaltfläche "Automatisch feststellen" drücken und danach das XMMS-Fenster anklicken.
+Comment[el]=Διαβάστε πρώτα το σχόλιο της ενέργειας "Πληκτρολογείστε 'Hello'".\n\nΌπως ακριβώς αυτήν την ενέργεια, θα γίνει εξομοίωση εισόδου από το πληκτρολόγιο, ειδικότερα, μετά το πάτημα του Ctrl+Alt+B, γίνεται αποστολή του B στο XMMS (Το B στο XMMS εκτελεί μετάβαση στο επόμενο τραγούδι). Το πλαίσιο επιλογής 'Αποστολή σε συγκεκριμένο παράθυρο' είναι ενεργοποιημένο και είναι καθορισμένο ένα παράθυρο με κλάση 'XMMS_Player': αυτό θα έχει σαν αποτέλεσμα την αποστολή της εισόδου πάντα σε αυτό το παράθυρο. Με αυτόν τον τρόπο, μπορείτε να ελέγχετε το XMMS ακόμη και αν για παράδειγμα βρίσκεται σε διαφορετική εικονική επιφάνεια εργασίας.\n\n(Εκτελέστε το 'xprop' και κάντε κλικ στο παράθυρο XMMS και αναζητήστε για το WM_CLASS για να δείτε το 'XMMS_Player').
+Comment[eo]=Legu la komenton pri ago "Tajpu Saluton" unue.\n\nSame kiel la "Tajpu Saluton" ago, ĉi tiu ŝajnigas klavaran enmeton, aparte post premo de Ctrl+Alt+B, sendas B al XMMS (B ene de XMMS saltas al la sekva kanto). La markobutono "Sendu al aparta fenestro" estas markita, kaj fenestra klaso de XMMS_Player estas difinita; tial la enmeto ĉiam estos sendita al ĉi tiu fenestro. Do, vi povas direkti XMMS kvankam eble estas sur malsama tabulo.\n\n(Tajpu "xprop" kaj klaku sur la XMMS fenestro, sekve serĉu WM_CLASS por vidi "XMMS_Player").
+Comment[es]=Lea el comentario de lea acción «Teclee 'Hola'» primero.\n\nAl igual que en la acción «Teclee 'Hola'», esto simula una entrada por el teclado, concretamente, tras pulsar Ctrl+Alt+B, envía B a XMMS (B en XMMS salta a la siguiente canción). Se marca la casilla «Enviar a una ventana concreta» está activada y se indica una ventana cuya clase conenga «XMMS_Player»; esto hará que los datos introducidos se envíen siempre a esta ventana. De esta manera, puede controlar XMMS incluso si, por ejemplo, se encuentra en otro escritorio virtual.\n\n(Ejecute «xprop», pulse en la ventana de XMMS y busque WM_CLASS para ver «XMMS_Player»).
+Comment[et]=Loe kõigepealt toimingu "'Hello' kirjutamine" kommentaari.\n\nNagu toiming "'Hello' kirjutamine", simuleerib see klaviatuurilt sisestamist ehk konkreetsemalt: vajutades Ctrl+Alt+B, saadetakse XMMS-ile B (XMMS-is tähendab B hüppamist järgmisele laulule). Märkekast 'Saadetakse määratud aknasse' on märgitud, määratud on aken, mille klass sisaldab 'XMMS_Player', millega tagatakse, et sisend saadetakse alati just sellesse aknasse. Sel moel saab XMMS-i juhtida isegi siis, kui see asub näiteks mõnel teisel virtuaalsel töölaual.\n\n(Anan käsk 'xprop', klõpsa XMMS-i aknal ja otsi lõiku WM_CLASS, kust leiad 'XMMS_Player'.)
+Comment[fr]=Veuillez d'abord lire le commentaire de l'action « Saisir 'Hello' ».\n\nTout comme l'action « Saisir 'Hello' », on simule ici une entrée de clavier. Dans notre cas, après avoir saisi « Ctrl+Alt+B », un « B » est envoyé à XMMS (B dans XMMS le fera passer à la chanson suivante). L'option « Envoyer à une fenêtre spécifique » est cochée et la classe contient « XMMS_Player », afin que la touche soit toujours envoyée à cette fenêtre. Grâce à cela, il est possible de contrôler XMMS même s'il est sur un bureau virtuel différent.\n\n(Lancez « xprop », cliquez sur la fenêtre XMMS, puis recherchez la valeur de « WM_CLASS » pour retrouver « XMMS_Player »).
+Comment[fy]=Lês earst it kommentaar fan de aksje "typ 'Hallo'".\n\nKrekt as de "typ 'Hallo'" aksje, simulearret dizze in toetseboerd ynfier, om krekt te wêzen, nei it drukken op Ctrl+Alt+B, stjoert it B nei XMMS (B in XMMS ljept nei de folgjend lied). De 'stjoer nei bepaalt finster’ karfakje is oankarre en in finster mei de class befetsjend 'XMMS_Player' is oantsjutte; dit soarget dat de ynfier altyd nei dit finster stjoerd wurdt. Sa kinne jo XMMS bestjoere ek as it him op in firtuele buroblêd stiet.\n\n
+Comment[hr]=Prvo pročitajte komentar o aktivnosti "Type 'Hello'".\n\nJednako kao i aktivnost "Type 'Hello'", i ova oponaša unos putem tipkovnice. Točnije, nakon pritiska tipki Ctrl+Alt+B prema aplikaciji XMMS šalje se "B" (B u aplikaciji XMMS označava prelazak na sljedeću pjesmu). Označava se okvir "Pošalji u određeni prozor" i određuje se prozor s klasom koja sadržava "XMMS_Player". Na ovaj se način unos uvijek šalje u ovaj prozor i aplikacijom XMMS možete upravljati čak i kad je na nekoj drugoj virtualnoj radnoj površini.\n\n(Da biste prikazali "XMMS_Player", pokrenite naredbu "xprop" i kliknite prozor aplikacije XMMS te pretražite za WM_CLASS.)
+Comment[hu]=Először olvassa el a "'Hello' beírása" leírását.\n\nHasonlóan a "'Hello' beírása" művelethez, ez is billentyűről végzett beírást szimulál, a Ctrl+Alt+B lenyomása után B-t küld az XMMS-nek (a B-vel lehet az XMMS-ben a következő számra ugrani). A 'Küldés egy adott ablaknak' be lesz jelölve és az 'XMMS_Player' ablakosztály lesz kiválasztva. A bemenet mindig ehhez az ablakhoz kerül. Az XMMS így akkor is vezérelhető, ha például egy másik asztalon található.\n\n(Indítsa el az 'xprop'-ot, kattintson az XMMS-ablakra és keressen rá a WM_CLASS-ra ('XMMS_Player').
+Comment[is]=Lestu athugasemdina við aðgerðina "Sláðu inn 'Hello'" fyrst.\n\nRétt eins og aðgerðin "Sláðu inn 'Hello'", þá virkar þetta með því að endurúthlutað er lyklaborðsinnslætti við ákveðin skilyrði. Nefninlega, með því að ýta á Ctrl+Alt+B, þá er sent B til XMMS (B í XMMS hoppar yfir í næsta lag). Hakað er við 'Senda í ákveðinn glugga' og gluggar með flokkun (class) sem inniheldur 'XMMS_Player' eru tilgreindir sem móttakendur; þannig að skipt er um lyklaborðsrunu til þessa flokks glugga. Á þennan hátt geturðu stýrt XMMS jafnvel þótt það sé t.d. í gangi á öðru sýndarskjáborði.\n\n(Keyrðu 'xprop' og smelltu á XMMS glugga, finndu WM_CLASS til að sjá 'XMMS_Player').
+Comment[it]=Leggi il commento dell'azione "Scrivi 'Hello'" prima.\n\nEsattamente come l'azione "Scrivi 'Hello'", questa simula l'inserimento da tastiera; nello specifico, con la pressione di Ctrl+Alt+B, invia B a XMMS (B in XMMS salta alla canzone successiva). La casella "Invia ad una finestra specifica" è marcata ed è specificata una finestra con la classe "XMMS_Player", che farà inviare l'immissione sempre a questa finestra. In questo modo, puoi controllare XMMS anche se, ad esempio, è in un desktop diverso.\n\n(Esegui "xprop" e fai clic sulla finestra di XMMS e cerca la voce WM_CLASS per trovare "XMMS_Player").
+Comment[ja]=まず「'Hello' を入力」の説明をお読みください。\n\nアクション「'Hello' を入力」と同様に、これもキーボード入力をシミュレートします。具体的には、Ctrl+Alt+B を押して XMMS に B を送ります (XMMS では B で次の曲に移ります)。入力の送り先に「特定のウィンドウ」を選択し、ウィンドウクラスに 'XMMS_Player' を指定します (入力を常にこのウィンドウに送るため)。これによって、他の仮想デスクトップにある XMMS も制御することができます。\n\n('XMMS_Player' を見るには、'xprop' を実行し、XMMS ウィンドウをクリックして WM_CLASS を探します)
+Comment[km]=អាន​សេចក្ដីអធិប្បាយ​នៅ​ពេល​មាន​សកម្មភាព "វាយ 'Hello'" ជា​មុន​សិន ។\n\nគ្រាន់​តែ​ "វាយ 'Hello'" អំពើ វា​នឹង​ក្លែង​ធ្វើ​ការ​បញ្ចូល​របស់​ក្ដារ​ចុច ជា​ពិសេស បន្ទាប់​ពី​ចុចបញ្ជា(Ctrl)+ជំនួស(Alt)+B វា​ផ្ញើ​ B ទៅ XMMS (B នៅ​ក្នុង XMMS លោត​ទៅកាន់​បទចម្រៀង​បន្ទាប់) ។ ប្រអប់​ធីក 'ផ្ញើ​ទៅ​បង្អួចជាក់លាក់' ត្រូវ​បាន​គូស​ធីក ហើយ​បង្អួច​​ជា​មួយ​នឹង​ថ្នាក់​របស់​វា​មាន​ 'XMMS_Player' ត្រូវ​បាន​បញ្ជាក់ វា​នឹង​ធ្វើ​ឲ្យ​ការ​បញ្ចូល​ផ្ញើ​ទៅ​​បង្អួច​នេះ ។ វិធីនេះ អ្នក​អាច​ត្រួតពិនិត្យ XMMS សូម្បី​តែ​វា​ជា​ឧទាហរណ៍​នៅលើ​ផ្ទៃតុ​និម្មិត​ផ្សេងៗ​គ្នា ។\n\n(រត់ 'xprop' ហើយ​ចុច​លើ​បង្អួច XMMS ហើយ​ស្វែងរក WM_CLASS ដើម្បី​មើល 'XMMS_Player') ។
+Comment[nds]=Lees bitte eerst den Kommentar för de Akschoon "'Hello' tippen".\n\nJüst as de dore Akschoon maakt disse en Tastatuuringaav na: Dat Drücken vun Strg+Alt+B stüert XMMS en "B" to, wat XMMS na't nakamen Stück jumpen lett. Dat Krüüzfeld "Na besünner Finster sennen" is anmaakt un för dat Finster is angeven, dat sien Klass "XMMS_Player" bargen schall, so dat de Ingaav jümmers dit Finster tostüert warrt. So kannst Du XMMS t.B. ok denn stüern, wenn sien Finster op en anner Schriefdisch liggt.\n\n(Du kannst de richtige Finsterklass ("XMMS_Player") rutfinnen, wenn Du "xprop" opröppst, op dat XMMS-Finster klickst un na "WM_CLASS" söchst.)
+Comment[nl]=Lees eerst de toelichting bij handeling "Hallo typen".\n\nNet als "Type hallo" simuleert deze een toetsenbordinvoer. In dit geval wordt na het indrukken van de toetsencombinatie Ctrl+Alt+B, de 'B' gestuurt naar XMMS (B in XMMS gaat naar de volgende track). Als het keuzevakje 'Naar specifiek venster sturen' is geselecteerd en een venster met de klasse 'XMMS_Player' isopgegeven zal deze toetsenbordinvoer altijd naar het XMMS-venster worden gestuurd. Op die manier kunt u XMMS ook bedienen terwijl u bijv. op een ander virtueel bureaublad aan het werk bent. \n\n (Voer 'xprop' uit en klik op het XMMS-venster en zoek naar WM-CLASS om 'XMMS_Player' te zien).
+Comment[pl]=Przeczytaj najpierw komentarz do akcji "Wpisanie 'Hello'".\n\nPodobnie jak akcja "Wpisanie 'Hello'", ta akcja symuluje wciśnięcie klawiszy. Konkretnie, wciśnięcie Ctrl+Alt+B wysyła klawisz B do XMMS-a (B w XMMS-ie powoduje przejście do następnej piosenki). Zaznaczona jest opcja 'Wyślij do określonego okna' i wyspecyfikowane jest okno, którego klasa zawiera w nazwie 'XMMS_Player' - spowoduje to wysłanie polecenia zawsze do tego okna. W ten sposób można kontrolować XMMS nawet jeśli jest na innym wirtualnym pulpicie. \n\nŻeby poznać nazwę klasy 'XMMS_Player' należy uruchomić program 'xprop', kliknąć na oknie XMMS i zobaczyć wartość dla WM_CLASS.
+Comment[pt]=Leia o comentário da acção "Escrever 'Olá'" primeiro.\n\nComo acontece na acção "Escrever 'Olá'", esta simula a introdução de dados do teclado; especificamente, depois de carregar em Ctrl+Alt+B, esta envia B para o XMMS (o B no XMMS salta para a música seguinte). A opção 'Enviar para uma janela específica' está activada e está definida uma janela com a sua classe a conter 'XMMS_Player'; isto fará com que os dados de entrada sejam sempre enviados para esta janela. Desta forma, poderá controlar o XMMS, mesmo que esteja p.ex. num ecrã virtual diferente.\n\n(Corra o 'xprop' e carregue na janela do XMMS para ver que a WM_CLASS é igual a 'XMMS_Player').
+Comment[pt_BR]=Leia o comentário sobre a ação "Digitar 'Hello'" primeiro.\n\nComo na ação "Digitar 'Hello'", está simula uma entrada via teclado, especificamente, após pressionar Crtl+Alt+B, ela envia B para o XMMS (B no XMMS salta para a próxima música). A caixa de verificação 'Enviar para uma janela específica' é marcada e uma janela com esta classe contendo 'XMMS Player' é especificada; isto fará com que a entrada seja sempre enviada para esta janela. Desta forma, você pode controlar o XMMS mesmo se ele estiver p.ex. em uma área de trabalho virtual diferente.\n\n(Execute 'xprop' e clique na janela XMMS e procure por WM_CLASS para ver 'XMMS_Player').
+Comment[ro]=Citiți mai întâi comentariul la acțiunea "Tastați 'Hello'". \n\nCa și acțiunea "Tastați 'Hello'", aceasta simulează o intrare de tastatură, mai exact, după apăsarea Ctrl+Alt+B, aceasta trimite B la XMMS (B în XMMS sare la următoarea melodie). Căsuța 'Trimite la fereastra specificată' este bifată și o fereastra cu clasa sa conținând 'XMMS_Player' este specificată; aceasta va face ca intrarea să fie întotdeauna trimisă la această fereastră. Astfel, puteți controla XMMS chiar dacă acesta este într-ul alt desktop virtual.\n\n(Rulați 'xprop' și faceți clic pe fereastra XMMS și căutați ca WM_CLASS să arate 'XMMS_Player').
+Comment[ru]=При нажатии Ctrl+Alt+B эмулируется нажатие клавиши "B" для окна XMMS (перейти на следующую композицию). Окно XMMS ищется по классу окна "XMMS_Player".\nКласс окна вы можете определить, запустив программу "xprop" и нажав курсором мыши на окне.
+Comment[sk]=Prečítajte si najprv komentár pre akciu "Typ 'Hello'".\n\nRovnako ako akcia "Typ 'Hello'", aj táto akcia simuluje vstup z klávesnice, konkrétne po stlačení Ctrl+Alt+B posiela B programu XMMS (B v XMMS preskočí na ďalšiu pieseň). Zaškrtávacie políčko 'Poslať konkrétnemu oknu' je zaškrtnuté a je zadané okno s triedou obsahujúcou 'XMMS_Player'; toto zabezpečí, že vstup bude vždy poslaný tomuto oknu. Takto môžete ovládať XMMS dokonca aj vtedy, keď je napríklad na inej virtuálnej ploche.\n\n(Spustite 'xprop' a kliknite na okno XMMS a hľadajte WM_CLASS, kde nájdete 'XMMS_Player').
+Comment[sr]=Прочитајте прво коментар за радњу „Унос ‘Hello’“.\n\nКао тамо, и ова радња симулира унос са тастатуре, посебице, пошто притиснете Ctrl+Alt+B, шаље се B у XMMS (B у XMMS-у скаче на следећу песму). Попуњена је кућица „Пошаљи у одређени прозор“ и наведен је прозор са класом која садржи „XMMS_Player“; овако ће унос увек бити слат том прозору. На овај начин можете управљати XMMS-ом чак и ако је нпр. на другој радној површини.\n\n(Извршите „xprop“ и кликните на прозор XMMS-а, те потражите WM_CLASS где пише „XMMS_Player“).
+Comment[sr@Latn]=Pročitajte prvo komentar za radnju „Unos ‘Hello’“.\n\nKao tamo, i ova radnja simulira unos sa tastature, posebice, pošto pritisnete Ctrl+Alt+B, šalje se B u XMMS (B u XMMS-u skače na sledeću pesmu). Popunjena je kućica „Pošalji u određeni prozor“ i naveden je prozor sa klasom koja sadrži „XMMS_Player“; ovako će unos uvek biti slat tom prozoru. Na ovaj način možete upravljati XMMS-om čak i ako je npr. na drugoj radnoj površini.\n\n(Izvršite „xprop“ i kliknite na prozor XMMS-a, te potražite WM_CLASS gde piše „XMMS_Player“).
+Comment[sv]=Läs kommentaren om åtgärden "Skriv 'Hej'" först.\n\nPrecis som "Skriv 'Hej'", simulerar åtgärden inmatning från tangentbordet, närmare bestämt efter att ha tryckt Ctrl+Alt+B, skickar den B till XMMS (B i XMMS går till nästa sång). Kryssrutan 'Specifikt fönster' är markerad och ett fönster vars klass innehåller 'XMMS_Player' är angivet. Det gör att inmatningen alltid skickas till detta fönster. På så sätt kan du styra XMMS även om det till exempel finns på ett annat virtuellt skrivbord.\n\n(Kör 'xprop', klicka på XMMS-fönstret och leta efter WM_CLASS för att se 'XMMS_Player'.)
+Comment[wa]=Lére li rawete en accion "Taper 'Hello'" aprume.\n\nLi minme k' avou l' accion "Taper 'Hello'", cisse-chal fwait come s' elle esteut ene intrêye di taprece. Après aveur tchôkî CTRL+ALT+B, il evoye B a XMMS (B e XMMS va å boket shuvant). Le boesse a tchoezi 'Evoyî a-z on specifyî purnea' est tchoezeye eyet on purnea avou s' classe contnant 'XMMS_djouweu' est specifyî. Çoula frè k' l' intrêye serè todi evoyeye a ç' purnea. Di cisse manire, vos ploz controler XMMS minme s' il est, metans, so-z on ôte forveyou scribanne.\n\n(Enondez 'xprop' eyet clitchîz sol purnea XMMS et cachîz après WM_CLASS po vey 'XMMS_djouweu').
+Comment[zh_TW]=請先參考「輸入 Hello」的註解。就如同「輸入 Hello」的動作,這個動作模擬鍵盤的輸入,在按下 Ctrl+Alt+B 之後,會送出 B 到 XMMS(在 XMMS 中 B 是跳到下一首歌)。勾選「送到指定視窗」,並指定視窗類別為包含 XMMS_Player。這會讓此輸入永遠送到這個視窗。您可以用這個方法控制 XMMS,即使是在不同的虛擬桌面上。\n\n(執行 xprop 並點選 XMMS 視窗,搜尋 WM_CLASS 可以看到 XMMS_Player)。
+Enabled=false
+Name=Next in XMMS
+Name[bg]="Следваща" в XMMS
+Name[ca]=Següent al XMMS
+Name[cs]=Další v XMMS
+Name[csb]=Pòstãpny w XMMS
+Name[da]=Næste i XMMS
+Name[de]=Nächstes Stück in XMMS
+Name[el]=Επόμενο στο XMMS
+Name[eo]=Sekva en XMMS
+Name[es]=Siguiente en XMMS
+Name[et]=Järgmine XMMS-is
+Name[fr]=Suivant dans la liste de lecture XMMS
+Name[fy]=Folgjende yn XMMS
+Name[hr]=Sljedeći u XMMS-u
+Name[hu]=Következő az XMMS-ben
+Name[is]=Næst í XMMS
+Name[it]=Successivo in XMMS
+Name[ja]=XMMS の次の曲
+Name[km]=បន្ទាប់​នៅ​ក្នុង XMMS
+Name[ko]=XMMS 다음 곡
+Name[nb]=Neste i XMMS
+Name[nds]=Nakamen XMMS-Stück
+Name[nl]=Volgende in XMMS
+Name[pa]=XMMS ਵਿੱਚ ਅੱਗੇ
+Name[pl]=Przejście do następnego utworu w XMMS
+Name[pt]=Seguinte no XMMS
+Name[pt_BR]=Próximo no XMMS
+Name[ro]=Următorul în XMMS
+Name[ru]=Следующая композиция в XMMS
+Name[sk]=Ďalší v XMMS
+Name[sr]=Следеће у XMMS-у
+Name[sr@Latn]=Sledeće u XMMS-u
+Name[sv]=Nästa i XMMS
+Name[te]=ఎక్స్ ఎంఎంఎస్ లొ తరువాత
+Name[tg]=Мавзӯъи дигар дар XMMS
+Name[tr]=XMMS'te Sonraki
+Name[uk]=Наступне в XMMS
+Name[uz]=XMMS'da keyingi qoʻshiqni oʻynash
+Name[uz@cyrillic]=XMMS'да кейинги қўшиқни ўйнаш
+Name[wa]=Shuvant e XMMS
+Name[zh_TW]=命令 XMMS 跳到下一首
+Type=KEYBOARD_INPUT_SHORTCUT_ACTION_DATA
+
+[Data_1_6Actions]
+ActionsCount=1
+
+[Data_1_6Actions0]
+Input=B
+IsDestinationWindow=true
+Type=KEYBOARD_INPUT
+
+[Data_1_6Actions0DestinationWindow]
+Comment=XMMS window
+Comment[bg]=Прозорец на XMMS
+Comment[bn]=XMMS উইণ্ডো
+Comment[ca]=Finestra del XMMS
+Comment[cs]=XMMS okno
+Comment[csb]=Òkno XMMS
+Comment[da]=XMMS-vindue
+Comment[de]=XMMS-Fenster
+Comment[el]=Παράθυρο XMMS
+Comment[eo]=XMMS fenestro
+Comment[es]=Ventana de XMMS
+Comment[et]=XMMS-i aken
+Comment[fr]=Fenêtre XMMS
+Comment[fy]=XMMS finster
+Comment[hr]=XMMS prozor
+Comment[hu]=XMMS-ablak
+Comment[is]=XMMS gluggi
+Comment[it]=Finestra XMMS
+Comment[ja]=XMMS ウィンドウ
+Comment[km]=បង្អួច XMMS
+Comment[ko]=XMMS 창
+Comment[nb]=XMMS-vindu
+Comment[nds]=XMMS-Finster
+Comment[nl]=XMMS-venster
+Comment[nn]=XMMS-vindauge
+Comment[pa]=XMMS ਝਰੋਖਾ
+Comment[pl]=Okno XMMS
+Comment[pt]=Janela do XMMS
+Comment[pt_BR]=Janela do XMMS
+Comment[ro]=Fereastră XMMS
+Comment[ru]=Окно XMMS
+Comment[sk]=Okno XMMS
+Comment[sr]=Прозор XMMS-а
+Comment[sr@Latn]=Prozor XMMS-a
+Comment[sv]=XMMS-fönster
+Comment[te]=ఎక్స్ ఎంఎంఎస్ విండొ
+Comment[tg]=Равзанаи XMMS
+Comment[tr]=XMMS penceresi
+Comment[uk]=Вікно XMMS
+Comment[uz]=XMMS oynasi
+Comment[uz@cyrillic]=XMMS ойнаси
+Comment[wa]=Purnea XMMS
+Comment[zh_TW]=XMMS 視窗
+WindowsCount=1
+
+[Data_1_6Actions0DestinationWindow0]
+Class=XMMS_Player
+ClassType=1
+Comment=XMMS Player window
+Comment[bg]=Прозорец на прозореца XMMS
+Comment[bn]=XMMS প্লেয়ার উইণ্ডো
+Comment[ca]=Finestra del reproductor XMMS
+Comment[cs]=Okno XMMS přehrávače
+Comment[csb]=Òkno grôcza XMMS
+Comment[da]=XMMS-afspillervindue
+Comment[de]=XMMS Wiedergabe-Fenster
+Comment[el]=Παράθυρο αναπαραγωγής XMMS
+Comment[eo]=XMMS ludila fenestro
+Comment[es]=Ventana del reproductor XMMS
+Comment[et]=XMMS-i mängija aken
+Comment[fr]=Fenêtre du lecteur XMMS
+Comment[fy]=Ofspylfinster XMMS
+Comment[hr]=Prozor XMMS programa
+Comment[hu]=XMMS-lejátszóablak
+Comment[is]=XMMS spilaragluggi
+Comment[it]=Finestra di riproduzione di XMMS
+Comment[ja]=XMMS プレーヤウィンドウ
+Comment[km]=បង្អួច​កម្មវិធី​ចាក់​របស់ XMMS
+Comment[ko]=XMMS 재생기 창
+Comment[nb]=XMMS spillevindu
+Comment[nds]=XMMS-Afspeler-Finster
+Comment[nl]=Afspeelvenster XMMS
+Comment[pa]=XMMS ਪਲੇਅਰ ਝਰੋਖਾ
+Comment[pl]=Okno odtwarzacza XMMS
+Comment[pt]=Janela do leitor XMMS
+Comment[pt_BR]=Janela do Reprodutor XMMS
+Comment[ro]=Fereastră player XMMS
+Comment[ru]=Окно проигрывателя XMMS
+Comment[sk]=Okno prehrávača XMMS
+Comment[sr]=Прозор плејера XMMS
+Comment[sr@Latn]=Prozor plejera XMMS
+Comment[sv]=XMMS-spelarfönster
+Comment[te]=ఎక్స్ ఎంఎంఎస్ ప్లెయర్ విండొ
+Comment[tg]=Равзанаи плеери XMMS
+Comment[tr]=XMMS Oynatıcı penceresi
+Comment[uk]=Вікно програвача XMMS
+Comment[uz]=XMMS pleyer oynasi
+Comment[uz@cyrillic]=XMMS плейер ойнаси
+Comment[wa]=Purnea XMMS djouweu
+Comment[zh_TW]=XMMS 播放器視窗
+Role=
+RoleType=0
+Title=
+TitleType=0
+Type=SIMPLE
+WindowTypes=33
+
+[Data_1_6Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_6Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_6Triggers0]
+Key=Alt+Ctrl+B
+Type=SHORTCUT
+
+[Data_1_7]
+Comment=Ok, Konqi in KDE3.1 has tabs, and now you can also have gestures. No need to use other browsers >;).\n\nJust press the middle mouse button and start drawing one of the gestures, and after you're finished, release the mouse button. If you only need to paste the selection, it still works, simply only click the middle mouse button. (You can change the mouse button to use in the global settings).\n\nRight now, there are these gestures available:\nmove right and back left - Forward (ALt+Right)\nmove left and back right - Back (Alt+Left)\nmove up and back down - Up (Alt+Up)\ncircle anticlockwise - Reload (F5)\n (As soon as I find out which ones are in Opera or Mozilla, I'll add more and make sure they are the same. Or if you do it yourself, feel free to help me and send me your khotkeysrc.)\n\nThe gestures shapes (some of the dialogs are from KGesture, thanks to Mike Pilone) can be simply entered by performing them in the configuration dialog. You can also look at your numeric pad to help you, gestures are recognized like a 3x3 grid of fields, numbered 1 to 9.\n\nNote that you must perform exactly the gesture to trigger the action. Because of this, it's possible to enter more gestures for the action. You should try to avoid complicated gestures where you change the direction of mouse moving more than once (i.e. do e.g. 45654 or 74123 as they are simple to perform but e.g. 1236987 may be already quite difficult).\n\nThe condition for all gestures are defined in this group. All these gestures are active only if the active window is Konqueror (class contains 'konqueror').
+Comment[bg]=Konqi в KDE3.1 има подпрозорци, а сега вече има и жестове. Няма нужда от други браузъри >;).\n\nПросто натиснете средният бутон на мишката и започнете да правите жестове, а след като свършите просто пуснете мишката. Ако само трябва да извършите операцията "поставяне", пак ще работи - просто натиснете средния бутон.
+Comment[ca]=Bé, el Konqi en el KDE3.1 tenia pestanyes, i ara podeu tenir gestos de ratolí., No hi ha necessitat d'usar altres navegadors >;).\n\nNomés premeu el botó central del ratolí i comenceu a dibuixar un dels gestos, un cop hageu acabat, allibereu el botó. Si només us cal enganxar la selecció, encara funciona; simplement feu un clic amb el botó central del ratolí (podeu canviar el botó del ratolí a usar a l'arranjament global).\n\nPer ara, hi ha disponibles aquests gestos:\nmoviment a la dreta i retorn a l'esquerra - endavant (Alt+Dreta)\nmoviment a l'esquerra i retorn a la dreta - enrere (Alt+Esquerra)\nmoviment amunt i retorn avall - amunt (Alt+Amunt)\ncercle antihorari - actualitzar (F5)\n (Tant aviat com trobi quins hi ha a l'Opera o al Mozilla, n'afegiré més i asseguraré que són els mateixos. O si voleu fer-ho vós mateix, preneu-vos la llibertat d'ajudar-me i envieu-me el vostre khotkeysrc.) \n\nLes formes dels gestos (alguns dels diàlegs són del KGesture, gràcies a Mike Pilone) es poden introduir simplement executant-los en el diàleg de configuració. També podeu mirar el teclat numèric per ajudar-vos, els gestos es poden assimilar a una graella de 3x3 camps, numerats d'1 a 9.\n\nTingueu en compte que heu d'executar exactament el gest per activar l'acció. Degut a això, és possible introduir més gestos per l'acció. Hauríeu d'intentar evitar gestos complicats quan canvieu la direcció del ratolí més d'una vegada (p.ex. fer 45654 o 74123 és més senzill que fer 1236987, que és força més difícil).\n\nLes condicions de tots els gestos es defineixen en aquest grup. Tots aquests gestos són actius només si la finestra activa és el Konqueror (la classe conté 'konqueror').
+Comment[da]=Ja, Konqueror i KDE3.1 har faneblade, og nu kan du også få gester. Ingen grund til at bruge andre browsere.\n\nTryk blot på musens midterste knap og begynde at tegne en gestus. Slip museknappen når du er færdig. Hvis du kun behøver at indsætte markeringen, fungerer dette også. Klik blot kun med musens midterste knap. (Du kan ændre den museknap som bruges i de generelle indstillinger.)\n\nFor øjeblikket findes følgende gester tilgængelige:\nFlyt til højre og tilbage til venstre - Fremad (Alt+Højrepil)\nFlyt til venstre og tilbage til højre - Tilbage (Alt+Vensterepil)\nFlyt opad og tilbage nedad - Op (Alt+Opadpil)\nCirkel mod uret - Opdatér (F5)\n(Så snart jeg finder ud af hvilke som findes i Opera og Mozilla, vil jeg tilføje flere, og sørge for at de er ligesådan. Eller hvis du gør det selv, så hjælp mig gerne og send mig din khotkeysrc.)\n\nGesternes form kan helt enkelt indtastes ved at udføre dem i indstillingsdialogen (nogle af dialogruterne kommer fra Kgesture, takket være Mike Pilone). Du kan også kigge på det numeriske tastatur for hjælp. Gester genkendes som et 3x3 gitter af felter, nummererede fra 1 til 9.\n\nBemærk at du skal udføre gesterne nøjagtigt for at handlingen skal udløses. På grund af dette er det muligt at indtaste flere gester for en handling. Du bør forsøge at undgå komplicerede gester hvor musens retning ændres mere end en gang (dvs. brug for eksempel 45654 eller 74123 efter som de er enkle at udføre, mens for eksempel 1236987 kan allerede være ganske svær).\n\nBetingelsen for alle gester defineres i denne gruppe. Alle gester er kun aktive hvis det aktive vindue er Konqueror (klassen indeholder 'konqueror').
+Comment[de]=Konqueror hat seit KDE 3.1 Unterfenster und nun werden auch Gesten unterstützt; es gibt also keinen Grund, einen anderen Browser zu verwenden ;-)\n\nDrücken Sie die mittlere Maustaste und ziehen mit der Maus eine der Gesten. Wenn Sie fertig sind, lassen Sie die mittlere Maustaste wieder los. Falls Sie mit der mittleren Maustaste nur eine Auswahl einfügen möchten, funktioniert dies selbstverständlich weiterhin indem Sie einfach nur die mittlere Maustaste drücken ohne eine Geste nachzuziehen. (Der Mausknopf für Gesten kann aber in den Globalen Einstellungen auch anderweitig festgelegt werden.)\n\nDie folgenden Gesten sind zur Zeit verfügbar:\nnach rechts und nach links -> Vorwärts (Alt+Rechts)\nnach links und nach rechts -> Zurück (Alt+Links)\nnach oben und nach unten -> Eine Ebene höher (Alt+Hoch)\nKreis gegen den Uhrzeigersinn -> Dokument erneut laden (F5)\n(Sobald ich noch weitere Gesten in Opera und Mozilla finde, werden sie auch hier hinzugefügt und entsprechend angepasst. Wenn Sie selbst welche finden und hinzufügen, senden Sie mir bitte die Datei khotkeysrc.)\n\nDie Gesten können eingegeben werden, indem Sie die Geste im Einrichtungsdialog ausführen. Es kann hilfreich sein, wenn Sie sich das Zahlenfeld Ihrer Tastatur ansehen; Gesten werden in einem Raster von 3x3 Feldern dargestellt die von 1 bis 9 durchnummeriert sind.\n\nEs muss immer die genau passende Geste ausgeführt werden, um die zugewiesene Aktion zu starten. Es ist möglich, einer Aktion mehrere Gesten zuzuordnen. Vermeiden Sie nach Möglichkeit zu komplizierte Gesten, die mehr als eine Richtungsänderung beinhalten. (Ein gutes Beispiel wäre 45654 oder 74123, weil diese einfach sind. 1236987 hingegen könnte bereits zu kompliziert sein.)\n\nDie Bedingung für alle Gesten wird in dieser Gruppe festgelegt. Alle Gesten sind nur im Konqueror-Fenster gültig (weil die Fensterklasse "konqueror" enthält).eine
+Comment[el]=Ο Konqi στο KDE3.1 περιέχει καρτέλες, και από τώρα μπορεί να χρησιμοποιεί και χειρονομίες .Δεν απαιτείται η χρήση άλλου περιηγητή >;).\n\nΑπλά πατήστε το μεσαίο κουμπί του ποντικιού και ξεκινήστε να σχεδιάζετε κάποια από τις χειρονομίες, και μόλις τελειώσετε, ελευθερώστε το κουμπί του ποντικού. Αν επιθυμείτε μόνο την επικόλληση της επιλογής, συνεχίζει να λειτουργεί με τον γνωστό τρόπο, απλά κάντε κλικ με το μεσαίο κουμπί του ποντικιού. (Μπορείτε να τροποποιήσετε το κουμπί του ποντικιού μέσω των καθολικών ρυθμίσεων).\n\nΓια την ώρα, υπάρχουν οι παρακάτω διαθέσιμες χειρονομίες:\nμετακίνηση δεξιά και πίσω αριστερά - Εμπρός (ALt+Δεξί)\nμετακίνηση αριστερά και πίσω δεξιά - Πίσω (Alt+Αριστερά)\nμετακίνηση πάνω και κάτω - Πάνω (Alt+Πάνω)\nκύκλος αριστερόστροφα - Επαναφόρτωση (F5)\n (Μόλις εντοπιστούν τα αντίστοιχα του Opera ή Mozilla, θα προστεθούν και αυτά για κοινή λειτουργικότητα. Φυσικά αν εντοπιστούν από εσάς ενημερώστε με και στείλτε μου το δικό σας khotkeysrc.)\n\nΤα σχήματα χειρονομιών (μερικά προέρχονται από το KGesture, χάριν του Mike Pilone) μπορούν να εισαχθούν απλά μέσω του διαλόγου ρυθμίσεων. Μπορείτε επίσης να δείτε το αριθμητικό πληκτρολόγιό σας για βοήθεια, καθώς οι χειρονομίες αναγνωρίζονται πάνω σε έναν κάνναβο 3x3, αριθμημένο από 1 έως 9.\n\nΣημειώστε ότι πρέπει να σχεδιάσετε ακριβώς τη χειρονομία για την ενεργοποίησή της. Εξαιτίας αυτού, είναι δυνατή η εισαγωγή περισσότερων χειρονομιών για μια ενέργεια. Θα πρέπει να αποφύγετε πολύπλοκες χειρονομίες στις οποίες τροποποιείτε την κατεύθυνση κίνησης του ποντικιού περισσότερο από μία φορά (π.χ. εκτελέστε το 45654 ή το 74123 καθώς είναι απλές σε μορφή αλλά το 1236987 ίσως είναι αρκετά δύσκολο).\n\nΟι συνθήκες για όλες τις χειρονομίες καθορίζονται σε αυτήν την ομάδα. Όλες αυτές οι χειρονομίες είναι ενεργές μόνο αν το ενεργό παράθυρο είναι ο Konqueror (η κλάση περιέχει το 'konqueror').
+Comment[eo]=Bone, Konkeranto en KDE3.1 enhavas langetojn, nun vi ankaŭ povas uzi gestojn. Vi ne bezonas aliajn retumilojn >;).\n\nNur premu la mezan musbutonon, skizu musgeston, kaj malpremu. Se vi nur bezonas alglui, nur klaku la mezan musbutonon. (Vi povas agordi kiun musbutonon por uzi en la malloka agordo).\n\nNune, ekzistas ĉi tiujn gestojn:\niru dekstren, reiru maldekstren - Sekva (Alt+Maldekstra Sago)\nirumaldekstren, reiru dekstren - Antaŭa (Alt + Dekstra Sago)\niru supren, reiru malsupren - Supra (Alt+Supra Sago)\niru kurbe maldekstren - Refreŝigi (F5)\nTuj post mi eltrovas kiajn da gestoj estas en Opero aŭ Fajrovulpo, mi aldonos ilin. Aŭ, se vi faras tion, helpeme sendu al mi vian khotkeysrc.)\n\nLa gestaj formoj (iom da la dialogoj estas de KGesture, dank' al Mike Pilone) povas esti enmetitaj simple per fari la geston en la agorda dialogo. Vi povas uzi la nombran klavaron kiel referencon. La sistemo akceptas gestajn movojn en 3x3 krado de kampoj, nombritaj 1 ĝis 9.\n\nNotu: vi devas fari la movojn precize. Pro tio, estas eble enmeti pli ol unu gesto por ĉiu ago. Mi konsilas ke vi ne ŝanĝu direkton pli ol unu fojo. (Ekz. 45654 aŭ 74123 estas simplaj, sed 1236987 estas pli kompleksa).\n\nLa kondiĉo por ĉiuj gestoj estas difinita en ĉi tiu grupo. Tutaj ĉiuj gestoj estas aktivaj nur se Konkeranto estas la aktiva fenestro (klaso enhavas "konkeranto").
+Comment[es]=Vale, Konqi en KDE3.1 tiene solapas, y ahora también puede tener gestos. No necesita usar otros navegadores >;).\n\nSimplemente pulse el botón central del ratón y empiece a dibujar uno de los gestos, y una vez haya finalizado, suelte el botón del ratón. Si sólo necesita pegar la selección, sigue funcionando como antes, simplemente pulse el botón central del ratón. (Puede cambiar el botón del ratón a usar en las opciones globales).\n\nPor ahora, están disponibles estos gestos:\nmover a la derecha y de nuevo a la izquierda - Avanzar (Alt+Derecha)\nmover a la izquierda y de nuevo a la derecha - Retroceder (Alt +Izquierda)\nsubir y volver a bajar - Subir (Alt+Arriba)\ncírculo en sentido antihorario - Recargar (F5)\n(Tan proto como se averigüen las que usan Opera o Mozilla, se añadirán más, asegurándose de que sean los mismos. O si quiere hacerlo usted mismo, queda invitado a ayudar al autor y enviarle su «khotkeysrc».)\n\nLas formas de los gestos (algunos de las ventanas son de KGesture, gracias a Mike Pilone) se pueden introducir simplemente realizándolas en la ventana de configuración. También pude mirar su teclado numérico como ayuda, los gestos se reconocen como una rejilla 3x3 de campos numerados del 1 al 9.\n\nObserve que debe realizar exactamente el gesto que lance la acción. Por ello, es posible introducir más gestos para la acción. Debería intentar evitar gestos complicados en los que cambie la dirección del ratón moviéndolo más de una vez (por ejemplo use 45654 o 74123 ya que son simples de realizar, mientras que 1236987 ya puede ser bastante difícil).\n\nLas condiciones para todos estos gestos están definidas en este grupo. Todos estos gestos se activan sólo si la ventana activa es Konqueror (la clase contiene «konqueror»).
+Comment[et]=Kui Konqueror sai KDE 3.1 ajal kaardid, siis nüüd saab ta ka žestid. Pole enam mingit põhjust kasutada teisi brausereid.\n\nVajuta lihtsalt hiire keskmine nupp alla ja hakka žesti joonistama ning kui oled valmis, vabasta nupp. Kui soovid ainult puhvris leiduvat asendada, on see endiselt võimalik - selleks tuleb lihtsalt korra hiire keskmise nupuga klõpsata. (Kasutatavat hiirenuppu saab muuta globaalsetes seadistustes.)\n\nPraegu saab kasutada järgmisi žeste:\nliigu paremale ja tagasi vasakule - Edasi (Alt+nool paremale)\nliigu vasakule ja tagasi paremale - Tagasi (Alt-nool vasakule)\nliigu üles ja tagasi alla - Üles (Alt+nool üles)\ntee ring vastupäeva - Laadi uuesti (F5)\n(Niipea kui saab selgeks, millised on žestid Operas ja Mozillas, lisatakse siia neid rohkem ja tagatakse, et nad oleksid ühesugused. Aga soovi korral on ka sul võimalik kaasa aidata ja saata autorile oma fail khotkeysrc.)\n\nŽestikujundeid (osad dialoogid on pärit rakendusest KGesture - tänu Mike Pilone'ile) saab sisestada väga lihtsalt - need tuleb lihtsalt seadistustedialoogis ette näidata. Abiks võib kasutada ka numbriklaviatuuri: žeste tuvastatakse sel juhul 3x3 ruudustikuna, mis vastavad numbriklaviatuuril numbritele 1 kuni 9.\n\nPane tähele, et toimingu käivitamiseks tuleb žesti täpselt korrata. Seepärast on ka võimalik ühele toimingule anda mitu žesti. Vältida tuleks keerulisi žeste, kus hiire liikumise suund muutub mitu korda: näiteks 45654 või 74123 on lihtsad, kuid samas 1236987 üsna keeruline.\n\nKõigi žestide tingimused on kindlaks määratud selles grupis. Kõik žestid on aktiivsed ainult siis, kui aktiivne on Konquerori aken (klass sisaldab 'konqueror').
+Comment[fr]=Konqueror dans KDE 3.1 avait les onglets, maintenant il possède également les mouvements, aucun besoin d'utiliser d'autres navigateurs.\n\nAppuyez simplement sur le bouton du milieu de la souris pour commencer à dessiner un mouvement et relâchez le lorsque vous avez terminé. Si vous souhaitez simplement faire un copier coller, le bouton central fonctionne toujours, cliquez simplement sur le bouton du milieu. (Vous pouvez changer le bouton de la souris pour prendre en compte les paramètres globaux).\n\nVoici les mouvements disponibles : \nDéplacez à droite, puis à gauche : Suivant (Alt+Droite)\nDéplacer à gauche, puis à droite : Précédent (Alt+Gauche)\nDéplacer en haut, puis bas : Dossier parent (Alt+Haut)\nCercle dans le sens inverse des aiguilles d'une montre : Rechargement (F5)\n (Aussitôt que je saurai ceux qui sont utilisés dans Opera ou Mozilla, j'en ajouterai d'autres et m'assurerai que ce sont les mêmes. Ou si vous le faites vous-même, vous pouvez m'aider en m'envoyant votre fichier khotkeysrc).\n\nLes mouvements (certains dialogues proviennent de KGesture, merci à Mike Pilone) sont enregistrés en utilisant la fenêtre de configuration. Vous pouvez aussi regarder votre clavier numérique pour bous aider, les mouvements se font sur une grille de 3 cases sur 3, nommée de 1 à 9.\n\nRemarquez que vous devez effectuer exactement ce mouvement pour déclencher l'évènement. Il est donc possible de définir plusieurs mouvements par action. Veuillez éviter les mouvements trop compliqués, lorsque par exemple vous modifiez la direction de la souris plus d'une fois (les mouvements 45654 ou 74123 sont simples à effectuer, contrairement à 1236987).\n\nLa condition de tous les mouvements est définie dans ce groupe. Tous ces mouvements ne seront actifs que si la fenêtre courante est Konqueror (la classe contient « konqueror »).
+Comment[fy]=Okee, Konqi yn KDE3.1 hat ljeppers, en no kinne jo ek stjoerrings hawwe, jo hoege gjin oare blêders te brûken >;).\n\nDruk gewoan op de middelste mûsknop en tekenje ien fan de stjoerrings, en neidat jo klear binne, kinne jo de knop wer loslitte. As jo allinne mar in seleksje hoege te plakken, it bliuwt wurkjen, klik gewoan op de middelste mûsknop. (Jo kinne de te brûken mûsknoppen wizigje yn de globle ynstellings).\n\nOp it stuit, binne de folgjende stjoerrings beskikber:\nNei rjochts en nei lofts - Fierder ((Alt+Rjochts)\nNei lofts en nei rjochts - Werom (Alt+Lofts)\nNei omheech en nei omleech - Omheech (Alt+Omheech)\nSirkel tsjin de klok yn - Ferfarskje (F5)\n (Sadra ik wit hokker yn Opera of mozilla brûkt wurde, meitsje ik der mear oan, dy’t oerienkomme mei harren. Of jo kinne it sels dwaan, fiel jo frij om my te helpen en stjoer my jo khotkeysrc.)\n\nDe stjoerringfigueren (guon fan de skermen binne fan KGesture, tanke oan Mike Pilone) kinne ienfâldich ynfierd wurde troch har út te fieren yn it konfiguraasje dialooch. Jo kinne ek nei jo numerike toetsen sjen foar help, stjoerrings wurde werkend as in roaster fan 3x3 fjilden, oanjûn fan 1 oant 9.\n\nTink derom dat jo de sjoerring eksakt neidwaan moatte foar de aksje. It is dêrom ek mooglik om meardere stjoerrings oan ien aksje te hingjen. Jo dogge der goed om yngewikkelde stjoerrings wêr jo de rjochting fan de mûs mear dan iens kear feroarje út de wei te gean (Doch bgl. 45654 of 74123 omdat dizzen maklik út te fieren binne mar 1236987 kin al muoilik wêze).\n\nDe kondysje fan alle stjoerrings binne oantsjutte yn dizze groep. Alle dizze stjoerrings binne allinne aktyf as it aktive finster Konqueror (class befettet 'konqueror').
+Comment[hr]=Konqi unutar KDE 3.1 sadrži kartice, a od sad ožete upotrebljavati i gestikulacije. Nema potrebe za drugim preglednicima >;).\n\nDovoljno je pritisnuti srednju tipku miša i započeti s "crtanjem" gestikulacije, a po njezinom dovršetku otpustiti tipku. Ako je potrebno samo prelijepiti odabir, aktivnost će i dalje funkcionirati - dovoljno je kliknuti srednjom tipkom miša. (Upotrebu tipke miša moguće je promijeniti u globalnim postavkama.)\n\nU ovom su trenutku dostupne sljedeće gestikulacije:\n- kretnja udesno i potom ulijevo - Naprijed (Alt+Desno)\n- kretnja ulijevo i potom udesno - Natrag (Alt+Lijevo)\n- kretnja prema gore i potom prema dolje - Razinu prema gore (Alt+Gore)\n- kruženje u smjeru suprotnom od kazaljki na satu - Osvježavanje (F5)\n(Čim autor ustanovi koje se gestikulacije upotrebljavaju u Operi ili Mozilli, one će biti dodane i provjerene radi podudaranja. Ako to sami učinite, autoru ove aplikacije pošaljite svoju datoteku khotkeysrc.)\n\nOblike gestikulacija moguće je jednostavno unijeti njihovim izvođenje unutar konfiguracijskog dijaloga (neki su dijalozi preuzeti iz KGesture, zahvaljujući Mikeu Piloneu). Također vam numerička tipkovnica može poslužiti kao pomoć. Gestikulacije se prepoznaju poput mreže od 3x3 polja, numerirana od 1 do 9.\n\nNapomena: Da biste pokrenuli aktivnost, gestikulaciju je potrebno točno izvesti. Iz tog je razloga za jednu aktivnst moguće unijeti više gestikulacija. Potrebno je izbjegavati složene gestikulacije tijekom kojih smjer kretanja miša mijenjate više od jedanputa (npr. izvedite kretnje u smejrovima 45654 ili 74123 jer su one jednostavne za izvođenje, ali izbjegavajte kretnje poput 1236987 jer bi one mogle biti jako zahtjevne).\n\nUvjeti za sve gestikulacije definirani su u ovoj grupi. Sve ove gestikulacije funkcioniraju samo ako je akativan prozor Konqueror (klasa sadrži "konqueror").
+Comment[hu]=A Konqi a KDE 3.1-től kezdve tud kezelni lapokat és most már mozdulatsorokat is. Nincs szükség más böngészőre >;).\n\nNyomja le a középső gombot és kezdje el 'rajzolni' a mozdulatsort. Ha elkészült, eressze fel az egérgombot. Akkor is működik, ha csak be kell illeszteni a kijelölést: egyszerűen kattintson a középső egérgombra. (A használni kívánt gomb beálítható a globális beállításoknál).\n\nJelenleg a következő mozdulatok használhatók:\njobbra és balra, balra és előre mozdítás (Alt+jobbra)\nbalra és jobbra - Vissza (Alt+balra)\nfelfelé és lefelé - Fel (Alt+fel)\nkör rajzolása balra - Újratöltés (F5)\n (Rövidesen az Opera és a Mozilla többi mozdulatsora is használható lesz. Küldje be a khotkeysrc fájlt, ha segíteni szeretne a további fejlesztésben.)\n\nAz alakzat-mozdulatsorok (néhány ablak a KGesture-ből származik, köszönet értük Mike Pilone-nak) egyszerűen bevihetők a beállítóablakban. A kezelés hasonló a numerikus billentyűzet elrendezéséhez, a mozdulatsor 3x3-as rácson belül van értelmezve, melyek 1-től 9-ig vannak számozva.\n\nA mozdulatsorok csak pontos végrehajtás esetén érvényesek, emiatt egy művelethez több mozdulatsor is rendelhető. Általában érdemes elkerülni az olyan mozdulatsorokat, ahol a mozgásirány egynél többször változik (például 45654 vagy 74123 könnyen elvégezhető, de 1236987 már jóval nehezebb).\n\nEbben a csoportban találhatók a feltételek. A mozdulatsorok csak akkor aktívak, ha a Konqueror az aktív ablak (az osztály tartalmazza a 'konqueror' sztringet).
+Comment[is]=Ok, Konqi í KDE3.1 fékk flipa, og núna er einnig hægt að nota (músar)hreyfingar. Þarft ekki annan vefrápara >;).\n\nBara að ýta á miðjuhnappinn á músinni og byrja að teikna einhverja af hreyfingunum, sleppa síðan þegar hreyfingin er búin. Til þess að líma eitthvað sem hefur verið valið, þá virkar eins og áður að smella einu sinni á miðjuhnappinn á músinni. (Þú getur breytt hvaða hnappur er notaður í víðværu stillingunum).\n\nÍ dag eru þessar hreyfingar í boði:\nhreyfa til hægri og aftur til vinstri - Fara áfram (ALt+Hægri ör)\nhreyfa til vinstri og aftur til hægri - Til baka (Alt+Vinstri ör)\nhreyfa upp og aftur niður - Upp (Alt+Upp)\nhringur rangsælis - Endurhlaða (F5)\n (Um leið og við finnum út hvaða hreyfingar verða notaðar í Opera og Mozilla vöfrunum, þá verður bætt við fleirum og gengið úr skugga um að hreyfingarnar séu þær sömu. Og ef þú ert að búa til þínar eigin, endilega sendu okkur khotkeysrc-skrána þína.)\n\nForm hreyfinganna (sumt af viðmótinu kemur úr KGesture, þakkir til Mike Pilone) er hægt að setja inn á einfaldan hátt í gegnum stillingaviðmót. Þú getur líka skoðað reiknihluta lyklaborðs til að átta þig á hreyfingunum, þær eru skilgreindar í 3x3 reitasvæði, númeruðu frá 1 til 9.\n\nAthugaðu að þú verður að gera hreyfinguna nákvæmlega til að aðgerðin/skipunin virki. Þessvegna er hægt að setja inn fleiri hreyfingar fyrir hverja aðgerð. Ekki er ráðlegt að setja inn verulega flóknar hreyfingar með mörgum stefnubreytingum á músinni (t.d. eru 45654 eða 74123 fremur einfaldar, en 1236987 gæti reynst erfið viðureignar).\n\nSkilyrði allra hreyfinga eru tilgreind í þessum flokki. Allar þessar hreyfingar eru aðeins virkar ef virki glugginn er Konqueror (class inniheldur 'konqueror').
+Comment[it]=OK, Konqueror in KDE3.1 ha le schede, e ora puoi avere anche i gesti. Non hai motivo di usare altri browser! >;).\n\nPremi il tasto centrale del mouse e inizia a disegnare uno dei gesti, e quando hai finito rilascia il tasto del mouse. Se devi solo incollare la selezione, puoi ancora farlo, fai solo clic col tasto centrale del mouse (Dalle impostazioni globali puoi scegliere il tasto da usare).\n\nAl momento sono disponibili i seguenti gesti:\nsposta a destra e indietro a sinistra - Avanti (Alt+Destra)\nsposta a sinistra e indietro a destra - Indietro (Alt+Sinistra)\nsposta in su e di nuovo in giù - Su (Alt+Su)\nfai un cerchio in senso antiorario - Ricarica (F5)\n (Non appena scoprirò quali gesti sono presenti in Opera e Mozilla, li aggiungerò assicurandomi che siano gli stessi. Oppure se lo fai tu, aiutami pure, e mandami il tuo khotkeysrc.)\n\nLe forme dei gesti (alcune delle finestre derivano da KGesture, grazie a Mike Pilone) possono essere inserite semplicemente eseguendole nella finestra di configurazione. Puoi anche usare il tastierino numerico per aiutarti, i gesti sono riconosciuti come una griglia di campi 3×3, numerati da 1 a 9.\n\nNota che devi eseguire il gesto esattamente per far scattare l'azione. Per questo motivo, è possibile inserire più gesti per una singola azione. Dovresti evitare gesti complicati in cui cambi la direzione di movimento del mouse più di una volta (cioè fai ad es. 45654 o 74123, perché sono abbastanza semplici da effettuare, ma, ad es. 1236987 è già piuttosto difficile).\n\nLa condizione per tutti i gesti sono definite in questo gruppo. Tutti questi gesti sono attivi solo se la finestra attiva è Konqueror (la classe contiene "konqueror").
+Comment[ja]=Konqueror は KDE 3.1 でタブとマウスジェスチャーを実装しました。もう他のブラウザを使う必要はありません。;)\n\nまずマウスの中ボタンを押して、押したままジェスチャーを描いて、描き終えたらボタンを放してください。選択を貼り付けるときは、マウスの中ボタンを押すだけです。マウスジェスチャーに使用するボタンは「全体設定」で変更できます。\n\n現在利用できるジェスチャーは以下のとおりです。\n右->左 - 進む (ALt+右)\n左->右 - 戻る (Alt+左)\n上->下 - 上 (Alt+上)\n反時計回りに一周 - 再読み込み (F5)\n (これ以外にも Opera や Mozilla で実装されているものが分かれば、Konqueror にも追加し、同じように動くようにします。あなた自身で追加したら、ぜひあなたの khotkeysrc を送ってください)\n\nジェスチャーの形は設定ダイアログで実際に描くことによって登録できます (ダイアログの一部は Mike Pilone による KGesture から流用しました)。テンキーも参考にしてください。ジェスチャーは 3x3 のグリッドの 1 から 9 の数値として認識されます。\n\nアクションはジェスチャーを正確に再現しなければ実行されません。このため、一つのアクションに複数のジェスチャーを登録できるようになっています。マウスを動かす方向を 2 度以上変える場合は、あまり複雑にしないでください (45654 や 74123 を描くのは簡単ですが、1236987 は既に難しいかもしれません)。\n\nすべてのジェスチャーの条件はこのグループに定義されています。これらのジェスチャーは、アクティブなウィンドウが Konqueror の場合 (ウィンドウのクラスが 'konqueror' を含む場合) にのみ有効になります。
+Comment[km]=យល់​ព្រម Konqi នៅ​ក្នុង KDE ៣.១ មាន​ផ្ទាំង​ជា​ច្រើន ហើយ​ឥឡូវ​អ្នក​ក៏​អាច​មាន​កាយវិកា ។ មិន​ចាំបាច់​ប្រើ​កម្មវិធីរុករក​ផ្សេង​ទៀត​ទេ >;) ។\n\nគ្រាន់​តែ​ចុច​ប៊ូតុង​កណ្ដុរ​ស្ដាំ ហើយ​ចាប់ផ្ដើម​គូរ​កាយវិកា​មួយ​ក្នុង​ចំណោម​កាយវិកា ហើយ​បន្ទាប់​មក​អ្នក​ត្រូវ​បាន​បញ្ចប់ លែង​ប៊ុតុង​កណ្ដុរ ។ ប្រសិន​បើ​អ្នក​ចាំបាច់​បិទភ្ជាប់​ជម្រើស វា​នៅ​តែ​ដំណើរការ តាម​ធម្មតា​ចុច​តែ​ប៊ុតុង​កណ្ដុរ​កណ្ដាល ។ (អ្នក​អាច​ផ្លាស់ប្ដូរ​ប៊ូតុង​កណ្ដុរ​ដើម្បី​ប្រើ​នៅ​ក្នុង​ការ​កំណត់​សកល) ។\n\nឥឡូវ មាន​កាយវិកា​ទាំងនេះ ៖\nផ្លាស់ទី​ទៅស្ដាំ និង​ត្រឡប់​ទៅ​ឆ្វេង - ឡើង​លើ(ALt+ខាងស្ដាំ)\nផ្លាស់ទី​ទៅ​ឆ្វេង និង​ត្រឡប់​ទៅ​ស្ដាំ - ថយ​ក្រោយ (Alt+ខាង​ឆ្វេង)\nផ្លាស់ទី​ឡើង​លើ និង​ចុះក្រោម - ឡើង​លើ (Alt+Up)\nបង្វិល​ស្រប​ទិស​ទ្រនិច​នាឡិកា - ផ្ទុក​ឡើង​វិញ (F5)\n (ចុច​រហូត​ដល់​ខ្ញុំ​អាច​ដឹង​​មួយ​នៅ​ក្នុង Opera ឬ Mozilla ខ្ញុំ​នឹង​បន្ថែម​វា​ច្រើនទៀត ហើយ​ប្រាកដ​ថា​ពួកវា​ដូច​គ្នា ។ ឬ​ប្រសិន​បើ​អ្នក​ធ្វើ​វា​ដោយ​ខ្លួន​ឯង ជួយ​ដោយសេរី ហើយ​ផ្ញើ​មក​ខ្ញុំ​នូវ​ khotkeysrc របស់​អ្នក ។)\n\nរូបរាង​របស់​កាយវិកា (ប្រអប់​មួយ​ចំនួន​បាន​មក​ពី KGesture សូម​អរគុណ​ចំពោះ Mike Pilone) អាច​ត្រូវ​បាន​បញ្ចូល​ដោយសាមញ្ញ​ដោយ​អនុវត្ត​ពួក​វា នៅ​ក្នុង​ប្រអប់​កំណត់​រចនាសម្ព័ន្ធ ។ អ្នក​ក៏អាច​មើល​បន្ទះ​លេខ​របស់​អ្នក​ដើម្បីជួយ​អ្នក កាយវិការ​ត្រូវ​បាន​ទទួល​ស្គាល់​ក្រឡា​ចត្រង្គ ៣x៣ របស់​វាល ដាក់​លេខ​ពី ១ ដល់ ៩ ។\n\nចំណាំថា អ្នក​ត្រូវ​តែ​អនុវត្ត​កាយវិកា​ជាក់លាក់​ដើម្បី​កេះ​សកម្មភាព ។ ដោយ​សារ​តែ​វា វា​អាច​បញ្ចូល​កាយវិកា​ច្រើន​សម្រាប់​សកម្មភាព ។អ្នក​គួរ​ព្យាយាម​ជៀសវាង​កាយវិកា​ស្មុគស្មាញ ដែលអ្នក​អាច​ផ្លាស់ប្ដូរ​ទិស​របស់ចលនា​កណ្ដុរ​ច្រើន​ជាង​មួយ (ឧ. ៤៥៦៥៤ ឬ ៧៤១២៣ ដូច​ដែល​ពួក​វា​អនុវត្ត​ធម្មតា ប៉ុន្តែ ឧ. ១២៣៦៩៨៧ អាច​ពិបាក​ស្រាប់​ហើយ) ។\n\nលក្ខខណ្ឌ​សម្រាប់កាយវិកា​ទាំងអស់​ត្រូវ​បាន​កំណត់​នៅ​ក្នុង​ក្រុម​នេះ ។ កាយវិកា​ទាំង​អស់​នេះ​សកម្ម​តែក្នុង​ករណី​ដែល​បង្អួច​សកម្ម​គឺ Konqueror (ថ្នាក់​រួម​មាន 'konqueror') ។
+Comment[nds]=Jo, in Konqui gifft dat siet KDE 3.1 Paneels, un nu ok Muustekens. Dat Bruken vun anner Nettkiekers deit nu redig nich mehr noot.\n\nDrück eenfach den Middel-Muusknoop un gah bi, een vun de Tekens to maken. Laat den Muusknoop wedder loos, wenn Du fardig büst. Wenn Du bloots de Utwahl infögen wullt, geiht dat ok, drück eenfach bloots den Middelknoop. (Binnen de globale Instellen kannst Du den Knoop fastleggen, mit den Du Tekens maken wullt.)\n\nOpstunns gifft dat disse Tekens: Na rechts un torüch na links - Vörwarts (Alt+Rechts)\nNa links un torüch na rechts - Torüch (Alt+Links)\nNa baven un torüch na nerrn - Na baven (Alt+Hooch)\nKrink linksrüm - Nieg laden (F5)\n (Wenn ik rutfunnen heff, wat för Tekens dat bi Opera un Mozilla gifft, föög ik de hier to. Wenn Du dat sülven maakst, kannst Du mi ok hölpen un Dien "khotkeysrc" tostüern.)\n\nDu kannst Dien Muustekens eenfach binnen den Instellendialoog utföhren un so ingeven (en Reeg vun de Dialogen is ut "KGesture", Dank Di, Mike Pilone!). För de Tekens gifft dat 3x3 Kuntrullpünkt, de vun 1 to 9 nummereert sünd as de Tasten op den Tallenblock vun Dien Tastatuur.\n\nBeacht bitte, dat Du dat Teken akraat utföhren muttst, wullt Du de Akschoon opropen. Dorüm laat sik för een Akschoon mehr Tekens angeven. Legg man keen vigeliensche Tekens fast, bi de Du de Richt vun de Muusbewegen mehr as eenmaal ännerst (t.B. laat sik 45654 oder 74123 licht maken, man 1236987 mag al düchtig swoor wesen.\n\nDe Bedingen för all Muustekens is över den Koppel fastleggt. All de Akschonen sünd bloots anmaakt, wenn dat aktive Finster Konqueror is (de Finsterklass "konqueror" bargt).
+Comment[nl]=Ok, Konqi in KDE3.1 heeft tabbladen en nu kunt u ook gebaren gebruiken. Geenreden meer om andere browsers te gebruiken >;).\n\nHoudt eenvoudigweg de middelste muisknop ingedrukten begin met het tekenen van één van de gebaren. Laat als u klaar bent de middelste muisknop weer los.Als u alleen een selectie wilt plakken dan werkt dit ook. Klik gewoon met de middelste muisknop. (U kunt de te gebruiken muisknop wijzigen in de globale instellingen).\n\nMomenteel zijn er enkele gebaren bechikbaar:\nBeweeg naar rechts en dan terug naar links - Vooruit (Alt + Pijl rechts)\nBeweeg naar links en dan terug naar rechts - Terug (Alt + Pijl links)\nBeweeg omhoog en dan terug naar beneden - Boven (Alt + Pijl omhoog)\nDraai de muis rechtsom in een cirkel - Herladen (F5)\n(Zodra ik uitgevonden welke in Opera of Mozila worden gebruikt zal ik er meer toevoegen en er voor zorgendat ze hetzelfde werken. Of als u ze zelf toevoegt, wees zo vrij om me te helpen en stuur me uw khotkeysrc-bestand.)\n\nDe gebaarvormen (enkele dialogen komen van KGesture, met dank aan Mike Pilone) kunnen worden ingevoerd door ze te tekenen in de configuratiedialoog. U kunt ook naar uw numerieke klavier kijken om u te helpen. GEbaren worden herkend als een raster van 3 bij 3 velden, genummerd van 1 tot 9.\n\nOpmerking: u moet de gebaar exact uitvoeren om de gewenstehandeling te activeren. Daarom is het mogelijk om meerdere gebaren aan een handeling toe te wijzen. Probeer complexe bewegingen, waarbij de richting van de muis meerdere malen wordt veranderd, te vermijden. Bijv. de beweging 45654 of 74123 is eenvoudig uit te voeren terwijl 1236987 al vrij moeilijk kan zijn.\n\nDe condities voor alle gebaren zijn gedefinieerd in deze groep. Alle gebaren worden alleen geactiveerd als een venster van Konqueror de focus heeft (vensterklasse bevat 'konqueror').
+Comment[pl]=Od wersji KDE 3.1 Konqueror ma zakładki, teraz może mieć też gesty. Nie ma potrzeby używać innych przeglądarek ;). \n\nPo prostu naciśnij środkowy przycisk myszy i zacznij rysować jeden z gestów. Kiedy skończysz, puść klawisz myszy. Jeśli chcesz używać wklejenia zaznaczenia, które jest dostępne przez kliknięcie środkowym przyciskiem myszy, nadal możesz to robić, po prostu kliknij (możesz zmienić przycisk myszy używany do gestów w ustawieniach globalnych). \n\nObecnie dostępne są następujące gesty:\nruch w prawo, a potem w lewo - przejście naprzód (Alt+Right)\nruch w lewo, a potem w prawo - przejście wstecz (Alt+Left)\nruch w górę i w dół - przejście w górę (Alt+Up)\nruch okrężny przeciwnie do ruchu wskazówek zegara - odświeżenie strony (F5)\nJak tylko dowiemy się, jakie są używane w Operze lub Mozilli, zostaną dodane aby były takie same. Lub możesz zrobić to na własną rękę i przysłać nam swój plik khotkeysrc.\n\nKształty gestów (niektóre z okien dialogowych pochodzą z programu KGesture, za co podziękowania dla Mike'a Pilone) mogą być podane po prostu przez wykonanie ich w oknie konfiguracyjnym. Możesz również patrzeć na klawisze numeryczne, żeby sobie pomóc - gesty są rozpoznawane na siatce pól 3x3, ponumerowanych od 1 do 9.\n\nProszę zwrócić uwagę, że trzeba wykonać dokładnie taki sam gest, aby wywołać akcję.Z tego powodu można podać więcej gestów dla akcji. Powinno się unikać skomplikowanych gestów w których kierunek ruchu myszy zmienia się więcej niż raz (np. można podać 45654 lub 74123, ponieważ są proste do wykonania, ale np. 1236987 może być już całkiem trudny).\n\nWarunki wszystkich gestów są określone w tej grupie. Wszystkie te gesty są włączone tylko gdy aktywnym oknem jest okno Konquerora (klasa okna zwiera 'konqueror').
+Comment[pt]=Ok, o Konqi no KDE3.1 tem páginas e você poderá agora ter também os gestos. Não é necessário usar agora os outros navegadores >;).\n\nBasta carregar no botão do meio do rato e começar a desenhar um dos gestos; depois de terminar, largue o botão do rato. Se só necessitar de colar a selecção, isso funciona à mesma; basta carregar uma vez no botão do meio do rato. (Poderá mudar o botão do rato a usar na configuração global). \n\nPor agora, existem três gestos disponíveis:\nmover para a direita e para a esquerda - Avançar (Alt+Direita)\nmover para a esquerda e para a direita - Recuar (Alt+Esquerda)\nmover para cima e para baixo - Subir (Alt+Cima)\nrodar no sentido anti-horário em círculo - Recarregar (F5)\n (Assim que se descubra como é no Opera ou no Mozilla, serão adicionados mais, certificando que são os mesmos. Ou, se o fizer você mesmo, pode ajudar o autor e enviar o seu ficheiro 'khotkeysrc'.)\n\nAs formas dos gestos (algumas das janelas são do KGesture, graças ao Mike Pilone) poderão ser simplesmente introduzidas se as efectuar na janela de configuração. Poderá também olhar para o seu teclado numérico para o ajuda, sendo que os gestos são reconhecidos como sendo uma grelha 3x3 de campos, numerados de 1 a 9.\n\nRepare que deverá efectuar exactamente o gesto que despoleta a acção. Devido a isso, é possível introduzir mais gestos para a acção. Deverá tentar evitar usar gestos complicados onde muda a direcção do movimento do rato mais que uma vez (i.e. fazer p.ex. 45654 ou 74123, dado que são simples de efectuar, mas o 1236987 já poderá ser bastante complicado).\n\nAs condições para todos os gestos estão definidas neste grupo. Todos estes gestos estão activos apenas se a janela activa for o Konqueror (a classe contém 'konqueror').
+Comment[pt_BR]=Ok, o Konqi no KDE3.1 tem abas, e agora você também pode ter gestos. Não é necessário usar outros navegadores >;).\n\nApenas pressione o botão do meio do mouse e comece a desenhar um dos gestos, e após você ter terminado, solte o botão do mouse. Se você apenas precisa colar a seleção, isso ainda funciona, basta apenas clicar com o botão do meio do mouse. (Você pode trocar o botão do mouse a usar nas configurações globais).\n\nAté o momento, existem estes gestos disponíveis:\nmover para a direita e voltar para a esquerda - Avançar (Alt+Seta Direita)\nmover para a esquerda e voltar para a direita - Retroceder (Alt+Seta Esquerda)\nmover para cima e voltar para baixo - Subir (Alt+Seta para cima)\ngirar no sentido anti-horário - Recarregar (F5)\n(Assim que eu descobrir como funciona no Opera ou Mozilla, vou adicionar mais e confirmar que são os mesmos. Ou se você mesmo fizer isso, sinta-se a vontade para me ajudar e enviar seu khotkeysrc.)\n\nAs formas dos gestos (alguns dos diálogos são do KGesture, obrigado ao Mike Pilone) podem ser indicadas executando-as no diálogo de configuração. Você também pode olhar o seu teclado numérico para ajudá-lo, gestos são reconhecidos como uma grade de 3x3 campos, numerados de 1 a 9.\n\nObserve que você precisa executar o gesto de forma exata para disparar a ação. Por isso, é possível indicar mais gestos para a ação. Tente evitar gestos complicados onde você troca a direção do mouse movendo-o mais de uma vez (p.ex. fazer 45654 ou 74123 são simples de efetuar mas p. ex. 1236987 pode ser bastante difícil).\n\nAs condições para todos os gestos estão definidas neste grupo. Todos estes gestos estão ativos apenas se a janela ativa é o Konqueror ( a classe contém 'konqueror').
+Comment[ru]=С версии 3.1 Konqueror поддерживает работу с вкладками.\nНажмите среднюю кнопку мыши, сделайте необходимый росчерк и отпустите кнопку. Вставка текста по средней кнопки мыши по прежнему работает (если вы не двигаете мышь).\nДоступны следующие росчерки:\nвправо и влево - Вперёд (Alt+Стрелка вправо)\nвлево и вправо - Назад (Alt+Стрелка влево)\nвверх и вниз - Вверх (Alt+Стрелка вверх)\nокружность против часовой стрелки - Обновить (F5)\nВы можете легко указать росчерки, выбрав направления движения мыши. Все эти росчерки работают только в окне Konqueror (класс окна "konqueror").
+Comment[sk]=Dobre, Konqi v KDE3.1 má panely a teraz môžete mať tiež gestá. Nepotrebujete používať iné prehliadače >;).\n\nJednoducho stlačte stredné tlačidlo myši a začnite kresliť jedno z gest a keď skončíte, pustite tlačidlo myši. Ak iba potrebujete vložiť výber, stále to funguje, stačí jednoducho kliknúť stredným tlačidlom myši. (Môžete zmeniť tlačidlo myši, ktoré má byť použité v globálnych nastaveniach).\n\nMomentálne sú dostupné tieto gestá:\npresunúť doprava a späť doľava - Vpred (Alt+Vpravo)\npresunúť doľava a späť doprava - Späť (Alt+Vľavo)\npresunúť nahor a späť nadol - Hore (Alt+Hore)\nKruh proti hodinovým ručičkám - Obnoviť (F5)\n (Akonáhle zistím, ktoré sú v Opere alebo Mozille, pridám viac a uistím sa, že sú také isté. Alebo ak ich chcete vytvoriť sami, kľudne mi pomôžte a pošlite mi vaše khotkeysrc.)\n\nTvary gest (niektoré dialógy sú z KGesture, vďaka Mikeovi Pilonovi) môžete jednoducho zadať ich vykonaním v konfiguračnom dialógu. Môžete sa tiež pozrieť na numerickú časť klávesnice, gestá sú totiž rozoznávané ako mriežka 3x3 poľa očíslovaného od 1 do 9.\n\nVšimnite si, že musíte urobiť gesto presne tak, ako je definované, aby sa akcia spustila. Kvôli tomu je možné zadať viac gest pre jednu akciu. Snažte sa vyhnúť komplikovaným gestám, kde meníte smer pohybu myši viac než raz (t.j. urobiť napríklad 45654 alebo 74123, pretože sú jednoduché na vykonanie, ale napríklad 1236987 už môže byť celkom zložité).\n\nPodmienky pre všetky gestá sú definované v tejto skupine. Všetky tieto gestá sú aktívne iba vtedy, keď je aktívne okno Konqueror (trieda obsahuje 'konqueror').
+Comment[sr]=У реду, Konqi од KDE 3.1 има језичке, а сад може имати и гестове. Нема потребе да користити друге прегледаче >;).\n\nСамо притисните средње дугме миша и почните да цртате један од гестова, и пошто завршите, пустите дугме миша. Ако само желите да пренесете избора, може и то, само кликните на средње дугме миша. (можете у глобалним поставкама променити дугме миша за гестове).\n\nТренутно, доступни су следећи гестови:\nпокред десно па лево — Напред (Alt+Right)\nпокрет лево па десно — Назад (Alt+Left)\nпокрет горе па доле — Горе (Alt+Up)\nкруг обрнуто казаљки на сату — Поновно учитавње (F5)\n (Чим сазнам које су у Opera-и или Mozilla-и, додаћу их и осигурати да су исте. Или ако то сами учините, слободно ми помозите тако што ћете ми послати свој khotkeysrc.)\n\nОблици гестова (неки од дијалога су из KGesture-а, хвала Мајку Пајлонеу) могу се уносити једноставним извођењем у дијалогу за подешавања. Можете као помоћ такође гледати у нумерички блок тастатуре, јер се гестови препознају као 3×3 мрежа поља, нумерисана од 1 до 9.\n\nГест се мора тачно извести да би се покренула радња, због чега је могуће задати више гестова за исту радњу. Требало би да избегавате компликоване гестове, код којих се смер миша мора мењати више од једанпут (нпр. 45654 или 74123 једноставни су за извођење, али већ нпр. 1236987 може бити врло захтеван).\n\nУслов за све гестове дефинисан је у овој групи. Сви ови гестови активни су само ако је активан прозор Konqueror-а (класа садржи „konqueror“).
+Comment[sr@Latn]=U redu, Konqi od KDE 3.1 ima jezičke, a sad može imati i gestove. Nema potrebe da koristiti druge pregledače >;).\n\nSamo pritisnite srednje dugme miša i počnite da crtate jedan od gestova, i pošto završite, pustite dugme miša. Ako samo želite da prenesete izbora, može i to, samo kliknite na srednje dugme miša. (možete u globalnim postavkama promeniti dugme miša za gestove).\n\nTrenutno, dostupni su sledeći gestovi:\npokred desno pa levo — Napred (Alt+Right)\npokret levo pa desno — Nazad (Alt+Left)\npokret gore pa dole — Gore (Alt+Up)\nkrug obrnuto kazaljki na satu — Ponovno učitavnje (F5)\n (Čim saznam koje su u Opera-i ili Mozilla-i, dodaću ih i osigurati da su iste. Ili ako to sami učinite, slobodno mi pomozite tako što ćete mi poslati svoj khotkeysrc.)\n\nOblici gestova (neki od dijaloga su iz KGesture-a, hvala Majku Pajloneu) mogu se unositi jednostavnim izvođenjem u dijalogu za podešavanja. Možete kao pomoć takođe gledati u numerički blok tastature, jer se gestovi prepoznaju kao 3×3 mreža polja, numerisana od 1 do 9.\n\nGest se mora tačno izvesti da bi se pokrenula radnja, zbog čega je moguće zadati više gestova za istu radnju. Trebalo bi da izbegavate komplikovane gestove, kod kojih se smer miša mora menjati više od jedanput (npr. 45654 ili 74123 jednostavni su za izvođenje, ali već npr. 1236987 može biti vrlo zahtevan).\n\nUslov za sve gestove definisan je u ovoj grupi. Svi ovi gestovi aktivni su samo ako je aktivan prozor Konqueror-a (klasa sadrži „konqueror“).
+Comment[sv]=Ja, Konqeror i KDE3.1 har flikar, och nu kan du också få gester. Ingen anledning att använda andra webbläsare.\n\nTryck bara på musens mittenknapp och börja rita en gest. Släpp musknappen när du är klar. Om du bara behöver klistra in markeringen, fungerar det också. Klicka helt enkelt bara med musens mittenknapp. (Du kan ändra musknapp som används i de allmänna inställningarna.)\n\nFör närvarande finns följande gester tillgängliga:\nFlytta höger och tillbaka åt vänster - Framåt (Alt+Högerpil)\nFlytta vänster och tillbaka åt höger - Bakåt (Alt+Vänsterpil)\nFlytta uppåt och tillbaka neråt - Upp (Alt+Uppåtpil)\nCirkel moturs - Uppdatera (F5)\n(Så fort jag får reda på vilka som finns i Opera och Mozilla, ska jag lägga till flera, och försäkra mig om att de är likadana. Eller om du gör det själv, hjälp mig gärna och skicka mig din khotkeysrc.)\n\nGesternas form kan helt enkelt matas in genom att utföra dem i inställningsdialogrutan (några av dialogrutorna kommer från Kgesture, tack till Mike Pilone). Du kan också titta på det numeriska tangentbordet för hjälp. Gester känns igen som ett 3x3 rutnät av fält, numrerade från 1 till 9.\n\nObservera att du måste utföra gesten exakt för att åtgärden ska utlösas. På grund av det är det möjligt att mata in flera gester för en åtgärd. Du bör försöka undvika komplicerade gester där musens riktning ändras mer än en gång (dvs. använd till exempel 45654 eller 74123 efter som de är enkla att utföra, men till exempel 1236987 kan redan den vara ganska svår).\n\nVillkor för alla gester definieras i denna grupp. Alla gester är bara aktiva om det aktiva fönstret är Konqueror (klassen innehåller 'konqueror').
+Comment[zh_TW]=KDE 3.1 中的 Konqi 有分頁,現在您也可以用手勢。不需要使用其它的瀏覽器了。\n\n只要按住滑鼠中鍵,然後開始畫某個手勢,畫完以後放開。如果您只是要貼上選擇的文字,您還是可以只簡單點選中鍵。(您可以在全域設定中改變滑鼠按鍵的定義。)\n\n現在,有這些手勢可以使用:\n往右移再往左移─表示往下一頁(Alt+右鍵)\n往左移再往右移─表示返回前一頁(Alt+左鍵)\n往上移再往下移─表示往上一層(Alt+上鍵)\n逆時針畫圈圈─重新載入(F5)\n(等我找出更多 Opera 或 Mozilla 的手勢,我會再加入。您也可以自己加入,並將您的 khotkeysrc 寄送給我。)\n\n手勢的形狀(有些對話框是從 KGesture 而來,感謝 Mike Pilone)可以在設定對話框中輸入。您也可以用鍵盤上的數字方向鍵。手勢就像是個 3x3 的格子,從 1 到 9。\n\n注意,您必須要完整做完手勢才會觸發動作,因此您可以對某動作輸入多個手勢。您應該避免使用太複雜的手勢,(例如:45654 或 74123 夠簡單,可以使用,但是 1236987 就可能有點困難)。\n\n所有手勢的條件都定義在此群組中。這些手勢只會在視窗類別為 Konqueror 才有作用。
+DataCount=4
+Enabled=false
+Name=Konqi Gestures
+Name[bg]=Жестове на Konqui
+Name[ca]=Gestos del Konqui
+Name[cs]=Konqui gesta
+Name[csb]=Gestë Konqui
+Name[da]=Konqui-gester
+Name[de]=Konqueror-Gesten
+Name[el]=Χειρονομίες Konqi
+Name[eo]=Konkerantaj Gestoj
+Name[es]=Gestor de Konqi
+Name[et]=Konqi žestid
+Name[fr]=Mouvements Konqi
+Name[fy]=Konqui Stjoerrings
+Name[hr]=Konqi gestikulacije
+Name[hu]=Konqi-mozdulatsorok
+Name[is]=Konqui gestures
+Name[it]=Gesti per Konqui
+Name[ja]=Konqi ジェスチャー
+Name[km]=កាយវិការ Konqi
+Name[ko]=Konqi 제스처
+Name[nb]=Konqi-bevegelse
+Name[nds]=Konqui-Muustekens
+Name[nl]=Konqueror-gebaren
+Name[pa]=ਕੋਨਕਿਊਈ ਪਰਭਾਵ
+Name[pl]=Gesty Konquerora
+Name[pt]=Gestos do Konqui
+Name[pt_BR]=Gestos do Konqui
+Name[ro]=Gesturi Konqui
+Name[ru]=Росчерки Konqueror
+Name[sk]=Konquiho gestá
+Name[sr]=Гестови у Konqi-ју
+Name[sr@Latn]=Gestovi u Konqi-ju
+Name[sv]=Konqueror-gester
+Name[te]=కాంక్వి సంజ్ఞలు
+Name[tg]=Хат задани Konqi
+Name[uk]=Жести Конкві
+Name[wa]=Konqi Gestures - Bodjî les purneas Konqi
+Name[zh_CN]=Konqi 手势
+Name[zh_TW]=Konqi 手勢
+SystemGroup=0
+Type=ACTION_DATA_GROUP
+
+[Data_1_7Conditions]
+Comment=Konqueror window
+Comment[bg]=Прозорец на Konqueror
+Comment[bn]=কনকরার উইণ্ডো
+Comment[ca]=Finestra del Konqueror
+Comment[cs]=Okno Konqueroru
+Comment[csb]=Òkno Konquerora
+Comment[da]=Konquerors vindue
+Comment[de]=Konqueror-Fenster
+Comment[el]=Παράθυρο Konqueror
+Comment[eo]=Konkeranta fenestro
+Comment[es]=Ventana de Konqueror
+Comment[et]=Konquerori aken
+Comment[fr]=Fenêtre de Konqueror
+Comment[fy]=Konqueror finster
+Comment[hr]=Konqueror prozor
+Comment[hu]=Konqueror-ablak
+Comment[is]=Konqueror gluggi
+Comment[it]=Finestra di Konqueror
+Comment[ja]=Konqueror ウィンドウ
+Comment[km]=បង្អួច​របស់ Konqueror
+Comment[ko]=Konqueror 창
+Comment[nb]=Konqueror-vindu
+Comment[nds]=Konqueror-Finster
+Comment[nl]=Konqueror-venster
+Comment[pa]=ਕੋਨਕਿਊਰੋਰ ਝਰੋਖਾ
+Comment[pl]=Okno Konquerora
+Comment[pt]=Janela do Konqueror
+Comment[pt_BR]=Janela do Konqueror
+Comment[ro]=Fereastră Konqueror
+Comment[ru]=Окно Konqueror
+Comment[sk]=Okno Konquerora
+Comment[sr]=Прозор Konqueror-а
+Comment[sr@Latn]=Prozor Konqueror-a
+Comment[sv]=Konqueror-fönster
+Comment[te]=కాంకెరర్ విండొ
+Comment[tg]=Равзанаи Konqueror
+Comment[tr]=Konqueror penceresi
+Comment[uk]=Вікно Konqueror
+Comment[uz]=Konqueror oynasi
+Comment[uz@cyrillic]=Konqueror ойнаси
+Comment[wa]=Purnea di Konqueror
+Comment[zh_CN]=Konqueror 窗口
+Comment[zh_TW]=Konqueror 視窗
+ConditionsCount=1
+
+[Data_1_7Conditions0]
+Type=ACTIVE_WINDOW
+
+[Data_1_7Conditions0Window]
+Comment=Konqueror
+Comment[eo]=Konkeranto
+Comment[pa]=ਕੋਨਕਿਊਰੋਰ
+Comment[te]=కాంకెరర్
+WindowsCount=1
+
+[Data_1_7Conditions0Window0]
+Class=konqueror
+ClassType=1
+Comment=Konqueror
+Comment[eo]=Konkeranto
+Comment[pa]=ਕੋਨਕਿਊਰੋਰ
+Comment[te]=కాంకెరర్
+Role=
+RoleType=0
+Title=
+TitleType=0
+Type=SIMPLE
+WindowTypes=33
+
+[Data_1_7_1]
+Comment=
+Enabled=false
+Name=Back
+Name[bg]=Black
+Name[bn]=পিছিয়ে যাও
+Name[br]=War-gil
+Name[ca]=Enrere
+Name[cs]=Zpět
+Name[csb]=Nazôd
+Name[da]=Tilbage
+Name[de]=Zurück
+Name[el]=Πίσω
+Name[eo]=Antaŭa
+Name[es]=Retroceder
+Name[et]=Tagasi
+Name[fr]=Retour
+Name[fy]=Werom
+Name[hr]=Natrag
+Name[hu]=Vissza
+Name[is]=Til baka
+Name[it]=Indietro
+Name[ja]=戻る
+Name[km]=ថយក្រោយ
+Name[ko]=NetHack
+Name[nds]=Torüch
+Name[nl]=Terug
+Name[pa]=ਪਿੱਛੇ
+Name[pl]=W tył
+Name[pt]=Recuar
+Name[pt_BR]=Voltar
+Name[ro]=Înapoi
+Name[ru]=Назад
+Name[sk]=Späť
+Name[sr]=Назад
+Name[sr@Latn]=Nazad
+Name[sv]=Bakåt
+Name[te]=వెనుకకు
+Name[tg]=Гузашта
+Name[tr]=Geri
+Name[uk]=Назад
+Name[uz]=Orqaga
+Name[uz@cyrillic]=Орқага
+Name[wa]=En erî
+Name[zh_CN]=后退
+Name[zh_TW]=返回
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_7_1Actions]
+ActionsCount=1
+
+[Data_1_7_1Actions0]
+Input=Alt+Left
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_7_1Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_7_1Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=3
+
+[Data_1_7_1Triggers0]
+Gesture=65456
+Type=GESTURE
+
+[Data_1_7_1Triggers1]
+Gesture=5456
+Type=GESTURE
+
+[Data_1_7_1Triggers2]
+Gesture=6545
+Type=GESTURE
+
+[Data_1_7_2]
+Comment=
+Enabled=false
+Name=Forward
+Name[bg]=Напред
+Name[bn]=এগিয়ে যাও
+Name[br]=War-raok
+Name[ca]=Endavant
+Name[cs]=Vpřed
+Name[csb]=Wprzódk
+Name[da]=Fremad
+Name[de]=Nach Vorne
+Name[el]=Εμπρός
+Name[eo]=Sekva
+Name[es]=Avanzar
+Name[et]=Edasi
+Name[fr]=Suivant
+Name[fy]=Foarút
+Name[hr]=Naprijed
+Name[hu]=Előre
+Name[is]=Áfram
+Name[it]=Avanti
+Name[ja]=進む
+Name[km]=បញ្ជូន​បន្ត
+Name[ko]=앞으로
+Name[nb]=Framover
+Name[nds]=Vörut
+Name[nl]=Vooruit
+Name[pa]=ਅੱਗੇ
+Name[pl]=W przód
+Name[pt]=Avançar
+Name[pt_BR]=Avançar
+Name[ro]=Înainte
+Name[ru]=Вперёд
+Name[sk]=Dopredu
+Name[sr]=Напред
+Name[sr@Latn]=Napred
+Name[sv]=Framåt
+Name[te]=ముందుకు
+Name[tg]=Навбатӣ
+Name[tr]=İleri
+Name[uk]=Вперед
+Name[uz]=Oldinga
+Name[uz@cyrillic]=Олдинга
+Name[wa]=Avancî
+Name[zh_CN]=前进
+Name[zh_TW]=往前
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_7_2Actions]
+ActionsCount=1
+
+[Data_1_7_2Actions0]
+Input=Alt+Right
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_7_2Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_7_2Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=3
+
+[Data_1_7_2Triggers0]
+Gesture=45654
+Type=GESTURE
+
+[Data_1_7_2Triggers1]
+Gesture=5654
+Type=GESTURE
+
+[Data_1_7_2Triggers2]
+Gesture=4565
+Type=GESTURE
+
+[Data_1_7_3]
+Comment=
+Enabled=false
+Name=Up
+Name[bg]=Нагоре
+Name[bn]=উপরে ওঠো
+Name[br]=Uhel
+Name[ca]=Amunt
+Name[cs]=Nahoru
+Name[csb]=W górã
+Name[da]=Op
+Name[de]=Aufwärts
+Name[el]=Πάνω
+Name[eo]=Supre
+Name[es]=Subir
+Name[et]=Üles
+Name[fr]=Haut
+Name[fy]=Omheech
+Name[hr]=Gore
+Name[hu]=Fel
+Name[is]=Upp
+Name[it]=Su
+Name[ja]=上
+Name[km]=ឡើងលើ
+Name[nb]=Opp
+Name[nds]=Na baven
+Name[nl]=Omhoog
+Name[pa]=ਉੱਤੇ
+Name[pl]=Do góry
+Name[pt]=Subir
+Name[pt_BR]=Subir
+Name[ro]=Sus
+Name[ru]=Вверх
+Name[sk]=Nahor
+Name[sr]=Горе
+Name[sr@Latn]=Gore
+Name[sv]=Upp
+Name[te]=పైకి
+Name[tg]=Боло
+Name[tr]=Yukarı
+Name[uk]=Вгору
+Name[uz]=Yuqoriga
+Name[uz@cyrillic]=Юқорига
+Name[wa]=Pu hôt
+Name[zh_CN]=向上
+Name[zh_TW]=上一層
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_7_3Actions]
+ActionsCount=1
+
+[Data_1_7_3Actions0]
+Input=Alt+Up
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_7_3Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_7_3Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=3
+
+[Data_1_7_3Triggers0]
+Gesture=25852
+Type=GESTURE
+
+[Data_1_7_3Triggers1]
+Gesture=2585
+Type=GESTURE
+
+[Data_1_7_3Triggers2]
+Gesture=5852
+Type=GESTURE
+
+[Data_1_7_4]
+Comment=
+Enabled=false
+Name=Reload
+Name[bg]=Презареждане
+Name[bn]=নতুন করে পড়ো
+Name[br]=Adkargañ
+Name[ca]=Actualitza
+Name[cs]=Obnovit
+Name[csb]=Òdswiéżë
+Name[da]=Genindlæs
+Name[de]=Dokument erneut laden
+Name[el]=Επαναφόρτωση
+Name[eo]=Reŝarĝi
+Name[es]=Recargar
+Name[et]=Laadi uuesti
+Name[fr]=Recharger
+Name[fy]=Ferfarskje
+Name[hr]=Osvježi
+Name[hu]=Újratöltés
+Name[is]=Endurhlaða
+Name[it]=Ricarica
+Name[ja]=再読み込み
+Name[km]=ផ្ទុកឡើង​វិញ
+Name[ko]=새로 고침
+Name[nb]=Omlast
+Name[nds]=Nieg laden
+Name[nl]=Herladen
+Name[pa]=ਮੁੜ-ਲੋਡ
+Name[pl]=Odśwież
+Name[pt]=Recarregar
+Name[pt_BR]=Recarregar
+Name[ro]=Reîncarcă
+Name[ru]=Обновить
+Name[sk]=Obnoviť
+Name[sr]=Поново учитај
+Name[sr@Latn]=Ponovo učitaj
+Name[sv]=Uppdatera
+Name[te]=మళ్లి ఎక్కించు
+Name[tg]=Бозсозӣ
+Name[tr]=Yeniden Yükle
+Name[uk]=Перезавантажити
+Name[uz]=Qaytadan yuklash
+Name[uz@cyrillic]=Қайтадан юклаш
+Name[wa]=Ritcherdjî
+Name[zh_CN]=重新装入
+Name[zh_TW]=重新載入
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_7_4Actions]
+ActionsCount=1
+
+[Data_1_7_4Actions0]
+Input=F5
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_7_4Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_7_4Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=3
+
+[Data_1_7_4Triggers0]
+Gesture=123698741
+Type=GESTURE
+
+[Data_1_7_4Triggers1]
+Gesture=1236987412
+Type=GESTURE
+
+[Data_1_7_4Triggers2]
+Gesture=4123698741
+Type=GESTURE
+
+[Data_1_8]
+Comment=After pressing Win+E (Tux+E), WWW browser will be launched and it will open http://www.kde.org . You may run all kind of commands you can run in minicli (Alt+F2).
+Comment[bg]=След като натиснете Win+E (Tux+E), ще бъде стартиран уеб браузър, който ще отвори http://www.kde.org . Можете да стартирате всякакви команди (Alt+F2).
+Comment[ca]=Després de prémer Win+E (Tux+E), s'engegarà el navegador WWW i obrirà http://www.kde.org . Podeu executar tota la classe d'ordres que es poden executar n el minicli (Alt+F2).
+Comment[csb]=Pò wcësniãcym Win+E (Tux+E), òstanié włączony przezérnik WWW ze starną http://www.kde.org. Mòżesz zrëszëc równojaką programã, jaką mòżesz zrëszëc téż w minicli (Alt+F2).
+Comment[da]=Efter tryk på Win+E (Tux+E), bliver en browser startet som vil åbne http://www.kde.org . Du kan køre alle slags kommandoer som du kan køre i minicli (Alt+F2).
+Comment[de]=Wenn Sie Windows+E drücken, wird der Webbrowser gestartet und http://www.kde.org geladen. Sie können alle Befehle ausführen, die von der Mini-Befehlszeile unterstützt werden (Alt+F2).
+Comment[el]=Μετά το πάτημα του Win+E (Tux+E), θα εκτελεστεί ο περιηγητής WWW και θα ανοίξει το http://www.kde.org . Μπορείτε να εκτελέσετε όλες τις εντολές που εκτελούνται με το minicli (Alt+F2).
+Comment[eo]=Post premo de Win+E (Tux+E), retumilo lanĉiĝos, vojaĝante al http://www.kde.org . Oni povas lanĉi la samajn komandojn kiel la eta komandlinio (Alt+F2).
+Comment[es]=Tras pulsar Win+E (Tux+E), se lanzará el navegador WWW y abrirá http://www.kde.org. Puede ejecutar toda clase de órdenes que pueda ejecutar en la minilínea de órdenes (Alt+F2).
+Comment[et]=Klahvidele Win+E (Tux+E) vajutades avatakse veebibrauser leheküljel http://www.kde.org. Käivitada võib kõiki käske, mida saab käivitada minikäsuaknas (Alt+F2).
+Comment[fr]=Après avoir appuyé sur « Win+E » (ou « Tux+E »), un navigateur Internet se lancera et ouvrira le site « http://www.kde.org ». Vous pouvez exécuter toutes les commandes habituellement lancées depuis le raccourci « Alt+F2 ».
+Comment[fy]=As jo Win+E (Tux+E) yndrukke, sil de blêder úteinsette en de side http://www.kde.org iepenje. Jo kinne alle kommando's útfiere dy't jo ek yn it finster "Kommando útfiere" (Alt+F2) oanroppe kinne.
+Comment[hr]=Nakon pritiska tipki Win+E (Tux+E) bit će pokrenut preglednik Interneta i otvorena stranica http://www.kde.org. Možete pokrenuti razne vrste naredbi, kao i pomoću "minicli" (Alt+F2).
+Comment[hu]=A Win+E (Tux+E) megnyomása után elindul a webböngésző és megnyitja a http://www.kde.org címet. A mini parancsablakban (Alt+F2) kiadható összes parancs használható.
+Comment[is]=Þegar stutt er á Win+E (Tux+E), opnast WWW vefrápari og fer á síðuna http://www.kde.org . Hægt er að keyra allskyns skipanir ef þær virka í "minicli"(Alt+F2).
+Comment[it]=Con la pressione di Win+E (Tux+E), verrà avviati il browser WWW ed aprirà il sito http://www.kde.org. Puoi eseguire tutti i comandi avviabili da minicli (Alt+F2).
+Comment[ja]=Win+E (Tux+E) を押すと、ウェブブラウザが起動し、http://www.kde.org を開きます。Alt+F2 で開く「コマンドを実行」ダイアログで実行できるあらゆるコマンドを指定できます。
+Comment[km]=បន្ទាប់​ពី​ចុច Win+E (Tux+E) កម្មវិធី​រុករក​បណ្ដាញ WWW នឹង​ត្រូវ​បាន​ចាប់ផ្ដើម ហើយ​វា​នឹង​បើក http://www.kde.org ។ អ្នក​អាច​រត់​ពាក្យ​បញ្ជា​គ្រប់ប្រភេទ ដែល​អ្នក​អាច​រត់​នៅ​ក្នុង minicli (Alt+F2) ។
+Comment[nb]=Etter tasting av Win+E (Tux+E), en nettleser startes som vil åpne http://www.kde.org . Man kan kjøre alle kommandoer i minicli (Alt+F2).
+Comment[nds]=Dat Drücken vun Win+E (Tux+E) maakt den Nettkieker op, de denn "http://www.kde.org" laadt. Du kannst so all Befehlen utföhren, de Du ok över den Dialoog "Befehl utföhren" (Alt+F2) opropen kannst.
+Comment[nl]=Wanneer u Win+E (Tux+E) indrukt, zal de webbrowser gestart worden met de pagina http://www.kde.org. U kunt alle commando's uitvoeren die u ook in het venster "Commando uitvoeren" (Alt+F2) kunt aanroepen.
+Comment[pl]=Po naciśnięciu Win+E, uruchomiona zostanie przeglądarka WWW na stronie http://www.kde.org . Możesz uruchomić dowolne polecenia, które można uruchomić w mini oknie poleceń (Alt+F2).
+Comment[pt]=Depois de carregar em Win+E (Tux+E), o navegador WWW será invocado e irá abrir o http://www.kde.org . Poderá executar todo o tipo de comandos que quiser na mini-linha de comandos (Alt+F2).
+Comment[pt_BR]=Após pressionar Win+E (Tux+E), o navegador WWW será iniciado e irá abrir http://www.kde.org . Você pode executar todos os tipos de comandos que pode executar no diálogo 'Executar Comando...' (Alt+F2).
+Comment[ro]=Apăsând Win+E (Tux+E), va lansa browser-ul WWW și va deschide http://www.kde.org . Puteți rula tot felul de comenzi în minicli-uri (Alt+F2).
+Comment[ru]=При нажатии Win+E (Tux+E), будет открыта страница http://www.kde.org в веб-браузере. Вы можете запускать любые команды в диалоге выполнения команд по Alt+F2.
+Comment[sk]=Po stlačení Win+E (Tux+E) bude spustený WWW prehliadač a otvorí http://www.kde.org. Môžete spúštať všetky druhy príkazov, ktoré môžete spustiť v minicli (Alt+F2).
+Comment[sr]=Пошто притиснете Win+E (Tux+E), покренуће се веб прегледач на страници http://www.kde.org . Можете извршити било коју наредбу коју и у мини командној линији (Alt+F2).
+Comment[sr@Latn]=Pošto pritisnete Win+E (Tux+E), pokrenuće se veb pregledač na stranici http://www.kde.org . Možete izvršiti bilo koju naredbu koju i u mini komandnoj liniji (Alt+F2).
+Comment[sv]=Efter att ha tryckt på Win+E (Tux+E), startas webbläsaren och visar http://www.kde.org . Du kan utföra alla sorters kommandon som kan utföras med Kör kommando (Alt+F2).
+Comment[uk]=Після натискання Win+E (Tux+E) буде запущено навігатор Тенет і він відкриє http://www.kde.org. Можна виконувати будь-які команди, які можливі в міні-інтерфейсі командного рядка (Alt+F2).
+Comment[wa]=Après aveur tchôkî WIN+E (Tux+E), on betchteu WWW serè enondé ki drovrè http://www.kde.org . Vos pôrîz enonder totes sôres di comandes ki vs poloz enonder dins minicli (ALT+F2).
+Comment[zh_TW]=按下 Win+E(Tux+E)後會開啟瀏覽器,並跳到 http://www.kde.org。您也可以在 minicli(Alt+F2)中執行所有可執行的指令。
+Enabled=false
+Name=Go to KDE Website
+Name[bg]=Уеб страницата на KDE
+Name[bn]=কে.ডি.ই. ওয়েবসাইট‌-এ যাও
+Name[ca]=Va al lloc web del KDE
+Name[cs]=Přejít na stránky KDE
+Name[csb]=Biéj do starnë KDE
+Name[da]=Gå til KDE's hjemmeside
+Name[de]=KDE-Webseite anzeigen
+Name[el]=Μετάβαση στην ιστοσελίδα του KDE
+Name[eo]=Iri al KDE-retejo
+Name[es]=Ir a la página web de KDE
+Name[et]=Liikumine KDE veebileheküljele
+Name[fr]=Consulter le site Internet de KDE
+Name[fy]=Gean nei de KDE webside
+Name[hr]=Kreni na KDE web-lokaciju
+Name[hu]=KDE honlap
+Name[is]=Fara á KDE vefsvæðið
+Name[it]=Vai al sito web di KDE
+Name[ja]=KDE ウェブサイトを訪問
+Name[km]=ទៅ​កាន់​តំបន់​បណ្ដាញ​របស់ KDE
+Name[ko]=KDE 웹 사이트로 가기
+Name[nb]=Gå til nettstedet KDE
+Name[nds]=De KDE-Nettsiet opmaken
+Name[nl]=Naar KDE-website gaan
+Name[pa]=KDE ਵੈੱਬਸਾਇਟ ਉੱਤੇ ਜਾਓ
+Name[pl]=Idź do strony WWW KDE
+Name[pt]=Ir para a Página Web do KDE
+Name[pt_BR]=Ir para o Website do KDE
+Name[ro]=Du-te la website-ul KDE
+Name[ru]=Веб-сайт KDE
+Name[sk]=Prejsť na website KDE
+Name[sr]=Иди на веб сајт KDE-а
+Name[sr@Latn]=Idi na veb sajt KDE-a
+Name[sv]=Gå till KDE:s hemsida
+Name[te]=కెడిఈ వెబ్ సైట్ కు వెళ్లండి
+Name[tg]=Веб- сайти KDE
+Name[tr]=KDE web sayfasına git
+Name[uk]=Перейти на веб-сайт KDE
+Name[uz]=KDE veb-saytini ochish
+Name[uz@cyrillic]=KDE веб-сайтини очиш
+Name[wa]=Aler sol waibe di KDE
+Name[zh_CN]=转到 KDE 网站
+Name[zh_TW]=跳到 KDE 網站
+Type=COMMAND_URL_SHORTCUT_ACTION_DATA
+
+[Data_1_8Actions]
+ActionsCount=1
+
+[Data_1_8Actions0]
+CommandURL=http://www.kde.org
+Type=COMMAND_URL
+
+[Data_1_8Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_8Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_8Triggers0]
+Key=Win+E
+Type=SHORTCUT
+
+[Gestures]
+Disabled=false
+MouseButton=2
+Timeout=1000
+
+[Main]
+Autostart=true
+Disabled=false
+Version=2
+ImportId=kde32b1
diff --git a/khotkeys/data/khotkeys_32b1_update.upd b/khotkeys/data/khotkeys_32b1_update.upd
new file mode 100644
index 000000000..0ac7358e5
--- /dev/null
+++ b/khotkeys/data/khotkeys_32b1_update.upd
@@ -0,0 +1,8 @@
+Id=kde32b1
+# the file is intentionally a dummy, as the binary will update khotkeysrc,
+# the khotkeys_update will just remember it has been done
+File=khotkeys_update
+Group=Dummy
+Options=overwrite
+ScriptArguments=--id kde32b1
+Script=khotkeys_update
diff --git a/khotkeys/data/khotkeys_printscreen.upd b/khotkeys/data/khotkeys_printscreen.upd
new file mode 100644
index 000000000..145a0c06a
--- /dev/null
+++ b/khotkeys/data/khotkeys_printscreen.upd
@@ -0,0 +1,8 @@
+Id=printscreen
+# the file is intentionally a dummy, as the binary will update khotkeysrc,
+# the khotkeys_update will just remember it has been done
+File=khotkeys_update
+Group=Dummy
+Options=overwrite
+ScriptArguments=--id printscreen
+Script=khotkeys_update
diff --git a/khotkeys/data/konqueror_gestures_kde321.khotkeys b/khotkeys/data/konqueror_gestures_kde321.khotkeys
new file mode 100644
index 000000000..e7a961315
--- /dev/null
+++ b/khotkeys/data/konqueror_gestures_kde321.khotkeys
@@ -0,0 +1,2042 @@
+[Data]
+DataCount=1
+
+[Data_1]
+Comment=Basic Konqueror gestures.
+Comment[bg]=Основни жестове в Konqueror.
+Comment[ca]=Gestos bàsics del Konqueror.
+Comment[cs]=Základní gesta Konqueroru.
+Comment[csb]=Pòdspòdlowé gestë Konquerora.
+Comment[da]=Basale gester for Konqueror.
+Comment[de]=Grundlegende Gesten für Konqueror
+Comment[el]=Βασικές χειρονομίες Konqueror.
+Comment[eo]=Bazaj Konkerantaj gestoj.
+Comment[es]=Gestos básicos de Konqueror.
+Comment[et]=Konquerori põhilised žestid.
+Comment[fr]=Mouvements de base de Konqueror.
+Comment[fy]=Basis stjoerrings foar Konqueror.
+Comment[hr]=Osnovne Konqueror gestikulacije.
+Comment[hu]=Néhány egyszerű mozdulatsor a Konquerorhoz.
+Comment[is]=Einfaldar Konqueror hreyfingar.
+Comment[it]=Gesti base per Konqueror.
+Comment[ja]=Konqueror の基本的なジェスチャーです。(マウスジェスチャーに使用するボタンは「全体設定」で変更できます)
+Comment[km]=កាយវិការ​មូលដ្ឋាន​របស់ Konqueror ។
+Comment[ko]=기본 Konqueror 제스처입니다.
+Comment[nb]=Standard Konqueror-bevegelser.
+Comment[nds]=Eenfach Muustekens för Konqueror
+Comment[nl]=Eenvoudige Konqueror-gebaren.
+Comment[pa]=ਮੁੱਢਲੇ ਕੋਨਕਿਉਰੋਰ ਪਰਭਾਵ
+Comment[pl]=Podstawowe gesty Konquerora
+Comment[pt]=Gestos básicos do Konqueror.
+Comment[pt_BR]=Gestos básicos do Konqueror.
+Comment[ro]=Gesturi de bază pentru Konqueror,
+Comment[ru]=Базовые росчерки Konqueror.
+Comment[sk]=Základné gestá Konquerora
+Comment[sr]=Основни гестови у Konqueror-у.
+Comment[sr@Latn]=Osnovni gestovi u Konqueror-u.
+Comment[sv]=Grundläggande Konqueror-gester.
+Comment[te]=సాధారణ కాంకెరర్ సంజ్ఞలు
+Comment[tg]=Хат задани аслӣ дар Konqueror
+Comment[uk]=Прості жести Konqueror.
+Comment[wa]=Apontyî l' manire di båze di bodjî les purneas di Konqueror
+Comment[zh_CN]=基本 Konqueror 手势。
+Comment[zh_TW]=基本的 Konqueror 手勢
+DataCount=14
+Enabled=true
+Name=Konqueror Gestures
+Name[bg]=Жестове в Konqueror
+Name[ca]=Gestos del Konqueror
+Name[cs]=Gesta Konqueroru
+Name[csb]=Gestë Konquerora
+Name[da]=Gester for Konqueror
+Name[de]=Konqueror-Gesten
+Name[el]=Χειρονομίες Konqueror
+Name[eo]=Konkerantaj Gestoj
+Name[es]=Gestos de Konqueror
+Name[et]=Konquerori žestid
+Name[fr]=Mouvements de Konqueror
+Name[fy]=Konqueror stjoerrings
+Name[hr]=Konqueror gestikulacije
+Name[hu]=Konqueror-mozdulatsorok
+Name[is]=Konqueror hreyfingar
+Name[it]=Gesti per Konqueror
+Name[ja]=Konqueror ジェスチャー
+Name[km]=កាយវិការ​របស់ Konqueror
+Name[ko]=Konqueror 제스처
+Name[nb]=Konqueror-bevegelser
+Name[nds]=Konqueror-Muustekens
+Name[nl]=Konqueror-gebaren
+Name[pa]=ਕੋਨਕਿਉਰੋਰ ਪਰਭਾਵ
+Name[pl]=Gesty Konquerora
+Name[pt]=Gestos do Konqueror
+Name[pt_BR]=Gestos do Konqueror
+Name[ro]=Gesturi Konqueror
+Name[ru]=Росчерки Konqueror
+Name[sk]=Gestá Konquerora
+Name[sr]=Konqueror-ови гестови
+Name[sr@Latn]=Konqueror-ovi gestovi
+Name[sv]=Konqueror-gester
+Name[te]=కాంకెరర్ సంజ్ఞలు
+Name[tg]=Хат задан дар Konqueror
+Name[uk]=Жести Konqueror
+Name[wa]=Manire di bodjî les purneas di Konqueror
+Name[zh_CN]=Konqueror 手势
+Name[zh_TW]=Konqueror 手勢
+SystemGroup=0
+Type=ACTION_DATA_GROUP
+
+[Data_1Conditions]
+Comment=Konqueror window
+Comment[bg]=Прозорец на Konqueror
+Comment[bn]=কনকরার উইণ্ডো
+Comment[ca]=Finestra del Konqueror
+Comment[cs]=Okno Konqueroru
+Comment[csb]=Òkno Konquerora
+Comment[da]=Konquerors vindue
+Comment[de]=Konqueror-Fenster
+Comment[el]=Παράθυρο Konqueror
+Comment[eo]=Konkeranta fenestro
+Comment[es]=Ventana de Konqueror
+Comment[et]=Konquerori aken
+Comment[fr]=Fenêtre de Konqueror
+Comment[fy]=Konqueror finster
+Comment[hr]=Konqueror prozor
+Comment[hu]=Konqueror-ablak
+Comment[is]=Konqueror gluggi
+Comment[it]=Finestra di Konqueror
+Comment[ja]=Konqueror ウィンドウ
+Comment[km]=បង្អួច​របស់ Konqueror
+Comment[ko]=Konqueror 창
+Comment[nb]=Konqueror-vindu
+Comment[nds]=Konqueror-Finster
+Comment[nl]=Konqueror-venster
+Comment[pa]=ਕੋਨਕਿਊਰੋਰ ਝਰੋਖਾ
+Comment[pl]=Okno Konquerora
+Comment[pt]=Janela do Konqueror
+Comment[pt_BR]=Janela do Konqueror
+Comment[ro]=Fereastră Konqueror
+Comment[ru]=Окно Konqueror
+Comment[sk]=Okno Konquerora
+Comment[sr]=Прозор Konqueror-а
+Comment[sr@Latn]=Prozor Konqueror-a
+Comment[sv]=Konqueror-fönster
+Comment[te]=కాంకెరర్ విండొ
+Comment[tg]=Равзанаи Konqueror
+Comment[tr]=Konqueror penceresi
+Comment[uk]=Вікно Konqueror
+Comment[uz]=Konqueror oynasi
+Comment[uz@cyrillic]=Konqueror ойнаси
+Comment[wa]=Purnea di Konqueror
+Comment[zh_CN]=Konqueror 窗口
+Comment[zh_TW]=Konqueror 視窗
+ConditionsCount=1
+
+[Data_1Conditions0]
+Type=ACTIVE_WINDOW
+
+[Data_1Conditions0Window]
+Comment=Konqueror
+Comment[eo]=Konkeranto
+Comment[pa]=ਕੋਨਕਿਊਰੋਰ
+Comment[te]=కాంకెరర్
+WindowsCount=1
+
+[Data_1Conditions0Window0]
+Class=^konqueror\s
+ClassType=3
+Comment=Konqueror
+Comment[eo]=Konkeranto
+Comment[pa]=ਕੋਨਕਿਊਰੋਰ
+Comment[te]=కాంకెరర్
+Role=konqueror-mainwindow#1
+RoleType=0
+Title=file:/ - Konqueror
+TitleType=0
+Type=SIMPLE
+WindowTypes=1
+
+[Data_1_1]
+Comment=Press, move left, release.
+Comment[bg]=Натискане, движение наляво, пускане.
+Comment[ca]=Premeu, moveu a l'esquerra, deixeu anar.
+Comment[csb]=Wcësni, przesënié w lewò, pùszczë.
+Comment[da]=Tryk ned, flyt til venstre, slip.
+Comment[de]=Drücken, nach links, loslassen.
+Comment[el]=Πιέστε, μετακινηθείτε αριστερά, ελευθερώστε.
+Comment[eo]=Premu, iru maldekstren, malpremu.
+Comment[es]=Pulsar, mover a la izquierda, soltar.
+Comment[et]=Vajuta, liiguta vasakule, vabasta.
+Comment[fr]=Appuyez, déplacez à gauche, relâchez.
+Comment[fy]=Yndrukke, nei lofts, loslitte
+Comment[hr]=Pritisni, pomakni ulijevo, otpusti.
+Comment[hu]=Lenyomás, balra, elengedés.
+Comment[is]=Smella niður, hreyfa til vinstri, sleppa.
+Comment[it]=Premi, sposta a sinistra, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを左に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ទៅ​ឆ្វេង លែង ។
+Comment[ko]=누르고, 왼쪽으로 이동하고, 놓기.
+Comment[nb]=Tast, flytt venstre, slipp.
+Comment[nds]=Drücken, na links, looslaten.
+Comment[nl]=Indrukken, naar links bewegen, loslaten.
+Comment[pl]=Naciśnij, w lewo, puść.
+Comment[pt]=Carregar, mover para a esquerda, largar.
+Comment[pt_BR]=Pressionar, mover para a esquerda, largar.
+Comment[ro]=Apasă, mută stânga, dă drumul.
+Comment[ru]=Нажать, влево, отпустить.
+Comment[sk]=Stlačte, presuňte sa vľavo, pustite.
+Comment[sr]=Притисните, повуците улево, пустите.
+Comment[sr@Latn]=Pritisnite, povucite ulevo, pustite.
+Comment[sv]=Tryck ner, flytta vänster, släpp.
+Comment[tr]=Bas, sola taşı, üzerine gel.
+Comment[uk]=Натиснути, ліворуч, відпустити.
+Comment[wa]=Tchôkî, bodjî viè l' hintche, låtchî.
+Comment[zh_TW]=按下,往左移,再放開。
+Enabled=true
+Name=Back
+Name[bg]=Black
+Name[bn]=পিছিয়ে যাও
+Name[br]=War-gil
+Name[ca]=Enrere
+Name[cs]=Zpět
+Name[csb]=Nazôd
+Name[da]=Tilbage
+Name[de]=Zurück
+Name[el]=Πίσω
+Name[eo]=Antaŭa
+Name[es]=Retroceder
+Name[et]=Tagasi
+Name[fr]=Retour
+Name[fy]=Werom
+Name[hr]=Natrag
+Name[hu]=Vissza
+Name[is]=Til baka
+Name[it]=Indietro
+Name[ja]=戻る
+Name[km]=ថយក្រោយ
+Name[ko]=NetHack
+Name[nds]=Torüch
+Name[nl]=Terug
+Name[pa]=ਪਿੱਛੇ
+Name[pl]=W tył
+Name[pt]=Recuar
+Name[pt_BR]=Voltar
+Name[ro]=Înapoi
+Name[ru]=Назад
+Name[sk]=Späť
+Name[sr]=Назад
+Name[sr@Latn]=Nazad
+Name[sv]=Bakåt
+Name[te]=వెనుకకు
+Name[tg]=Гузашта
+Name[tr]=Geri
+Name[uk]=Назад
+Name[uz]=Orqaga
+Name[uz@cyrillic]=Орқага
+Name[wa]=En erî
+Name[zh_CN]=后退
+Name[zh_TW]=返回
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_10]
+Comment=Opera-style: Press, move up, release.\nNOTE: Conflicts with 'New Tab', and as such is disabled by default.
+Comment[bg]=Стил Opera: натискане, движение нагоре, пускане.\nЗАБЕЛЕЖКА:Има конфликт с "Нов подпрозорец" и затова е изключено по подразбиране.
+Comment[ca]=Estil de l'Opera: premeu, moveu amunt, deixeu anar.\nNOTA: els conflictes amb 'Pestanya nova', i similars estan inhabilitats per defecte.
+Comment[csb]=Sztél Operë: Wcësni, przesënié w górã, pùszczë.\nBÔCZË: Zwada z 'Nowô kôrta' je domëslno zablokòwónô.
+Comment[da]=Ligesom Opera: Tryk ned, flyt opad, slip.\nBemærk: Giver konflikt med 'Nyt faneblad', og er derfor ikke aktiveret som standard.
+Comment[de]=Opera-Stil: Drücken, nach oben, loslassen.\nHinweis: Dies steht in Konflikt mit der Aktion "Neues Unterfenster" und ist daher in der Voreinstellung nicht aktiviert.
+Comment[el]=Στυλ Opera: Πιέστε, μετακινήστε πάνω, ελευθερώστε.\nΣΗΜΕΙΩΣΗ: Αυτό συγκρούεται με την 'Νέα καρτέλα', και οπότε είναι προκαθορισμένα απενεργοποιημένο.
+Comment[eo]=Opera-stilo: Premu, iru supren, malpremu.\nNOTU: Malakordas kun "Nova Langeto", tial estas malebligita defaŭlte.
+Comment[es]=Estilo Opera: Pulsar, subir, soltar.\nNOTA: Entra en conflicto con «Nueva solapa», por lo que está deshabilitado por omisión.
+Comment[et]=Opera stiilis: vajuta, liiguta üles, vabasta.\nMärkus: konfliktis toiminguga 'Uus kaart' ja seetõttu vaikimisi välja lülitatud.
+Comment[fr]=À la manière d'Opera : appuyez, déplacez en haut, relâchez.\nRemarque : Entre en conflit avec le mouvement de nouvel onglet, il est donc désactivé par défaut.
+Comment[fy]=Opera-styl: yndrukke, nei omheech, loslitte.\nTink derom: Konflikten mei 'Nije ljepper', en sa binne standert útskeakele.
+Comment[hr]=U stilu Opere: Pritisni, pomakni prema gore, otpusti.\nNAPOMENA: U sukobu s gestikulacijom "Nova kartica" te je iz tog razloga onemogućeno zadanim postavkama.
+Comment[hu]=Opera-stílus: lenyomás, fel, elengedés.\nMEGJEGYZÉS: Ütközik az 'Új lap' paranccsal, ezért alapértelmezésben le van tiltva.
+Comment[is]=Opera-aðferðin: Ýta, færa upp, sleppa.\nATH: rekst á við 'Nýr flipi', og er þess vegna sjálfgefið óvirk.
+Comment[it]=Stile Opera: Premi, sposta in su, rilascia.\nNOTA: È in conflitto con "Nuova scheda", e quindi è normalmente disabilitato.
+Comment[ja]=Opera スタイル: マウスの中ボタンを押したまま、マウスを上に動かし、ボタンを放します。\n注意: 「新規タブ」と競合するため、デフォルトでは無効になっています。
+Comment[km]=រចនាប័ទ្ម​របស់ Opera ៖ ចុច​ ផ្លាស់ទី​ឡើងលើ លែង ។\n ចំណាំ ៖ ប៉ះទង្គិច​​ជា​មួយ 'ផ្ទាំង​​ថ្មី' ហើយ​​​ត្រូវ​បាន​បិទ​តាម​លំនាំដើម ។
+Comment[ko]=URL/디렉터리 구조에서 한 단계 위로 갑니다.\n오페라 스타일: 누르고, 위로 이동하고, 왼쪽으로 이동하고, 위로 이동하고, 놓기.\n메모: "이전 탭으로 이동하기"와 충돌하기 때문에 기본적으로 비활성화되어 있습니다.
+Comment[nb]=Opera-stil: Tast, flytt opp, slipp.\nMerk: I konflikt med 'Ny fane'. Derfor er den slått av som standard.
+Comment[nds]=Opera-Stil: Drücken, na baven, looslaten.\nBeacht: Verdreegt sik nich mit "Nieg Paneel" un is dorüm standardwies utmaakt.
+Comment[nl]=Opera-stijl: indrukken, omhoog bewegen, loslaten.\nOpmerking: Botst met 'Nieuw tabblad', en is standaard uitgeschakeld.
+Comment[pl]=Styl Opery: naciśnij, w górę, puść.\nUWAGA: kłóci się z poleceniem 'Nowa karta', więc jest domyślnie wyłączone.
+Comment[pt]=Estilo Opera: Carregar, mover para cima, largar.\nNOTA: Existem conflitos com a 'Nova Página', por isso está desactivado por omissão.
+Comment[pt_BR]=Estilo Opera: Pressionar, mover para cima, largar.\nNOTA: Conflita com 'Nova Aba', por isso está desativado por padrão.
+Comment[ro]=Stil-Opera: apasă, mută sus, dă drumul.\nNOTĂ: conflict cu 'Filă nouă', și de aceea este inactiv în mod implicit.
+Comment[ru]=Росчерк Opera: нажать, вверх, отпустить.\nКонфликтует с действием "Новая вкладка", которое отключено по умолчанию.
+Comment[sk]=Štýl-Opery: Stlačte, presuňte sa nahor, pustite.\nPOZNÁMKA: Spôsobuje konflikt s 'Nový panel' a preto je štandardne vypnuté.
+Comment[sr]=У стилу Opera-е: Притисните, повуците нагоре, пустите.\nНапомена: У сукобу са „Нов језичак“, и стога подразумевано искључено.
+Comment[sr@Latn]=U stilu Opera-e: Pritisnite, povucite nagore, pustite.\nNapomena: U sukobu sa „Nov jezičak“, i stoga podrazumevano isključeno.
+Comment[sv]=Enligt Opera: Tryck ner, flytta uppåt, släpp.\nObservera: Ger konflikt med "Ny flik", och är därför normalt inte aktiverad.
+Comment[uk]=В стилі Opera: Натиснути, вгору, відпустити.\nПримітка: Конфліктує з "Нова вкладка" і тому типово вимкнено.
+Comment[wa]=Sîle d' Opera: tchôkî, bodjî viè l' hôt, låtchî.\nNOTEZ: Des afrontmints avou 'Novele linwete' et ds ôtes insi sint dismetous por vos.
+Comment[zh_TW]=Opera 風格:按下,往上移,再放開。\n注意:會與「新增分頁」衝突,預設為關閉。
+Enabled=false
+Name=Stop Loading
+Name[bg]=Спиране на зареждането
+Name[bn]=লোড করা থামাও
+Name[ca]=Atura la càrrega
+Name[cs]=Zastavit nahrávání
+Name[csb]=Zatrzëmôj ladowanié
+Name[da]=Stands indlæsning
+Name[de]=Ladevorgang abbrechen
+Name[el]=Σταμάτημα φόρτωσης
+Name[eo]=Haltu la ŝarĝon
+Name[es]=Detener la carga
+Name[et]=Laadimise peatamine
+Name[fr]=Arrêter le chargement
+Name[fy]=it laden stopje
+Name[hr]=Zaustavi učitavanje
+Name[hu]=A betöltés leállítása
+Name[is]=Stöðva hleðslu
+Name[it]=Interrompi caricamento
+Name[ja]=読み込みを停止
+Name[km]=បញ្ឈប់​កា​រផ្ទុក
+Name[ko]=불러오기 멈추기
+Name[nb]=Stans lasting
+Name[nds]=Laden anhollen
+Name[nl]=Laden stoppen
+Name[pa]=ਲੋਡ ਕਰਨਾ ਰੋਕੋ
+Name[pl]=Zatrzymaj wczytywanie
+Name[pt]=Parar o Carregamento
+Name[pt_BR]=Parar o Carregamento
+Name[ro]=Oprește încărcare
+Name[ru]=Остановить загрузку
+Name[sk]=Zastaviť načítanie
+Name[sr]=Заустави учитавање
+Name[sr@Latn]=Zaustavi učitavanje
+Name[sv]=Stoppa laddning
+Name[te]=ఎక్కించడం ఆపు
+Name[tg]=Манъи боркунӣ
+Name[tr]=Yüklemeyi Durdur
+Name[uk]=Зупинити завантаження
+Name[uz]=Yuklashni toʻxtatish
+Name[uz@cyrillic]=Юклашни тўхтатиш
+Name[wa]=Åwe tcherdjî
+Name[zh_TW]=停止載入
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_10Actions]
+ActionsCount=1
+
+[Data_1_10Actions0]
+Input=Escape\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_10Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_10Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_10Triggers0]
+Gesture=258
+Type=GESTURE
+
+[Data_1_11]
+Comment=Going up in URL/directory structure.\nMozilla-style: Press, move up, move left, move up, release.
+Comment[bg]=Едно ниво нагоре в директорията..\nСтил Мозила: натискане, движение нагоре, движение наляво, движение нагоре, пускане.
+Comment[ca]=Va amunt per l'URL/estructura de directoris.\nEstil Mozilla: premeu, moveu amunt, moveu a l'esquerra, moveu amunt, deixeu anar.
+Comment[csb]=Biéj w górã sztrukturë URL/katalogù.\nSztél Mozillë: Wcësni, przesënié w górã, przesëni w lewò, przesënié w górã, pùszczë.
+Comment[da]=Opad i URL- eller mappestruktur.\nLigesom Mozilla: Tryk ned, flyt opad, flyt til venstre, flyt opad, slip.
+Comment[de]=Geht in der Adress-/Ordnerstruktur eine Ebene höher.\nMozilla-Stil: Drücken, nach oben, nach links, nach oben, loslassen.
+Comment[el]=Μετάβαση προς τα πάνω στη δομή URL/καταλόγου.\nΣτυλ Mozilla: Πιέστε, μετακίνηση πάνω, μετακίνηση αριστερά, μετακίνηση πάνω, ελευθέρωση.
+Comment[eo]=Irante supren en URL/dosieruja strukturo.\nMozila-stilo: Premu, iru supren, iru maldekstren, iru supren, malpremu.
+Comment[es]=Subir en la estructura de URL/directorios.\nEstilo Mozilla: Pulsar, subir, mover a la izquierda, subir, soltar.
+Comment[et]=Liikumine URL-i/kataloogistruktuuris üles.\nMozilla stiilis: vajuta, liiguta üles, liiguta vasakule, liiguta üles, vabasta.
+Comment[fr]=Remonter d'un cran dans l'URL ou les dossiers.\nComme Mozilla : appuyez, déplacez en haut, à gauche, en haut, relâchez.
+Comment[fy]=Omheech gean yn adres-/triemtafelstruktuer.\nMozilla-styl: Yndrukke, nei omheech, nei lofts, nei omheech, loslitte.
+Comment[hr]=Kretanje razinu prema gore u strukturi URL adrese ili mape.\nU stilu Mozille: Pritisni, pomakni prema gore, pomakni ulijevo, otpusti.
+Comment[hu]=Felfelé lép a könyvtárstruktúrában (vagy az URL-ben).\nMozilla-stílus: lenyomás, fel, balra, fel, elengedés.
+Comment[is]=Fara upp í slóða-/möppukerfi.\nMozilla-aðferðin: Ýta, færa upp, færa til vinstri, færa upp, sleppa.
+Comment[it]=Risale nella struttura dell'URL o delle directory.\nStile Mozilla: Premi, sposta in su, sposta a sinistra, sposta in su, rilascia.
+Comment[ja]=URL/ディレクトリ構造の一つ上に移動します。\nMozilla スタイル: マウスの中ボタンを押したまま、マウスを上->左->上の順に動かし、ボタンを放します。
+Comment[km]=ឡើង​លើ​នៅ​ក្នុង​រចនាប័ទ្ម​ថត URL/ ។\nរចនាប័ទ្មរបស់ Mozilla ៖ ចុច ផ្លាស់ទី​ឡើងលើ ផ្លាស់ទី​ទៅ​ឆ្វេង ផ្លាស់ទី​ឡើង​លើ លែង ។
+Comment[ko]=URL/디렉터리 구조에서 한 단계 위로 갑니다.\n모질라 스타일: 누르고, 위로 이동하고, 왼쪽으로 이동하고, 위로 이동하고, 놓기.
+Comment[nb]=Følg URL/katalogstrukturen.\nLikt som i Mozilla: Tast, flytt opp, flytt venstre, flytt opp, slipp.
+Comment[nds]=Na överornt Orner gahn.\nMozilla-Stil: Drücken, na baven, na links, na baven, looslaten.
+Comment[nl]=Omhoog gaan in de URL- of mappenstructuur.\nMozilla-stijl: Indrukken, omhoog bewegen, naar links bewegen, omhoog bewegen, loslaten.
+Comment[pl]=Przejście do góry w strukturze adresów URL/katalogów.\nStyl Mozilli: naciśnij, w górę, w lewo, w górę, puść.
+Comment[pt]=Subir na estrutura de pastas/URLs.\nEstilo Mozilla: Carregar, mover para cima, mover para a esquerda, mover para cima, largar.
+Comment[pt_BR]=Subindo na estrutura de URL/diretório.\nEstilo Mozilla: Pressionar, mover para cima, mover para a esquerda, mover para cima, largar.
+Comment[ro]=Urcând în structura URL/director.\nStil-Mozilla: apasă, mută sus, mută stânga, mută sus, dă drumul.
+Comment[ru]=Перейти на два уровня выше.\nРосчерк Mozilla: нажать, вверх, влево, вверх, отпустить
+Comment[sk]=Presun o úroveň vyššie v URL/adresárovej štruktúre.\nŠtýl-Mozilly: Stlačte, presuňte sa nahor, pustite.
+Comment[sr]=Одлазак навише у структури URL-а/фасцикли.\nУ стилу Mozilla-е: Притисните, повуците нагоре, повуците улево, повуците нагоре, пустите.
+Comment[sr@Latn]=Odlazak naviše u strukturi URL-a/fascikli.\nU stilu Mozilla-e: Pritisnite, povucite nagore, povucite ulevo, povucite nagore, pustite.
+Comment[sv]=Uppåt för webbadress eller katalogstruktur.\nEnligt Mozilla: Tryck ner, flytta uppåt, flytta vänster, flytta uppåt, släpp.
+Comment[uk]=Перехід вгору в структурі URL/тек.\nВ стилі Mozilla: Натиснути, вгору, ліворуч, вгору, відпустити.
+Comment[wa]=Monter dins l' sitructeure URL/ridant.\nStîle Mozilla: Tchôkî, monter, bodjî viè l' hintche, monter, låtchî.
+Comment[zh_TW]=往上一層的網址或目錄。\nMozilla 風格:按住,往上移,往左移,往上移,再放開。
+Enabled=true
+Name=Up
+Name[bg]=Нагоре
+Name[bn]=উপরে ওঠো
+Name[br]=Uhel
+Name[ca]=Amunt
+Name[cs]=Nahoru
+Name[csb]=W górã
+Name[da]=Op
+Name[de]=Aufwärts
+Name[el]=Πάνω
+Name[eo]=Supre
+Name[es]=Subir
+Name[et]=Üles
+Name[fr]=Haut
+Name[fy]=Omheech
+Name[hr]=Gore
+Name[hu]=Fel
+Name[is]=Upp
+Name[it]=Su
+Name[ja]=上
+Name[km]=ឡើងលើ
+Name[nb]=Opp
+Name[nds]=Na baven
+Name[nl]=Omhoog
+Name[pa]=ਉੱਤੇ
+Name[pl]=Do góry
+Name[pt]=Subir
+Name[pt_BR]=Subir
+Name[ro]=Sus
+Name[ru]=Вверх
+Name[sk]=Nahor
+Name[sr]=Горе
+Name[sr@Latn]=Gore
+Name[sv]=Upp
+Name[te]=పైకి
+Name[tg]=Боло
+Name[tr]=Yukarı
+Name[uk]=Вгору
+Name[uz]=Yuqoriga
+Name[uz@cyrillic]=Юқорига
+Name[wa]=Pu hôt
+Name[zh_CN]=向上
+Name[zh_TW]=上一層
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_11Actions]
+ActionsCount=1
+
+[Data_1_11Actions0]
+Input=Alt+Up
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_11Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_11Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_11Triggers0]
+Gesture=36547
+Type=GESTURE
+
+[Data_1_12]
+Comment=Going up in URL/directory structure.\nOpera-style: Press, move up, move left, move up, release.\nNOTE: Conflicts with "Activate Previous Tab", and as such is disabled by default.
+Comment[bg]=Едно ниво нагоре.\nСтил Opera: натискане, движение нагоре, движение наляво, движение нагоре, пускане.\nЗАБЕЛЕЖКА:Има конфликт с "Активиране на предишен подпрозорец" и затова е изключено по подразбиране.
+Comment[ca]=Va amunt per l'URL/estructura de directoris.\nEstil Opera: premeu, moveu amunt, moveu a l'esquerra, moveu amunt, deixeu anar.\nNOTA: els conflictes amb "Activa la pestanya anterior" i similars estan inactives per defecte.
+Comment[da]=Opad i URL- eller mappestruktur.\nLigesom Opera: Tryk ned, flyt opad, flyt til venstre, flyt opad, slip.\nBemærk: Giver konflikt med "Aktivér foregående faneblad", og er derfor ikke aktiveret som standard.
+Comment[de]=Geht in der Adress-/Ordnerstruktur eine Ebene höher.\nOpera-Stil: Drücken, nach oben, nach links, nach oben, loslassen.\nHinweis: Dies steht in Konflikt mit der Aktion "Vorheriges Unterfenster aktivieren und ist daher in der Voreinstellung nicht aktiviert.
+Comment[el]=Μετάβαση προς τα πάνω στη δομή URL/καταλόγου.\nΣτυλ Opera: Πιέστε, μετακίνηση πάνω, μετακίνηση αριστερά, μετακίνηση πάνω, ελευθέρωση.\nΣΗΜΕΙΩΣΗ: Συγκρούεται με το "Ενεργοποίηση προηγούμενης καρτέλας", οπότε είναι προκαθορισμένα απενεργοποιημένο.
+Comment[eo]=Irante supren en URL/dosieruja strukturo.\nOpera-stilo: Premu, iru supren, iru maldekstren, iru supren, malpremu.\nNOTU: Malakordas kun "Aktivigi Antaŭan Langeton", tial estas malebligita defaŭlte.
+Comment[es]=Subir en la estructura de URL/directorios.\nEstilo Opera: Pulsar, subir, mover a la izquierda, subir, soltar.\nNOTA: Entra en conflicto con «Activar la solapa anterior», por lo que está deshabilitado por omisión.
+Comment[et]=Liikumine URL-i/kataloogistruktuuris üles.\nOpera stiilis: vajuta, liiguta üles, liiguta vasakule, liiguta üles, vabasta.\nMärkus: konfliktis toiminguga "Eelmise kaardi aktiveerimine" ja seetõttu vaikimisi välja lülitatud.
+Comment[fr]=Remonter d'un cran dans l'URL ou les dossiers.\nComme Opera : Appuyez, déplacez en haut, à gauche, en haut, relâchez.\nRemarque : identique au mouvement d'activation de l'onglet précédent, il est donc désactivé par défaut.
+Comment[fy]=Omheech gean yn adres-/triemtafelstruktuer.\nOpera-styl: Yndrukke, nei omheech, nei lofts, nei omheech, loslitte. \nTink derom: Konflikten mei "Foarige ljepper aktivearje", en sa is standert útskeakele.
+Comment[hr]=Kretanje razinu prema gore u strukturi URL adrese ili mape.\nU stilu Opere: Pritisni, pomakni prema gore, pomakni ulijevo, pomakni prema gore, otpusti.\nNAPOMENA: U sukobu s gestikulacijom "Aktiviraj prethodnu karticu" te je iz tog razloga onemogućeno zadanim postavkama.
+Comment[hu]=Felfelé lép a könyvtárstruktúrában (vagy az URL-ben).\nOpera-stílus: lenyomás, fel, balra, fel, elengedés.\nMEGJEGYZÉS: Ütközik az "Előző lap" paranccsal, ezért alapértelmezésben le van tiltva.
+Comment[is]=Fara upp í slóða-/möppukerfi.\nOpera-aðferðin: Ýta, færa upp, færa til vinstri, færa upp, sleppa.\nATH: rekst á við 'Virkja fyrri flipa', og er þess vegna sjálfgefið óvirk.
+Comment[it]=Risale nella struttura dell'URL o directory.\nStile Opera: Premi, sposta in su, sposta a sinistra, sposta in su, rilascia.\nNOTA: È in conflitto con "Attiva scheda precedente", e quindi è normalmente disabilitato.
+Comment[ja]=URL/ディレクトリ構造の一つ上に移動します。\nOpera スタイル: マウスの中ボタンを押したまま、マウスを上->左->上の順に動かし、ボタンを放します。\n注意: 「前のタブをアクティブに」と競合するため、デフォルトでは無効になっています。
+Comment[km]=ឡើង​លើ​នៅ​ក្នុង​រចនាប័ទ្ម​ថត URL/ ។\nរចនាប័ទ្ម​របស់ Opera ៖ ចុច ផ្លាស់ទី​ឡើង​លើ ផ្លាស់ទី​ទៅ​ឆ្វេង ផ្លាស់ទី​ឡើង​លើ លែង ។\nចំណាំ ៖ ប៉ះទង្គិច​ជា​មួយ "ផ្ទាំង​ពីមុន​ដែល​សកម្ម" ហើយ​​ត្រូវ​បាន​បិទ​តាម​លំនាំដើម ។
+Comment[ko]=URL/디렉터리 구조에서 한 단계 위로 갑니다.\n오페라 스타일: 누르고, 위로 이동하고, 왼쪽으로 이동하고, 위로 이동하고, 놓기.\n메모: "이전 탭으로 이동하기"와 충돌하기 때문에 기본적으로 비활성화되어 있습니다.
+Comment[nds]=Na överornt Orner gahn.\nOpera-Stil: Drücken, na baven, na links, looslaten.\nBeacht: Verdreegt sik nich mit "Verleden Paneel aktiv maken" un is dorüm standardwies utmaakt.
+Comment[nl]=Omhoog gaan in de URL- of mappenstructuur.\nOpera-stijl: Indrukken, omhoog bewegen, naar links bewegen, omhoog bewegen,loslaten.\Opmerking: Botst met "Vorige tabblad activeren", en is daarom standaard uitgeschakeld.
+Comment[pl]=Przejście do góry w strukturze adresów URL/katalogów.\nStyl Opery: naciśnij, w górę, w lewo, w górę, puść.\nUWAGA: kłóci się z akcją "Uaktywnij poprzednią kartę", więc jest domyślnie wyłączone.
+Comment[pt]=Subir na estrutura de pastas/URLs.\nEstilo Opera: Carregar, mover para cima, mover para a esquerda, mover para cima, largar.\nNOTA: Existem conflitos com o "Activar a Página Anterior", pelo que está desactivado por omissão.
+Comment[pt_BR]=Subindo na estrutura de URL/diretório.\nEstilo Opera: Pressionar, mover para cima, mover para a esquerda, mover para cima, largar.\nNOTA: Conflita com "Ativar Aba Anterior", por isso está desativado por padrão.
+Comment[ro]=Urcând în structura URL/director.\nStil-Opera: apasă, mută sus, mută stânga, mută sus, dă drumul.\nNOTĂ: conflict cy "Activează file precedentă", și de aceea este inactiv în mod implicit.
+Comment[ru]=Перейти на два уровня выше.\nРосчерк Opera: нажать, вверх, влево, вверх, отпустить.\nКонфликтует с действием "Перейти на предыдущую вкладку", которое отключено по умолчанию.
+Comment[sk]=Presun o úroveň vyššie v URL/adresárovej štruktúre.\nŠtýl-Opery: Stlačte, presuňte sa vľavo, nahor, pustite.\nPOZNÁMKA: Spôsobuje konflikt s "Aktivovať predchádzajúci panel", a preto je štandardne vypnuté.
+Comment[sr]=Одлазак навише у структури URL-а/фасцикли.\nУ стилу Opera-е: Притисните, повуците нагоре, повуците улево, повуците нагоре, пустите.\nНапомена: У сукобу са „Активирај претходни језичак“, и стога подразумевано искључено.
+Comment[sr@Latn]=Odlazak naviše u strukturi URL-a/fascikli.\nU stilu Opera-e: Pritisnite, povucite nagore, povucite ulevo, povucite nagore, pustite.\nNapomena: U sukobu sa „Aktiviraj prethodni jezičak“, i stoga podrazumevano isključeno.
+Comment[sv]=Uppåt för webbadress eller katalogstruktur.\nEnligt Opera: Tryck ner, flytta uppåt, flytta vänster, flytta uppåt, släpp.\nObservera: Ger konflikt med "Aktivera föregående flik", och är därför normalt inte aktiverad.
+Comment[uk]=Перехід вгору в структурі URL/тек.\nВ стилі Opera: Натиснути, вгору, ліворуч, вгору, відпустити.\nПримітка: Конфліктує з "Активувати попередню вкладку" і тому типово вимкнено.
+Comment[wa]=Monter dins l' sitructeure URL/ridant.\nStîle Opera: Tchôkî, monter, bodjî viè l' hintche, monter, låtchî.\nNOTEZ: Des afrontmints avou 'Mete en alaedje li linwete di dvant' et ds ôtes insi sint dismetous por vos.
+Comment[zh_TW]=往上一層的網址或目錄。\nOpera 風格:按住,往上移,往左移,往上移,再放開。\n注意:會與「跳到前一個分頁」衝突,預設為關閉。
+Enabled=false
+Name=Up #2
+Name[bg]=Нагоре #2
+Name[br]=Uhel #2
+Name[ca]=Amunt 2
+Name[cs]=Nahoru #2
+Name[csb]=W górã #2
+Name[da]=Op #2
+Name[de]=Nach oben (2)
+Name[el]=Πάνω #2
+Name[eo]=Supren #2
+Name[es]=Subir #2
+Name[et]=Üles nr. 2
+Name[fr]=Haut #2
+Name[fy]=Omheech #2
+Name[hr]=Gore br.2
+Name[hu]=Fel (2)
+Name[is]=Upp #2
+Name[it]=Su #2
+Name[ja]=上 #2
+Name[km]=ឡើង​លើ #2
+Name[ko]=위로 #2
+Name[nb]=Opp #2
+Name[nds]=Na baven (2)
+Name[nl]=Omhoog #2
+Name[pa]=ਉੱਤੇ #2
+Name[pl]=W górę (2)
+Name[pt]=Subir #2
+Name[pt_BR]=Subir #2
+Name[ro]=Sus 2
+Name[ru]=Вверх на два уровня
+Name[sk]=Hore #2
+Name[sr]=Нагоре #2
+Name[sr@Latn]=Nagore #2
+Name[sv]=Upp nummer 2
+Name[te]=పైకి #2
+Name[tg]=Ду дараҷа боло
+Name[tr]=Yukarı #2
+Name[uk]=Вгору #2
+Name[wa]=Pus hôt #2
+Name[zh_TW]=往上層(2)
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_12Actions]
+ActionsCount=1
+
+[Data_1_12Actions0]
+Input=Alt+Up\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_12Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_12Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_12Triggers0]
+Gesture=36987
+Type=GESTURE
+
+[Data_1_13]
+Comment=Press, move up, move right, release.
+Comment[bg]=Натискане, движение нагоре, движение надясно, пускане.
+Comment[ca]=Premeu, moveu amunt, moveu a la dreta, deixeu anar.
+Comment[csb]=Wcësni, przesënié w górã, przesënié w prawò, pùszczë.
+Comment[da]=Tryk ned, flyt til højre, slip.
+Comment[de]=Drücken, nach oben, nach rechts, loslassen.
+Comment[el]=Πίεση, μετακίνηση πάνω, μετακίνηση δεξιά, ελευθέρωση.
+Comment[eo]=Premu, iru supren, iru dekstren, malpremu.
+Comment[es]=Pulsar, subir, mover a la derecha, soltar.
+Comment[et]=Vajuta, liiguta üles, liiguta paremale, vabasta.
+Comment[fr]=Appuyez, déplacez en haut, à droite, relâchez.
+Comment[fy]=Yndrukke, nei omheech, nei rjochts, loslitte.
+Comment[hr]=Pritisni, pomakni prema gore, pomakni udesno, otpusti.
+Comment[hu]=Lenyomás, fel, jobbra, elengedés.
+Comment[is]=Ýta, færa upp, færa til hægri, sleppa.
+Comment[it]=Premi, sposta in su, sposta a destra, rilascia.
+Comment[ja]=マウスの中ボタン押したまま、マウスを上->右の順に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ឡើង​លើ ផ្លាស់ទីទៅ​ស្ដាំ លែង ។
+Comment[ko]=누르고, 위로 이동하고, 오른쪽으로 이동하고, 놓기.
+Comment[nb]=Tast, flytt opp, flytt høyre, slipp.
+Comment[nds]=Drücken, na baven, na rechts, looslaten.
+Comment[nl]=Indrukken, omhoog bewegen, loslaten.
+Comment[pl]=Naciśnij, w górę, w prawo, puść.
+Comment[pt]=Carregar, mover para cima, mover para a direita, largar.
+Comment[pt_BR]=Pressionar, mover para cima, mover para a direita, largar.
+Comment[ro]=Apasă, mută sus, mută dreapta, dă drumul.
+Comment[ru]=Нажать, вверх, вправо, отпустить.
+Comment[sk]=Stlačte, presuňte sa vpravo, pustite.
+Comment[sr]=Притисните, повуците нагоре, повуците удесно, пустите.
+Comment[sr@Latn]=Pritisnite, povucite nagore, povucite udesno, pustite.
+Comment[sv]=Tryck ner, flytta höger, släpp.
+Comment[uk]=Натиснути, вгору, праворуч, відпустити.
+Comment[wa]=Tchôkî, monter, bodjî viè l' droete, låtchî.
+Comment[zh_TW]=按住,往上移,往右移,再放開。
+Enabled=true
+Name=Activate Next Tab
+Name[bg]=Активиране на следващ подпрозорец
+Name[bn]=পরবর্তী ট্যাব সক্রিয় করো
+Name[br]=Bevaat ar vevennig a heul
+Name[ca]=Activa la pestanya següent
+Name[cs]=Aktivovat další záložku
+Name[csb]=Aktiwacùjë pòstãpną kôrtã
+Name[da]=Aktivér næste faneblad
+Name[de]=Nächstes Unterfenster aktivieren
+Name[el]=Ενεργοποίηση επόμενης καρτέλας
+Name[eo]=Aktivigi sekvan langeton
+Name[es]=Activar la siguiente solapa
+Name[et]=Järgmise kaardi aktiveerimine
+Name[fr]=Activer l'onglet suivant
+Name[fy]=Folgjende ljepper aktivearje
+Name[hr]=Aktiviraj sljedeću karticu
+Name[hu]=Következő lap
+Name[is]=Virkja næsta flipa
+Name[it]=Attiva scheda successiva
+Name[ja]=次のタブをアクティブに
+Name[km]=ធ្វើ​ឲ្យ​ថេប​បន្ទាប់​សកម្ម
+Name[ko]=다음 탭 활성화시키기
+Name[nb]=Skru på neste fane
+Name[nds]=Nakamen Paneel aktiv maken
+Name[nl]=Volgend tabblad activeren
+Name[pa]=ਅਗਲੀ ਟੈਬ ਸਰਗਰਮ ਕਰੋ
+Name[pl]=Uaktywnienie następnej karty
+Name[pt]=Activar a Página Seguinte
+Name[pt_BR]=Ativar Próxima Aba
+Name[ro]=Activează următoarea filă
+Name[ru]=Перейти на следующую вкладку
+Name[sk]=Aktivovať ďalší panel
+Name[sr]=Активирај следећи језичак
+Name[sr@Latn]=Aktiviraj sledeći jezičak
+Name[sv]=Aktivera nästa flik
+Name[tr]=Sonraki Sekmeyi Etkinleştir
+Name[uk]=Активізувати наступну вкладку
+Name[uz]=Keyingi tabni aktivlashtirish
+Name[uz@cyrillic]=Кейинги табни активлаштириш
+Name[wa]=Mete en alaedje li linwete shuvante
+Name[zh_TW]=跳到下一個分頁
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_13Actions]
+ActionsCount=1
+
+[Data_1_13Actions0]
+Input=Ctrl+.\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_13Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_13Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_13Triggers0]
+Gesture=14789
+Type=GESTURE
+
+[Data_1_14]
+Comment=Press, move up, move left, release.
+Comment[bg]=Натискане, движение нагоре, движение наляво, пускане.
+Comment[ca]=Premeu, moveu amunt, moveu a l'esquerra, deixeu anar.
+Comment[csb]=Wcësni, przesëni w górã, przesëni w lewò, pùszczë.
+Comment[da]=Tryk ned, flyt opad, slip.
+Comment[de]=Drücken, nach oben, nach links, loslassen.
+Comment[el]=Πίεση, μετακίνηση πάνω, μετακίνηση αριστερά, ελευθέρωση.
+Comment[eo]=Premu, iru supren, iru maldekstren, malpremu.
+Comment[es]=Pulsar, subir, mover a la izquierda, soltar.
+Comment[et]=Vajuta, liiguta üles, liiguta vasakule, vabasta.
+Comment[fr]=Appuyez, déplacez en haut, à gauche, relâchez.
+Comment[fy]=Yndrukke, nei omheech, neo lofts, loslitte.
+Comment[hr]=Pritisni, pomakni prema gore, pomakni ulijevo, otpusti.
+Comment[hu]=Lenyomás, fel, balra, elengedés.
+Comment[is]=Ýta, færa upp, færa til vinstri, sleppa.
+Comment[it]=Premi, sposta in su, sposta a sinistra, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを上->左の順に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ឡើង​លើ ផ្លាស់ទី​ទៅ​ឆ្វេង លែង ។
+Comment[ko]=누르고, 위로 이동하고, 왼쪽으로 이동하고, 놓기.
+Comment[nb]=Tast, flytt opp, flytt venstre, slipp.
+Comment[nds]=Drücken, na baven, na links, looslaten.
+Comment[nl]=Indrukken, omhoog bewegen, naar links bewegen, loslaten.
+Comment[pl]=Naciśnij, w górę, w lewo, puść.
+Comment[pt]=Carregar, mover para cima, mover para a esquerda, largar.
+Comment[pt_BR]=Pressionar, mover para cima, mover para a esquerda, largar.
+Comment[ro]=Apasă, mută sus, mută stânga, dă drumul.
+Comment[ru]=Нажать, вверх, влево, отпустить.
+Comment[sk]=Stlačte, presuňte sa nahor, pustite.
+Comment[sr]=Притисните, повуците нагоре, повуците улево, пустите.
+Comment[sr@Latn]=Pritisnite, povucite nagore, povucite ulevo, pustite.
+Comment[sv]=Tryck ner, flytta uppåt, släpp.
+Comment[uk]=Натиснути, вгору, ліворуч, відпустити.
+Comment[wa]=Tchôkî, monter, bodjî viè l' hintche, låtchî.
+Comment[zh_TW]=按住,往上移,往左移,再放開。
+Enabled=true
+Name=Activate Previous Tab
+Name[bg]=Активиране на предишен подпрозорец
+Name[bn]=পূর্ববর্তী ট্যাব সক্রিয় করো
+Name[br]=Bevaat ar vevennig diaraok
+Name[ca]=Activa la pestanya anterior
+Name[cs]=Aktivovat předchozí záložku
+Name[csb]=Aktiwacùjë pòprzédną kôrtã
+Name[da]=Aktivér forrige faneblad
+Name[de]=Vorheriges Unterfenster aktivieren
+Name[el]=Ενεργοποίηση προηγούμενης καρτέλας
+Name[eo]=Aktivigi antaŭan langeton
+Name[es]=Activar la solapa anterior
+Name[et]=Eelmise kaardi aktiveerimine
+Name[fr]=Activer l'onglet précédent
+Name[fy]=Foarige ljepper aktivearje
+Name[hr]=Aktiviraj prethodnu karticu
+Name[hu]=Előző lap
+Name[is]=Virkja síðasta flipa
+Name[it]=Attiva scheda precedente
+Name[ja]=前のタブをアクティブに
+Name[km]=ធ្វើ​ឲ្យថេប​មុន​សកម្ម
+Name[ko]=이전 탭 활성화시키기
+Name[nb]=Vis forrige fane
+Name[nds]=Verleden Paneel aktiv maken
+Name[nl]=Vorig tabblad activeren
+Name[pa]=ਪਿਛਲੀ ਟੈਬ ਸਰਗਰਮ ਕਰੋ
+Name[pl]=Uaktywnienie poprzedniej karty
+Name[pt]=Activar a Página Anterior
+Name[pt_BR]=Ativar Aba Anterior
+Name[ro]=Activează fila precedentă
+Name[ru]=Перейти на предыдущую вкладку
+Name[sk]=Aktivovať predchádzajúci panel
+Name[sr]=Активирај претходни језичак
+Name[sr@Latn]=Aktiviraj prethodni jezičak
+Name[sv]=Aktivera föregående flik
+Name[tr]=Önceki Sekmeyi Etkinleştir
+Name[uk]=Активізувати попередню вкладку
+Name[uz]=Oldingi tabni aktivlashtirish
+Name[uz@cyrillic]=Олдинги табни активлаштириш
+Name[wa]=Mete en alaedje li linwete di dvant
+Name[zh_TW]=跳到前一個分頁
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_14Actions]
+ActionsCount=1
+
+[Data_1_14Actions0]
+Input=Ctrl+,
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_14Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_14Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_14Triggers0]
+Gesture=36987
+Type=GESTURE
+
+[Data_1_1Actions]
+ActionsCount=1
+
+[Data_1_1Actions0]
+Input=Alt+Left
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_1Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_1Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_1Triggers0]
+Gesture=654
+Type=GESTURE
+
+[Data_1_2]
+Comment=Press, move down, move up, move down, release.
+Comment[bg]=Натискане, движение надолу, движение нагоре, движение надолу, пускане.
+Comment[ca]=Premeu, moveu avall, moveu amunt, moveu avall, deixeu anar.
+Comment[csb]=wcësni, dół, góra, dół, pùszczë.
+Comment[da]=Tryk ned, flyt nedad, flyt opad, flyt nedad, slip.
+Comment[de]=Drücken, nach unten, nach oben, nach unten, loslassen.
+Comment[el]=Πίεση, μετακίνηση κάτω, μετακίνηση πάνω, μετακίνηση κάτω, ελευθέρωση.
+Comment[eo]=Premu, iru malsupren, iru supren, iru malsupren, malpremu.
+Comment[es]=Pulsar, bajar, subir, bajar, soltar.
+Comment[et]=Vajuta, liiguta alla, liiguta üles, liiguta alla, vabasta.
+Comment[fr]=Appuyez, déplacez en bas, en haut, en bas, relâchez.
+Comment[fy]=Yndrukke, nei omleech, nei omheech, nei omleech, loslitte.
+Comment[hr]=Pritisni, pomakni prema dolje, pomakni prema gore, pomakni prema dolje, otpusti.
+Comment[hu]=Lenyomás, le, fel, le, elengedés.
+Comment[is]=Ýta, færa niður, færa upp, færa niður, sleppa.
+Comment[it]=Premi, sposta in giù, sposta in su, sposta in giù, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを下->上->下の順に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ចុះក្រោម ផ្លាស់ទី​ឡើង​លើ ផ្លាស់ទី​ចុះក្រោម លែង ។
+Comment[ko]=누르고, 아래로 이동하고, 위로 이동하고, 아래로 이동하고, 놓기.
+Comment[nb]=Tast, flytt ned, flytt opp, flytt ned, slipp.
+Comment[nds]=Drücken, na nerrn, na baven, na nerrn, looslaten.
+Comment[nl]=Indrukken, naar beneden bewegen, naar boven bewegen, naar beneden bewegen, loslaten.
+Comment[pl]=Naciśnij, w dół, w górę, w dół, puść.
+Comment[pt]=Carregar, mover para baixo, mover para cima, mover para baixo, largar.
+Comment[pt_BR]=Pressionar, mover para baixo, mover para cima, mover para baixo, largar.
+Comment[ro]=Apasă, mută jos, mută sus, mută jos, dă drumul.
+Comment[ru]=Нажать, вниз, вверх, вниз, отпустить.
+Comment[sk]=Stlačte, presuňte sa nadol, nahor, nadol, pustite.
+Comment[sr]=Притисните, повуците надоле, повуците нагоре, повуците надоле, пустите.
+Comment[sr@Latn]=Pritisnite, povucite nadole, povucite nagore, povucite nadole, pustite.
+Comment[sv]=Tryck ner, flytta neråt, flytta uppåt, flytta neråt, släpp.
+Comment[uk]=Натиснути, вниз, вгору, вниз, відпустити.
+Comment[wa]=Tchôkî, dischinde, monter, dischinde, låtchî.
+Comment[zh_TW]=按住,往下移,往上移,往下移,再放開。
+Enabled=true
+Name=Duplicate Tab
+Name[bg]=Дублиране на подпрозорец
+Name[br]=Eilañ ar vevennig
+Name[ca]=Duplica la pestanya
+Name[cs]=Duplikovat záložku
+Name[csb]=Duplikùjë kôrtã
+Name[da]=Duplikér faneblad
+Name[de]=Unterfenster duplizieren
+Name[el]=Αντίγραφο καρτέλας
+Name[eo]=Kopiita langeto
+Name[es]=Duplicar la solapa
+Name[et]=Kaardi dubleerimine
+Name[fr]=Dupliquer l'onglet
+Name[fy]=Ljepper duplisearje
+Name[hr]=Kopiraj karticu
+Name[hu]=Lap duplikálása
+Name[is]=Afrit af flipa
+Name[it]=Duplica scheda
+Name[ja]=タブを複製
+Name[km]=ស្ទួន​ថេប
+Name[ko]=탭 복제하기
+Name[nb]=Doble faner
+Name[nds]=Paneel verdubbeln
+Name[nl]=Tabblad dupliceren
+Name[pa]=ਡੁਪਲੀਕੇਟ ਟੈਬ
+Name[pl]=Powiel kartę
+Name[pt]=Duplicar a Página
+Name[pt_BR]=Duplicar a Aba
+Name[ro]=Duplică filă
+Name[ru]=Дублировать вкладку
+Name[sk]=Duplikovať panel
+Name[sr]=Удвостручи језичак
+Name[sr@Latn]=Udvostruči jezičak
+Name[sv]=Duplicera flik
+Name[tr]=Sekmeyi İkile
+Name[uk]=Дублювати вкладку
+Name[uz]=abning nusxasini yaratish
+Name[uz@cyrillic]=абнинг нусхасини яратиш
+Name[wa]=Dobler li linwete
+Name[zh_TW]=複製分頁
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_2Actions]
+ActionsCount=1
+
+[Data_1_2Actions0]
+Input=Ctrl+Shift+D\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_2Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_2Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_2Triggers0]
+Gesture=8525852
+Type=GESTURE
+
+[Data_1_3]
+Comment=Press, move down, move up, release.
+Comment[bg]=Натискане, движение надолу, движение нагоре, пускане.
+Comment[ca]=Premeu, moveu avall, moveu amunt, deixeu anar.
+Comment[csb]=Wcësni, dół, góra, pùszczë.
+Comment[da]=Tryk ned, flyt nedad, flyt opad, slip.
+Comment[de]=Drücken, nach unten, nach oben, loslassen.
+Comment[el]=Πίεση, μετακίνηση κάτω, μετακίνηση πάνω, ελευθέρωση.
+Comment[eo]=Premu, iru malsupren, iru supren, malpremu.
+Comment[es]=Pulsar, bajar, subir, soltar.
+Comment[et]=Vajuta, liiguta alla, liiguta üles, vabasta.
+Comment[fr]=Appuyez, déplacez en bas, en haut, relâchez.
+Comment[fy]=Yndrukke, nei omleech, nei omheech, loslitte.
+Comment[hr]=Pritisni, pomakni prema dolje, pomakni prema gore, otpusti.
+Comment[hu]=Lenyomás, le, fel, elengedés.
+Comment[is]=Ýta, færa niður, færa upp, sleppa.
+Comment[it]=Premi, sposta in giù, sposta in su, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを下->上の順に動かし、ボタンを放します。
+Comment[km]=ចុច​ ផ្លាស់ទី​ចុះក្រោម ផ្លាស់ទៅ​ឡើងលើ លែង ។
+Comment[ko]=누르고, 아래쪽으로 이동하고, 위쪽으로 이동하고, 놓기.
+Comment[nb]=Tast, flytt ned, flytt opp, slipp.
+Comment[nds]=Drücken, na nerrn, na baven, looslaten.
+Comment[nl]=Indrukken, naar beneden bewegen, naar boven bewegen, loslaten.
+Comment[pl]=Naciśnij, w dół, w górę, puść.
+Comment[pt]=Carregar, mover para baixo, mover para cima, largar.
+Comment[pt_BR]=Pressionar, mover para baixo, mover para cima, largar.
+Comment[ro]=Apasă, mută jos, mută sus, dă drumul.
+Comment[ru]=Нажать, вниз, вверх, отпустить.
+Comment[sk]=Stlačte, presuňte sa nadol, nahor, pustite.
+Comment[sr]=Притисните, повуците надоле, повуците нагоре, пустите.
+Comment[sr@Latn]=Pritisnite, povucite nadole, povucite nagore, pustite.
+Comment[sv]=Tryck ner, flytta neråt, flytta uppåt, släpp.
+Comment[uk]=Натиснути, вниз, вгору, відпустити.
+Comment[wa]=Tchôkî, dischinde, monter, låtchî.
+Comment[zh_TW]=按住,往下移,往上移,再放開。
+Enabled=true
+Name=Duplicate Window
+Name[bg]=Дублиране на прозореца
+Name[ca]=Duplica la finestra
+Name[cs]=Duplikovat okno
+Name[csb]=Duplikùjë òkno
+Name[da]=Duplikée vindue
+Name[de]=Fenster duplizieren
+Name[el]=Αντίγραφο παραθύρου
+Name[eo]=Kopii fenestron
+Name[es]=Duplicar la ventana
+Name[et]=Akna dubleerimine
+Name[fr]=Dupliquer la fenêtre
+Name[fy]=Finster duplisearje
+Name[hr]=Kopiraj prozor
+Name[hu]=Ablak duplikálása
+Name[is]=Afrit af glugga
+Name[it]=Duplica finestra
+Name[ja]=ウィンドウを複製
+Name[km]=ស្ទួន​បង្អួច
+Name[ko]=창 복제하기
+Name[nb]=Doble vinduer
+Name[nds]=Finster verdubbeln
+Name[nl]=Venster dupliceren
+Name[pa]=ਡੁਪਲੀਕੇਟ ਝਰੋਖਾ
+Name[pl]=Powiel okno
+Name[pt]=Duplicar a Janela
+Name[pt_BR]=Duplicar a Janela
+Name[ro]=Duplică fereastra
+Name[ru]=Дублировать окно
+Name[sk]=Duplikovať okno
+Name[sr]=Удвостручи прозор
+Name[sr@Latn]=Udvostruči prozor
+Name[sv]=Duplicera fönster
+Name[tr]=Pencereyi İkile
+Name[uk]=Дублювати вікно
+Name[uz]=Oynani nusxasini yaratish
+Name[uz@cyrillic]=Ойнани нусхасини яратиш
+Name[wa]=Dobler li purnea
+Name[zh_TW]=複製視窗
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_3Actions]
+ActionsCount=1
+
+[Data_1_3Actions0]
+Input=Ctrl+D\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_3Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_3Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_3Triggers0]
+Gesture=85258
+Type=GESTURE
+
+[Data_1_4]
+Comment=Press, move right, release.
+Comment[bg]=Натискане, движение надясно, пускане.
+Comment[ca]=Premeu, moveu a la dreta, deixeu anar.
+Comment[csb]=Wcësni, jidz w prawò, pùszczë.
+Comment[da]=Tryk, flyt til højre, giv slip.
+Comment[de]=Drücken, nach rechts, loslassen
+Comment[el]=Πίεση, μετακίνηση δεξιά, ελευθέρωση.
+Comment[eo]=Premu, iru dekstren, malpremu.
+Comment[es]=Pulsar, mover a la derecha, soltar.
+Comment[et]=Vajuta, liiguta paremale, vabasta.
+Comment[fr]=Appuyez, déplacez à droite, relâchez.
+Comment[fy]=Yndrukke, nei rjochts, loslitte.
+Comment[hr]=Pritisni, pomakni udesno, otpusti.
+Comment[hu]=Lenyomás, jobbra, elengedés.
+Comment[is]=Smella niður, hreyfa til hægri, sleppa.
+Comment[it]=Premi, sposta a desta, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを右に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ទៅស្ដាំ លែង ។
+Comment[ko]=누르고, 오른쪽으로 이동하고, 놓기.
+Comment[nb]=Tast, flytt opp, slipp.
+Comment[nds]=Drücken, na rechts, looslaten.
+Comment[nl]=Indrukken, naar rechts bewegen, loslaten.
+Comment[pa]=ਦੱਬੋ, ਸੱਜੇ ਜਾਓ, ਛੱਡੋ
+Comment[pl]=Naciśnij, w prawo, puść.
+Comment[pt]=Carregar, mover para a direita, largar.
+Comment[pt_BR]=Pressionar, mover para a direita, largar.
+Comment[ro]=Apasă, mută dreapta, dă drumul.
+Comment[ru]=Нажать, вправо, отпустить.
+Comment[sk]=Stlačte, presuňte vpravo, pustite
+Comment[sr]=Притисните, повуците удесно, пустите.
+Comment[sr@Latn]=Pritisnite, povucite udesno, pustite.
+Comment[sv]=Tryck ner, flytta höger, släpp.
+Comment[tr]=Bas, sağa taşı, üzerine gel.
+Comment[uk]=Натиснути, праворуч, відпустити.
+Comment[uz]=Bosing, oʻngga, qoʻyib yuboring.
+Comment[uz@cyrillic]=Босинг, ўнгга, қўйиб юборинг.
+Comment[wa]=Tchôkî, dischinde, låtchî.
+Comment[zh_TW]=按住,往右移,再放開。
+Enabled=true
+Name=Forward
+Name[bg]=Напред
+Name[bn]=এগিয়ে যাও
+Name[br]=War-raok
+Name[ca]=Endavant
+Name[cs]=Vpřed
+Name[csb]=Wprzódk
+Name[da]=Fremad
+Name[de]=Nach Vorne
+Name[el]=Εμπρός
+Name[eo]=Sekva
+Name[es]=Avanzar
+Name[et]=Edasi
+Name[fr]=Suivant
+Name[fy]=Foarút
+Name[hr]=Naprijed
+Name[hu]=Előre
+Name[is]=Áfram
+Name[it]=Avanti
+Name[ja]=進む
+Name[km]=បញ្ជូន​បន្ត
+Name[ko]=앞으로
+Name[nb]=Framover
+Name[nds]=Vörut
+Name[nl]=Vooruit
+Name[pa]=ਅੱਗੇ
+Name[pl]=W przód
+Name[pt]=Avançar
+Name[pt_BR]=Avançar
+Name[ro]=Înainte
+Name[ru]=Вперёд
+Name[sk]=Dopredu
+Name[sr]=Напред
+Name[sr@Latn]=Napred
+Name[sv]=Framåt
+Name[te]=ముందుకు
+Name[tg]=Навбатӣ
+Name[tr]=İleri
+Name[uk]=Вперед
+Name[uz]=Oldinga
+Name[uz@cyrillic]=Олдинга
+Name[wa]=Avancî
+Name[zh_CN]=前进
+Name[zh_TW]=往前
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_4Actions]
+ActionsCount=1
+
+[Data_1_4Actions0]
+Input=Alt+Right
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_4Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_4Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_4Triggers0]
+Gesture=456
+Type=GESTURE
+
+[Data_1_5]
+Comment=Press, move down, move half up, move right, move down, release.\n(Drawing a lowercase 'h'.)
+Comment[bg]=Натискане, движение надясно, полудвижение нагоре, движение надясно, движение надолу, пускане.\n(Пише се малка буква "h".)
+Comment[ca]=Premeu, moveu avall, moveu mig amunt, moveu a la dreta, moveu avall, deixeu anar.\n(Dibuixant una 'h' minúscula)
+Comment[csb]=Wcësni, dół, pół do górë, prawò, dół, pùszczë\n(Céchùjë môłą lëterã 'h').
+Comment[da]=Tryk ned, flyt nedad, flyt halvvejs opad, flyt til højre, flyt nedad.\n(Tegner et lille 'h'.)
+Comment[de]=Drücken, nach unten, halb nach oben, nach rechts, nach unten, loslassen. (ein kleines "h" zeichnen")
+Comment[el]=Πίεση, μετακίνηση κάτω, μετακίνηση κατά το ήμισυ πάνω, μετακίνηση δεξιά, μετακίνηση κάτω,ελευθέρωση.\n(Σχεδίαση ενός μικρού 'h'.)
+Comment[eo]=Premu, iru malsupren, iru duone supren, iru dekstren, iru malsupren, malpremu.\n(Skizante minusklan "h".)
+Comment[es]=Pulsar, bajar, subir hasta la mitad, mover a la derecha, bajar, soltar.\n(Dibujando una «h» minúscula.)
+Comment[et]=Vajuta, liiguta alla, liiguta pool teed üles, liiguta paremale, liiguta alla, vabasta.\n(Väikese h-tähe joonistamine.)
+Comment[fr]=Appuyez, déplacez en bas, à moitié en haut, à droite, puis en bas, relâchez.\n (Dessinez un « h » minuscule).
+Comment[fy]=Yndrukke, nei omleech, heal nei omheech, nei rjochts, nei omleech, loslitte.\n(Tekenje in lytse letter 'h'.)
+Comment[hr]=Pritisni, pomakni prema dolje, pomakni prema gore za pola, pomakni udesno, pomakni prema dolje, otpusti.\n(Crtanje malog slova "h".)
+Comment[hu]=Lenyomás, le, kicsit fel, jobbra, le, elengedés.\n(Kis 'h' betű.)
+Comment[is]=Ýta, færa niður, færa að hálfu upp, færa til hægri, færa niður, sleppa.\n(Teiknar lítið 'h'.)
+Comment[it]=Premi, sposta in giù, sposta in su a metà, sposta a destra, sposta in giù, rilascia.\n(Disegna un'"h" minuscola.)
+Comment[ja]=マウスの中ボタンを押したまま、マウスを下に動かし、次に半分の距離だけ上に動かし、さらに右->下の順に動かし、ボタンを放します。\n(小文字の 'h' を描くように)
+Comment[km]=ចុច ផ្លាស់ទី​ចុះក្រោម ផ្លាស់ទី​ពាក់កណ្ដាល​ឡើងលើ ផ្លាស់ទី​ទៅ​ស្ដាំ ផ្លាស់ទីចុះក្រោម លែង\n(គូរ​អក្សរអក្សរ 'h' ។)
+Comment[ko]=누르고, 아래로 이동하고, 위로 이동하고, 아래로 이동하고, 놓기.
+Comment[nb]=Tast, flytt ned, flytt halvveis opp, flytt høyre, flytt ned, frigi.\n(Tegner en liten 'h'.)
+Comment[nds]=Drücken, na nerrn, halvig na baven, na rechts, na nerrn, looslaten.\n(En lütt "h" malen.)
+Comment[nl]=Indrukken, naar beneden bewegen, half naar boven bewegen, naar rechts bewegen, naar beneden bewegen, loslaten.\n(het tekenen van een kleine 'h'.)
+Comment[pl]=Naciśnij, w dół, do połowy w górę, w prawo, w dół, puść.\nOdpowiada rysowaniu małej litery 'h'.
+Comment[pt]=Carregar, mover para baixo, meio-movimento para cima, mover para a direita, mover para baixo, largar.\n(Desenhar um 'h' minúsculo.)
+Comment[pt_BR]=Pressionar, mover para baixo, meio-movimento para cima, mover para a direita, mover para baixo, largar.\n(Desenhando um 'h' minúsculo.)
+Comment[ru]=Нажать, вниз, вполовину вверх, вправо, вниз, отпустить.\nКак будто рисуете мышью букву "h".
+Comment[sk]=Stlačte, presuňte sa nadol, do polovice nahor, doprava, dole, pustite.\n(Nakreslenie malého 'h'.)
+Comment[sr]=Притисните, повуците надоле, повуците пола нагоре, повуците удесно, повуците надоле, пустите.\n(Као да цртате мало слово „h“.)
+Comment[sr@Latn]=Pritisnite, povucite nadole, povucite pola nagore, povucite udesno, povucite nadole, pustite.\n(Kao da crtate malo slovo „h“.)
+Comment[sv]=Tryck ner, flytta neråt, flytta halvvägs uppåt, flytta höger, flytta neråt.\n(Ritar ett litet 'h'.)
+Comment[uk]=Натиснути, вниз, на половину вгору, праворуч, вниз, відпустити.\n(Ніби малюєте мишкою літеру "h".)
+Comment[wa]=Tchôkî, dischinde, monter å mitan, bodjî viè l' droete, dischinde, låtchî.\n(Dessinaedje d' on 'h' e ptite lete.)
+Comment[zh_TW]=按住,往下移,往上移一半,往右移,往下移,再放開。\n(就像寫一個小寫的 h)
+Enabled=true
+Name=Home
+Name[af]=Tuiste
+Name[ar]=المنزل
+Name[az]=Başlanğıc
+Name[be]=Хатняя тэчка
+Name[bg]=Домашна директория
+Name[bn]=ব্যক্তিগত ফোল্ডার
+Name[br]=Er-gêr
+Name[bs]=Početak
+Name[ca]=Inici
+Name[cs]=Můj adresář
+Name[csb]=Dodóm
+Name[cy]=Cartref
+Name[da]=Hjem
+Name[de]=Persönlicher Ordner
+Name[el]=Προσωπικός φάκελος
+Name[eo]=Hejmo
+Name[es]=Personal
+Name[et]=Kodu
+Name[eu]=Etxea
+Name[fa]=آغازه
+Name[fi]=Koti
+Name[fr]=Dossier personnel
+Name[fy]=Thús
+Name[ga]=Baile
+Name[gl]=Persoal
+Name[he]=בית
+Name[hi]=घर
+Name[hr]=Početak
+Name[hu]=Saját könyvtár
+Name[id]=Rumah
+Name[is]=Heimasvæðið þitt
+Name[ja]=ホーム
+Name[ka]=სახლში
+Name[kk]=Мекен
+Name[km]=ផ្ទះ
+Name[ko]=홈
+Name[lo]=ພື້ນທີ່ສ່ວນຕົວ
+Name[lt]=Pradžia
+Name[lv]=Mājas
+Name[mk]=Дома
+Name[mn]=Гэр
+Name[ms]=Laman Utama
+Name[mt]=Direttorju Personali
+Name[nb]=Hjem
+Name[nds]=Tohuus
+Name[ne]=गृह
+Name[nn]=Heim
+Name[nso]=Gae
+Name[oc]=Inici
+Name[pa]=ਘਰ
+Name[pl]=Katalog domowy
+Name[pt]=Pasta Pessoal
+Name[pt_BR]=Pasta do Usuário
+Name[ro]=Acasă
+Name[ru]=Домой
+Name[rw]=Urugo
+Name[se]=Ruoktu
+Name[sk]=Domov
+Name[sl]=Domov
+Name[sr]=Домаће
+Name[sr@Latn]=Domaće
+Name[ss]=Ekhaya
+Name[sv]=Hem
+Name[ta]=தொடக்கம்
+Name[te]=ఇల్లు
+Name[tg]=Компютери Ман
+Name[th]=พื้นที่ส่วนตัว
+Name[tr]=Başlangıç
+Name[tt]=Anabit
+Name[uk]=Домівка
+Name[uz]=Uy
+Name[uz@cyrillic]=Уй
+Name[ven]=Haya
+Name[vi]=Nhà
+Name[wa]=Måjhon
+Name[xh]=Ikhaya
+Name[zh_CN]=主文件夹
+Name[zh_TW]=家目錄
+Name[zu]=Ikhaya
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_5Actions]
+ActionsCount=1
+
+[Data_1_5Actions0]
+Input=Ctrl+Home\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_5Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_5Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=2
+
+[Data_1_5Triggers0]
+Gesture=741563
+Type=GESTURE
+
+[Data_1_5Triggers1]
+Gesture=7414563
+Type=GESTURE
+
+[Data_1_6]
+Comment=Press, move right, move down, move right, release.\nMozilla-style: Press, move down, move right, release.
+Comment[bg]=Натискане, движение надолу, движение нагоре, движение надолу, пускане.
+Comment[ca]=Premeu, moveu a la dreta, moveu avall, moveu a la dreta, deixeu anar.\nEstil Mozilla: premeu, moveu avall, moveu a la dreta, deixeu anar.
+Comment[csb]=Wcësni, przesënié w prawò, przesëni w dól, przesëni w prawò, pùszczë\nSztél Mozillë: Wcësni, przesëni w dół, przesëni w prawò, pùszczë.
+Comment[da]=Tryk ned, flyt til højre, flyt nedad, flyt til højre, slip.\nLigesom Mozilla: Tryk ned, flyt nedad, flyt til højre, slip.
+Comment[de]=Drücken, nach rechts, nach unten, nach rechts, loslassen.\nMozilla-Stil: Drücken, nach unten, nach rechts, loslassen.
+Comment[el]=Πίεση, μετακίνηση δεξιά, μετακίνηση κάτω, μετακίνηση δεξιά, ελευθέρωση.\nΣτυλ Mozilla: Πίεση, μετακίνηση κάτω, μετακίνηση δεξιά, ελευθέρωση.
+Comment[eo]=Premu, iru dekstren, iru malsupren, iru dekstren, malpremu.\nMozila stilo: Premu, iru malsupren, iru dekstren, malpremu.
+Comment[es]=Pulsar, mover a la derecha, bajar, mover a la derecha, soltar.\nEstilo Mozilla: Pulsar, bajar, mover a la derecha, soltar.
+Comment[et]=Vajuta, liiguta paremale, liiguta alla, liiguta paremale, vabasta.\nMozilla stiilis: vajuta, liiguta alla, liiguta paremale, vabasta.
+Comment[fr]=Appuyez, déplacez à droite, en bas, à droite, relâchez.\nComme Mozilla : appuyez, déplacez en bas, à droite, relâchez.
+Comment[fy]=Yndrukke, nei rjochts, nei omleech, nei rjochts, loslitte.\nMozilla-styl: Yndrukke, nei omleech, nei rjochts, loslitte.
+Comment[hr]=Pritisni, pomakni udesno, pomakni prema dolje, pomakni udesno, otpusti.\nU stilu Mozille: Pritisni, pomakni prema dolje, pomakni udesno, otpusti.
+Comment[hu]=Lenyomás, jobbra, le, jobbra, elengedés.\nMozilla-stílus: Lenyomás, le, jobbra, elengedés.
+Comment[is]=Ýta, færa til hægri, færa niður, færa til hægri, sleppa.\nMozilla-aðferðin: Ýta, færa niður, færa til hægri, sleppa.
+Comment[it]=Premi, sposta a destra, sposta in giù, sposta a destra, rilascia.\nStile Mozilla: Premi, sposta in giù, sposta a destra, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを右->下->右の順に動かし、ボタンを放します。\nMozilla スタイル: マウスの中ボタンを押したまま、マウスを下->右の順に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទៅ​ទៅស្ដាំ ផ្លាស់ទី​ចុះក្រោម ផ្លាស់ទៅ​ទៅ​ស្ដាំ លែង ។\n​រចនាប័ទ្ម​របស់ Mozilla ៖ ចុច ផ្លាស់ទៅ​ចុះក្រោម ផ្លាស់ទី​ទៅស្ដាំ លែង ។
+Comment[nds]=Drücken, na rechts, na nerrn, na rechts, looslaten.\nMozilla-Stil: Drücken, na nerrn, na rechts, looslaten.
+Comment[nl]=Indrukken, naar rechts bewegen, naar beneden bewegen, naar rechts bewegen, loslaten.\nAls in Mozilla: Indrukken, naar beneden bewegen, naar rechts bewegen, loslaten.
+Comment[pl]=Naciśnij, w prawo, w dół, w prawo, puść.\nStyl Mozilli: naciśnij, w dół, w prawo, puść.
+Comment[pt]=Carregar, mover para a direita, mover para baixo, mover para a direita, largar.\nEstilo Mozilla: Carregar, mover para baixo, mover para a direita, largar.
+Comment[pt_BR]=Pressionar, mover para a direita, mover para baixo, mover para a direita, largar.\nEstilo Mozilla: Pressionar, mover para baixo, mover para a direita, largar.
+Comment[ru]=Нажать, вправо, вниз, вправо, отпустить.\nРосчерк Mozilla: нажать, вниз, вправо, отпустить.
+Comment[sk]=Stlačte, presuňte sa vpravo, dole, vpravo, pustite.\nŠtýl-Mozilly: Stlačte, presuňte sa nadol, vpravo, pustite.
+Comment[sr]=Притисните, повуците удесно, повуците надоле, повуците удесно, пустите.\nУ стилу Mozilla-е: Притисните, повуците надоле, повуците удесно, пустите.
+Comment[sr@Latn]=Pritisnite, povucite udesno, povucite nadole, povucite udesno, pustite.\nU stilu Mozilla-e: Pritisnite, povucite nadole, povucite udesno, pustite.
+Comment[sv]=Tryck ner, flytta höger, flytta neråt, flytta höger, släpp.\nEnligt Mozilla: Tryck ner, flytta neråt, flytta höger, släpp.
+Comment[uk]=Натиснути, праворуч, вниз, праворуч, відпустити.\nВ стилі Mozilla: Натиснути, вниз, праворуч, відпустити.
+Comment[wa]=Tchôkî, bodjî viè l' droete, dischinde, bodjî viè l' droete, låtchî.\nStîle Mozilla: Tchôkî, dischinde, bodjî viè l' droete, låtchî.
+Comment[zh_TW]=按住,往右移,往下移,往右移,再放開。\nMozilla 風格:按住,往下移,往右移,再放開。
+Enabled=true
+Name=Close Tab
+Name[bg]=Затваряне на подпрозореца
+Name[bn]= ট্যাব বন্ধ করো
+Name[br]=Serriñ ar vevennig
+Name[ca]=Tanca la pestanya
+Name[cs]=Zavřít záložku
+Name[csb]=Zamkni kôrtã
+Name[da]=Luk faneblad
+Name[de]=Unterfenster schließen
+Name[el]=Κλείσιμο καρτέλας
+Name[eo]=Fermu langeton
+Name[es]=Cerrar la solapa
+Name[et]=Kaardi sulgemine
+Name[fr]=Fermer l'onglet
+Name[fy]=Ljepper slute
+Name[hr]=Zatvori karticu
+Name[hu]=Lap bezárása
+Name[is]=Loka flipa
+Name[it]=Chiudi scheda
+Name[ja]=タブを閉じる
+Name[km]=បិទ​ថេប
+Name[ko]=탭 닫기
+Name[nb]=Steng fane
+Name[nds]=Paneel tomaken
+Name[nl]=Tabblad sluiten
+Name[pa]=ਟੈਬ ਬੰਦ ਕਰੋ
+Name[pl]=Zamknij kartę
+Name[pt]=Fechar a Página
+Name[pt_BR]=Fechar a Aba
+Name[ro]=Închide fila
+Name[ru]=Закрыть вкладку
+Name[sk]=Zavrieť panel
+Name[sr]=Затвори језичак
+Name[sr@Latn]=Zatvori jezičak
+Name[sv]=Stäng flik
+Name[te]=టాబ్ ను ముసివెయి
+Name[tr]=Sekmeyi Kapat
+Name[uk]=Закрити вкладку
+Name[uz]=Tabni yopish
+Name[uz@cyrillic]=Табни ёпиш
+Name[wa]=Clôre li linwete
+Name[zh_TW]=關閉分頁
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_6Actions]
+ActionsCount=1
+
+[Data_1_6Actions0]
+Input=Ctrl+W\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_6Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_6Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=2
+
+[Data_1_6Triggers0]
+Gesture=78523
+Type=GESTURE
+
+[Data_1_6Triggers1]
+Gesture=74123
+Type=GESTURE
+
+[Data_1_7]
+Comment=Press, move up, release.\nConflicts with Opera-style 'Up #2', which is disabled by default.
+Comment[bg]=Натискане, движение нагоре, пускане.\nИма конфликт със стила на Opera "Нагоре 2", който е по подразбиране.
+Comment[ca]=Premeu, moveu amunt, deixeu anar.\nConflictes amb l'estil Opera 'Amunt 2', que està inhabilitat per omissió.
+Comment[da]=Tryk ned, flyt opad, slip.\nGiver konflikt med 'Op nummer 2' brugt af Opera, som ikke er aktiveret som standard.
+Comment[de]=Drücken, nach oben, loslassen.\nSteht in Konflikt mit dem Opera-Stil von "Nach oben (2)", welches aber in der Voreinstellung nicht aktiviert ist.
+Comment[el]=Πίεση, μετακίνηση πάνω, ελευθέρωση.\nΣύγκρουση με το στυλ Opera 'Πάνω #2', το οποίο είναι προκαθορισμένα απενεργοποιημένο.
+Comment[eo]=Premu, iru supren, malpremu.\nMalakordas kun la Opera stilo "Supren #2", kiu estas malebligita defaŭlte.
+Comment[es]=Pulsar, subir, soltar.\nEntra en conflicto con el «Subir #2» de Opera, por lo que está deshabilitado por omisión.
+Comment[et]=Vajuta, liiguta üles, vabasta.\nKonfliktis Opera stiilis 'Üles nr. 2', mis on vaikimisi välja lülitatud.
+Comment[fr]=Appuyez, déplacez en haut, relâchez.\nConflit avec le « Haut #2 » d'Opera, il est donc désactivé par défaut.
+Comment[fy]=Yndrukke, nei omheech, loslitte.\nKonflikt mei Opera-styl 'nei omheech #2', hokker standert útskeakele is.
+Comment[hr]=Pritisni, pomakni prema gore, otpusti.\nU sukobu s Operinim "Gore br.2", koji je onemogućen po zadanim postavkama.
+Comment[hu]=Lenyomás, fel, elengedés.\nÜtközik az Opera-stílusú 'Fel (2)' paranccsal, amelyik alapértelmezésben le van tiltva.
+Comment[is]=Ýta, færa upp, sleppa.\nRekst á við Opera-aðferðina 'Upp #2', sem er sjálfgefið óvirk.
+Comment[it]=Premi, sposta in su, rilascia.\nÈ in conflitto con il gesto in stile Opera "Su #2", che è disabilitato normalmente.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを上に動かし、ボタンを放します。\nデフォルトで無効になっている Opera スタイルの「上 #2」と競合します。
+Comment[km]=ចុច ផ្លាស់ទី​ឡើងលើ លែង ។\nប៉ះទង្គិច​ជា​មួយ​នឹង​រចនាប័ទ្ម​របស់ Opera 'ឡើង​លើ #2' ដែល​ត្រូវ​បាន​បិទ​ដោយ​លំនាំដើម ។
+Comment[nds]=Drücken, na baven, looslaten.\nVerdreegt sik nich mit "Na baven (2)" in Opera-Stil, wat man standardwies utmaakt is.
+Comment[nl]=Indrukken, naar boven bewegen, loslaten.\nBotst met de tweede handeling omhoog gaan in Opera, staat daarom standaard uit.
+Comment[pl]=Naciśnij, w górę, puść.\nKłóci się z 'W górę (2)' w stylu Opery, który jest domyślnie wyłączony.
+Comment[pt]=Carregar, mover para cima, largar.\nExistem conflitos com o 'Cima #2' do Opera, que está desactivado por omissão.
+Comment[pt_BR]=Pressionar, mover para cima, largar.\nConflita com o Estilo Opera 'Up #2', por isso está desativado por padrão.
+Comment[ru]=Нажать, вверх, отпустить.\nКонфликтует с росчерком Opera "На два уровня выше", который отключен по умолчанию.
+Comment[sk]=Stlačte, presuňte sa nahor, pustite.\nSpôsobuje konflikt so štýlom Opery 'Nahor #2', ktoré je štandardne vypnuté.
+Comment[sr]=Притисните, повуците нагоре, пустите.\nУ сукобу са „Нагоре #2“ у стилу Opera-е, које је подразумевано искључено.
+Comment[sr@Latn]=Pritisnite, povucite nagore, pustite.\nU sukobu sa „Nagore #2“ u stilu Opera-e, koje je podrazumevano isključeno.
+Comment[sv]=Tryck ner, flytta upp, släpp.\nGer konflikt med 'Upp nummer 2' använt av Opera, som normalt inte är aktiverat.
+Comment[uk]=Натиснути, вгору, відпустити.\nКонфліктує з жестом в стилі Opera "Вгору #2", який типово вимкнений.
+Comment[wa]=Tchôkî, monter, låtchî.\nAfrontmints avou l' sitîle d' Opera 'Pus hôt #2' k' est dismetou por vos.
+Comment[zh_TW]=按住,往上移,再放開。\n與預設為關閉的 Opera 風格「往上層(2)」衝突,
+Enabled=true
+Name=New Tab
+Name[bg]=Нов подпрозорец
+Name[bn]=নতুন ট্যাব
+Name[br]=Bevennig nevez
+Name[ca]=Pestanya nova
+Name[cs]=Nová záložka
+Name[csb]=Nowô kôrta
+Name[da]=Nyt faneblad
+Name[de]=Neues Unterfenster
+Name[el]=Νέα καρτέλα
+Name[eo]=Nova langeto
+Name[es]=Nueva solapa
+Name[et]=Uus kaart
+Name[fr]=Nouvel onglet
+Name[fy]=Nije ljepper
+Name[hr]=Nova kartica
+Name[hu]=Új lap
+Name[is]=Opna nýjan flipa
+Name[it]=Nuova scheda
+Name[ja]=新規タブ
+Name[km]=ថេប​ថ្មី
+Name[ko]=새 탭
+Name[nb]=Ny fane
+Name[nds]=Nieg Paneel
+Name[nl]=Nieuw tabblad
+Name[pa]=ਨਵੀਂ ਟੈਬ
+Name[pl]=Nowa karta
+Name[pt]=Nova Página
+Name[pt_BR]=Nova Aba
+Name[ro]=Filă nouă
+Name[ru]=Новая вкладка
+Name[sk]=Nový panel
+Name[sr]=Нови језичак
+Name[sr@Latn]=Novi jezičak
+Name[sv]=Ny flik
+Name[te]=కొత్త టాబ్
+Name[tr]=Yeni Sekme
+Name[uk]=Нова вкладка
+Name[uz]=Yangi tab
+Name[uz@cyrillic]=Янги таб
+Name[wa]=Novele linwete
+Name[zh_TW]=新分頁
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_7Actions]
+ActionsCount=1
+
+[Data_1_7Actions0]
+Input=Ctrl+Shift+N
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_7Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_7Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_7Triggers0]
+Gesture=258
+Type=GESTURE
+
+[Data_1_8]
+Comment=Press, move down, release.
+Comment[bg]=Натискане, движение надолу, пускане.
+Comment[ca]=Premeu, moveu avall, deixeu anar.
+Comment[csb]=Wcësni, przesënié w dół, pùszczë.
+Comment[da]=Tryk ned, flyt nedad, slip.
+Comment[de]=Drücken, nach unten, loslassen.
+Comment[el]=Πίεση, μετακίνηση κάτω, ελευθέρωση.
+Comment[eo]=Premu, iru malsupren, malpremu.
+Comment[es]=Pulsar, bajar, soltar.
+Comment[et]=Vajuta, liiguta alla, vabasta.
+Comment[fr]=Appuyez, déplacez en bas, relâchez.
+Comment[fy]=Yndrukke, nei omleech, loslitte
+Comment[hr]=Pritisni, pomakni prema dolje, otpusti.
+Comment[hu]=Lenyomás, le, elengedés.
+Comment[is]=Ýta, færa niður, sleppa.
+Comment[it]=Premi, sposta in giù, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを下に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ចុះក្រោម លែង ។
+Comment[ko]=누르고, 아래로 이동하고, 놓기.
+Comment[nds]=Drücken, na nerrn, looslaten.
+Comment[nl]=Indrukken, naar beneden bewegen, loslaten.
+Comment[pl]=Naciśnij, w dół, puść.
+Comment[pt]=Carregar, mover para baixo, largar.
+Comment[pt_BR]=Pressionar, mover para baixo, largar.
+Comment[ro]=Apasă, mută jos, dă drumul.
+Comment[ru]=Нажать, вниз, отпустить.
+Comment[sk]=Stlačte, presuňte nadol, pustite.
+Comment[sr]=Притисните, повуците надоле, пустите.
+Comment[sr@Latn]=Pritisnite, povucite nadole, pustite.
+Comment[sv]=Tryck ner, flytta neråt, släpp.
+Comment[uk]=Натиснути, вниз, відпустити.
+Comment[wa]=Tchôkî, dischinde, låtchî.
+Comment[zh_TW]=按住,往下移,再放開。
+Enabled=true
+Name=New Window
+Name[af]=Nuwe Venster
+Name[ar]=نافذة جديدة
+Name[az]=Yeni Pəncərə
+Name[be]=Новае акно
+Name[bg]=Нов прозорец
+Name[bn]=নতুন উইণ্ডো
+Name[br]=Prenestr nevez
+Name[bs]=Novi prozor
+Name[ca]=Finestra nova
+Name[cs]=Nové okno
+Name[csb]=Nowé òkno
+Name[cy]=Ffenestr Newydd
+Name[da]=Nyt vindue
+Name[de]=Neues Fenster
+Name[el]=Νέο παράθυρο
+Name[eo]=Nova fenestro
+Name[es]=Nueva ventana
+Name[et]=Uus aken
+Name[eu]=Leiho berria
+Name[fa]=پنجرۀ جدید
+Name[fi]=Uusi ikkuna
+Name[fr]=Nouvelle fenêtre
+Name[fy]=Nij finster
+Name[ga]=Fuinneog Nua
+Name[gl]=Nova Fiestra
+Name[he]=חלון חדש
+Name[hi]=नया विंडो
+Name[hr]=Novi prozor
+Name[hu]=Új ablak
+Name[id]=Jendela Baru
+Name[is]=Opna nýjan glugga
+Name[it]=Nuova finestra
+Name[ja]=新規ウィンドウ
+Name[ka]=ახალი ფანჯარა
+Name[kk]=Жаңа терезе
+Name[km]=បង្អួច​ថ្មី
+Name[ko]=새 창
+Name[lo]=ສ້າງຫນ້າຕ່າງໃຫມ່
+Name[lt]=Naujas langas
+Name[lv]=Jauns Logs
+Name[mk]=Нов прозорец
+Name[mn]=Шинэ цонх
+Name[ms]=Tetingkap Baru
+Name[mt]=Window Ġdida
+Name[nb]=Nytt vindu
+Name[nds]=Nieg Finster
+Name[ne]=नयाँ सञ्झ्याल
+Name[nl]=Nieuw venster
+Name[nn]=Nytt vindauge
+Name[nso]=Window ye Ntshwa
+Name[oc]=Navera finestra
+Name[pa]=ਨਵਾਂ ਝਰੋਖਾ
+Name[pl]=Nowe okno
+Name[pt]=Nova Janela
+Name[pt_BR]=Nova Janela
+Name[ro]=Fereastră nouă
+Name[ru]=Новое окно
+Name[rw]=Idirishya Rishya
+Name[se]=Ođđa láse
+Name[sk]=Nové okno
+Name[sl]=Novo okno
+Name[sr]=Нови прозор
+Name[sr@Latn]=Novi prozor
+Name[ss]=Liwindi lelisha
+Name[sv]=Nytt fönster
+Name[ta]=புதிய சாளரம்
+Name[te]=కొత్త విండొ
+Name[tg]=Тирезаи Нав
+Name[th]=สร้างหน้าต่างใหม่
+Name[tr]=Yeni Pencere
+Name[tt]=Yana Täräzä
+Name[uk]=Нове вікно
+Name[uz]=Yangi oyna
+Name[uz@cyrillic]=Янги ойна
+Name[ven]=Windo ntswa
+Name[vi]=Mở cửa sổ mới
+Name[wa]=Novea purnea
+Name[xh]=Window Entsha
+Name[zh_CN]=新建窗口
+Name[zh_TW]=新視窗
+Name[zu]=I-window Entsha
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_8Actions]
+ActionsCount=1
+
+[Data_1_8Actions0]
+Input=Ctrl+N\n
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_8Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_8Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_8Triggers0]
+Gesture=852
+Type=GESTURE
+
+[Data_1_9]
+Comment=Press, move up, move down, release.
+Comment[bg]=Натискане, движение нагоре, движение надолу, пускане.
+Comment[ca]=Premeu, moveu amunt, moveu avall, deixeu anar.
+Comment[csb]=Wcësni, przesënié w górã, przesënié w dół, pùszczë.
+Comment[da]=Tryk ned, flyt opad, flyt nedad, slip.
+Comment[de]=Drücken, nach oben, nach unten, loslassen.
+Comment[el]=Πίεση, μετακίνηση πάνω, μετακίνηση κάτω, ελευθέρωση.
+Comment[eo]=Premu, iru supren, iru malsupren, malpremu.
+Comment[es]=Pulsar, subir, bajar, soltar.
+Comment[et]=Vajuta, liiguta üles, liiguta alla, vabasta.
+Comment[fr]=Appuyez, déplacez en haut, en bas, relâchez.
+Comment[fy]=Yndrukke, nei omheech, nei omleech, loslitte.
+Comment[hr]=Pritisni, pomakni prema gore, pomakni prema dolje, otpusti.
+Comment[hu]=Lenyomás, fel, le, elengedés.
+Comment[is]=Ýta, færa upp, færa niður, sleppa.
+Comment[it]=Premi, sposta in su, sposta in giù, rilascia.
+Comment[ja]=マウスの中ボタンを押したまま、マウスを上->下の順に動かし、ボタンを放します。
+Comment[km]=ចុច ផ្លាស់ទី​ឡើងលើ ផ្លាស់ទី​ចុះក្រោម លែង ។
+Comment[ko]=누르고, 위로 이동하고, 아래로 이동하고, 놓기.
+Comment[nds]=Drücken, na baven, na nerrn, looslaten.
+Comment[nl]=Indrukken, omhoog bewegen, omlaag bewegen, loslaten.
+Comment[pl]=Naciśnij, w górę, w dół, puść.
+Comment[pt]=Carregar, mover para cima, mover para baixo, largar.
+Comment[pt_BR]=Pressionar, mover para cima, mover para baixo, largar.
+Comment[ro]=Apasă, mută sus, mută jos, dă drumul.
+Comment[ru]=Нажать, вверх, вниз, отпустить.
+Comment[sk]=Stlačte, presuňte nahor, nadol, pustite.
+Comment[sr]=Притисните, повуците нагоре, повуците надоле, пустите.
+Comment[sr@Latn]=Pritisnite, povucite nagore, povucite nadole, pustite.
+Comment[sv]=Tryck ner, flytta uppåt, flytta neråt, släpp.
+Comment[uk]=Натиснути, вгору, вниз, відпустити.
+Comment[wa]=Tchôkî, monter, dischinde, låtchî.
+Comment[zh_TW]=按住,往上移,往下移,再放開。
+Enabled=true
+Name=Reload
+Name[bg]=Презареждане
+Name[bn]=নতুন করে পড়ো
+Name[br]=Adkargañ
+Name[ca]=Actualitza
+Name[cs]=Obnovit
+Name[csb]=Òdswiéżë
+Name[da]=Genindlæs
+Name[de]=Dokument erneut laden
+Name[el]=Επαναφόρτωση
+Name[eo]=Reŝarĝi
+Name[es]=Recargar
+Name[et]=Laadi uuesti
+Name[fr]=Recharger
+Name[fy]=Ferfarskje
+Name[hr]=Osvježi
+Name[hu]=Újratöltés
+Name[is]=Endurhlaða
+Name[it]=Ricarica
+Name[ja]=再読み込み
+Name[km]=ផ្ទុកឡើង​វិញ
+Name[ko]=새로 고침
+Name[nb]=Omlast
+Name[nds]=Nieg laden
+Name[nl]=Herladen
+Name[pa]=ਮੁੜ-ਲੋਡ
+Name[pl]=Odśwież
+Name[pt]=Recarregar
+Name[pt_BR]=Recarregar
+Name[ro]=Reîncarcă
+Name[ru]=Обновить
+Name[sk]=Obnoviť
+Name[sr]=Поново учитај
+Name[sr@Latn]=Ponovo učitaj
+Name[sv]=Uppdatera
+Name[te]=మళ్లి ఎక్కించు
+Name[tg]=Бозсозӣ
+Name[tr]=Yeniden Yükle
+Name[uk]=Перезавантажити
+Name[uz]=Qaytadan yuklash
+Name[uz@cyrillic]=Қайтадан юклаш
+Name[wa]=Ritcherdjî
+Name[zh_CN]=重新装入
+Name[zh_TW]=重新載入
+Type=KEYBOARD_INPUT_GESTURE_ACTION_DATA
+
+[Data_1_9Actions]
+ActionsCount=1
+
+[Data_1_9Actions0]
+Input=F5
+IsDestinationWindow=false
+Type=KEYBOARD_INPUT
+
+[Data_1_9Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_9Triggers]
+Comment=Gesture_triggers
+Comment[bg]=Жестове
+Comment[cs]=Spouštěče gest
+Comment[csb]=Wëwòłujący_gest
+Comment[da]=Gestus_udløsere
+Comment[de]=Gesten_Aktivierung
+Comment[el]=Ενεργοποιήσεις χειρονομίας
+Comment[eo]=Gestaj_Lanĉoj
+Comment[es]=Activadores de los gestos
+Comment[et]=Žesti käivitajad
+Comment[fy]=Stjoerring_starters
+Comment[hr]=Okidači gestikulacija
+Comment[hu]=Mozdulatsor-kiváltók
+Comment[is]=Gesture_strengir
+Comment[it]=Interruttori_gesti
+Comment[km]=ការ​កេះ​កាយវិការ
+Comment[nb]=Bevegelsestarer
+Comment[nds]=Muustekens
+Comment[nl]=Gebaarstarters
+Comment[pl]=Uruchomienie gestów
+Comment[pt]=Activações dos gestos
+Comment[pt_BR]=Ativadores_de_gestos
+Comment[sk]=Spúštače_gest
+Comment[sr]=Окидачи гестова
+Comment[sr@Latn]=Okidači gestova
+Comment[sv]=Gestutlösning
+Comment[te]=సంజ్ఞ_ట్రిగ్గర్లు
+Comment[wa]=Rascourtis_bodjaedje_des_purneas
+Comment[zh_CN]=手势触发器
+Comment[zh_TW]=手勢觸發
+TriggersCount=1
+
+[Data_1_9Triggers0]
+Gesture=25852
+Type=GESTURE
+
+[Main]
+Version=2
+ImportId=konqueror_gestures_kde321
diff --git a/khotkeys/data/konqueror_gestures_kde321_update.upd b/khotkeys/data/konqueror_gestures_kde321_update.upd
new file mode 100644
index 000000000..06e784aef
--- /dev/null
+++ b/khotkeys/data/konqueror_gestures_kde321_update.upd
@@ -0,0 +1,8 @@
+Id=kde321
+# the file is intentionally a dummy, as the binary will update khotkeysrc,
+# the khotkeys_update will just remember it has been done
+File=khotkeys_update
+Group=Dummy
+Options=overwrite
+ScriptArguments=--id konqueror_gestures_kde321
+Script=khotkeys_update
diff --git a/khotkeys/data/printscreen.khotkeys b/khotkeys/data/printscreen.khotkeys
new file mode 100644
index 000000000..c56638fc5
--- /dev/null
+++ b/khotkeys/data/printscreen.khotkeys
@@ -0,0 +1,198 @@
+[Data]
+DataCount=1
+
+[Data_1]
+Comment=This group contains actions that are set up by default.
+Comment[bg]=Тази група съдържа действия, които са зададени по подразбирани.
+Comment[ca]=Aquest grup conté accions que s'han establert per omissió.
+Comment[csb]=Na grëpa zamëkô dzejania jaczé są ùstôwióné domëslno.
+Comment[da]=Denne gruppe indeholder handlinger som er indstillede som standard.
+Comment[de]=Diese Gruppe enthält in der Voreinstellung aktivierte Aktionen.
+Comment[el]=Η ομάδα αυτή περιέχει ενέργειες που είναι προκαθορισμένα καθορισμένες.
+Comment[eo]=Ĉi tiu grupo enhavas agojn antaŭdifinitajn defaŭlte.
+Comment[es]=Este grupo contiene acciones que están configuradas por omisión.
+Comment[et]=See grupp sisaldab vaikimisi määratud toiminguid.
+Comment[fr]=Ce groupe contient des actions définies par défaut.
+Comment[fy]=Dizze groep befettet aksjes dy standert ynsteld binne.
+Comment[hr]=Ova grupa sadrži zadano definirane aktivnosti.
+Comment[hu]=Ez a csoport tartalmazza az alapértelmezett műveleteket.
+Comment[is]=Þessi hópur inniheldur aðgerðir sem eru sjálfgefið uppsettar.
+Comment[it]=Questo gruppo contiene azioni che sono attive in modo predefinito.
+Comment[ja]=このグループにはデフォルトで設定されているアクションが含まれています。
+Comment[km]=ក្រុម​នេះ​មាន​សកម្មភាព​ដែល​ត្រូវ​បាន​កំណត់​ដោយ​លំនាំដើម ។
+Comment[ko]=이 그룹은 기본값으로 설정되어 있는 동작을 포함합니다.
+Comment[nds]=Disse Koppel bargt vörinstellt Akschonen.
+Comment[nl]=Deze groep bevat handelingen die standaard zijn ingesteld.
+Comment[pl]=Ta grupa zawiera akcje, które są domyślnie ustawione.
+Comment[pt]=Este grupo contém as acções que estão configuradas por omissão.
+Comment[pt_BR]=Este grupo contém ações que, por padrão, estão configuradas.
+Comment[ru]=Группа действий по умолчанию.
+Comment[sk]=Táto skupina obsahuje akcie, ktoré sú štandardne nastavené.
+Comment[sr]=Ова група садржи радње које су подразумевано намештене.
+Comment[sr@Latn]=Ova grupa sadrži radnje koje su podrazumevano nameštene.
+Comment[sv]=Gruppen innehåller åtgärder som normalt är förinställda.
+Comment[uk]=Ця група містить типові налаштовані дії.
+Comment[wa]=Ci groupe a des accions ki sont prémetowes.
+Comment[zh_TW]=此群組包含了預先設定好的動作。
+DataCount=1
+Enabled=true
+Name=Preset Actions
+Name[bg]=Фиксирани действия
+Name[ca]=Accions preestablertes
+Name[cs]=Přednastavené činnosti
+Name[csb]=Domëslné dzejania
+Name[da]=Forudindstillede handlinger
+Name[de]=Voreingestellte Aktionen
+Name[el]=Προκαθορισμένες ενέργειες
+Name[eo]=Antaŭdifintaj Agoj
+Name[es]=Acciones preconfiguradas
+Name[et]=Eelmääratud toimingud
+Name[fr]=Actions prédéfinies
+Name[fy]=Foarynstelde aksjes
+Name[hr]=Unaprijed zadane aktivnosti
+Name[hu]=Beállított műveletek
+Name[is]=Forsniðnar aðgerðir
+Name[it]=Azioni predefinite
+Name[ja]=プリセットアクション
+Name[km]=កំណង់​សកម្មភាព​ជា​មុន
+Name[ko]=미리 정의된 동작
+Name[nb]=Forhåndshandlinger
+Name[nds]=Vörinstellt Akschonen
+Name[nl]=Voorgedefinieerde acties
+Name[pa]=ਪ੍ਰੀ-ਸੈੱਟ ਕਾਰਵਾਈਆਂ
+Name[pl]=Predefiniowane czynności
+Name[pt]=Acções Predefinidas
+Name[pt_BR]=Ações Predefinidas
+Name[ro]=Acțiuni presetate
+Name[ru]=Примеры действий
+Name[sk]=Prednastavené akcie
+Name[sr]=Преподешене акције
+Name[sr@Latn]=Prepodešene akcije
+Name[sv]=Förinställda åtgärder
+Name[tg]=Мисолҳои амалиёт
+Name[tr]=Eylemleri Kaydet
+Name[uk]=Наперед налаштовані дії
+Name[wa]=Prémetowès accions
+Name[zh_TW]=預先設定動作
+SystemGroup=0
+Type=ACTION_DATA_GROUP
+AllowMerge=true
+
+[Data_1Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_1]
+Comment=Launches KSnapShot when PrintScrn is pressed.
+Comment[bg]=Стартиране на KSnapShot при натискане на клавиша "PrintScrn"
+Comment[ca]=Executa el KSnapShot que es prem la tecla ImprPant.
+Comment[csb]=Włącziwô KSnapShot czedë wcësniãti je PrintScrn.
+Comment[da]=Starter Ksnapshot når Prt Sc trykkes ned.
+Comment[de]=Startet KSnapShot wenn "Bildschirm Drucken" gedrückt wurde.
+Comment[el]=Εκτέλεση του KSnapShot όταν πατηθεί το PrintScrn.
+Comment[eo]=Lanĉas KSnapShot (Ekranfotilon) kiam vi premas la "Printi Ekranon" klavon.
+Comment[es]=Lanza KSnapShot cuando se pulsa la tecla ImprPant.
+Comment[et]=Käivitab PrintSrcni vajutamisel KSnapShoti.
+Comment[fr]=Lancement de KSnapShot lorsque l'on appuie sur « Imprim Écran ».
+Comment[fy]=Set útein mei KSnapShot as PrintScrn yndrukt wurdt.
+Comment[hr]=Pokreće aplikaciju KSnapShot nakon pritiska tipke PrintScrn.
+Comment[hu]=Elindítja a KSnapshotot a PrintScreen billentyű lenyomásakor.
+Comment[is]=Ræsir KSnapShot þegar ýtt er á PrintScrn lykilinn.
+Comment[it]=Avvia KSnapShot quando viene premuto il tasto Stamp.
+Comment[ja]=PrintScrn を押して KSnapShot を起動します。
+Comment[km]=ចាប់​ផ្ដើម KSnapShot នៅ​ពេល​ចុច​គ្រាប់​ចុច​បោះពុម្ព​អេក្រង់ ។
+Comment[ko]=PrintScrn 키가 눌렸을 때 KSnapShot을 실행합니다.
+Comment[nds]=Röppt "KSnapShot" op, wenn Een de "PrintScreen"-Tast drückt.
+Comment[nl]=KSnapShot starten wanneer PrintScreen wordt ingedrukt.
+Comment[pl]=Uruchamia KSnapShot, kiedy naciśnięty jest klawisz PrintScrn.
+Comment[pt]=Lança o KSnapShot quando carregar no PrintScrn.
+Comment[pt_BR]=Lança o KSnapShot quando PrintScrn é pressionada.
+Comment[ru]=Запуск KSnapShot при нажатии кнопки PrintScreen.
+Comment[sk]=Spúšťa KSnapShot pri stlačení PrintScrn
+Comment[sr]=Покреће KSnapShot када се притисне тастер PrintScrn.
+Comment[sr@Latn]=Pokreće KSnapShot kada se pritisne taster PrintScrn.
+Comment[sv]=Startar Ksnapshot när Prt Sc trycks ner.
+Comment[uk]=Запускає KSnapShot, коли натиснути PrintScrn.
+Comment[wa]=Lance KWaitroulêye cwand PrintScrn est tchôkî.
+Comment[zh_TW]=按下 PrintScreen 鍵時叫出 KSnapShot。
+Enabled=true
+Name=PrintScreen
+Name[bg]=Печат на екрана
+Name[ca]=Impressió de pantalla
+Name[de]=Bildschirm Drucken
+Name[eo]=Printi Ekranon
+Name[es]=Imprimir la pantalla
+Name[fr]=Impression écran
+Name[fy]=print foarbyld
+Name[is]=PrentaSkjá
+Name[it]=Stamp
+Name[km]=បោះពុម្ព​អេក្រង់
+Name[nb]=Skriv skjermdump
+Name[nds]=Schirmfoto
+Name[pa]=ਸਕਰੀਨ-ਛਾਪੋ
+Name[pl]=Zrzut ekranu
+Name[pt]=Imprimir o Ecrã
+Name[ro]=Imprimă ecram
+Name[ru]=Снимок экрана
+Name[sv]=Skriv ut skärmen
+Name[te]=తెర ప్రచురించు
+Name[tg]=Сурати экран
+Name[uk]=Знімок екрану
+Type=COMMAND_URL_SHORTCUT_ACTION_DATA
+
+[Data_1_1Actions]
+ActionsCount=1
+
+[Data_1_1Actions0]
+CommandURL=ksnapshot
+Type=COMMAND_URL
+
+[Data_1_1Conditions]
+Comment=
+ConditionsCount=0
+
+[Data_1_1Triggers]
+Comment=Simple_action
+Comment[bg]=Обикновено_действие
+Comment[cs]=Jednoduchá akce
+Comment[csb]=Prostô_akcëja
+Comment[da]=Simpel_handling
+Comment[de]=Einfache_Aktion
+Comment[el]=Απλή ενέργεια
+Comment[eo]=Simpla_ago
+Comment[es]=Acción sencilla
+Comment[et]=Lihtne toiming
+Comment[fy]=Ienfâldige_aksje
+Comment[hr]=Jednostavna aktivnost
+Comment[hu]=Egyszerű_művelet
+Comment[is]=Einföld aðgerð
+Comment[it]=Azione_semplice
+Comment[km]=សកម្ម​ភាព​គំរូ
+Comment[nb]=Enkel_handling
+Comment[nds]=Eenfach_Akschoon
+Comment[nl]=Eenvoudige_handeling
+Comment[pa]=ਸਧਾਰਨ ਕਾਰਵਾਈ
+Comment[pl]=Prosta akcja
+Comment[pt]=Acção Simples
+Comment[pt_BR]=Ação_simples
+Comment[ro]=Acțiune simplă
+Comment[ru]=Простое действие
+Comment[sk]=Jednoduchá_akcia
+Comment[sl]=Preprosto_dejanje
+Comment[sr]=Једноставна радња
+Comment[sr@Latn]=Jednostavna radnja
+Comment[sv]=Enkel åtgärd
+Comment[tg]=Амалиёти оддӣ
+Comment[tr]=Basit_eylem
+Comment[uk]=Проста_дія
+Comment[wa]=Simpe_accion
+Comment[zh_TW]=簡易動作
+TriggersCount=1
+
+[Data_1_1Triggers0]
+Key=Print
+Type=SHORTCUT
+
+[Main]
+Version=2
+ImportId=printscreen
diff --git a/khotkeys/kcontrol/Makefile.am b/khotkeys/kcontrol/Makefile.am
new file mode 100644
index 000000000..81e691669
--- /dev/null
+++ b/khotkeys/kcontrol/Makefile.am
@@ -0,0 +1,40 @@
+SUBDIRS = ui
+
+kde_module_LTLIBRARIES = kcm_khotkeys.la kcm_khotkeys_init.la
+
+kcm_khotkeys_la_SOURCES = \
+ menuedit.cpp window_trigger_widget.cpp tab_widget.cpp main_buttons_widget.cpp \
+ actions_listview_widget.cpp menuentry_widget.cpp general_tab.cpp \
+ action_group_tab.cpp kcmkhotkeys.cpp command_url_widget.cpp windowdef_list_widget.cpp \
+ windowdef_simple_widget.cpp triggers_tab.cpp dcop_widget.cpp info_tab.cpp \
+ action_list_widget.cpp keyboard_input_widget.cpp condition_list_widget.cpp \
+ gesturedrawer.cpp gesturerecorder.cpp gesturerecordpage.cpp gesture_triggers_tab.cpp \
+ windowselector.cpp gestures_settings_tab.cpp general_settings_tab.cpp \
+ voicerecorder.cpp voicerecordpage.cpp voice_settings_tab.cpp
+
+kcm_khotkeys_la_LIBADD = ui/libui.la $(LIB_KDEUI) $(LIB_ARTS)
+kcm_khotkeys_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+
+kcm_khotkeys_init_la_SOURCES = init.cpp
+
+kcm_khotkeys_init_la_LIBADD = $(LIB_KDECORE)
+kcm_khotkeys_init_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+
+noinst_HEADERS = menuedit.h window_trigger_widget.h \
+ tab_widget.h main_buttons_widget.h actions_listview_widget.h menuentry_widget.h \
+ general_tab.h action_group_tab.h kcmkhotkeys.h windowdef_list_widget.h \
+ command_url_widget.h windowdef_simple_widget.h triggers_tab.h dcop_widget.h info_tab.h \
+ action_list_widget.h keyboard_input_widget.h condition_list_widget.h \
+ activate_window_widget.h \
+ gesturedrawer.h gesturerecorder.h gesturerecordpage.h gesture_triggers_tab.h \
+ windowselector.h gestures_settings_tab.h general_settings_tab.h \
+ voicerecorder.h voicerecordpage.h voice_settings_tab.h
+
+
+INCLUDES= -I$(top_srcdir)/khotkeys/shared -I$(srcdir)/ui -I./ui $(all_includes)
+
+METASOURCES = AUTO
+
+xdg_apps_DATA = khotkeys.desktop
+
+KDE_ICON = khotkeys
diff --git a/khotkeys/kcontrol/action_group_tab.cpp b/khotkeys/kcontrol/action_group_tab.cpp
new file mode 100644
index 000000000..fbe681555
--- /dev/null
+++ b/khotkeys/kcontrol/action_group_tab.cpp
@@ -0,0 +1,94 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _ACTION_GROUP_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "action_group_tab.h"
+
+#include <qlineedit.h>
+#include <qcheckbox.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <ktextedit.h>
+
+#include <actions.h>
+#include <action_data.h>
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Action_group_tab::Action_group_tab( QWidget* parent_P , const char* name_P )
+ : Action_group_tab_ui( parent_P, name_P )
+ {
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( action_name_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( disable_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_multilineedit, SIGNAL( textChanged()),
+ module, SLOT( changed()));
+ }
+
+void Action_group_tab::clear_data()
+ {
+ disconnect( action_name_lineedit, SIGNAL( textChanged( const QString& )), this,
+ SLOT( action_group_name_changed( const QString& )));
+ action_name_lineedit->clear();
+ action_name_lineedit->setReadOnly( false );
+ disable_checkbox->setChecked( false );
+ disable_checkbox->setText( i18n( "&Disable" ));
+ comment_multilineedit->clear();
+ system_group = Action_data_group::SYSTEM_NONE;
+ }
+
+void Action_group_tab::set_data( const Action_data_group* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ action_name_lineedit->setText( data_P->name());
+ action_name_lineedit->setReadOnly( data_P->is_system_group());
+ disable_checkbox->setChecked( !data_P->enabled( true ));
+ if( !data_P->parent()->enabled( false ))
+ disable_checkbox->setText( i18n( "&Disable (group is disabled)" ));
+ else
+ disable_checkbox->setText( i18n( "&Disable" ));
+ comment_multilineedit->setText( data_P->comment());
+ connect( action_name_lineedit, SIGNAL( textChanged( const QString& )), this,
+ SLOT( action_group_name_changed( const QString& )));
+ system_group = data_P->system_group();
+ }
+
+Action_data_group* Action_group_tab::get_data( Action_data_group* parent_P,
+ Condition_list* conditions_P ) const
+ {
+ QString name = action_name_lineedit->text();
+ return new Action_data_group( parent_P, name, comment_multilineedit->text(), conditions_P,
+ system_group, !disable_checkbox->isChecked());
+ }
+
+void Action_group_tab::action_group_name_changed( const QString& name_P )
+ {
+ module->action_name_changed( name_P );
+ }
+
+} // namespace KHotKeys
+
+#include "action_group_tab.moc"
diff --git a/khotkeys/kcontrol/action_group_tab.h b/khotkeys/kcontrol/action_group_tab.h
new file mode 100644
index 000000000..aa5237073
--- /dev/null
+++ b/khotkeys/kcontrol/action_group_tab.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _ACTION_GROUP_TAB_H_
+#define _ACTION_GROUP_TAB_H_
+
+#include <action_group_tab_ui.h>
+#include <action_data.h>
+
+namespace KHotKeys
+{
+
+class Action_data_group;
+class Windowdef_list;
+
+class Action_group_tab
+ : public Action_group_tab_ui
+ {
+ Q_OBJECT
+ public:
+ Action_group_tab( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Action_data_group* data_P );
+ Action_data_group* get_data( Action_data_group* parent_P,
+ Condition_list* conditions_P ) const;
+ public slots:
+ void clear_data();
+ protected slots:
+ virtual void action_group_name_changed( const QString& name_P );
+ protected:
+ Action_data_group::system_group_t system_group;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/action_list_widget.cpp b/khotkeys/kcontrol/action_list_widget.cpp
new file mode 100644
index 000000000..c12a2df86
--- /dev/null
+++ b/khotkeys/kcontrol/action_list_widget.cpp
@@ -0,0 +1,354 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _ACTION_LIST_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "action_list_widget.h"
+
+#include <assert.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qheader.h>
+#include <qlineedit.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <khlistview.h>
+
+#include "command_url_widget.h"
+#include "menuentry_widget.h"
+#include "dcop_widget.h"
+#include "keyboard_input_widget.h"
+#include "activate_window_widget.h"
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+// Action_list_widget
+
+Action_list_widget::Action_list_widget( QWidget* parent_P, const char* name_P )
+ : Action_list_widget_ui( parent_P, name_P ), selected_item( NULL )
+ {
+ QPopupMenu* popup = new QPopupMenu; // CHECKME looks like setting parent doesn't work
+ popup->insertItem( i18n( "Command/URL..." ), TYPE_COMMAND_URL_ACTION );
+ popup->insertItem( i18n( "K-Menu Entry..." ), TYPE_MENUENTRY_ACTION );
+ popup->insertItem( i18n( "DCOP Call..." ), TYPE_DCOP_ACTION );
+ popup->insertItem( i18n( "Keyboard Input..." ), TYPE_KEYBOARD_INPUT_ACTION );
+ popup->insertItem( i18n( "Activate Window..." ), TYPE_ACTIVATE_WINDOW_ACTION );
+ connect( popup, SIGNAL( activated( int )), SLOT( new_selected( int )));
+ new_button->setPopup( popup );
+ actions_listview->header()->hide();
+ actions_listview->addColumn( "" );
+ actions_listview->setSorting( -1 );
+ actions_listview->setForceSelect( true );
+ copy_button->setEnabled( false );
+ modify_button->setEnabled( false );
+ delete_button->setEnabled( false );
+ clear_data();
+ connect( actions_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( modify_pressed() ) );
+
+ // KHotKeys::Module::changed()
+ connect( new_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( copy_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( modify_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( delete_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+Action_list_widget::~Action_list_widget()
+ {
+ delete new_button->popup();
+ }
+
+void Action_list_widget::clear_data()
+ {
+ comment_lineedit->clear();
+ actions_listview->clear();
+ }
+
+void Action_list_widget::set_data( const Action_list* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ comment_lineedit->setText( data_P->comment());
+ Action_list_item* after = NULL;
+ actions_listview->clear();
+ for( Action_list::Iterator it( *data_P );
+ *it;
+ ++it )
+ after = create_listview_item( *it, actions_listview, NULL, after, true );
+ }
+
+Action_list* Action_list_widget::get_data( Action_data* data_P ) const
+ {
+// CHECKME TODO hmm, tady to bude chtit asi i children :(
+ Action_list* list = new Action_list( comment_lineedit->text());
+ for( QListViewItem* pos = actions_listview->firstChild();
+ pos != NULL;
+ pos = pos->nextSibling())
+ list->append( static_cast< Action_list_item* >( pos )->action()->copy( data_P ));
+ return list;
+ }
+
+void Action_list_widget::new_selected( int type_P )
+ {
+ Action_dialog* dlg = NULL;
+ switch( type_P )
+ {
+ case TYPE_COMMAND_URL_ACTION: // Command_url_action_dialog
+ dlg = new Command_url_action_dialog( NULL );
+ break;
+ case TYPE_MENUENTRY_ACTION: // Menuentry_action_dialog
+ dlg = new Menuentry_action_dialog( NULL );
+ break;
+ case TYPE_DCOP_ACTION: // Dcop_action_dialog
+ dlg = new Dcop_action_dialog( NULL );
+ break;
+ case TYPE_KEYBOARD_INPUT_ACTION: // Keyboard_input_action_dialog
+ dlg = new Keyboard_input_action_dialog( NULL );
+ break;
+ case TYPE_ACTIVATE_WINDOW_ACTION: // Activate_window_action_dialog
+ dlg = new Activate_window_action_dialog( NULL );
+ break;
+ default:
+ assert( false );
+ }
+ if( dlg != NULL )
+ {
+ Action* action = dlg->edit_action();
+ if( action != NULL )
+ actions_listview->setSelected( create_listview_item( action, actions_listview,
+ NULL, selected_item, false ), true );
+ // CHECKME tady pak jeste spravne vnoreni, kdyz bude skupina
+ delete dlg;
+ }
+ }
+
+void Action_list_widget::copy_pressed()
+ {
+ if ( !selected_item )
+ return;
+ actions_listview->setSelected( create_listview_item( selected_item->action(),
+ selected_item->parent() ? NULL : actions_listview, selected_item->parent(),
+ selected_item, true ), true );
+ }
+
+void Action_list_widget::delete_pressed()
+ {
+ delete selected_item; // CHECKME snad vyvola signaly pro enable()
+ selected_item = NULL;
+ }
+
+void Action_list_widget::modify_pressed()
+ {
+ if ( !selected_item )
+ return;
+ edit_listview_item( selected_item );
+ }
+
+void Action_list_widget::current_changed( QListViewItem* item_P )
+ {
+// if( item_P == selected_item )
+// return;
+ selected_item = static_cast< Action_list_item* >( item_P );
+// actions_listview->setSelected( item_P, true );
+ copy_button->setEnabled( item_P != NULL );
+ modify_button->setEnabled( item_P != NULL );
+ delete_button->setEnabled( item_P != NULL );
+ }
+
+Action_list_item* Action_list_widget::create_listview_item( Action* action_P,
+ QListView* parent1_P, QListViewItem* parent2_P, QListViewItem* after_P, bool copy_P )
+ {
+ Action* new_win = copy_P ? action_P->copy( NULL ) : action_P;
+// CHECKME uz by nemelo byt treba
+/* if( after_P == NULL )
+ {
+ if( parent1_P == NULL )
+ return new Action_list_item( parent2_P, new_win );
+ else
+ return new Action_list_item( parent1_P, new_win );
+ }
+ else*/
+ {
+ if( parent1_P == NULL )
+ return new Action_list_item( parent2_P, after_P, new_win );
+ else
+ return new Action_list_item( parent1_P, after_P, new_win );
+ }
+ }
+
+void Action_list_widget::edit_listview_item( Action_list_item* item_P )
+ {
+ Action_dialog* dlg = NULL;
+ if( Command_url_action* action = dynamic_cast< Command_url_action* >( item_P->action()))
+ dlg = new Command_url_action_dialog( action );
+ else if( Menuentry_action* action = dynamic_cast< Menuentry_action* >( item_P->action()))
+ dlg = new Menuentry_action_dialog( action );
+ else if( Dcop_action* action = dynamic_cast< Dcop_action* >( item_P->action()))
+ dlg = new Dcop_action_dialog( action );
+ else if( Keyboard_input_action* action
+ = dynamic_cast< Keyboard_input_action* >( item_P->action()))
+ dlg = new Keyboard_input_action_dialog( action );
+ else if( Activate_window_action* action
+ = dynamic_cast< Activate_window_action* >( item_P->action()))
+ dlg = new Activate_window_action_dialog( action );
+ else // CHECKME TODO pridat dalsi
+ assert( false );
+ Action* new_action = dlg->edit_action();
+ if( new_action != NULL )
+ {
+ item_P->set_action( new_action );
+ item_P->widthChanged( 0 );
+ actions_listview->repaintItem( item_P );
+ }
+ delete dlg;
+ }
+
+// Action_list_item
+
+QString Action_list_item::text( int column_P ) const
+ {
+ return column_P == 0 ? action()->description() : QString::null;
+ }
+
+Action_list_item::~Action_list_item()
+ {
+ delete _action;
+ }
+
+// Command_url_action_dialog
+
+Command_url_action_dialog::Command_url_action_dialog( Command_url_action* action_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), action( NULL ) // CHECKME caption
+ {
+ widget = new Command_url_widget( this );
+ widget->set_data( action_P );
+ setMainWidget( widget );
+ }
+
+Action* Command_url_action_dialog::edit_action()
+ {
+ exec();
+ return action;
+ }
+
+void Command_url_action_dialog::accept()
+ {
+ KDialogBase::accept();
+ action = widget->get_data( NULL ); // CHECKME NULL ?
+ }
+
+// Menuentry_action_dialog
+
+Menuentry_action_dialog::Menuentry_action_dialog( Menuentry_action* action_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), action( NULL ) // CHECKME caption
+ {
+ widget = new Menuentry_widget( this );
+ widget->set_data( action_P );
+ setMainWidget( widget );
+ }
+
+Action* Menuentry_action_dialog::edit_action()
+ {
+ exec();
+ return action;
+ }
+
+void Menuentry_action_dialog::accept()
+ {
+ KDialogBase::accept();
+ action = widget->get_data( NULL ); // CHECKME NULL ?
+ }
+
+// Dcop_action_dialog
+
+Dcop_action_dialog::Dcop_action_dialog( Dcop_action* action_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), action( NULL ) // CHECKME caption
+ {
+ widget = new Dcop_widget( this );
+ widget->set_data( action_P );
+ setMainWidget( widget );
+ }
+
+Action* Dcop_action_dialog::edit_action()
+ {
+ exec();
+ return action;
+ }
+
+void Dcop_action_dialog::accept()
+ {
+ KDialogBase::accept();
+ action = widget->get_data( NULL ); // CHECKME NULL ?
+ }
+
+// Keyboard_input_action_dialog
+
+Keyboard_input_action_dialog::Keyboard_input_action_dialog( Keyboard_input_action* action_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), action( NULL ) // CHECKME caption
+ {
+ widget = new Keyboard_input_widget( this );
+ widget->set_data( action_P );
+ setMainWidget( widget );
+ }
+
+Action* Keyboard_input_action_dialog::edit_action()
+ {
+ exec();
+ return action;
+ }
+
+void Keyboard_input_action_dialog::accept()
+ {
+ KDialogBase::accept();
+ action = widget->get_data( NULL ); // CHECKME NULL ?
+ }
+
+// Activate_window_action_dialog
+
+Activate_window_action_dialog::Activate_window_action_dialog( Activate_window_action* action_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), action( NULL ) // CHECKME caption
+ {
+ widget = new Activate_window_widget( this );
+ widget->set_data( action_P ? action_P->window() : NULL );
+ setMainWidget( widget );
+ }
+
+Action* Activate_window_action_dialog::edit_action()
+ {
+ exec();
+ return action;
+ }
+
+void Activate_window_action_dialog::accept()
+ {
+ KDialogBase::accept();
+ action = new Activate_window_action( NULL, widget->get_data()); // CHECKME NULL ?
+ }
+
+} // namespace KHotKeys
+
+#include "action_list_widget.moc"
diff --git a/khotkeys/kcontrol/action_list_widget.h b/khotkeys/kcontrol/action_list_widget.h
new file mode 100644
index 000000000..f1f965db6
--- /dev/null
+++ b/khotkeys/kcontrol/action_list_widget.h
@@ -0,0 +1,205 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _ACTION_LIST_WIDGET_H_
+#define _ACTION_LIST_WIDGET_H_
+
+#include <qlistview.h>
+
+#include <actions.h>
+#include <kdialogbase.h>
+
+#include <action_list_widget_ui.h>
+
+#include "activate_window_widget.h"
+
+namespace KHotKeys
+{
+
+class Action_data;
+class Command_url_widget;
+class Menuentry_widget;
+class Dcop_widget;
+class Keyboard_input_widget;
+
+class Action_list_item;
+
+class Action_list_widget
+ : public Action_list_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Action_list_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ virtual ~Action_list_widget();
+ void set_data( const Action_list* data_P );
+ Action_list* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ protected:
+ Action_list_item* create_listview_item( Action* action_P, QListView* parent1_P,
+ QListViewItem* parent2_P, QListViewItem* after_P, bool copy_P );
+ void edit_listview_item( Action_list_item* item_P );
+ enum type_t { TYPE_COMMAND_URL_ACTION, TYPE_MENUENTRY_ACTION, TYPE_DCOP_ACTION,
+ TYPE_KEYBOARD_INPUT_ACTION, TYPE_ACTIVATE_WINDOW_ACTION };
+ protected slots:
+ void new_selected( int type_P );
+ virtual void copy_pressed();
+ virtual void delete_pressed();
+ virtual void modify_pressed();
+ virtual void current_changed( QListViewItem* item_P );
+ protected:
+ Action_list_item* selected_item;
+ };
+
+typedef Action_list_widget Action_list_tab;
+
+class Action_list_item
+ : public QListViewItem
+ {
+ public:
+ Action_list_item( QListView* parent_P, Action* action_P );
+ Action_list_item( QListViewItem* parent_P, Action* action_P );
+ Action_list_item( QListView* parent_P, QListViewItem* after_P, Action* action_P );
+ Action_list_item( QListViewItem* parent_P, QListViewItem* after_P, Action* action_P );
+ virtual ~Action_list_item();
+ virtual QString text( int column_P ) const;
+ Action* action() const;
+ void set_action( Action* action_P );
+ protected:
+ Action* _action; // owns it
+ };
+
+class Action_dialog
+ {
+ public:
+ virtual Action* edit_action() = 0;
+ virtual ~Action_dialog();
+ };
+
+class Command_url_action_dialog
+ : public KDialogBase, public Action_dialog
+ {
+ Q_OBJECT
+ public:
+ Command_url_action_dialog( Command_url_action* action_P );
+ virtual Action* edit_action();
+ protected:
+ virtual void accept();
+ Command_url_widget* widget;
+ Command_url_action* action;
+ };
+
+class Menuentry_action_dialog
+ : public KDialogBase, public Action_dialog
+ {
+ Q_OBJECT
+ public:
+ Menuentry_action_dialog( Menuentry_action* action_P );
+ virtual Action* edit_action();
+ protected:
+ virtual void accept();
+ Menuentry_widget* widget;
+ Menuentry_action* action;
+ };
+
+class Dcop_action_dialog
+ : public KDialogBase, public Action_dialog
+ {
+ Q_OBJECT
+ public:
+ Dcop_action_dialog( Dcop_action* action_P );
+ virtual Action* edit_action();
+ protected:
+ virtual void accept();
+ Dcop_widget* widget;
+ Dcop_action* action;
+ };
+
+class Keyboard_input_action_dialog
+ : public KDialogBase, public Action_dialog
+ {
+ Q_OBJECT
+ public:
+ Keyboard_input_action_dialog( Keyboard_input_action* action_P );
+ virtual Action* edit_action();
+ protected:
+ virtual void accept();
+ Keyboard_input_widget* widget;
+ Keyboard_input_action* action;
+ };
+
+class Activate_window_action_dialog
+ : public KDialogBase, public Action_dialog
+ {
+ Q_OBJECT
+ public:
+ Activate_window_action_dialog( Activate_window_action* action_P );
+ virtual Action* edit_action();
+ protected:
+ virtual void accept();
+ Activate_window_widget* widget;
+ Activate_window_action* action;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Action_list_item
+
+inline
+Action_list_item::Action_list_item( QListView* parent_P, Action* action_P )
+ : QListViewItem( parent_P ), _action( action_P )
+ {
+ }
+
+inline
+Action_list_item::Action_list_item( QListViewItem* parent_P, Action* action_P )
+ : QListViewItem( parent_P ), _action( action_P )
+ {
+ }
+
+inline
+Action_list_item::Action_list_item( QListView* parent_P, QListViewItem* after_P,
+ Action* action_P )
+ : QListViewItem( parent_P, after_P ), _action( action_P )
+ {
+ }
+
+inline
+Action_list_item::Action_list_item( QListViewItem* parent_P, QListViewItem* after_P,
+ Action* action_P )
+ : QListViewItem( parent_P, after_P ), _action( action_P )
+ {
+ }
+
+inline
+Action* Action_list_item::action() const
+ {
+ return _action;
+ }
+
+inline
+void Action_list_item::set_action( Action* action_P )
+ {
+ delete _action;
+ _action = action_P;
+ }
+
+// Action_dialog
+
+inline
+Action_dialog::~Action_dialog()
+ {
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/actions_listview_widget.cpp b/khotkeys/kcontrol/actions_listview_widget.cpp
new file mode 100644
index 000000000..4d0534e9d
--- /dev/null
+++ b/khotkeys/kcontrol/actions_listview_widget.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _ACTIONS_LISTVIEW_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "actions_listview_widget.h"
+
+#include <qheader.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <qdragobject.h>
+
+#include <khlistview.h>
+#include <actions.h>
+#include <triggers.h>
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Actions_listview_widget::Actions_listview_widget( QWidget* parent_P, const char* name_P )
+ : Actions_listview_widget_ui( parent_P, name_P ), recent_item( NULL ),
+ saved_current_item( NULL )
+ {
+// actions_listview->setSorting( 0 );
+ actions_listview->header()->hide();
+ actions_listview->addColumn( "" );
+ actions_listview->setRootIsDecorated( true ); // CHECKME
+ connect( actions_listview, SIGNAL( current_changed( QListViewItem* )),
+ SLOT( current_changed( QListViewItem* )));
+ connect( actions_listview, SIGNAL( moved( QListViewItem*, QListViewItem*, QListViewItem* )),
+ SLOT( item_moved( QListViewItem*, QListViewItem*, QListViewItem* )));
+ // KHotKeys::Module::changed()
+ }
+
+void Actions_listview_widget::action_name_changed( const QString& )
+ {
+ current_action()->widthChanged( 0 );
+ actions_listview->repaintItem( current_action());
+ }
+
+void Actions_listview_widget::set_action_data( Action_data_base* data_P, bool recent_action_P )
+ {
+ if( recent_action_P )
+ {
+ assert( recent_item != NULL );
+ recent_item->set_data( data_P );
+ }
+ else
+ saved_current_item->set_data( data_P );
+ }
+
+void Actions_listview_widget::current_changed( QListViewItem* item_P )
+ {
+ kdDebug( 1217 ) << "current_changed:" << item_P << endl;
+ set_current_action( static_cast< Action_listview_item* >( item_P ));
+ }
+
+void Actions_listview_widget::set_current_action( Action_listview_item* item_P )
+ {
+ if( item_P == saved_current_item )
+ return;
+ recent_item = saved_current_item;
+ saved_current_item = item_P;
+ if( actions_listview->currentItem() != item_P )
+ {
+ if( item_P == NULL )
+ actions_listview->clearSelection();
+ actions_listview->setCurrentItem( item_P );
+ }
+ emit current_action_changed();
+ }
+
+void Actions_listview_widget::new_action( Action_data_base* data_P )
+ {
+ QListViewItem* parent = NULL;
+ if( current_action() != NULL )
+ {
+ if( dynamic_cast< Action_data_group* >( current_action()->data()) != NULL )
+ parent = current_action();
+ else
+ parent = current_action()->parent();
+ }
+ if( parent )
+ parent->setOpen( true );
+ Action_listview_item* tmp = create_item( parent, NULL, data_P );
+ recent_item = saved_current_item;
+ saved_current_item = tmp;
+ actions_listview->setSelected( tmp, true );
+ }
+
+void Actions_listview_widget::delete_action()
+ {
+// while( QListViewItem* child = current_action()->firstChild())
+// delete child;
+// QListViewItem* nw = current_action()->itemAbove();
+// if( nw == NULL )
+// nw = current_action()->itemBelow();
+ delete saved_current_item;
+ saved_current_item = NULL;
+ recent_item = NULL;
+// if( nw != NULL )
+// {
+// saved_current_item = static_cast< Action_listview_item* >( nw );
+// actions_listview->setSelected( nw, true );
+// }
+// else
+// saved_current_item = NULL;
+ }
+
+void Actions_listview_widget::item_moved( QListViewItem* item_P, QListViewItem*, QListViewItem* )
+ {
+ Action_listview_item* item = static_cast< Action_listview_item* >( item_P );
+ Action_listview_item* parent = static_cast< Action_listview_item* >( item->parent());
+ if( parent == NULL )
+ item->data()->reparent( module->actions_root());
+ else if( Action_data_group* group = dynamic_cast< Action_data_group* >( parent->data()))
+ item->data()->reparent( group );
+ else
+ item->data()->reparent( module->actions_root());
+ module->changed();
+ }
+
+void Actions_listview_widget::build_up()
+ {
+ build_up_recursively( module->actions_root(), NULL );
+ }
+
+void Actions_listview_widget::build_up_recursively( Action_data_group* parent_P,
+ Action_listview_item* item_parent_P )
+ {
+ Action_listview_item* prev = NULL;
+ for( Action_data_group::Iterator it = parent_P->first_child();
+ it;
+ ++it )
+ {
+ prev = create_item( item_parent_P, prev, ( *it ));
+ Action_data_group* grp = dynamic_cast< Action_data_group* >( *it );
+ if( grp != NULL )
+ build_up_recursively( grp, prev );
+ }
+ }
+
+Action_listview_item* Actions_listview_widget::create_item( QListViewItem* parent_P,
+ QListViewItem* after_P, Action_data_base* data_P )
+ {
+ if( parent_P != NULL )
+ return new Action_listview_item( parent_P, after_P, data_P );
+ else
+ return new Action_listview_item( actions_listview, after_P, data_P );
+ }
+
+// Actions_listview
+
+Actions_listview::Actions_listview( QWidget* parent_P, const char* name_P )
+ : KHListView( parent_P, name_P ), _widget( static_cast< Actions_listview_widget* >( parent_P->parent()))
+ {
+ // this relies on the way designer creates the .cpp file from .ui (yes, I'm lazy)
+ assert( dynamic_cast< Actions_listview_widget_ui* >( parent_P->parent()));
+ setDragEnabled( true );
+ setDropVisualizer( true );
+ setAcceptDrops( true );
+ }
+
+// Action_listview_item
+
+QString Action_listview_item::text( int column_P ) const
+ {
+ return column_P == 0 ? data()->name() : QString::null;
+ }
+
+// CHECKME poradne tohle zkontrolovat po tom prekopani
+
+} // namespace KHotKeys
+
+#include "actions_listview_widget.moc"
diff --git a/khotkeys/kcontrol/actions_listview_widget.h b/khotkeys/kcontrol/actions_listview_widget.h
new file mode 100644
index 000000000..4b0d937a3
--- /dev/null
+++ b/khotkeys/kcontrol/actions_listview_widget.h
@@ -0,0 +1,151 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _ACTIONS_LISTVIEW_WIDGET_H_
+#define _ACTIONS_LISTVIEW_WIDGET_H_
+
+#include <khlistview.h>
+
+#include <action_data.h>
+
+#include <actions_listview_widget_ui.h>
+
+class QDragObject;
+
+namespace KHotKeys
+{
+
+class Action_listview_item;
+class Action_data_base;
+
+class Actions_listview_widget
+ : public Actions_listview_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Actions_listview_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ Action_listview_item* current_action() const;
+ void set_current_action( Action_listview_item* item );
+ Action_data_base* current_action_data() const;
+ void set_action_data( Action_data_base* data_P, bool recent_action_P = false );
+ void action_name_changed( const QString& name_P );
+ void clear();
+ void build_up();
+ void new_action( Action_data_base* data_P );
+ void delete_action();
+ private:
+ Action_listview_item* create_item( QListViewItem* parent_P, QListViewItem* after_P, Action_data_base* data_P );
+ void build_up_recursively( Action_data_group* parent_P,
+ Action_listview_item* item_parent_P );
+ Action_listview_item* recent_item;
+ Action_listview_item* saved_current_item;
+ private slots:
+ void item_moved( QListViewItem* item_P, QListViewItem* was_after_P, QListViewItem* after_P );
+ void current_changed( QListViewItem* item_P );
+ signals:
+ void current_action_changed();
+ };
+
+class Actions_listview
+ : public KHListView
+ {
+ Q_OBJECT
+ public:
+ Actions_listview( QWidget* parent_P = NULL, const char* name_P = NULL );
+ Actions_listview_widget* widget();
+ private:
+ Actions_listview_widget* _widget;
+ };
+
+// CHECKME a jak to bude s parent itemu, kdyz Action_data uz maji vlastni parent ?
+class Action_listview_item
+ : public QListViewItem
+ {
+ public:
+ virtual QString text( int column_P ) const;
+ Action_data_base* data() const;
+ void set_data( Action_data_base* data_P );
+ Action_listview_item( QListView* parent_P, QListViewItem* after_P,
+ Action_data_base* data_P );
+ Action_listview_item( QListViewItem* parent_P, QListViewItem* after_P,
+ Action_data_base* data_P );
+ protected:
+ Action_data_base* _data; // CHECKME doesn't own !!!
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Actions_listview_widget
+
+inline
+Action_listview_item* Actions_listview_widget::current_action() const
+ {
+ return saved_current_item;
+ }
+
+inline
+Action_data_base* Actions_listview_widget::current_action_data() const
+ {
+ return current_action() != NULL ? current_action()->data() : NULL;
+ }
+
+inline
+void Actions_listview_widget::clear()
+ {
+ actions_listview->clear();
+ recent_item = 0;
+ saved_current_item = 0;
+ }
+
+// Actions_listview
+
+inline
+Actions_listview_widget* Actions_listview::widget()
+ {
+ return _widget;
+ }
+
+// Action_listview_item
+
+inline
+Action_listview_item::Action_listview_item( QListView* parent_P, QListViewItem* after_P,
+ Action_data_base* data_P )
+ : QListViewItem( parent_P, after_P ), _data( data_P )
+ {
+ if( dynamic_cast< Action_data_group* >( data_P ))
+ setExpandable( true );
+ }
+
+inline
+Action_listview_item::Action_listview_item( QListViewItem* parent_P, QListViewItem* after_P,
+ Action_data_base* data_P )
+ : QListViewItem( parent_P, after_P ), _data( data_P )
+ {
+ if( dynamic_cast< Action_data_group* >( data_P ))
+ setExpandable( true );
+ }
+
+inline
+Action_data_base* Action_listview_item::data() const
+ {
+ return _data;
+ }
+
+inline
+void Action_listview_item::set_data( Action_data_base* data_P )
+ {
+ _data = data_P;
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/activate_window_widget.h b/khotkeys/kcontrol/activate_window_widget.h
new file mode 100644
index 000000000..64291e7f4
--- /dev/null
+++ b/khotkeys/kcontrol/activate_window_widget.h
@@ -0,0 +1,28 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _ACTIVATE_WINDOW_WIDGET_H_
+#define _ACTIVATE_WINDOW_WIDGET_H_
+
+#include "windowdef_list_widget.h"
+
+namespace KHotKeys
+{
+
+typedef Windowdef_list_widget Activate_window_widget;
+typedef Activate_window_widget Activate_window_tab;
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/command_url_widget.cpp b/khotkeys/kcontrol/command_url_widget.cpp
new file mode 100644
index 000000000..936ceca99
--- /dev/null
+++ b/khotkeys/kcontrol/command_url_widget.cpp
@@ -0,0 +1,70 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _COMMAND_URL_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "command_url_widget.h"
+
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <klineedit.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <kurlrequester.h>
+
+#include <actions.h>
+#include <action_data.h>
+#include <windowdef_list_widget.h>
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Command_url_widget::Command_url_widget( QWidget* parent_P, const char* name_P )
+ : Command_url_widget_ui( parent_P, name_P )
+ {
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( command_url_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+void Command_url_widget::clear_data()
+ {
+ command_url_lineedit->lineEdit()->clear();
+ }
+
+void Command_url_widget::set_data( const Command_url_action* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ command_url_lineedit->lineEdit()->setText( data_P->command_url());
+ }
+
+Command_url_action* Command_url_widget::get_data( Action_data* data_P ) const
+ {
+ return new Command_url_action( data_P, command_url_lineedit->lineEdit()->text());
+ }
+
+void Command_url_widget::browse_pressed()
+ { // CHECKME TODO
+ }
+
+} // namespace KHotKeys
+
+#include "command_url_widget.moc"
diff --git a/khotkeys/kcontrol/command_url_widget.h b/khotkeys/kcontrol/command_url_widget.h
new file mode 100644
index 000000000..cc7e7430d
--- /dev/null
+++ b/khotkeys/kcontrol/command_url_widget.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _COMMAND_URL_WIDGET_H_
+#define _COMMAND_URL_WIDGET_H_
+
+#include <command_url_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Command_url_action;
+class Action_data;
+
+class Command_url_widget
+ : public Command_url_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Command_url_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Command_url_action* data_P );
+ Command_url_action* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ protected slots:
+ virtual void browse_pressed();
+ };
+
+typedef Command_url_widget Command_url_tab;
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/condition_list_widget.cpp b/khotkeys/kcontrol/condition_list_widget.cpp
new file mode 100644
index 000000000..407798d58
--- /dev/null
+++ b/khotkeys/kcontrol/condition_list_widget.cpp
@@ -0,0 +1,395 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _CONDITIONS_LIST_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "condition_list_widget.h"
+
+#include <assert.h>
+#include <qpushbutton.h>
+#include <qheader.h>
+#include <qlineedit.h>
+#include <qpopupmenu.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <khlistview.h>
+
+#include <conditions.h>
+
+#include "windowdef_list_widget.h"
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+// Condition_list_widget
+
+Condition_list_widget::Condition_list_widget( QWidget* parent_P, const char* name_P )
+ : Condition_list_widget_ui( parent_P, name_P ), selected_item( NULL )
+ {
+ conditions.setAutoDelete( true );
+ QPopupMenu* popup = new QPopupMenu; // CHECKME looks like setting parent doesn't work
+ popup->insertItem( i18n( "Active Window..." ), TYPE_ACTIVE_WINDOW );
+ popup->insertItem( i18n( "Existing Window..." ), TYPE_EXISTING_WINDOW );
+ popup->insertItem( i18n( "Not_condition", "Not" ), TYPE_NOT );
+ popup->insertItem( i18n( "And_condition", "And" ), TYPE_AND );
+ popup->insertItem( i18n( "Or_condition", "Or" ), TYPE_OR );
+ connect( conditions_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( modify_pressed() ) );
+
+ connect( popup, SIGNAL( activated( int )), SLOT( new_selected( int )));
+ new_button->setPopup( popup );
+ conditions_listview->header()->hide();
+ conditions_listview->addColumn( "" );
+ conditions_listview->setSorting( -1 );
+ conditions_listview->setRootIsDecorated( true ); // CHECKME
+ conditions_listview->setForceSelect( true );
+ copy_button->setEnabled( false );
+ modify_button->setEnabled( false );
+ delete_button->setEnabled( false );
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( new_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( copy_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( modify_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( delete_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+Condition_list_widget::~Condition_list_widget()
+ {
+ delete new_button->popup();
+ }
+
+void Condition_list_widget::clear_data()
+ {
+ comment_lineedit->clear();
+ conditions.clear();
+ conditions_listview->clear();
+ }
+
+void Condition_list_widget::set_data( const Condition_list* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ comment_lineedit->setText( data_P->comment());
+ conditions.clear();
+ conditions_listview->clear();
+ insert_listview_items( data_P, conditions_listview, NULL );
+#ifdef KHOTKEYS_DEBUG
+ kdDebug( 1217 ) << "Condition_list_widget::set_data():" << endl;
+ Condition::debug_list( conditions );
+#endif
+ }
+
+void Condition_list_widget::insert_listview_items( const Condition_list_base* parent_P,
+ QListView* parent1_P, Condition_list_item* parent2_P )
+ {
+ Condition_list_item* prev = NULL;
+ for( Condition_list_base::Iterator it( *parent_P );
+ *it;
+ ++it )
+ {
+ prev = create_listview_item( *it, parent1_P, parent2_P, prev, true );
+ if( Condition_list_base* group = dynamic_cast< Condition_list_base* >( *it ))
+ insert_listview_items( group, NULL, prev );
+ }
+ }
+
+Condition_list* Condition_list_widget::get_data( Action_data_base* data_P ) const
+ {
+#ifdef KHOTKEYS_DEBUG
+ kdDebug( 1217 ) << "Condition_list_widget::get_data():" << endl;
+ Condition::debug_list( conditions );
+#endif
+// CHECKME TODO hmm, tady to bude chtit asi i children :(
+ Condition_list* list = new Condition_list( comment_lineedit->text(), data_P );
+ get_listview_items( list, conditions_listview->firstChild());
+ return list;
+ }
+
+void Condition_list_widget::get_listview_items( Condition_list_base* list_P,
+ QListViewItem* first_item_P ) const
+ {
+ list_P->clear();
+ for( QListViewItem* pos = first_item_P;
+ pos != NULL;
+ pos = pos->nextSibling())
+ {
+ Condition* cond = static_cast< Condition_list_item* >( pos )->condition()->copy( list_P );
+ if( Condition_list_base* group = dynamic_cast< Condition_list_base* >( cond ))
+ get_listview_items( group, pos->firstChild());
+ }
+ }
+
+void Condition_list_widget::new_selected( int type_P )
+ {
+ Condition_list_item* parent = NULL;
+ Condition_list_item* after = NULL;
+ if( selected_item && selected_item->condition())
+ {
+ Condition_list_base* tmp = dynamic_cast< Condition_list_base* >
+ ( selected_item->condition());
+ if( tmp && tmp->accepts_children())
+ {
+ int ret = KMessageBox::questionYesNoCancel( NULL,
+ i18n( "A group is selected.\nAdd the new condition in this selected group?" ), QString::null, i18n("Add in Group"), i18n("Ignore Group"));
+ if( ret == KMessageBox::Cancel )
+ return;
+ else if( ret == KMessageBox::Yes )
+ parent = selected_item;
+ else
+ parent = NULL;
+ }
+ }
+ if( parent == NULL && selected_item != NULL && selected_item->parent() != NULL )
+ {
+ parent = static_cast< Condition_list_item* >( selected_item->parent());
+ after = selected_item;
+ }
+ Condition_list_base* parent_cond = parent
+ ? static_cast< Condition_list_base* >( parent->condition()) : NULL;
+ assert( !parent || dynamic_cast< Condition_list_base* >( parent->condition()));
+ Condition_dialog* dlg = NULL;
+ Condition* condition = NULL;
+ switch( type_P )
+ {
+ case TYPE_ACTIVE_WINDOW: // Active_window_condition
+ dlg = new Active_window_condition_dialog(
+ new Active_window_condition( new Windowdef_list( "" ), parent_cond )); // CHECKME NULL
+ break;
+ case TYPE_EXISTING_WINDOW: // Existing_window_condition
+ dlg = new Existing_window_condition_dialog(
+ new Existing_window_condition( new Windowdef_list( "" ), parent_cond )); // CHECKME NULL
+ break;
+ case TYPE_NOT: // Not_condition
+ condition = new Not_condition( parent_cond );
+ break;
+ case TYPE_AND: // And_condition
+ condition = new And_condition( parent_cond );
+ break;
+ case TYPE_OR: // Or_condition
+ condition = new Or_condition( parent_cond );
+ break;
+ }
+ if( dlg != NULL )
+ {
+ condition = dlg->edit_condition();
+ delete dlg;
+ }
+ if( condition != NULL )
+ {
+ if( parent != NULL )
+ conditions_listview->setSelected( create_listview_item( condition,
+ NULL, parent, after, false ), true );
+ else
+ conditions_listview->setSelected( create_listview_item( condition,
+ conditions_listview, NULL, selected_item, false ), true );
+ }
+ }
+
+void Condition_list_widget::copy_pressed()
+ {
+ if ( !selected_item )
+ return;
+ conditions_listview->setSelected( create_listview_item(
+ selected_item->condition()->copy( selected_item->condition()->parent()),
+ selected_item->parent() ? NULL : conditions_listview,
+ static_cast< Condition_list_item* >( selected_item->parent()),
+ selected_item, true ), true );
+ }
+
+void Condition_list_widget::delete_pressed()
+{
+ if ( selected_item )
+ {
+ conditions.remove( selected_item->condition()); // we own it
+ delete selected_item; // CHECKME snad vyvola signaly pro enable()
+ selected_item = NULL;
+ }
+}
+
+void Condition_list_widget::modify_pressed()
+ {
+ if ( !selected_item )
+ return;
+ edit_listview_item( selected_item );
+ }
+
+void Condition_list_widget::current_changed( QListViewItem* item_P )
+ {
+// if( item_P == selected_item )
+// return;
+ selected_item = static_cast< Condition_list_item* >( item_P );
+// conditions_listview->setSelected( selected_item, true );
+ copy_button->setEnabled( selected_item != NULL );
+ delete_button->setEnabled( selected_item != NULL );
+ if( selected_item != NULL )
+ { // not,and,or can't be modified
+ if( dynamic_cast< Not_condition* >( selected_item->condition()) == NULL
+ && dynamic_cast< And_condition* >( selected_item->condition()) == NULL
+ && dynamic_cast< Or_condition* >( selected_item->condition()) == NULL )
+ {
+ modify_button->setEnabled( true );
+ }
+ else
+ modify_button->setEnabled( false );
+ }
+ else
+ modify_button->setEnabled( false );
+ }
+
+Condition_list_item* Condition_list_widget::create_listview_item( Condition* condition_P,
+ QListView* parent1_P, Condition_list_item* parent2_P, QListViewItem* after_P, bool copy_P )
+ {
+#ifdef KHOTKEYS_DEBUG
+ kdDebug( 1217 ) << "Condition_list_widget::create_listview_item():" << endl;
+ Condition::debug_list( conditions );
+ kdDebug( 1217 ) << kdBacktrace() << endl;
+#endif
+ Condition* new_cond = copy_P ? condition_P->copy( parent2_P
+ ? static_cast< Condition_list_base* >( parent2_P->condition()) : NULL ) : condition_P;
+ assert( !copy_P || !parent2_P || dynamic_cast< Condition_list_base* >( parent2_P->condition()));
+// CHECKME uz by nemelo byt treba
+/* if( after_P == NULL )
+ {
+ if( parent1_P == NULL )
+ return new Condition_list_item( parent2_P, new_win );
+ else
+ return new Condition_list_item( parent1_P, new_win );
+ }
+ else*/
+ {
+ if( parent1_P == NULL )
+ {
+ parent2_P->setOpen( true );
+ if( new_cond->parent() == NULL ) // own only toplevels, they own the rest
+ conditions.append( new_cond ); // we own it, not the listview
+ return new Condition_list_item( parent2_P, after_P, new_cond );
+ }
+ else
+ {
+ if( new_cond->parent() == NULL )
+ conditions.append( new_cond ); // we own it, not the listview
+ return new Condition_list_item( parent1_P, after_P, new_cond );
+ }
+ }
+ }
+
+void Condition_list_widget::edit_listview_item( Condition_list_item* item_P )
+ {
+ Condition_dialog* dlg = NULL;
+ if( Active_window_condition* condition
+ = dynamic_cast< Active_window_condition* >( item_P->condition()))
+ dlg = new Active_window_condition_dialog( condition );
+ else if( Existing_window_condition* condition
+ = dynamic_cast< Existing_window_condition* >( item_P->condition()))
+ dlg = new Existing_window_condition_dialog( condition );
+ else if( dynamic_cast< Not_condition* >( item_P->condition()) != NULL )
+ return;
+ else if( dynamic_cast< And_condition* >( item_P->condition()) != NULL )
+ return;
+ else if( dynamic_cast< Or_condition* >( item_P->condition()) != NULL )
+ return;
+ else // CHECKME TODO pridat dalsi
+ assert( false );
+ Condition* new_condition = dlg->edit_condition();
+ if( new_condition != NULL )
+ {
+ Condition* old_cond = item_P->condition();
+ item_P->set_condition( new_condition );
+ int pos = conditions.find( old_cond );
+ if( pos >= 0 )
+ {
+ conditions.remove( pos ); // we own it
+ conditions.insert( pos, new_condition );
+ }
+ item_P->widthChanged( 0 );
+ conditions_listview->repaintItem( item_P );
+ }
+#ifdef KHOTKEYS_DEBUG
+ kdDebug( 1217 ) << "Condition_list_widget::edit_listview_item():" << endl;
+ Condition::debug_list( conditions );
+#endif
+ delete dlg;
+ }
+
+// Condition_list_item
+
+QString Condition_list_item::text( int column_P ) const
+ {
+ return column_P == 0 ? condition()->description() : QString::null;
+ }
+
+// Active_window_condition_dialog
+
+Active_window_condition_dialog::Active_window_condition_dialog(
+ Active_window_condition* condition_P )
+ : KDialogBase( NULL, NULL, true, i18n( "Window Details" ), Ok | Cancel ), condition( NULL )
+ {
+ widget = new Windowdef_list_widget( this );
+ widget->set_data( condition_P->window());
+ setMainWidget( widget );
+ }
+
+Condition* Active_window_condition_dialog::edit_condition()
+ {
+ exec();
+ return condition;
+ }
+
+void Active_window_condition_dialog::accept()
+ {
+ KDialogBase::accept();
+ condition = new Active_window_condition( widget->get_data(), NULL ); // CHECKME NULL ?
+ }
+
+// Existing_window_condition_dialog
+
+Existing_window_condition_dialog::Existing_window_condition_dialog(
+ Existing_window_condition* condition_P )
+ : KDialogBase( NULL, NULL, true, i18n( "Window Details" ), Ok | Cancel ), condition( NULL )
+ {
+ widget = new Windowdef_list_widget( this );
+ widget->set_data( condition_P->window());
+ setMainWidget( widget );
+ }
+
+Condition* Existing_window_condition_dialog::edit_condition()
+ {
+ exec();
+ return condition;
+ }
+
+void Existing_window_condition_dialog::accept()
+ {
+ KDialogBase::accept();
+ condition = new Existing_window_condition( widget->get_data(), NULL ); // CHECKME NULL ?
+ }
+
+} // namespace KHotKeys
+
+#include "condition_list_widget.moc"
diff --git a/khotkeys/kcontrol/condition_list_widget.h b/khotkeys/kcontrol/condition_list_widget.h
new file mode 100644
index 000000000..e24739763
--- /dev/null
+++ b/khotkeys/kcontrol/condition_list_widget.h
@@ -0,0 +1,165 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _CONDITIONS_LIST_WIDGET_H_
+#define _CONDITIONS_LIST_WIDGET_H_
+
+#include <qlistview.h>
+#include <qptrlist.h>
+
+#include <kdialogbase.h>
+
+#include <conditions.h>
+#include <condition_list_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Action_data;
+class Windowdef_list_widget;
+
+class Condition_list_item;
+
+class Condition_list_widget
+ : public Condition_list_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Condition_list_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ virtual ~Condition_list_widget();
+ void set_data( const Condition_list* data_P );
+ Condition_list* get_data( Action_data_base* data_P ) const;
+ public slots:
+ void clear_data();
+ protected:
+ Condition_list_item* create_listview_item( Condition* condition_P, QListView* parent1_P,
+ Condition_list_item* parent2_P, QListViewItem* after_P, bool copy_P );
+ void edit_listview_item( Condition_list_item* item_P );
+ enum type_t { TYPE_ACTIVE_WINDOW, TYPE_EXISTING_WINDOW, TYPE_NOT, TYPE_AND, TYPE_OR };
+ protected slots:
+ void new_selected( int type_P );
+ virtual void copy_pressed();
+ virtual void delete_pressed();
+ virtual void modify_pressed();
+ virtual void current_changed( QListViewItem* item_P );
+ private:
+ void insert_listview_items( const Condition_list_base* parent_P,
+ QListView* parent1_P, Condition_list_item* parent2_P );
+ void get_listview_items( Condition_list_base* list_P, QListViewItem* first_item_P ) const;
+ Condition_list_item* selected_item;
+ QPtrList< Condition > conditions;
+ };
+
+typedef Condition_list_widget Condition_list_tab;
+
+class Condition_list_item
+ : public QListViewItem
+ {
+ public:
+ Condition_list_item( QListView* parent_P, Condition* condition_P );
+ Condition_list_item( QListViewItem* parent_P, Condition* condition_P );
+ Condition_list_item( QListView* parent_P, QListViewItem* after_P, Condition* condition_P );
+ Condition_list_item( QListViewItem* parent_P, QListViewItem* after_P,
+ Condition* condition_P );
+ virtual QString text( int column_P ) const;
+ Condition* condition() const;
+ void set_condition( Condition* condition_P );
+ protected:
+ Condition* _condition; // owns it
+ };
+
+class Condition_dialog
+ {
+ public:
+ virtual Condition* edit_condition() = 0;
+ virtual ~Condition_dialog();
+ };
+
+class Active_window_condition_dialog
+ : public KDialogBase, public Condition_dialog
+ {
+ Q_OBJECT
+ public:
+ Active_window_condition_dialog( Active_window_condition* condition_P );
+ virtual Condition* edit_condition();
+ protected:
+ virtual void accept();
+ Windowdef_list_widget* widget;
+ Active_window_condition* condition;
+ };
+
+class Existing_window_condition_dialog
+ : public KDialogBase, public Condition_dialog
+ {
+ Q_OBJECT
+ public:
+ Existing_window_condition_dialog( Existing_window_condition* condition_P );
+ virtual Condition* edit_condition();
+ protected:
+ virtual void accept();
+ Windowdef_list_widget* widget;
+ Existing_window_condition* condition;
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Condition_list_item
+
+inline
+Condition_list_item::Condition_list_item( QListView* parent_P, Condition* condition_P )
+ : QListViewItem( parent_P ), _condition( condition_P )
+ {
+ }
+
+inline
+Condition_list_item::Condition_list_item( QListViewItem* parent_P, Condition* condition_P )
+ : QListViewItem( parent_P ), _condition( condition_P )
+ {
+ }
+
+inline
+Condition_list_item::Condition_list_item( QListView* parent_P, QListViewItem* after_P,
+ Condition* condition_P )
+ : QListViewItem( parent_P, after_P ), _condition( condition_P )
+ {
+ }
+
+inline
+Condition_list_item::Condition_list_item( QListViewItem* parent_P, QListViewItem* after_P,
+ Condition* condition_P )
+ : QListViewItem( parent_P, after_P ), _condition( condition_P )
+ {
+ }
+
+inline
+Condition* Condition_list_item::condition() const
+ {
+ return _condition;
+ }
+
+inline
+void Condition_list_item::set_condition( Condition* condition_P )
+ {
+ _condition = condition_P;
+ }
+
+// Condition_dialog
+
+inline
+Condition_dialog::~Condition_dialog()
+ {
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/dcop_widget.cpp b/khotkeys/kcontrol/dcop_widget.cpp
new file mode 100644
index 000000000..6cc8773a1
--- /dev/null
+++ b/khotkeys/kcontrol/dcop_widget.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _DCOP_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "dcop_widget.h"
+
+#include <qlineedit.h>
+#include <qpushbutton.h>
+
+#include <krun.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include <actions.h>
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Dcop_widget::Dcop_widget( QWidget* parent_P, const char* name_P )
+ : Dcop_widget_ui( parent_P, name_P )
+ {
+ clear_data();
+ try_button->setText( i18n( "to try", "&Try" )); // Qt designer can't do this
+ // KHotKeys::Module::changed()
+ connect( remote_app_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( remote_object_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( called_function_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( arguments_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+void Dcop_widget::clear_data()
+ {
+ remote_app_lineedit->clear();
+ remote_object_lineedit->clear();
+ called_function_lineedit->clear();
+ arguments_lineedit->clear();
+ // CHECKME nebo spis multilineedit ?
+ }
+
+void Dcop_widget::set_data( const Dcop_action* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ remote_app_lineedit->setText( data_P->remote_application());
+ remote_object_lineedit->setText( data_P->remote_object());
+ called_function_lineedit->setText( data_P->called_function());
+ arguments_lineedit->setText( data_P->arguments());
+ // CHECKME nebo spis multilineedit ?
+ }
+
+Dcop_action* Dcop_widget::get_data( Action_data* data_P ) const
+ {
+ return new Dcop_action( data_P, remote_app_lineedit->text().stripWhiteSpace(),
+ remote_object_lineedit->text().stripWhiteSpace(),
+ called_function_lineedit->text().stripWhiteSpace(), arguments_lineedit->text());
+ }
+
+// CHECKME later "steal" whole interfaces browsing from kdcop
+void Dcop_widget::run_kdcop_pressed()
+ {
+ if( KRun::runCommand( "kdcop" ) == 0 )
+ KMessageBox::sorry( NULL, i18n( "Failed to run KDCOP" ));
+ }
+
+void Dcop_widget::try_pressed()
+ {
+ Dcop_action* tmp = get_data( NULL ); // CHECKME
+ tmp->execute();
+ delete tmp;
+ }
+
+} // namespace KHotKeys
+
+#include "dcop_widget.moc"
diff --git a/khotkeys/kcontrol/dcop_widget.h b/khotkeys/kcontrol/dcop_widget.h
new file mode 100644
index 000000000..83cb6fabe
--- /dev/null
+++ b/khotkeys/kcontrol/dcop_widget.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _DCOP_WIDGET_H_
+#define _DCOP_WIDGET_H_
+
+#include <dcop_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Dcop_action;
+class Action_data;
+
+class Dcop_widget
+ : public Dcop_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Dcop_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Dcop_action* data_P );
+ Dcop_action* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ protected slots:
+ virtual void run_kdcop_pressed();
+ virtual void try_pressed();
+ };
+
+typedef Dcop_widget Dcop_tab;
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/general_settings_tab.cpp b/khotkeys/kcontrol/general_settings_tab.cpp
new file mode 100644
index 000000000..77a262a31
--- /dev/null
+++ b/khotkeys/kcontrol/general_settings_tab.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _GENERAL_SETTINGS_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "general_settings_tab.h"
+
+#include <qcheckbox.h>
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+General_settings_tab::General_settings_tab( QWidget* parent_P, const char* name_P )
+ : General_settings_tab_ui( parent_P, name_P )
+ {
+ // KHotKeys::Module::changed()
+ connect( disable_daemon_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ }
+
+void General_settings_tab::import_clicked()
+ {
+ module->import();
+ }
+
+void General_settings_tab::write_data() const
+ {
+ module->set_daemon_disabled( disable_daemon_checkbox->isChecked());
+ }
+
+void General_settings_tab::read_data()
+ {
+ disable_daemon_checkbox->setChecked( module->daemon_disabled());
+ }
+
+void General_settings_tab::clear_data()
+ {
+ // "global" tab, not action specific, do nothing
+ }
+
+} // namespace KHotKeys
+
+#include "general_settings_tab.moc"
diff --git a/khotkeys/kcontrol/general_settings_tab.h b/khotkeys/kcontrol/general_settings_tab.h
new file mode 100644
index 000000000..5140b1110
--- /dev/null
+++ b/khotkeys/kcontrol/general_settings_tab.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _GENERAL_SETTINGS_TAB_H_
+#define _GENERAL_SETTINGS_TAB_H_
+
+#include <general_settings_tab_ui.h>
+
+namespace KHotKeys
+{
+
+class General_settings_tab
+ : public General_settings_tab_ui
+ {
+ Q_OBJECT
+ public:
+ General_settings_tab( QWidget* parent = NULL, const char* name = NULL );
+ void read_data();
+ void write_data() const;
+ public slots:
+ void clear_data();
+ protected slots:
+ virtual void import_clicked();
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/general_tab.cpp b/khotkeys/kcontrol/general_tab.cpp
new file mode 100644
index 000000000..8c7025e69
--- /dev/null
+++ b/khotkeys/kcontrol/general_tab.cpp
@@ -0,0 +1,136 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _GENERAL_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "general_tab.h"
+
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <ktextedit.h>
+
+#include <actions.h>
+#include <action_data.h>
+
+#include "tab_widget.h"
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+General_tab::General_tab( QWidget* parent_P, const char* name_P )
+ : General_tab_ui( parent_P, name_P )
+ {
+ for( Tab_widget::action_type_t i = Tab_widget::TYPE_FIRST;
+ i < Tab_widget::TYPE_END;
+ ++i )
+ switch( i )
+ {
+ case Tab_widget::TYPE_GENERIC:
+ action_type_combo->insertItem( i18n( "Generic" ), i );
+ break;
+ case Tab_widget::TYPE_COMMAND_URL_SHORTCUT:
+ action_type_combo->insertItem(
+ i18n( "Keyboard Shortcut -> Command/URL (simple)" ), i );
+ break;
+ case Tab_widget::TYPE_MENUENTRY_SHORTCUT:
+ action_type_combo->insertItem(
+ i18n( "K-Menu Entry (simple)" ), i );
+ break;
+ case Tab_widget::TYPE_DCOP_SHORTCUT:
+ action_type_combo->insertItem(
+ i18n( "Keyboard Shortcut -> DCOP Call (simple)" ), i );
+ break;
+ case Tab_widget::TYPE_KEYBOARD_INPUT_SHORTCUT:
+ action_type_combo->insertItem(
+ i18n( "Keyboard Shortcut -> Keyboard Input (simple)" ), i );
+ break;
+ case Tab_widget::TYPE_KEYBOARD_INPUT_GESTURE:
+ action_type_combo->insertItem(
+ i18n( "Gesture -> Keyboard Input (simple)" ), i );
+ break;
+ case Tab_widget::TYPE_ACTIVATE_WINDOW_SHORTCUT:
+ action_type_combo->insertItem(
+ i18n( "Keyboard Shortcut -> Activate Window (simple)" ), i );
+ break;
+ case Tab_widget::TYPE_END:
+ assert( false );
+ }
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( action_name_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( disable_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_multilineedit, SIGNAL( textChanged()),
+ module, SLOT( changed()));
+ connect( action_type_combo, SIGNAL( activated( int )),
+ module, SLOT( changed()));
+ }
+
+void General_tab::clear_data()
+ {
+ disconnect( action_name_lineedit, SIGNAL( textChanged( const QString& )),
+ this, SLOT( action_name_changed( const QString& )));
+ disconnect( action_type_combo, SIGNAL( activated( int )),
+ this, SIGNAL( action_type_changed( int ))); // CHECKME neodpoji to sloty od nej ?
+ action_name_lineedit->clear();
+ disable_checkbox->setChecked( false );
+ disable_checkbox->setText( i18n( "&Disable" ));
+ comment_multilineedit->clear();
+ action_type_combo->setCurrentItem( Tab_widget::TYPE_GENERIC );
+// module->set_action_type( data_P->type()); CHECKME tohle asi tady ne
+ }
+
+void General_tab::set_data( const Action_data* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ action_name_lineedit->setText( data_P->name());
+ disable_checkbox->setChecked( !data_P->enabled( true ));
+ if( !data_P->parent()->enabled( false ))
+ disable_checkbox->setText( i18n( "&Disable (group is disabled)" ));
+ else
+ disable_checkbox->setText( i18n( "&Disable" ));
+ comment_multilineedit->setText( data_P->comment());
+ action_type_combo->setCurrentItem( Tab_widget::type( data_P ));
+// module->set_action_type( data_P->type());
+ connect( action_name_lineedit, SIGNAL( textChanged( const QString& )),
+ SLOT( action_name_changed( const QString& )));
+ connect( action_type_combo, SIGNAL( activated( int )),
+ SIGNAL( action_type_changed( int )));
+ }
+
+void General_tab::get_data( QString& name_O, QString& comment_O, bool& enabled_O )
+ {
+ name_O = action_name_lineedit->text();
+ comment_O = comment_multilineedit->text();
+ enabled_O = !disable_checkbox->isChecked();
+ }
+
+void General_tab::action_name_changed( const QString& name_P )
+ {
+ module->action_name_changed( name_P );
+ }
+
+} // namespace KHotKeys
+
+#include "general_tab.moc"
diff --git a/khotkeys/kcontrol/general_tab.h b/khotkeys/kcontrol/general_tab.h
new file mode 100644
index 000000000..f9096b3ad
--- /dev/null
+++ b/khotkeys/kcontrol/general_tab.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _GENERAL_TAB_H_
+#define _GENERAL_TAB_H_
+
+#include <general_tab_ui.h>
+
+namespace KHotKeys
+{
+
+class Action_data;
+class Trigger_list;
+class Action_data_group;
+class Windowdef_list;
+class Action_list;
+
+class General_tab
+ : public General_tab_ui
+ {
+ Q_OBJECT
+ public:
+ General_tab( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Action_data* data_P );
+ void get_data( QString& name_O, QString& comment_O, bool& enabled_O );
+ public slots:
+ void clear_data();
+ signals:
+ void action_type_changed( int type_P );
+ protected slots:
+ void action_name_changed( const QString& name_P );
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/gesture_triggers_tab.cpp b/khotkeys/kcontrol/gesture_triggers_tab.cpp
new file mode 100644
index 000000000..bfcad0295
--- /dev/null
+++ b/khotkeys/kcontrol/gesture_triggers_tab.cpp
@@ -0,0 +1,161 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _GESTURE_TRIGGERS_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gesture_triggers_tab.h"
+
+#include <qpushbutton.h>
+#include <qlineedit.h>
+
+#include <triggers.h>
+#include <actions.h>
+#include <action_data.h>
+
+#include "kcmkhotkeys.h"
+#include "gesturedrawer.h"
+#include "gesturerecordpage.h"
+
+namespace KHotKeys
+{
+
+Gesture_triggers_tab::Gesture_triggers_tab( QWidget* parent_P, const char* name_P )
+ : Gesture_triggers_tab_ui( parent_P, name_P )
+ {
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( gesture_edit_button1, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( gesture_edit_button2, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( gesture_edit_button3, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ }
+
+void Gesture_triggers_tab::clear_data()
+ {
+ gesture1 = gesture2 = gesture3 = QString::null;
+ gesture_lineedit1->clear();
+ gesture_lineedit2->clear();
+ gesture_lineedit3->clear();
+ gesture_drawer1->setData( QString::null );
+ gesture_drawer2->setData( QString::null );
+ gesture_drawer3->setData( QString::null );
+ }
+
+void Gesture_triggers_tab::set_data( const Trigger_list* triggers_P )
+ {
+ if( triggers_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ Gesture_trigger* trig = NULL;
+ Trigger_list::Iterator it( *triggers_P );
+ if( it )
+ {
+ assert( dynamic_cast< Gesture_trigger* >( *it ));
+ trig = static_cast< Gesture_trigger* >( *it );
+ }
+ else
+ trig = NULL;
+ gesture1 = trig ? trig->gesturecode() : QString::null;
+ gesture_lineedit1->setText( gesture1 );
+ gesture_drawer1->setData( gesture1 );
+ ++it;
+ if( it )
+ {
+ assert( dynamic_cast< Gesture_trigger* >( *it ));
+ trig = static_cast< Gesture_trigger* >( *it );
+ }
+ else
+ trig = NULL;
+ gesture2 = trig ? trig->gesturecode() : QString::null;
+ gesture_lineedit2->setText( gesture2 );
+ gesture_drawer2->setData( gesture2 );
+ ++it;
+ if( it )
+ {
+ assert( dynamic_cast< Gesture_trigger* >( *it ));
+ trig = static_cast< Gesture_trigger* >( *it );
+ }
+ else
+ trig = NULL;
+ gesture3 = trig ? trig->gesturecode() : QString::null;
+ gesture_lineedit3->setText( gesture3 );
+ gesture_drawer3->setData( gesture3 );
+ }
+
+Trigger_list* Gesture_triggers_tab::get_data( Action_data* data_P ) const
+ {
+ Trigger_list* ret = new Trigger_list( "Gesture_triggers" );
+ if( !gesture1.isEmpty())
+ ret->append( new Gesture_trigger( data_P, gesture1 ));
+ if( !gesture2.isEmpty())
+ ret->append( new Gesture_trigger( data_P, gesture2 ));
+ if( !gesture3.isEmpty())
+ ret->append( new Gesture_trigger( data_P, gesture3 ));
+ return ret;
+ }
+
+void Gesture_triggers_tab::edit_gesture_pressed1()
+ {
+ Gesture_edit_dialog dlg( gesture1 );
+ gesture1 = dlg.edit_gesture();
+ gesture_lineedit1->setText( gesture1 );
+ gesture_drawer1->setData( gesture1 );
+ }
+
+void Gesture_triggers_tab::edit_gesture_pressed2()
+ {
+ Gesture_edit_dialog dlg( gesture2 );
+ gesture2 = dlg.edit_gesture();
+ gesture_lineedit2->setText( gesture2 );
+ gesture_drawer2->setData( gesture2 );
+ }
+
+void Gesture_triggers_tab::edit_gesture_pressed3()
+ {
+ Gesture_edit_dialog dlg( gesture3 );
+ gesture3 = dlg.edit_gesture();
+ gesture_lineedit3->setText( gesture3 );
+ gesture_drawer3->setData( gesture3 );
+ }
+
+// Gesture_edit_dialog
+
+Gesture_edit_dialog::Gesture_edit_dialog( const QString& gesture_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption
+ _gesture( gesture_P ), _page( NULL )
+ {
+ _page = new GestureRecordPage( _gesture,
+ this, "GestureRecordPage");
+
+// connect(_page, SIGNAL(gestureRecorded(bool)), // allow clearing the gesture
+// this, SLOT(enableButtonOK(bool)));
+
+ setMainWidget( _page );
+ }
+
+QString Gesture_edit_dialog::edit_gesture()
+ {
+ if( exec())
+ return _page->getGesture();
+ else
+ return _gesture;
+ }
+
+} // namespace KHotKeys
+
+#include "gesture_triggers_tab.moc"
diff --git a/khotkeys/kcontrol/gesture_triggers_tab.h b/khotkeys/kcontrol/gesture_triggers_tab.h
new file mode 100644
index 000000000..1bdaaf694
--- /dev/null
+++ b/khotkeys/kcontrol/gesture_triggers_tab.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _GESTURE_TRIGGERS_TAB_H_
+#define _GESTURE_TRIGGERS_TAB_H_
+
+#include <gesture_triggers_tab_ui.h>
+
+#include <qstring.h>
+
+#include <kdialogbase.h>
+
+namespace KHotKeys
+{
+
+class Trigger_list;
+class Action_data;
+
+class Gesture_triggers_tab
+ : public Gesture_triggers_tab_ui
+ {
+ Q_OBJECT
+ public:
+ Gesture_triggers_tab( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Trigger_list* triggers_P );
+ Trigger_list* get_data( Action_data* data_P ) const;
+ protected:
+ virtual void edit_gesture_pressed1();
+ virtual void edit_gesture_pressed2();
+ virtual void edit_gesture_pressed3();
+ public slots:
+ void clear_data();
+ private:
+ QString gesture1, gesture2, gesture3;
+ };
+
+class GestureRecordPage;
+
+class Gesture_edit_dialog
+ : public KDialogBase
+ {
+ Q_OBJECT
+ public:
+ Gesture_edit_dialog( const QString& gesture_P );
+ QString edit_gesture();
+ private:
+ // CHECKME accept() ?
+ QString _gesture;
+ GestureRecordPage *_page;
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/gesturedrawer.cpp b/khotkeys/kcontrol/gesturedrawer.cpp
new file mode 100644
index 000000000..646d2e469
--- /dev/null
+++ b/khotkeys/kcontrol/gesturedrawer.cpp
@@ -0,0 +1,161 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Mike Pilone <[email protected]>
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include <qcolor.h>
+#include <qpainter.h>
+
+#include "gesturedrawer.h"
+
+namespace KHotKeys
+{
+
+GestureDrawer::GestureDrawer(QWidget *parent, const char *name)
+ : QFrame(parent, name), _data(QString::null)
+ {
+ setBackgroundColor( colorGroup().base());
+ setFrameStyle(QFrame::Panel | QFrame::Sunken);
+ setMinimumSize(30, 30);
+ }
+
+GestureDrawer::~GestureDrawer()
+ {
+ }
+
+void GestureDrawer::setData(const QString &data)
+ {
+ _data = data;
+
+ repaint();
+ }
+
+void GestureDrawer::paintEvent(QPaintEvent *ev)
+ {
+ // Iterate through the data points and draw a line to each of them
+ Q_UINT32 startCell = 0;
+ Q_UINT32 endCell = 0;
+ QPoint startPoint;
+ QPoint endPoint;
+
+ QPainter p(this);
+
+ if (_data.length() > 0)
+ {
+ startCell = QString(_data[0]).toUInt();
+ }
+
+ for (Q_UINT32 index = 1; index < _data.length(); ++index)
+ {
+ endCell = QString(_data[index]).toUInt();
+
+ startPoint = lookupCellCoords(startCell);
+ endPoint = lookupCellCoords(endCell);
+
+ if (index == 1)
+ {
+ // Draw something to show the starting point
+ p.drawRect(startPoint.x()-2, startPoint.y()-2, 4, 4);
+ p.fillRect(startPoint.x()-2, startPoint.y()-2, 4, 4,
+ QBrush(black));
+ }
+
+ p.drawLine(startPoint, endPoint);
+ drawArrowHead(startPoint, endPoint, p);
+
+ startCell = endCell;
+ }
+
+ p.end();
+
+ QFrame::paintEvent(ev);
+ }
+
+QPoint GestureDrawer::lookupCellCoords(Q_UINT32 cell)
+ {
+ // First divide the widget into thirds, horizontally and vertically
+ Q_UINT32 w = width();
+ Q_UINT32 h = height();
+
+ Q_UINT32 wThird = w / 3;
+ Q_UINT32 hThird = h / 3;
+
+ switch(cell)
+ {
+ case 1:
+ return QPoint(wThird/2, 2*hThird+hThird/2);
+
+ case 2:
+ return QPoint(wThird+wThird/2, 2*hThird+hThird/2);
+
+ case 3:
+ return QPoint(2*wThird+wThird/2, 2*hThird+hThird/2);
+
+ case 4:
+ return QPoint(wThird/2, hThird+hThird/2);
+
+ case 5:
+ return QPoint(wThird+wThird/2, hThird+hThird/2);
+
+ case 6:
+ return QPoint(2*wThird+wThird/2, hThird+hThird/2);
+
+ case 7:
+ return QPoint(wThird/2, hThird/2);
+
+ case 8:
+ return QPoint(wThird+wThird/2, hThird/2);
+
+ case 9:
+ return QPoint(2*wThird+wThird/2, hThird/2);
+ }
+
+ return QPoint(0, 0);
+ }
+
+void GestureDrawer::drawArrowHead(QPoint &start, QPoint &end,
+ QPainter &p)
+ {
+ int deltaX = end.x() - start.x();
+ int deltaY = end.y() - start.y();
+
+ if (deltaY == 0)
+ {
+ // horizontal line
+ int offset = 0;
+ if (deltaX > 0)
+ offset = -3;
+ else
+ offset = 3;
+
+ p.drawLine(QPoint(end.x()+offset, end.y()+2), end);
+ p.drawLine(QPoint(end.x()+offset, end.y()-2), end);
+ }
+ else if (deltaX == 0)
+ {
+ // vertical line
+ int offset = 0;
+ if (deltaY > 0)
+ offset = -3;
+ else
+ offset = +3;
+
+ p.drawLine(QPoint(end.x()+2, end.y()+offset), end);
+ p.drawLine(QPoint(end.x()-2, end.y()+offset), end);
+ }
+ else
+ {
+ // diagnal - The math would be pretty complex, so don't do anything
+ }
+
+ }
+
+} // namespace KHotKeys
+
+#include "gesturedrawer.moc"
diff --git a/khotkeys/kcontrol/gesturedrawer.h b/khotkeys/kcontrol/gesturedrawer.h
new file mode 100644
index 000000000..bcc8ba7e8
--- /dev/null
+++ b/khotkeys/kcontrol/gesturedrawer.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Mike Pilone <[email protected]>
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef GESTURE_DRAWER_H
+#define GESTURE_DRAWER_H
+
+#include <qframe.h>
+#include <qstring.h>
+#include <qevent.h>
+#include <qpoint.h>
+#include <qwidget.h>
+#include <qsize.h>
+
+namespace KHotKeys
+{
+
+class GestureDrawer : public QFrame
+ {
+ Q_OBJECT
+ public:
+ GestureDrawer(QWidget *parent, const char *name);
+ ~GestureDrawer();
+
+ void setData(const QString &data);
+
+ virtual QSize sizeHint() const { return QSize(30, 30); }
+
+ protected:
+ void paintEvent(QPaintEvent *ev);
+
+ private:
+ QPoint lookupCellCoords(Q_UINT32 cell);
+ void drawArrowHead(QPoint &start, QPoint &end,
+ QPainter &p);
+
+
+ QString _data;
+ };
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/gesturerecorder.cpp b/khotkeys/kcontrol/gesturerecorder.cpp
new file mode 100644
index 000000000..d14614c77
--- /dev/null
+++ b/khotkeys/kcontrol/gesturerecorder.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Mike Pilone <[email protected]>
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include <qcolor.h>
+#include <qevent.h>
+
+#include "gesturerecorder.h"
+
+namespace KHotKeys
+{
+
+GestureRecorder::GestureRecorder(QWidget *parent, const char *name)
+ : QFrame(parent, name), _mouseButtonDown(false)
+ {
+ setBackgroundColor( colorGroup().base());
+ setFrameStyle(QFrame::Sunken | QFrame::Panel);
+ setLineWidth(2);
+ setMidLineWidth(0);
+ }
+
+GestureRecorder::~GestureRecorder()
+ {
+ }
+
+void GestureRecorder::mousePressEvent(QMouseEvent *ev)
+ {
+ if (ev->button() == QMouseEvent::LeftButton)
+ {
+ _mouseButtonDown = true;
+ stroke.reset();
+ QPoint pos = ev->pos();
+ stroke.record(pos.x(), pos.y());
+ }
+ }
+
+void GestureRecorder::mouseReleaseEvent(QMouseEvent *ev)
+ {
+ if ((ev->button() == QMouseEvent::LeftButton) && (_mouseButtonDown))
+ {
+ QPoint pos = ev->pos();
+ stroke.record(pos.x(), pos.y());
+ QString data( stroke.translate());
+ if( !data.isEmpty())
+ emit recorded(data);
+ }
+ }
+
+void GestureRecorder::mouseMoveEvent(QMouseEvent *ev)
+ {
+ if (_mouseButtonDown)
+ {
+ QPoint pos = ev->pos();
+ stroke.record(pos.x(), pos.y());
+ }
+ }
+
+} // namespace KHotKeys
+
+#include "gesturerecorder.moc"
diff --git a/khotkeys/kcontrol/gesturerecorder.h b/khotkeys/kcontrol/gesturerecorder.h
new file mode 100644
index 000000000..707243d81
--- /dev/null
+++ b/khotkeys/kcontrol/gesturerecorder.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Mike Pilone <[email protected]>
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef GESTURE_RECORDER_H
+#define GESTURE_RECORDER_H
+
+#include <qframe.h>
+#include <qstring.h>
+
+#include <gestures.h>
+
+class QMouseEvent;
+
+namespace KHotKeys
+{
+
+class GestureRecorder : public QFrame
+ {
+ Q_OBJECT
+
+ public:
+ GestureRecorder(QWidget *parent, const char *name);
+ ~GestureRecorder();
+
+ protected:
+ void mousePressEvent(QMouseEvent *);
+ void mouseReleaseEvent(QMouseEvent *);
+ void mouseMoveEvent(QMouseEvent *);
+
+ signals:
+ void recorded(const QString &data);
+
+ private:
+ bool _mouseButtonDown;
+ Stroke stroke;
+ };
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/gesturerecordpage.cpp b/khotkeys/kcontrol/gesturerecordpage.cpp
new file mode 100644
index 000000000..e24beaaf3
--- /dev/null
+++ b/khotkeys/kcontrol/gesturerecordpage.cpp
@@ -0,0 +1,147 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Mike Pilone <[email protected]>
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include <qwidget.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "gesturerecordpage.h"
+#include "gesturerecorder.h"
+#include "gesturedrawer.h"
+
+namespace KHotKeys
+{
+
+GestureRecordPage::GestureRecordPage(const QString &gesture,
+ QWidget *parent, const char *name)
+ : QVBox(parent, name),
+ _recorder(NULL), _resetButton(NULL),
+ _tryOne(NULL), _tryTwo(NULL), _tryThree(NULL), _gest(QString::null),
+ _tryCount(1)
+ {
+ QString message;
+
+ message = i18n("Draw the gesture you would like to record below. Press "
+ "and hold the left mouse button while drawing, and release "
+ "when you have finished.\n\n"
+ "You will be required to draw the gesture 3 times. After "
+ "each drawing, if they match, the indicators below will "
+ "change to represent which step you are on.\n\n"
+ "If at any point they do not match, you will be required to "
+ "restart. If you want to force a restart, use the reset "
+ "button below.\n\nDraw here:");
+
+ QLabel *label = new QLabel(message, this, "label");
+ label->setAlignment(QLabel::AlignLeft | QLabel::WordBreak |
+ QLabel::AlignVCenter);
+
+ _recorder = new GestureRecorder(this, "recorder");
+ _recorder->setMinimumHeight(150);
+ setStretchFactor(_recorder, 1);
+ connect(_recorder, SIGNAL(recorded(const QString &)),
+ this, SLOT(slotRecorded(const QString &)));
+
+ QHBox *hBox = new QHBox(this, "hbox");
+
+ _tryOne = new GestureDrawer(hBox, "tryOne");
+ _tryTwo = new GestureDrawer(hBox, "tryTwo");
+ _tryThree = new GestureDrawer(hBox, "tryThree");
+
+ QWidget *spacer = new QWidget(hBox, "spacer");
+ hBox->setStretchFactor(spacer, 1);
+
+ _resetButton = new QPushButton(i18n("&Reset"), hBox, "resetButton");
+ connect(_resetButton, SIGNAL(clicked()),
+ this, SLOT(slotResetClicked()));
+
+
+
+ // initialize
+ if (!gesture.isNull())
+ {
+ slotRecorded(gesture);
+ slotRecorded(gesture);
+ slotRecorded(gesture);
+ }
+ else
+ emit gestureRecorded(false);
+ }
+
+GestureRecordPage::~GestureRecordPage()
+ {
+ }
+
+void GestureRecordPage::slotRecorded(const QString &data)
+ {
+ switch (_tryCount)
+ {
+ case 1:
+ {
+ _gest = data;
+ _tryOne->setData(_gest);
+ _tryCount++;
+ }
+ break;
+
+ case 2:
+ {
+ if (_gest == data)
+ {
+ _tryTwo->setData(data);
+ _tryCount++;
+ }
+ else
+ {
+ KMessageBox::sorry(this, i18n("Your gestures did not match."));
+ slotResetClicked();
+ }
+ break;
+ }
+
+ case 3:
+ {
+ if (_gest == data)
+ {
+ _tryThree->setData(data);
+ _tryCount++;
+ emit gestureRecorded(true);
+ }
+ else
+ {
+ KMessageBox::sorry(this, i18n("Your gestures did not match."));
+ slotResetClicked();
+ }
+ break;
+ }
+ default:
+ KMessageBox::information(this, i18n("You have already completed the three required drawings. Either press 'Ok' to save or 'Reset' to try again."));
+ }
+ }
+
+void GestureRecordPage::slotResetClicked()
+ {
+ _gest = QString::null;
+
+ _tryOne->setData(QString::null);
+ _tryTwo->setData(QString::null);
+ _tryThree->setData(QString::null);
+
+ _tryCount = 1;
+
+ emit gestureRecorded(false);
+ }
+
+} // namespace KHotKeys
+
+#include "gesturerecordpage.moc"
diff --git a/khotkeys/kcontrol/gesturerecordpage.h b/khotkeys/kcontrol/gesturerecordpage.h
new file mode 100644
index 000000000..2636b47b3
--- /dev/null
+++ b/khotkeys/kcontrol/gesturerecordpage.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Mike Pilone <[email protected]>
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef GESTURE_RECORD_PAGE_H
+#define GESTURE_RECORD_PAGE_H
+
+#include <qvbox.h>
+
+#include "gesturedrawer.h"
+
+class QWidget;
+class QPushButton;
+class QLabel;
+
+namespace KHotKeys
+{
+
+class Gesture;
+class GestureRecorder;
+
+class GestureRecordPage : public QVBox
+ {
+ Q_OBJECT
+
+ public:
+ GestureRecordPage(const QString &gesture,
+ QWidget *parent, const char *name);
+ ~GestureRecordPage();
+
+ const QString &getGesture() const { return _gest; }
+
+ protected slots:
+ void slotRecorded(const QString &data);
+ void slotResetClicked();
+
+ signals:
+ void gestureRecorded(bool);
+
+ private:
+ GestureRecorder *_recorder;
+ QPushButton *_resetButton;
+ GestureDrawer *_tryOne;
+ GestureDrawer *_tryTwo;
+ GestureDrawer *_tryThree;
+
+ QString _gest;
+
+ Q_UINT32 _tryCount;
+ };
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/gestures_settings_tab.cpp b/khotkeys/kcontrol/gestures_settings_tab.cpp
new file mode 100644
index 000000000..e3c71c66a
--- /dev/null
+++ b/khotkeys/kcontrol/gestures_settings_tab.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _GESTURES_SETTINGS_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gestures_settings_tab.h"
+
+#include <klocale.h>
+#include <qcombobox.h>
+#include <knuminput.h>
+#include <qcheckbox.h>
+
+#include "kcmkhotkeys.h"
+#include "windowdef_list_widget.h"
+
+namespace KHotKeys
+{
+
+Gestures_settings_tab::Gestures_settings_tab( QWidget* parent_P, const char* name_P )
+ : Gestures_settings_tab_ui( parent_P, name_P )
+ {
+ mouse_button_combo->insertItem( i18n( "Button 2 (middle)" ), 0 );
+ mouse_button_combo->insertItem( i18n( "Button 3 (secondary)" ), 1 );
+ mouse_button_combo->insertItem( i18n( "Button 4 (often wheel up)" ), 2 );
+ mouse_button_combo->insertItem( i18n( "Button 5 (often wheel down)" ), 3 );
+ mouse_button_combo->insertItem( i18n( "Button 6 (if available)" ), 4 );
+ mouse_button_combo->insertItem( i18n( "Button 7 (if available)" ), 5 );
+ mouse_button_combo->insertItem( i18n( "Button 8 (if available)" ), 6 );
+ mouse_button_combo->insertItem( i18n( "Button 9 (if available)" ), 7 );
+ // KHotKeys::Module::changed()
+ connect( mouse_gestures_globally, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( mouse_button_combo, SIGNAL( activated( int )),
+ module, SLOT( changed()));
+ connect( timeout_input, SIGNAL( valueChanged( int )),
+ module, SLOT( changed()));
+ }
+
+void Gestures_settings_tab::read_data()
+ {
+ mouse_gestures_globally->setChecked( module->gestures_disabled());
+ mouse_button_combo->setCurrentItem( module->gesture_button() - 2 );
+ timeout_input->setValue( module->gesture_timeout());
+ if( module->gestures_exclude() != NULL )
+ windowdef_list_widget->set_data( module->gestures_exclude());
+ else
+ windowdef_list_widget->clear_data();
+ }
+
+void Gestures_settings_tab::write_data() const
+ {
+ module->set_gestures_disabled( mouse_gestures_globally->isChecked());
+ module->set_gesture_button( mouse_button_combo->currentItem() + 2 );
+ module->set_gesture_timeout( timeout_input->value());
+ module->set_gestures_exclude( windowdef_list_widget->get_data());
+ }
+
+void Gestures_settings_tab::clear_data()
+ {
+ // "global" tab, not action specific, do nothing
+ }
+
+} // namespace KHotKeys
+
+#include "gestures_settings_tab.moc"
diff --git a/khotkeys/kcontrol/gestures_settings_tab.h b/khotkeys/kcontrol/gestures_settings_tab.h
new file mode 100644
index 000000000..a02126d8f
--- /dev/null
+++ b/khotkeys/kcontrol/gestures_settings_tab.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _GESTURES_SETTINGS_TAB_H_
+#define _GESTURES_SETTINGS_TAB_H_
+
+#include <gestures_settings_tab_ui.h>
+
+namespace KHotKeys
+{
+
+class Gestures_settings_tab
+ : public Gestures_settings_tab_ui
+ {
+ Q_OBJECT
+ public:
+ Gestures_settings_tab( QWidget* parent = NULL, const char* name = NULL );
+ void read_data();
+ void write_data() const;
+ public slots:
+ void clear_data();
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/hi16-app-khotkeys.png b/khotkeys/kcontrol/hi16-app-khotkeys.png
new file mode 100644
index 000000000..1e919e897
--- /dev/null
+++ b/khotkeys/kcontrol/hi16-app-khotkeys.png
Binary files differ
diff --git a/khotkeys/kcontrol/hi32-app-khotkeys.png b/khotkeys/kcontrol/hi32-app-khotkeys.png
new file mode 100644
index 000000000..b1b86f875
--- /dev/null
+++ b/khotkeys/kcontrol/hi32-app-khotkeys.png
Binary files differ
diff --git a/khotkeys/kcontrol/info_tab.cpp b/khotkeys/kcontrol/info_tab.cpp
new file mode 100644
index 000000000..7363d27a1
--- /dev/null
+++ b/khotkeys/kcontrol/info_tab.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _INFO_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "info_tab.h"
+
+#include <qpushbutton.h>
+#include <qlabel.h>
+
+#include <klocale.h>
+
+namespace KHotKeys
+{
+
+Info_tab::Info_tab( QWidget* parent_P, const char* name_P )
+ : Info_tab_ui( parent_P, name_P )
+ {
+ clear_data();
+ }
+
+void Info_tab::clear_data()
+ {
+ // "global" tab, not action specific, do nothing
+ }
+
+} // namespace KHotKeys
+
+#include "info_tab.moc"
diff --git a/khotkeys/kcontrol/info_tab.h b/khotkeys/kcontrol/info_tab.h
new file mode 100644
index 000000000..72628fe75
--- /dev/null
+++ b/khotkeys/kcontrol/info_tab.h
@@ -0,0 +1,35 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _INFO_TAB_H_
+#define _INFO_TAB_H_
+
+#include <info_tab_ui.h>
+
+namespace KHotKeys
+{
+
+class Info_tab
+ : public Info_tab_ui
+ {
+ Q_OBJECT
+ public:
+ Info_tab( QWidget* parent_P = NULL, const char* name_P = NULL );
+ public slots:
+ void clear_data();
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/init.cpp b/khotkeys/kcontrol/init.cpp
new file mode 100644
index 000000000..3468690e2
--- /dev/null
+++ b/khotkeys/kcontrol/init.cpp
@@ -0,0 +1,47 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _INIT_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <stdlib.h>
+
+extern "C"
+{
+ KDE_EXPORT void init_khotkeys()
+ {
+ KConfig cfg( "khotkeysrc", true );
+ cfg.setGroup( "Main" );
+ if( !cfg.readBoolEntry( "Autostart", false ))
+ return;
+ // Non-xinerama multhead support in KDE is just a hack
+ // involving forking apps per-screen. Don't bother with
+ // kded modules in such case.
+ QCString multiHead = getenv("KDE_MULTIHEAD");
+ if (multiHead.lower() == "true")
+ kapp->kdeinitExec( "khotkeys" );
+ else
+ {
+ DCOPRef ref( "kded", "kded" );
+ if( !ref.call( "loadModule", QCString( "khotkeys" )))
+ {
+ kdWarning( 1217 ) << "Loading of khotkeys module failed." << endl;
+ kapp->kdeinitExec( "khotkeys" );
+ }
+ }
+ }
+}
diff --git a/khotkeys/kcontrol/kcmkhotkeys.cpp b/khotkeys/kcontrol/kcmkhotkeys.cpp
new file mode 100644
index 000000000..8ffc1ff19
--- /dev/null
+++ b/khotkeys/kcontrol/kcmkhotkeys.cpp
@@ -0,0 +1,318 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KCMKHOTKEYS_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "kcmkhotkeys.h"
+
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <qlayout.h>
+#include <qsplitter.h>
+
+#include <kcmodule.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kglobal.h>
+#include <ksimpleconfig.h>
+#include <kfiledialog.h>
+#include <dcopref.h>
+#include <klibloader.h>
+
+#include <input.h>
+#include <triggers.h>
+#include <action_data.h>
+
+#include "tab_widget.h"
+#include "actions_listview_widget.h"
+#include "main_buttons_widget.h"
+#include "voicerecorder.h"
+
+extern "C"
+{
+ KDE_EXPORT KCModule* create_khotkeys( QWidget* parent_P, const char* name_P )
+ {
+// sleep( 20 ); // CHECKME DEBUG
+ KGlobal::locale()->insertCatalogue("khotkeys");
+ KHotKeys::Module* ret = new KHotKeys::Module( parent_P, name_P );
+ ret->load(); // CHECKME
+ return ret;
+ }
+}
+
+namespace KHotKeys
+{
+
+Module::Module( QWidget* parent_P, const char* )
+ : KCModule( parent_P, "khotkeys" ), _actions_root( NULL ), _current_action_data( NULL ),
+ listview_is_changed( false ), deleting_action( false )
+ {
+ setButtons( Help | Cancel | Apply | Ok );
+ module = this;
+ init_global_data( false, this ); // don't grab keys
+ init_arts();
+ QVBoxLayout* vbox = new QVBoxLayout( this );
+ vbox->setSpacing( 6 );
+ vbox->setMargin( 11 );
+ QSplitter* splt = new QSplitter( this );
+ actions_listview_widget = new Actions_listview_widget( splt );
+ tab_widget = new Tab_widget( splt );
+ vbox->addWidget( splt );
+ buttons_widget = new Main_buttons_widget( this );
+ vbox->addWidget( buttons_widget );
+ connect( actions_listview_widget, SIGNAL( current_action_changed()),
+ SLOT( listview_current_action_changed()));
+ connect( buttons_widget, SIGNAL( new_action_pressed()), SLOT( new_action()));
+ connect( buttons_widget, SIGNAL( new_action_group_pressed()), SLOT( new_action_group()));
+ connect( buttons_widget, SIGNAL( delete_action_pressed()), SLOT( delete_action()));
+ connect( buttons_widget, SIGNAL( global_settings_pressed()), SLOT( global_settings()));
+// listview_current_action_changed(); // init
+
+ KAboutData* about = new KAboutData("kcmkhotkeys", I18N_NOOP("KHotKeys"), KHOTKEYS_VERSION,
+ 0,
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 1999-2005 Lubos Lunak"), 0, 0);
+ about->addAuthor("Lubos Lunak", I18N_NOOP("Maintainer"), "[email protected]");
+ setAboutData( about );
+
+ }
+
+Module::~Module()
+ {
+ _current_action_data = NULL;
+ tab_widget->load_current_action(); // clear tab_widget
+ delete _actions_root;
+ module = NULL;
+ }
+
+void Module::load()
+ {
+ actions_listview_widget->clear();
+ delete _actions_root;
+ settings.actions = NULL;
+ _current_action_data = NULL;
+ settings.read_settings( true );
+ _actions_root = settings.actions;
+ kdDebug( 1217 ) << "actions_root:" << _actions_root << endl;
+ actions_listview_widget->build_up();
+ tab_widget->load_current_action();
+ emit KCModule::changed( false ); // HACK otherwise the module would be changed from the very beginning
+ }
+
+void Module::save()
+ {
+ tab_widget->save_current_action_changes();
+ settings.actions = _actions_root;
+ settings.write_settings();
+ if( daemon_disabled())
+ {
+ QByteArray data;
+ kapp->dcopClient()->send( "khotkeys*", "khotkeys", "quit()", data );
+ kdDebug( 1217 ) << "disabling khotkeys daemon" << endl;
+ }
+ else
+ {
+ if( !kapp->dcopClient()->isApplicationRegistered( "khotkeys" ))
+ {
+ kdDebug( 1217 ) << "launching new khotkeys daemon" << endl;
+ KApplication::kdeinitExec( "khotkeys" );
+ }
+ else
+ {
+ QByteArray data;
+ kapp->dcopClient()->send( "khotkeys*", "khotkeys", "reread_configuration()", data );
+ kdDebug( 1217 ) << "telling khotkeys daemon to reread configuration" << endl;
+ }
+ }
+ emit KCModule::changed( false );
+ }
+
+
+QString Module::quickHelp() const
+ {
+ return i18n( "" ); // TODO CHECKME
+ }
+
+void Module::action_name_changed( const QString& name_P )
+ {
+ current_action_data()->set_name( name_P );
+ actions_listview_widget->action_name_changed( name_P );
+ }
+
+void Module::listview_current_action_changed()
+ {
+ // CHECKME tohle je trosku hack, aby se pri save zmenenych hodnot ve stare vybrane polozce
+ // zmenila data v te stare polozce a ne nove aktivni
+ listview_is_changed = true;
+ set_new_current_action( !deleting_action );
+ listview_is_changed = false;
+ }
+
+void Module::set_new_current_action( bool save_old_P )
+ {
+ if( save_old_P )
+ tab_widget->save_current_action_changes();
+ _current_action_data = actions_listview_widget->current_action_data();
+ kdDebug( 1217 ) << "set_new_current_action : " << _current_action_data << endl;
+ tab_widget->load_current_action();
+ buttons_widget->enable_delete( current_action_data() != NULL );
+ }
+
+// CHECKME volano jen z Tab_widget pro nastaveni zmenenych dat ( novy Action_data_base )
+void Module::set_current_action_data( Action_data_base* data_P )
+ {
+ delete _current_action_data;
+ _current_action_data = data_P;
+ actions_listview_widget->set_action_data( data_P, listview_is_changed );
+// tab_widget->load_current_action(); CHECKME asi neni treba
+ }
+
+#if 0
+
+}
+#include <iostream>
+#include <iomanip>
+namespace KHotKeys {
+
+void check_tree( Action_data_group* b, int lev_P = 0 )
+ {
+ using namespace std;
+ cerr << setw( lev_P ) << "" << b << ":Group:" << b->name().latin1() << ":" << b->parent() << endl;
+ for( Action_data_group::Iterator it = b->first_child();
+ it;
+ ++it )
+ if( Action_data_group* g = dynamic_cast< Action_data_group* >( *it ))
+ check_tree( g, lev_P + 1 );
+ else
+ cerr << setw( lev_P + 1 ) << "" << (*it) << ":Action:" << (*it)->name().latin1() << ":" << (*it)->parent() << endl;
+ }
+
+#endif
+
+void Module::new_action()
+ {
+ tab_widget->save_current_action_changes();
+// check_tree( actions_root());
+ Action_data_group* parent = current_action_data() != NULL
+ ? dynamic_cast< Action_data_group* >( current_action_data()) : NULL;
+ if( parent == NULL )
+ {
+ if( current_action_data() != NULL )
+ parent = current_action_data()->parent();
+ else
+ parent = module->actions_root();
+ }
+ Action_data_base* item = new Generic_action_data( parent, i18n( "New Action" ), "",
+ new Trigger_list( "" ), new Condition_list( "", NULL ), new Action_list( "" ), true );
+ actions_listview_widget->new_action( item );
+// check_tree( actions_root());
+ set_new_current_action( false );
+ }
+
+// CHECKME spojit tyhle dve do jedne
+void Module::new_action_group()
+ {
+ tab_widget->save_current_action_changes();
+// check_tree( actions_root());
+ Action_data_group* parent = current_action_data() != NULL
+ ? dynamic_cast< Action_data_group* >( current_action_data()) : NULL;
+ if( parent == NULL )
+ {
+ if( current_action_data() != NULL )
+ parent = current_action_data()->parent();
+ else
+ parent = module->actions_root();
+ }
+ Action_data_base* item = new Action_data_group( parent, i18n( "New Action Group" ), "",
+ new Condition_list( "", NULL ), Action_data_group::SYSTEM_NONE, true );
+ actions_listview_widget->new_action( item );
+// check_tree( actions_root());
+ set_new_current_action( false );
+ }
+
+void Module::delete_action()
+ {
+ delete _current_action_data;
+ _current_action_data = NULL;
+ deleting_action = true; // CHECKME zase tak trosku hack, jinak by se snazilo provest save
+ actions_listview_widget->delete_action(); // prave mazane polozky
+ deleting_action = false;
+ set_new_current_action( false );
+ }
+
+void Module::global_settings()
+ {
+ actions_listview_widget->set_current_action( NULL );
+ set_new_current_action( true );
+ }
+
+void Module::set_gestures_exclude( Windowdef_list* windows )
+ {
+ delete settings.gestures_exclude;
+ settings.gestures_exclude = windows;
+ }
+
+void Module::import()
+ {
+ QString file = KFileDialog::getOpenFileName( QString::null, "*.khotkeys", topLevelWidget(),
+ i18n( "Select File with Actions to Be Imported" ));
+ if( file.isEmpty())
+ return;
+ KSimpleConfig cfg( file, true );
+ if( !settings.import( cfg, true ))
+ {
+ KMessageBox::error( topLevelWidget(),
+ i18n( "Import of the specified file failed. Most probably the file is not a valid "
+ "file with actions." ));
+ return;
+ }
+ actions_listview_widget->clear();
+ actions_listview_widget->build_up();
+ tab_widget->load_current_action();
+ emit KCModule::changed( true );
+ }
+
+void Module::changed()
+ {
+ emit KCModule::changed( true );
+ }
+
+void Module::init_arts()
+ {
+#ifdef HAVE_ARTS
+ if( haveArts())
+ {
+ KLibrary* arts = KLibLoader::self()->library( "khotkeys_arts" );
+ if( arts == NULL )
+ kdDebug( 1217 ) << "Couldn't load khotkeys_arts:" << KLibLoader::self()->lastErrorMessage() << endl;
+ if( arts != NULL && VoiceRecorder::init( arts ))
+ ; // ok
+ else
+ disableArts();
+ }
+#endif
+ }
+
+Module* module; // CHECKME
+
+} // namespace KHotKeys
+
+#include "kcmkhotkeys.moc"
diff --git a/khotkeys/kcontrol/kcmkhotkeys.h b/khotkeys/kcontrol/kcmkhotkeys.h
new file mode 100644
index 000000000..3061fa9ec
--- /dev/null
+++ b/khotkeys/kcontrol/kcmkhotkeys.h
@@ -0,0 +1,170 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KCMKHOTKEYS_H_
+#define _KCMKHOTKEYS_H_
+
+#include <kcmodule.h>
+#include <kshortcut.h>
+
+#include <actions.h>
+#include <settings.h>
+
+
+
+namespace KHotKeys
+{
+
+class Actions_listview_widget;
+class Tab_widget;
+class Action_data_base;
+class Main_buttons_widget;
+
+class Module
+ : public KCModule
+ {
+ Q_OBJECT
+ public:
+ Module( QWidget *parent_P, const char *name_P );
+ virtual ~Module();
+ virtual void load();
+ virtual void save();
+// virtual void defaults(); not used
+ QString quickHelp() const;
+ int buttons();
+ void set_current_action_data( Action_data_base* data_P );
+ Action_data_base* current_action_data();
+ void action_name_changed( const QString& name_P );
+ Action_data_group* actions_root() const;
+ void set_gestures_disabled( bool set );
+ bool gestures_disabled() const;
+ void set_gesture_button( int button );
+ int gesture_button() const;
+ void set_gesture_timeout( int time );
+ int gesture_timeout() const;
+ void set_gestures_exclude( Windowdef_list* windows );
+ const Windowdef_list* gestures_exclude() const;
+ void set_daemon_disabled( bool disable );
+ bool daemon_disabled() const;
+ void import();
+ KShortcut voice_shortcut() const;
+ void set_voice_shortcut( const KShortcut&) ;
+ public slots:
+ void changed();
+ protected:
+ void set_new_current_action( bool save_old_P );
+ void init_arts();
+ Actions_listview_widget* actions_listview_widget;
+ Tab_widget* tab_widget;
+ Main_buttons_widget* buttons_widget;
+ Action_data_group* _actions_root; // vlastni vsechny Action_data
+ Action_data_base* _current_action_data;
+ bool listview_is_changed;
+ bool deleting_action;
+ Settings settings;
+ protected slots:
+ void listview_current_action_changed();
+ void new_action();
+ void new_action_group();
+ void delete_action();
+ void global_settings();
+ };
+
+extern Module* module;
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Module
+
+inline
+Action_data_group* Module::actions_root() const
+ {
+ return _actions_root;
+ }
+
+inline
+Action_data_base* Module::current_action_data()
+ {
+ return _current_action_data;
+ }
+
+inline
+void Module::set_gestures_disabled( bool set )
+ {
+ settings.gestures_disabled_globally = set;
+ }
+
+inline
+bool Module::gestures_disabled() const
+ {
+ return settings.gestures_disabled_globally;
+ }
+
+inline
+void Module::set_gesture_button( int button )
+ {
+ settings.gesture_mouse_button = button;
+ }
+
+inline
+int Module::gesture_button() const
+ {
+ return settings.gesture_mouse_button;
+ }
+
+inline
+void Module::set_gesture_timeout( int time )
+ {
+ settings.gesture_timeout = time;
+ }
+
+inline
+int Module::gesture_timeout() const
+ {
+ return settings.gesture_timeout;
+ }
+
+inline
+const Windowdef_list* Module::gestures_exclude() const
+ {
+ return settings.gestures_exclude;
+ }
+
+inline
+void Module::set_daemon_disabled( bool disabled_P )
+ {
+ settings.daemon_disabled = disabled_P;
+ }
+
+inline
+bool Module::daemon_disabled() const
+ {
+ return settings.daemon_disabled;
+ }
+
+
+inline
+void Module::set_voice_shortcut( const KShortcut& cut)
+ {
+ settings.voice_shortcut=cut;
+ }
+
+inline
+KShortcut Module::voice_shortcut() const
+ {
+ return settings.voice_shortcut;
+ }
+
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/keyboard_input_widget.cpp b/khotkeys/kcontrol/keyboard_input_widget.cpp
new file mode 100644
index 000000000..3d60d8e13
--- /dev/null
+++ b/khotkeys/kcontrol/keyboard_input_widget.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KEYBOARD_INPUT_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "keyboard_input_widget.h"
+
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+
+#include <ktextedit.h>
+
+#include <actions.h>
+#include <action_data.h>
+
+#include "windowdef_list_widget.h"
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Keyboard_input_widget::Keyboard_input_widget( QWidget* parent_P, const char* name_P )
+ : Keyboard_input_widget_ui( parent_P, name_P )
+ {
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( action_window_radio, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( active_window_radio, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( specific_window_radio, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( keyboard_input_multilineedit, SIGNAL( textChanged()),
+ module, SLOT( changed()));
+ connect( modify_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ }
+
+void Keyboard_input_widget::clear_data()
+ {
+ keyboard_input_multilineedit->clear();
+ action_window_radio->setChecked( true );
+ active_window_radio->setChecked( false );
+ specific_window_radio->setChecked( false );
+ window_groupbox->setEnabled( false );
+ windowdef_list_widget->clear_data();
+ }
+
+void Keyboard_input_widget::set_data( const Keyboard_input_action* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ keyboard_input_multilineedit->setText( data_P->input());
+ const Windowdef_list* dest_window = data_P->dest_window();
+ specific_window_radio->setChecked( dest_window != NULL );
+ window_groupbox->setEnabled( dest_window != NULL );
+ if( dest_window != NULL )
+ windowdef_list_widget->set_data( dest_window );
+ else
+ {
+ windowdef_list_widget->clear_data();
+ if( data_P->activeWindow())
+ active_window_radio->setChecked( true );
+ else
+ action_window_radio->setChecked( true );
+ }
+ }
+
+Keyboard_input_action* Keyboard_input_widget::get_data( Action_data* data_P ) const
+ {
+ const Windowdef_list* windows = NULL;
+ if( specific_window_radio->isChecked())
+ windows = windowdef_list_widget->get_data();
+ return new Keyboard_input_action( data_P, keyboard_input_multilineedit->text(),
+ windows, active_window_radio->isChecked());
+ }
+
+void Keyboard_input_widget::modify_pressed()
+ { // CHECKME TODO
+
+ // CHECKME klavesy nesmi byt i18n() !!
+ }
+
+} // namespace KHotKeys
+
+#include "keyboard_input_widget.moc"
diff --git a/khotkeys/kcontrol/keyboard_input_widget.h b/khotkeys/kcontrol/keyboard_input_widget.h
new file mode 100644
index 000000000..7c1f15b95
--- /dev/null
+++ b/khotkeys/kcontrol/keyboard_input_widget.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KEYBOARD_INPUT_WIDGET_H_
+#define _KEYBOARD_INPUT_WIDGET_H_
+
+#include <keyboard_input_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Keyboard_input_action;
+class Action_data;
+
+class Keyboard_input_widget
+ : public Keyboard_input_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Keyboard_input_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Keyboard_input_action* data_P );
+ Keyboard_input_action* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ protected slots:
+ virtual void modify_pressed();
+ };
+
+typedef Keyboard_input_widget Keyboard_input_tab;
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/khotkeys.desktop b/khotkeys/kcontrol/khotkeys.desktop
new file mode 100644
index 000000000..f5781da2b
--- /dev/null
+++ b/khotkeys/kcontrol/khotkeys.desktop
@@ -0,0 +1,208 @@
+[Desktop Entry]
+Exec=kcmshell khotkeys
+Icon=khotkeys
+Type=Application
+
+X-KDE-ModuleType=Library
+X-KDE-Library=khotkeys
+X-KDE-Init-Library=khotkeys_init
+X-KDE-Init=khotkeys
+
+Name=Input Actions
+Name[af]=Inset Aksies
+Name[ar]=نشاطات الإدخال
+Name[be]=Дзеянні
+Name[bg]=Действия
+Name[br]=Oberoù enkas
+Name[bs]=Akcije unosa
+Name[ca]=Accions d'entrada
+Name[cs]=Vstupní činnosti
+Name[csb]=Klawiszowé dzéjania
+Name[da]=Indgiv handlinger
+Name[de]=Tastenkombinationen
+Name[el]=Ενέργειες εισόδου
+Name[eo]=Enir-agadoj
+Name[es]=Introducir acciones
+Name[et]=Sisestustoimingud
+Name[eu]=Sarrerako ekintzak
+Name[fa]=کنشهای ورودی
+Name[fi]=Syöttötoiminnot
+Name[fr]=Actions d'entrées
+Name[fy]=Ynfieraksjes
+Name[ga]=Gníomhartha Ionchurtha
+Name[gl]=Accións de Entrada
+Name[he]=פעולות קלט
+Name[hr]=Aktivnosti unosa
+Name[hu]=Beviteli műveletek
+Name[is]=Inntaksaðgerðir
+Name[it]=Azioni di immissione
+Name[ja]=入力アクション
+Name[ka]=შეტანის ქმედებები
+Name[kk]=Енгізу әрекеттері
+Name[km]=អំពើបញ្ចូល
+Name[ko]=입력 동작
+Name[lt]=Įvesties veiksmai
+Name[mk]=Влезни дејства
+Name[ms]=Tindakan Input
+Name[nb]=Input-handlinger
+Name[nds]=Ingaavakschonen
+Name[ne]=आगत कार्य
+Name[nl]=Invoeracties
+Name[nn]=Innhandlingar
+Name[pa]=ਇੰਪੁੱਟ ਕਾਰਵਾਈਆਂ
+Name[pl]=Akcje klawiszowe
+Name[pt]=Acções de Entrada
+Name[pt_BR]=Ações de Entrada
+Name[ro]=Acțiuni de intrare
+Name[ru]=Действия
+Name[rw]=Kwinjiza Ibikorwa
+Name[sk]=Vstupné akcie
+Name[sl]=Vhodna dejanja
+Name[sr]=Акције улаза
+Name[sr@Latn]=Akcije ulaza
+Name[sv]=Inmatningsåtgärder
+Name[ta]=உள்ளீட்டு செயல்கள்
+Name[te]=ములాంశ చర్యలు
+Name[tg]=Амалҳо
+Name[th]=การกระทำเพื่อใส่ข้อมูล
+Name[tr]=Girdi Eylemleri
+Name[tt]=Kertü Ğämälläre
+Name[uk]=Ввід
+Name[uz]=Kiritish amallari
+Name[uz@cyrillic]=Киритиш амаллари
+Name[vi]=Gõ Phím nóng
+Name[wa]=Accions en intrêye
+Name[zh_CN]=输入动作
+Name[zh_TW]=輸入動作
+
+Comment=Configure Hotkey settings
+Comment[af]=Stel kortpad sleutels op
+Comment[be]=Настаўленні клавішных скаротаў
+Comment[bg]=Настройване на жестове с мишката
+Comment[bn]=হট-কী সেটিংস কনফিগার করুন
+Comment[br]=Kefluniañ dibarzhoù Hotkey
+Comment[bs]=Podesite opcije kratica tastature
+Comment[ca]=Configura l'arranjament de les tecles ràpides
+Comment[cs]=Nastavení horkých kláves
+Comment[csb]=Kònfigùracëjô klawiszowëch skrodzënów
+Comment[cy]=Ffurfweddu gosodiadau BysyllBrys
+Comment[da]=Opsætning af genvejstast
+Comment[de]=Tastenkombinationen festlegen
+Comment[el]=Ρυθμίσεις HotKeys
+Comment[eo]=Agordo de klavkomando
+Comment[es]=Configuración de las preferencias de Hotkey
+Comment[et]=Kiirklahvide seadistused
+Comment[eu]=Konfiguratu Hotkey-ren ezarpenak
+Comment[fa]=پیکربندی تنظیمات کلید میان‌بر
+Comment[fi]=Muokkaa pikanäppäinten asetuksia
+Comment[fr]=Configurer les réglages des raccourcis clavier
+Comment[fy]=Fluchtoetsen ynstelle
+Comment[gl]=Configurar opcións de HotKeys
+Comment[he]=שינוי הגדרות מקשי הקיצור
+Comment[hi]=हॉट-की विन्यास कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje postavki prečaca
+Comment[hu]=A használható parancsok beállítása
+Comment[is]=Stillingar flýtilykla
+Comment[it]=Configura impostazioni di Hotkey
+Comment[ja]=ホットキーの設定
+Comment[ka]=კლავიშთა კომბინაციის კონფიგურირება
+Comment[kk]=Пернелер тіркесімдерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​កំណត់​គ្រាប់ចុច​បន្ទាន់
+Comment[ko]=단축키 설정
+Comment[lt]=Konfigūruoti klavišų kombinacijų nustatymus
+Comment[lv]=Konfigurē karsto taustiņu parametrus
+Comment[mk]=Конфигурирајте ги поставувањата за брзите копчиња
+Comment[ms]=Konfigur seting Kekunci Panas
+Comment[mt]=Konfigurazzjoni tal-hotkeys
+Comment[nb]=Sett opp hurtigtaster
+Comment[nds]=Akschonen för besünner Ingaven instellen
+Comment[ne]=हटकुञ्जी सेटिङ कन्फिगर गर्नुहोस्
+Comment[nl]=Sneltoetsen instellen
+Comment[nn]=Set opp snøggtastar
+Comment[pa]=ਹਾਟਕੀ ਸੈਟਿੰਗ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja skrótów klawiszowych
+Comment[pt]=Configurar as opções de teclas
+Comment[pt_BR]=Configura definições de teclas de atalho
+Comment[ro]=Configurează setările Hotkey
+Comment[ru]=Настройка действий по комбинациям клавиш и росчеркам мышью
+Comment[rw]=Kuboneza amagenamiterere Butozihuta
+Comment[se]=Heivet jođánisboaluid
+Comment[sk]=Nastavenia klávesových skratiek
+Comment[sl]=Nastavitve vročih tipk
+Comment[sr]=Подешавање поставки пречица
+Comment[sr@Latn]=Podešavanje postavki prečica
+Comment[sv]=Anpassa Hotkey-inställningar
+Comment[ta]=ÍÕìÌÅ¢¨º «¨ÁôÒ¸¨Ç ¯ûǨÁ
+Comment[th]=ตั้งค่าปุ่มลัด
+Comment[tr]=Kısayol ayarlarını yapılandır
+Comment[tt]=Qaynar töymälärne caylaw
+Comment[uk]=Налаштування швидких клавіш
+Comment[vi]=Cấu hình các thiết lập về phím nóng
+Comment[wa]=Apontiaedjes des tchuzes Hotkeys
+Comment[zh_CN]=配置热键设置
+Comment[zh_TW]=設定熱鍵設定值
+
+Keywords=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures
+Keywords[af]=Keys,Globale sleutel bindings,sleutel scheme,sleutel bindings,kortpaaie,application kortpaaie
+Keywords[ar]=مفايتح، مفاتيح الاختصارات العامّة، خريطة المفاتيح، مفاتيح الاختصارات، اختصارات، اختصارات تطبيقات ، حركات الفأرة
+Keywords[be]=Клавішы,Глабальныя скароты,Скароты,Рухі,Рухі мышы,Keys,Global key bindings,Key bindings,Gestures,Mouse gestures
+Keywords[bg]=бърз, клавиш, бързи, достъп, клавишна, комбинация, жестове, мишка, жест, операция, Keys, Global key bindings, Key bindings, Gestures, Mouse gestures
+Keywords[bs]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures,tipke,kratice tastature,globalne kratice tastature,geste,geste miša
+Keywords[ca]=Tecles,lligams de tecles globals,Lligams de tecles,gestos,gestos de ratolí
+Keywords[cs]=Klávesy,Globální klávesové zkratky,Schéma kláves,Klávesové zkratky,Zkratky,Gesta
+Keywords[csb]=klawisze,globalné klawiszowé skrodzënë,schemë skrodzënów,gestë,mësz
+Keywords[cy]=Bysyll,Bysellau,Rhwymiadau bysell eang,Ystumiau,Ystumiau llygoden
+Keywords[da]=Taster,Globale tastebindinger,Tastebindinger,Gester,Muse-gester
+Keywords[de]=Tasten,Tastenzuordnung,Tastenkürzel,Kurzbefehle,Tastenschema,Tastaturlayout,Gesten,Mausgesten
+Keywords[el]=Πλήκτρα,Καθολικοί συνδυασμοί πλήκτρων,Συνδυασμοί πλήκτρων,Gestures,Mouse gestures
+Keywords[eo]=klavoj,malloka,signifoj,asocioj,kombinoj,klavkombinoj,muzo
+Keywords[es]=Teclas,Asociaciones de teclas globales,Asociaciones de teclas,Gestos,Gestos del ratón
+Keywords[et]=Klahvid,Globaalsed kiirklahvid,Klahviskeem,Kiirklahvid,Klahvide seosed,Žestid,Hiirežestid
+Keywords[eu]=Teklak,Tekla elkarketa orokorrak,Tekla elkarketak,Keinuak,Saguaren keinuak
+Keywords[fa]=کلیدها، مقیدسازیهای کلید سراسری، مقیدسازیهای کلید، حرکات، حرکات موشی
+Keywords[fi]=Näppäimet,Yleiset näppäinsidokset,Näppäinteema,Näppäinsidokset,pikavalinnat,sovellusten pikavalinnat,hiirieleet
+Keywords[fr]=touches,raccourcis clavier globaux,raccourcis clavier,gestes,gestes de la souris
+Keywords[fy]=keys,toetsen,toetsenbindingen,key bindings,toetsbiningen,sneltoetsen,fluchtoetsen,globale toetsenbindingen,algemiene toetsbiningen,mouse gestures,muisgebaren,mûsstjoeringen,stjoeringen,gestures,gebaren
+Keywords[ga]=Eochracha,Ceangail chomhchoiteanna eochracha,Ceangail chomhchoiteanna,Gothaí,Gothaí luiche
+Keywords[gl]=Teclas,Atallos de teclado globais,Atallos de teclado,Xestos,Xestos co rato
+Keywords[he]=מקשים,תפקידי מקשים גלובליים,תצורת מקשים,תפקידי מקשים,קיצורים,קיצורים של יישומים, Keys,Global key bindings,Key bindings,Gestures,Mouse gestures
+Keywords[hi]=कुंजियाँ,ग्लोबल की-बाइंडिंग्स,की-बाइंडिंग्स,गेस्चर्स,माउस गेस्चर्स
+Keywords[hr]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures,Tipke,Opći prečaci tipkovnice,Prečaci tipkovnice,Gestikulacije,Gestikulacije mišem
+Keywords[hu]=billentyűk,globális billentyűparancs,billentyűparancs,műveletek,mozdulatsorok
+Keywords[is]=Lyklar,Hnappar,Flýtihnappar,Flýtilyklar,Lyklabindingar
+Keywords[it]=tasti,associazioni globali di tasti,schema di tasti,associazioni di tasti,scorciatoie,gesti,gesti mouse,mouse gesti
+Keywords[ja]=キー,グローバルキー,キーバインド,ジェスチャー,マウスジェスチャー
+Keywords[km]=គ្រាប់ចុច,ការ​ចង​គ្រាប់ចុច​សកល,ការ​ចង​គ្រាប់ចុច,កាយវិការ,កាយវិការ​កណ្ដុរ
+Keywords[lt]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures,klavišai,klavišų sietis,klavišų schema,klavišų išdėstymas,spartieji klavišai,programų spartieji klavišai,pelės veiksmai
+Keywords[lv]=Taustiņi,Globālās taustiņu sasaistes,Taustiņu shēma,Taustiņu sasaistes,mouse gestures
+Keywords[mk]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures, Копчиња,Глобални врски на копчиња,врски на копчиња,гестови,гестови со глушец
+Keywords[nb]=Taster,generelle hurtigtaster,hurtigtaster,bevegelser,musebevegelser
+Keywords[nds]=Tasten,Globale Tastkombinatschonen,Tastschema,Tastkombinatschonen,Ingaavtekens,Muusteken
+Keywords[ne]=कुञ्जीहरू, विश्वव्यापी कुञ्जी बाइन्डिङ, कुञ्जी बाइन्डिङ, सङ्केत, माउस सङ्केत
+Keywords[nl]=keys,toetsen,toetsenbindingen,key bindings,sneltoetsen,globale toetsenbindingen,mouse gestures,muisgebaren,gestures,gebaren
+Keywords[nn]=tastar,globale snøggtastar,tasteoppsett,snøggtastar,snarvegar,programsnarvegar,rørsler,muserørsler
+Keywords[pa]=Keys,Global key bindings,Key bindings,Gestures,ਮਾਊਸ gestures, ਸਵਿੱਚਾਂ
+Keywords[pl]=klawisze,globalne skróty klawiszowe,schematy skrótów,gesty,mysz
+Keywords[pt]=teclas,teclas globais,esquema de teclas,atribuições de teclas,gestos,gestos com rato
+Keywords[pt_BR]=Teclas,Teclas de atalho globais,esquema de teclado,gestos, gestos do mouse
+Keywords[ro]=taste,asocieri globale de taste,schemă taste,asocieri taste,acceleratori,acceleratori aplicații,scurtături,gesturi
+Keywords[ru]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures,мышь,росчерк,клавиши,комбинации клавиш,действия
+Keywords[rw]=Buto,Ibyafataranyijwe urufunguzo rusange,Ibyafatanyijwe by'urufunguzo,Ibimenyetso,Ibimenyetso by'imbeba
+Keywords[se]=boalut,oppalaš jođánisboalut,boalločoahkádusat,boalločatnasat,njuolgobálgát,prográmmanjuolgabálgát,lihkádusat,sáhpánlihkádusat
+Keywords[sk]=Klávesy,Globálne klávesové skratky,schéma kláves,klávesové skratky,gestá,gestá myšou
+Keywords[sl]=tipke,globalne vezi tipk,vezi tipk,tipkovne vezi,gibi,miškini gibi
+Keywords[sr]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,тастери,глобални тастери,пречица,шема тастера,пречице,програмске пречице
+Keywords[sr@Latn]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,tasteri,globalni tasteri,prečica,šema tastera,prečice,programske prečice
+Keywords[sv]=tangenter,globala tangentbindningar,tangentbindningar,gester,musgester
+Keywords[ta]=விசைகள்,உலகலாவிய விசை பிணைப்புகள்,விசை திட்டம்,விசை பிணைப்புகள்,குறுக்குவழிகள்,பயன்பாட்டுக் குறுக்குவழிகள்
+Keywords[th]=ปุ่มพิมพ์,ปุ่มพิมพ์ส่วนกลาง,ชุดปุ่มพิมพ์,การจับคู่ปุ่มพิมพ์,ปุ่มพิมพ์ลัด,แป้นพิมพ์ลัด,ปุ่มพิมพ์ลัดแอพพลิเคชัน,การลากเมาส์
+Keywords[tr]=Tuşlar,Küresel tuş bağlantıları,Tuş bağlantıları,Kısayollar,Uygulama kısayolları,Fare hareketleri
+Keywords[uk]=клавіші,глобальні прив'язки клавіш,схема клавіш,прив'язка клавіш, жести, жести мишки
+Keywords[uz]=Gestures,Mouse gestures,Tugmalar,Umumiy tugmalar birikmasi,Tugmalar birikmasi
+Keywords[uz@cyrillic]=Gestures,Mouse gestures,Тугмалар,Умумий тугмалар бирикмаси,Тугмалар бирикмаси
+Keywords[vi]=Phím,tổ hợp phím toàn cục,tổ hợp phím,gõ phím,di chuyển chuột
+Keywords[wa]=Tapes,globås rascourtis,rascourtis,djesses,manire di bodjî,manire di bodjî li sori
+Keywords[zh_CN]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures,键,全局键绑定,手势,鼠标手势
+Keywords[zh_TW]=Keys,Global key bindings,Key bindings,Gestures,Mouse gestures,按鍵,全域按建連結,按鍵連結,手勢,滑鼠手勢
+
+Categories=Qt;KDE;X-KDE-settings-accessibility;
diff --git a/khotkeys/kcontrol/main_buttons_widget.cpp b/khotkeys/kcontrol/main_buttons_widget.cpp
new file mode 100644
index 000000000..fb8718a1c
--- /dev/null
+++ b/khotkeys/kcontrol/main_buttons_widget.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define MAIN_BUTTONS_WIDGET_CPP
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "main_buttons_widget.h"
+
+#include <qpushbutton.h>
+
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Main_buttons_widget::Main_buttons_widget( QWidget* parent_P, const char* name_P )
+ : Main_buttons_widget_ui( parent_P, name_P )
+ {
+ connect( new_action_button, SIGNAL( clicked()), SIGNAL( new_action_pressed()));
+ connect( new_action_group_button, SIGNAL( clicked()), SIGNAL( new_action_group_pressed()));
+ connect( delete_action_button, SIGNAL( clicked()), SIGNAL( delete_action_pressed()));
+ connect( global_settings_button, SIGNAL( clicked()), SIGNAL( global_settings_pressed()));
+ enable_delete( false );
+ // KHotKeys::Module::changed()
+ connect( new_action_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( new_action_group_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( delete_action_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ setMaximumHeight( sizeHint().height()); // it gets too high and I have no idea why
+ }
+
+void Main_buttons_widget::enable_delete( bool enable_P )
+ {
+ delete_action_button->setEnabled( enable_P );
+ }
+
+} // namespace KHotKeys
+
+#include "main_buttons_widget.moc"
diff --git a/khotkeys/kcontrol/main_buttons_widget.h b/khotkeys/kcontrol/main_buttons_widget.h
new file mode 100644
index 000000000..cd13b3cbc
--- /dev/null
+++ b/khotkeys/kcontrol/main_buttons_widget.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef MAIN_BUTTONS_WIDGET_H
+#define MAIN_BUTTONS_WIDGET_H
+
+#include <main_buttons_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Main_buttons_widget
+ : public Main_buttons_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Main_buttons_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void enable_delete( bool enable_P );
+ signals:
+ void new_action_pressed();
+ void new_action_group_pressed();
+ void delete_action_pressed();
+ void global_settings_pressed();
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/menuedit.cpp b/khotkeys/kcontrol/menuedit.cpp
new file mode 100644
index 000000000..dd0035dfa
--- /dev/null
+++ b/khotkeys/kcontrol/menuedit.cpp
@@ -0,0 +1,359 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+// BEWARE ! unbelievably messy code
+
+#define _MENUEDIT_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "menuedit.h"
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kaccel.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <kkeydialog.h>
+
+#include <settings.h>
+#include <action_data.h>
+
+namespace KHotKeys
+{
+
+static QObject* owner = NULL;
+
+void khotkeys_init()
+ {
+ // I hope this works
+ KGlobal::locale()->insertCatalogue("khotkeys");
+ // CHECKME hack
+ assert( owner == NULL );
+ owner = new QObject;
+ init_global_data( false, owner );
+ }
+
+void khotkeys_cleanup()
+ {
+ delete owner;
+ owner = NULL;
+ }
+
+Menuentry_shortcut_action_data* khotkeys_get_menu_entry_internal2(
+ const Action_data_group* data_P, const QString& entry_P )
+ {
+ if( !data_P->enabled( false ))
+ return NULL;
+ for( Action_data_group::Iterator it = data_P->first_child();
+ it;
+ ++it )
+ {
+ if( !(*it)->enabled( true ))
+ continue;
+ if( Menuentry_shortcut_action_data* entry
+ = dynamic_cast< Menuentry_shortcut_action_data* >( *it ))
+ {
+ KService::Ptr service = entry->action() ? entry->action()->service() : KService::Ptr(0);
+ if ( service && (service->storageId() == entry_P) )
+ return entry;
+ }
+ if( Action_data_group* group = dynamic_cast< Action_data_group* >( *it ))
+ {
+ Menuentry_shortcut_action_data* data
+ = khotkeys_get_menu_entry_internal2( group, entry_P );
+ if( data != NULL )
+ return data;
+ }
+ }
+ return NULL;
+ }
+
+Action_data_group* khotkeys_get_menu_root( Action_data_group* data_P )
+ {
+ for( Action_data_group::Iterator it = data_P->first_child();
+ it;
+ ++it )
+ if( Action_data_group* group = dynamic_cast< Action_data_group* >( *it ))
+ {
+ if( group->system_group() == Action_data_group::SYSTEM_MENUENTRIES )
+ return group;
+ }
+ return new Action_data_group( data_P, i18n( MENU_EDITOR_ENTRIES_GROUP_NAME ),
+ i18n( "These entries were created using Menu Editor." ), new Condition_list( "", NULL ), // CHECKME tenhle condition list
+ Action_data_group::SYSTEM_MENUENTRIES, true );
+ }
+
+Menuentry_shortcut_action_data* khotkeys_get_menu_entry_internal( Action_data_group* data_P,
+ const QString& entry_P )
+ {
+ return khotkeys_get_menu_entry_internal2( khotkeys_get_menu_root( data_P ), entry_P );
+ }
+
+QString khotkeys_get_menu_shortcut( Menuentry_shortcut_action_data* data_P )
+ {
+ if( data_P->trigger() != NULL )
+ return data_P->trigger()->shortcut().toString();
+ return "";
+ }
+
+void khotkeys_get_all_shortcuts_internal(const Action_data_group* data_P, QStringList &result)
+ {
+ if( !data_P->enabled( false ))
+ return;
+ for( Action_data_group::Iterator it = data_P->first_child();
+ it;
+ ++it )
+ {
+ if( !(*it)->enabled( true ))
+ continue;
+ if( Menuentry_shortcut_action_data* entry
+ = dynamic_cast< Menuentry_shortcut_action_data* >( *it ))
+ {
+ if (entry->trigger() && !entry->trigger()->shortcut().isNull())
+ result.append(entry->trigger()->shortcut().toString());
+ }
+ if( Action_data_group* group = dynamic_cast< Action_data_group* >( *it ))
+ {
+ khotkeys_get_all_shortcuts_internal( group, result );
+ }
+ }
+ }
+
+
+QStringList khotkeys_get_all_shortcuts( )
+ {
+ QStringList result;
+ Settings settings;
+ settings.read_settings( true );
+
+ khotkeys_get_all_shortcuts_internal(settings.actions, result);
+
+ return result;
+ }
+
+
+KService::Ptr khotkeys_find_menu_entry_internal(const Action_data_group* data_P, const QString &shortcut_P)
+ {
+ if( !data_P->enabled( false ))
+ return 0;
+ for( Action_data_group::Iterator it = data_P->first_child();
+ it;
+ ++it )
+ {
+ if( !(*it)->enabled( true ))
+ continue;
+ if( Menuentry_shortcut_action_data* entry
+ = dynamic_cast< Menuentry_shortcut_action_data* >( *it ))
+ {
+ if (entry->trigger() &&
+ entry->trigger()->shortcut().toString() == shortcut_P)
+ {
+ if (entry->action())
+ return entry->action()->service();
+ return 0;
+ }
+ }
+ if( Action_data_group* group = dynamic_cast< Action_data_group* >( *it ))
+ {
+ KService::Ptr result = khotkeys_find_menu_entry_internal( group, shortcut_P );
+ if (result)
+ return result;
+ }
+ }
+ return 0;
+ }
+
+
+KService::Ptr khotkeys_find_menu_entry( const QString& shortcut_P )
+ {
+ Settings settings;
+ settings.read_settings( true );
+
+ return khotkeys_find_menu_entry_internal(settings.actions, shortcut_P);
+ }
+
+
+void khotkeys_send_reread_config()
+ {
+ QByteArray data;
+ if( !kapp->dcopClient()->isAttached())
+ kapp->dcopClient()->attach();
+ if( !kapp->dcopClient()->isApplicationRegistered( "khotkeys" ))
+ {
+ kdDebug( 1217 ) << "launching new khotkeys daemon" << endl;
+ KApplication::kdeinitExec( "khotkeys" );
+ }
+ else
+ {
+ QByteArray data;
+ kapp->dcopClient()->send( "khotkeys*", "khotkeys", "reread_configuration()", data );
+ kdDebug( 1217 ) << "telling khotkeys daemon to reread configuration" << endl;
+ }
+ }
+
+QString khotkeys_get_menu_entry_shortcut( const QString& entry_P )
+ {
+ Settings settings;
+ settings.read_settings( true );
+ Menuentry_shortcut_action_data* entry
+ = khotkeys_get_menu_entry_internal( settings.actions, entry_P );
+ if( entry == NULL )
+ {
+ delete settings.actions;
+ return "";
+ }
+ QString shortcut = khotkeys_get_menu_shortcut( entry );
+ delete settings.actions;
+ return shortcut;
+ }
+
+bool khotkeys_menu_entry_moved( const QString& new_P, const QString& old_P )
+ {
+ Settings settings;
+ settings.read_settings( true );
+ Menuentry_shortcut_action_data* entry
+ = khotkeys_get_menu_entry_internal( settings.actions, old_P );
+ if( entry == NULL )
+ {
+ delete settings.actions;
+ return false;
+ }
+ Action_data_group* parent = entry->parent();
+ QString new_name = new_P;
+ if( entry->name().startsWith( i18n( "K Menu - " )))
+ new_name = i18n( "K Menu - " ) + new_P;
+ Menuentry_shortcut_action_data* new_entry = new Menuentry_shortcut_action_data( parent,
+ new_name, entry->comment(), entry->enabled( true ));
+ new_entry->set_trigger( entry->trigger()->copy( new_entry ));
+ new_entry->set_action( new Menuentry_action( new_entry, new_P ));
+ delete entry;
+ settings.write_settings();
+ delete settings.actions;
+ khotkeys_send_reread_config();
+ return true;
+ }
+
+void khotkeys_menu_entry_deleted( const QString& entry_P )
+ {
+ Settings settings;
+ settings.read_settings( true );
+ Menuentry_shortcut_action_data* entry
+ = khotkeys_get_menu_entry_internal( settings.actions, entry_P );
+ if( entry == NULL )
+ {
+ delete settings.actions;
+ return;
+ }
+ delete entry;
+ settings.write_settings();
+ delete settings.actions;
+ khotkeys_send_reread_config();
+ }
+
+QString khotkeys_change_menu_entry_shortcut( const QString& entry_P,
+ const QString& shortcut_P )
+ {
+ Settings settings;
+ settings.read_settings( true );
+ Menuentry_shortcut_action_data* entry
+ = khotkeys_get_menu_entry_internal( settings.actions, entry_P );
+ bool new_entry = ( entry == NULL );
+ if( new_entry )
+ {
+ entry = new Menuentry_shortcut_action_data( NULL, i18n( "K Menu - " ) + entry_P,
+ "" );
+ entry->set_action( new Menuentry_action( entry, entry_P ));
+ }
+ else
+ {
+ // erase the trigger, i.e. replace with a copy with no trigger and no parent yet
+ Menuentry_shortcut_action_data* entry_tmp = new Menuentry_shortcut_action_data( NULL,
+ entry->name(), entry->comment(), entry->enabled( false ));
+ entry_tmp->set_action( new Menuentry_action( entry_tmp, entry_P ));
+ delete entry;
+ entry = entry_tmp;
+ }
+ QString shortcut = "";
+ // make sure the shortcut is valid
+ shortcut = (KShortcut( shortcut_P )).toStringInternal();
+ if( !shortcut.isEmpty())
+ entry->set_trigger( new Shortcut_trigger( entry, KShortcut( shortcut )));
+ if( shortcut.isEmpty())
+ {
+ delete entry;
+ if( !new_entry ) // remove from config file
+ {
+ settings.write_settings();
+ khotkeys_send_reread_config();
+ }
+ delete settings.actions;
+ return "";
+ }
+ entry->reparent( khotkeys_get_menu_root( settings.actions ));
+ settings.daemon_disabled = false; // #91782
+ settings.write_settings();
+ khotkeys_send_reread_config();
+ return shortcut;
+ }
+
+// CHECKME nejaka forma kontroly, ze tahle kl. kombinace neni pouzita pro jiny menuentry ?
+
+} // namespace KHotKeys
+
+//
+// exported functions
+//
+
+void khotkeys_init()
+ {
+ KHotKeys::khotkeys_init();
+ }
+
+void khotkeys_cleanup()
+ {
+ KHotKeys::khotkeys_cleanup();
+ }
+
+QString khotkeys_get_menu_entry_shortcut( const QString& entry_P )
+ {
+ return KHotKeys::khotkeys_get_menu_entry_shortcut( entry_P );
+ }
+
+bool khotkeys_menu_entry_moved( const QString& new_P, const QString& old_P )
+ {
+ return KHotKeys::khotkeys_menu_entry_moved( new_P, old_P );
+ }
+
+void khotkeys_menu_entry_deleted( const QString& entry_P )
+ {
+ KHotKeys::khotkeys_menu_entry_deleted( entry_P );
+ }
+
+QString khotkeys_change_menu_entry_shortcut( const QString& entry_P,
+ const QString& shortcut_P )
+ {
+ return KHotKeys::khotkeys_change_menu_entry_shortcut( entry_P, shortcut_P );
+ }
+
+QStringList khotkeys_get_all_shortcuts( )
+ {
+ return KHotKeys::khotkeys_get_all_shortcuts();
+ }
+
+KService::Ptr khotkeys_find_menu_entry( const QString& shortcut_P )
+ {
+ return KHotKeys::khotkeys_find_menu_entry( shortcut_P );
+ }
diff --git a/khotkeys/kcontrol/menuedit.h b/khotkeys/kcontrol/menuedit.h
new file mode 100644
index 000000000..0986d1cca
--- /dev/null
+++ b/khotkeys/kcontrol/menuedit.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _MENUEDIT_H_
+#define _MENUEDIT_H_
+
+#include <qstring.h>
+#include <kdialogbase.h>
+#include <kaccel.h>
+#include <kservice.h>
+
+// see also kdebase/kmenuedit/khotkeys.h
+extern "C"
+ {
+// initializes khotkeys DSO - loads i18n catalogue
+// handled automatically by KHotKeys wrapper class in kmenuedit
+KDE_EXPORT void khotkeys_init( void );
+// clean up khotkeys DSO
+// handled automatically by KHotKeys wrapper class in kmenuedit
+KDE_EXPORT void khotkeys_cleanup( void );
+// return keyboard shortcut ( e.g. "ALT+T" ) for given menu entry ( e.g.
+// "System/Konsole.desktop"
+KDE_EXPORT QString khotkeys_get_menu_entry_shortcut( const QString& entry_P );
+// changes assigned shortcut to menu entry a updates config file
+KDE_EXPORT QString khotkeys_change_menu_entry_shortcut( const QString& entry_P,
+ const QString& shortcut_P );
+// menu entry was moved in K Menu
+KDE_EXPORT bool khotkeys_menu_entry_moved( const QString& new_P, const QString& old_P );
+// menu entry was removed
+KDE_EXPORT void khotkeys_menu_entry_deleted( const QString& entry_P );
+// List of all hotkeys in use
+KDE_EXPORT QStringList khotkeys_get_all_shortcuts( );
+// Find menu entry that uses shortcut
+KDE_EXPORT KService::Ptr khotkeys_find_menu_entry( const QString& shortcut_P );
+ } // extern "C"
+
+#endif
diff --git a/khotkeys/kcontrol/menuentry_widget.cpp b/khotkeys/kcontrol/menuentry_widget.cpp
new file mode 100644
index 000000000..2bad5597c
--- /dev/null
+++ b/khotkeys/kcontrol/menuentry_widget.cpp
@@ -0,0 +1,70 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _MENUENTRY_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "menuentry_widget.h"
+
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+
+#include <kdebug.h>
+
+#include <actions.h>
+#include <action_data.h>
+
+#include "windowdef_list_widget.h"
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Menuentry_widget::Menuentry_widget( QWidget* parent_P, const char* name_P )
+ : Menuentry_widget_ui( parent_P, name_P )
+ {
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( menuentry_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+void Menuentry_widget::clear_data()
+ {
+ menuentry_lineedit->clear();
+ }
+
+void Menuentry_widget::set_data( const Menuentry_action* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ menuentry_lineedit->setText( data_P->command_url());
+ }
+
+Menuentry_action* Menuentry_widget::get_data( Action_data* data_P ) const
+ {
+ return new Menuentry_action( data_P, menuentry_lineedit->text());
+ }
+
+void Menuentry_widget::browse_pressed()
+ { // CHECKME TODO
+ }
+
+} // namespace KHotKeys
+
+#include "menuentry_widget.moc"
diff --git a/khotkeys/kcontrol/menuentry_widget.h b/khotkeys/kcontrol/menuentry_widget.h
new file mode 100644
index 000000000..0c871ec79
--- /dev/null
+++ b/khotkeys/kcontrol/menuentry_widget.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _MENUENTRY_WIDGET_H_
+#define _MENUENTRY_WIDGET_H_
+
+#include <menuentry_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Menuentry_action;
+class Action_data;
+
+class Menuentry_widget
+ : public Menuentry_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Menuentry_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Menuentry_action* data_P );
+ Menuentry_action* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ protected slots:
+ virtual void browse_pressed();
+ };
+
+typedef Menuentry_widget Menuentry_tab;
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/tab_widget.cpp b/khotkeys/kcontrol/tab_widget.cpp
new file mode 100644
index 000000000..2a484529a
--- /dev/null
+++ b/khotkeys/kcontrol/tab_widget.cpp
@@ -0,0 +1,484 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _TAB_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "tab_widget.h"
+
+#include <typeinfo>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <actions.h>
+#include <action_data.h>
+
+#include "general_tab.h"
+#include "action_group_tab.h"
+#include "windowdef_list_widget.h"
+#include "menuentry_widget.h"
+#include "command_url_widget.h"
+#include "dcop_widget.h"
+#include "triggers_tab.h"
+#include "info_tab.h"
+#include "action_list_widget.h"
+#include "keyboard_input_widget.h"
+#include "kcmkhotkeys.h"
+#include "condition_list_widget.h"
+#include "gesture_triggers_tab.h"
+#include "gestures_settings_tab.h"
+#include "general_settings_tab.h"
+#include "voice_settings_tab.h"
+
+// CHECKME
+//nejak lip ty typeid
+//asi spis udelat funkci, ktera vrati enum a pak tam mit switche, tak se zajisti, ze se nikde
+//nezapomene
+
+// CHECKME mozna nejak lepe to poradi tabu, takhle je to podle jejich poradi v enum
+
+namespace KHotKeys
+{
+
+Tab_widget::Tab_widget( QWidget* parent_P, const char* name_P )
+ : QTabWidget( parent_P, name_P )
+ {
+ pages[ TAB_INFO ] = new Info_tab;
+ pages[ TAB_GENERAL_SETTINGS ] = new General_settings_tab;
+ pages[ TAB_GESTURES_SETTINGS ] = new Gestures_settings_tab;
+ General_tab* general_tab;
+ pages[ TAB_GENERAL ] = general_tab = new General_tab;
+ connect( general_tab, SIGNAL( action_type_changed( int )),
+ SLOT( set_action_type_slot( int )));
+ pages[ TAB_GROUP_GENERAL ] = new Action_group_tab;
+ pages[ TAB_CONDITIONS ] = new Condition_list_tab;
+ pages[ TAB_ACTIONS ] = new Action_list_tab;
+ pages[ TAB_TRIGGERS ] = new Triggers_tab;
+ pages[ TAB_SHORTCUT_TRIGGER ] = new Shortcut_trigger_tab;
+ pages[ TAB_GESTURE_TRIGGER ] = new Gesture_triggers_tab;
+ pages[ TAB_COMMAND_URL ] = new Command_url_tab;
+ pages[ TAB_MENUENTRY ] = new Menuentry_tab;
+ pages[ TAB_DCOP ] = new Dcop_tab;
+ pages[ TAB_KEYBOARD_INPUT ] = new Keyboard_input_tab;
+ pages[ TAB_WINDOW ] = new Windowdef_list_tab;
+ pages[ TAB_VOICE_SETTINGS ] = new Voice_settings_tab;
+ for( tab_pos_t i = TAB_FIRST;
+ i < TAB_END;
+ ++i )
+ connect( this, SIGNAL( clear_pages_signal()), pages[ i ], SLOT( clear_data()));
+#ifdef HAVE_ARTS
+ if( haveArts())
+ show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS, TAB_VOICE_SETTINGS ));
+ else
+#endif
+ show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS ));
+ current_type = NONE;
+ current_data_type = TYPE_GENERIC;
+ }
+
+Tab_widget::~Tab_widget()
+ {
+ for( tab_pos_t i = TAB_FIRST;
+ i < TAB_END;
+ ++i )
+ {
+ removePage( pages[ i ] );
+ delete pages[ i ];
+ }
+ }
+
+void Tab_widget::save_current_action_changes()
+ {
+ if( current_type == NONE ) // info, global settings
+ {
+ static_cast< Gestures_settings_tab* >( pages[ TAB_GESTURES_SETTINGS ] )->write_data(); // saves
+ static_cast< General_settings_tab* >( pages[ TAB_GENERAL_SETTINGS ] )->write_data(); // saves
+ static_cast< Voice_settings_tab* >( pages[ TAB_VOICE_SETTINGS ] )->write_data(); // saves
+ }
+ else if( current_type == GROUP )
+ {
+ Action_data_group* old =
+ static_cast< Action_data_group* >( module->current_action_data());
+ Action_data_group* item =
+ static_cast< Action_group_tab* >( pages[ TAB_GROUP_GENERAL ] )->get_data(
+ module->current_action_data()->parent(), NULL );
+ item->set_conditions( static_cast< Condition_list_tab* >( pages[ TAB_CONDITIONS ] )
+ ->get_data( item ));
+ for( Action_data_group::Iterator it = old->first_child();
+ it;
+ )
+ {
+ Action_data_base* tmp = ( *it );
+ ++it; // the items will be removed from the list, so better be carefull
+ tmp->reparent( item );
+ }
+ module->set_current_action_data( item );
+ }
+ else if( current_type == DATA )
+ {
+ QString name, comment;
+ bool enabled;
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->get_data( name, comment, enabled );
+ switch( current_data_type )
+ {
+ case TYPE_GENERIC:
+ {
+ Generic_action_data* tmp = new Generic_action_data(
+ module->current_action_data()->parent(), name, comment, NULL, NULL, NULL,
+ enabled );
+ tmp->set_triggers(
+ static_cast< Triggers_tab* >( pages[ TAB_TRIGGERS ] )->get_data( tmp ));
+ tmp->set_conditions( static_cast< Condition_list_tab* >
+ ( pages[ TAB_CONDITIONS ] )->get_data( tmp ));
+ tmp->set_actions(
+ static_cast< Action_list_tab* >( pages[ TAB_ACTIONS ] )->get_data( tmp ));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_COMMAND_URL_SHORTCUT:
+ {
+ Command_url_shortcut_action_data* tmp = new Command_url_shortcut_action_data(
+ module->current_action_data()->parent(), name, comment, enabled );
+ tmp->set_trigger(
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->get_data( tmp ));
+ tmp->set_action(
+ static_cast< Command_url_tab* >( pages[ TAB_COMMAND_URL ] )->get_data( tmp ));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_MENUENTRY_SHORTCUT:
+ {
+ Menuentry_shortcut_action_data* tmp = new Menuentry_shortcut_action_data(
+ module->current_action_data()->parent(), name, comment, enabled );
+ tmp->set_trigger(
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->get_data( tmp ));
+ tmp->set_action(
+ static_cast< Menuentry_tab* >( pages[ TAB_MENUENTRY ] )->get_data( tmp ));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_DCOP_SHORTCUT:
+ {
+ Dcop_shortcut_action_data* tmp = new Dcop_shortcut_action_data(
+ module->current_action_data()->parent(), name, comment, enabled );
+ tmp->set_trigger(
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->get_data( tmp ));
+ tmp->set_action(
+ static_cast< Dcop_tab* >( pages[ TAB_DCOP ] )->get_data( tmp ));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_KEYBOARD_INPUT_SHORTCUT:
+ {
+ Keyboard_input_shortcut_action_data* tmp
+ = new Keyboard_input_shortcut_action_data(
+ module->current_action_data()->parent(), name, comment, enabled );
+ tmp->set_trigger(
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->get_data( tmp ));
+ tmp->set_action( static_cast< Keyboard_input_tab* >
+ ( pages[ TAB_KEYBOARD_INPUT ] )->get_data( tmp ));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_KEYBOARD_INPUT_GESTURE:
+ {
+ Keyboard_input_gesture_action_data* tmp
+ = new Keyboard_input_gesture_action_data(
+ module->current_action_data()->parent(), name, comment, enabled );
+ tmp->set_triggers(
+ static_cast< Gesture_triggers_tab* >( pages[ TAB_GESTURE_TRIGGER ] )
+ ->get_data( tmp ));
+ tmp->set_action( static_cast< Keyboard_input_tab* >
+ ( pages[ TAB_KEYBOARD_INPUT ] )->get_data( tmp ));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_ACTIVATE_WINDOW_SHORTCUT:
+ {
+ Activate_window_shortcut_action_data* tmp
+ = new Activate_window_shortcut_action_data(
+ module->current_action_data()->parent(), name, comment, enabled );
+ tmp->set_trigger(
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->get_data( tmp ));
+ tmp->set_action( new Activate_window_action( tmp,
+ static_cast< Windowdef_list_tab* >
+ ( pages[ TAB_WINDOW ] )->get_data()));
+ module->set_current_action_data( tmp );
+ break;
+ }
+ case TYPE_END:
+ assert( false );
+ }
+ }
+ }
+
+void Tab_widget::load_current_action()
+ {
+ check_action_type();
+ if( current_type == NONE ) // info, global settings
+ {
+ static_cast< Gestures_settings_tab* >( pages[ TAB_GESTURES_SETTINGS ] )->read_data(); // loads
+ static_cast< Voice_settings_tab* >( pages[ TAB_VOICE_SETTINGS ] )->read_data(); // loads
+ static_cast< General_settings_tab* >( pages[ TAB_GENERAL_SETTINGS ] )->read_data(); // loads
+ }
+ else if( current_type == GROUP )
+ {
+ static_cast< Action_group_tab* >( pages[ TAB_GROUP_GENERAL ] )->set_data(
+ static_cast< Action_data_group* >( module->current_action_data()));
+ static_cast< Condition_list_tab* >( pages[ TAB_CONDITIONS ] )
+ ->set_data( module->current_action_data()->conditions());
+ }
+ else if( current_type == DATA )
+ {
+ Action_data* tmp = static_cast< Action_data* >( module->current_action_data());
+ switch( current_data_type )
+ {
+ case TYPE_GENERIC:
+ kdDebug( 1217 ) << "loading unknown" << endl;
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( tmp );
+ static_cast< Condition_list_tab* >( pages[ TAB_CONDITIONS ] )
+ ->set_data( tmp->conditions());
+ static_cast< Triggers_tab* >( pages[ TAB_TRIGGERS ] )->set_data( tmp->triggers());
+ static_cast< Action_list_tab* >( pages[ TAB_ACTIONS ] )->set_data(
+ tmp->actions());
+ break;
+ case TYPE_COMMAND_URL_SHORTCUT:
+ {
+ kdDebug( 1217 ) << "loading command_url_shortcut" << endl;
+ Command_url_shortcut_action_data* item
+ = static_cast< Command_url_shortcut_action_data* >( tmp );
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item );
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->set_data( item->trigger());
+ static_cast< Command_url_tab* >( pages[ TAB_COMMAND_URL ] )->set_data(
+ item->action());
+ break;
+ }
+ case TYPE_MENUENTRY_SHORTCUT:
+ {
+ kdDebug( 1217 ) << "loading menuentry_shortcut" << endl;
+ Menuentry_shortcut_action_data* item
+ = static_cast< Menuentry_shortcut_action_data* >( tmp );
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item );
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->set_data( item->trigger());
+ static_cast< Menuentry_tab* >( pages[ TAB_MENUENTRY ] )->set_data(
+ item->action());
+ break;
+ }
+ case TYPE_DCOP_SHORTCUT:
+ {
+ kdDebug( 1217 ) << "loading dcop_shortcut" << endl;
+ Dcop_shortcut_action_data* item
+ = static_cast< Dcop_shortcut_action_data* >( tmp );
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item );
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->set_data( item->trigger());
+ static_cast< Dcop_tab* >( pages[ TAB_DCOP ] )->set_data(
+ item->action());
+ break;
+ }
+ case TYPE_KEYBOARD_INPUT_SHORTCUT:
+ {
+ kdDebug( 1217 ) << "loading keyboard_input_shortcut" << endl;
+ Keyboard_input_shortcut_action_data* item
+ = static_cast< Keyboard_input_shortcut_action_data* >( tmp );
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item );
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->set_data( item->trigger());
+ static_cast< Keyboard_input_tab* >( pages[ TAB_KEYBOARD_INPUT ] )->set_data(
+ item->action());
+ break;
+ }
+ case TYPE_KEYBOARD_INPUT_GESTURE:
+ {
+ kdDebug( 1217 ) << "loading keyboard_input_gesture" << endl;
+ Keyboard_input_gesture_action_data* item
+ = static_cast< Keyboard_input_gesture_action_data* >( tmp );
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item );
+ static_cast< Gesture_triggers_tab* >( pages[ TAB_GESTURE_TRIGGER ] )
+ ->set_data( item->triggers());
+ static_cast< Keyboard_input_tab* >( pages[ TAB_KEYBOARD_INPUT ] )->set_data(
+ item->action());
+ break;
+ }
+ case TYPE_ACTIVATE_WINDOW_SHORTCUT:
+ {
+ kdDebug( 1217 ) << "loading activate_window_shortcut" << endl;
+ Activate_window_shortcut_action_data* item
+ = static_cast< Activate_window_shortcut_action_data* >( tmp );
+ static_cast< General_tab* >( pages[ TAB_GENERAL ] )->set_data( item );
+ static_cast< Shortcut_trigger_tab* >( pages[ TAB_SHORTCUT_TRIGGER ] )
+ ->set_data( item->trigger());
+ static_cast< Windowdef_list_tab* >( pages[ TAB_WINDOW ] )->set_data(
+ item->action()->window());
+ break;
+ }
+ case TYPE_END:
+ assert( false );
+ }
+ }
+ }
+
+void Tab_widget::check_action_type()
+ {
+ if( module->current_action_data() == NULL )
+ {
+ kdDebug( 1217 ) << "setting none" << endl;
+ if( current_type == NONE )
+ return;
+#ifdef HAVE_ARTS
+ if( haveArts())
+ show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS, TAB_VOICE_SETTINGS ));
+ else
+#endif
+ show_pages(( TAB_INFO, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS ));
+ current_type = NONE;
+ return;
+ }
+ if( dynamic_cast< Action_data_group* >( module->current_action_data()) != NULL )
+ { // Action_data_group
+ kdDebug( 1217 ) << "setting group" << endl;
+ if( current_type == GROUP )
+ return;
+ show_pages(( TAB_GROUP_GENERAL, TAB_CONDITIONS ));
+ current_type = GROUP;
+ return;
+ }
+ else // standard action
+ {
+ action_type_t is_type =
+ type( static_cast< Action_data* >( module->current_action_data()));
+ kdDebug( 1217 ) << "setting data " << is_type << endl;
+ if( current_type == DATA && is_type == current_data_type )
+ return;
+ current_type = DATA;
+ set_action_type( is_type, true );
+ return;
+ }
+ }
+
+void Tab_widget::set_action_type( action_type_t type_P, bool force_P )
+ {
+ assert( current_type == DATA );
+ if( current_data_type == type_P && !force_P )
+ return;
+ current_data_type = type_P;
+ switch( type_P )
+ {
+ case TYPE_GENERIC:
+ show_pages(( TAB_GENERAL, TAB_TRIGGERS, TAB_ACTIONS, TAB_CONDITIONS ));
+ break;
+ case TYPE_COMMAND_URL_SHORTCUT:
+ show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_COMMAND_URL ));
+ break;
+ case TYPE_MENUENTRY_SHORTCUT:
+ show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_MENUENTRY ));
+ break;
+ case TYPE_DCOP_SHORTCUT:
+ show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_DCOP ));
+ break;
+ case TYPE_KEYBOARD_INPUT_SHORTCUT:
+ show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_KEYBOARD_INPUT ));
+ break;
+ case TYPE_KEYBOARD_INPUT_GESTURE:
+ show_pages(( TAB_GENERAL, TAB_GESTURE_TRIGGER, TAB_KEYBOARD_INPUT ));
+ break;
+ case TYPE_ACTIVATE_WINDOW_SHORTCUT:
+ show_pages(( TAB_GENERAL, TAB_SHORTCUT_TRIGGER, TAB_WINDOW ));
+ break;
+ case TYPE_END:
+ assert( false );
+ }
+ }
+
+void Tab_widget::set_action_type_slot( int type_P )
+ {
+ set_action_type( static_cast< action_type_t >( type_P ));
+ }
+
+const char* const Tab_widget::tab_labels[ Tab_widget::TAB_END ] = {
+ I18N_NOOP( "Info" ), // TAB_INFO
+ I18N_NOOP( "General Settings" ), // TAB_GENERAL_SETTINGS
+ I18N_NOOP( "Gestures Settings" ), // TAB_GESTURES_SETTINGS
+ I18N_NOOP( "General" ), // TAB_GENERAL
+ I18N_NOOP( "General" ), // TAB_GROUP_GENERAL
+ I18N_NOOP( "Triggers" ), // TAB_TRIGGERS
+ I18N_NOOP( "Keyboard Shortcut" ), // TAB_SHORTCUT_TRIGGER
+ I18N_NOOP( "Gestures" ), // TAB_GESTURE_TRIGGER
+ I18N_NOOP( "Actions" ), // TAB_ACTIONS
+ I18N_NOOP( "Command/URL Settings" ), // TAB_COMMAND_URL
+ I18N_NOOP( "Menu Entry Settings" ), // TAB_MENUENTRY
+ I18N_NOOP( "DCOP Call Settings" ), // TAB_DCOP
+ I18N_NOOP( "Keyboard Input Settings" ), // TAB_KEYBOARD_INPUT
+ I18N_NOOP( "Window" ), // TAB_WINDOW
+ I18N_NOOP( "Conditions" ), // TAB_CONDITIONS
+ I18N_NOOP( "Voices Settings" ) // TAB_VOICE_SETTINGS
+ };
+
+void Tab_widget::show_pages( const Pages_set& pages_P )
+ {
+ hide(); // this seems to be necessary, otherwise it's not repainter properly
+ for( tab_pos_t i = TAB_FIRST;
+ i < TAB_END;
+ ++i )
+ {
+ removePage( pages[ i ] );
+ if( pages_P.is_set( i )) // don't clear page contents if it stays visible
+ disconnect( this, SIGNAL( clear_pages_signal()), pages[ i ], SLOT( clear_data()));
+ }
+ clear_pages();
+ // reconnect all pages to this signal
+ disconnect( this, SIGNAL( clear_pages_signal()), NULL, NULL );
+ for( tab_pos_t i = TAB_FIRST;
+ i < TAB_END;
+ ++i )
+ {
+ if( pages_P.is_set( i ))
+ addTab( pages[ i ], i18n( tab_labels[ i ] ));
+ connect( this, SIGNAL( clear_pages_signal()), pages[ i ], SLOT( clear_data()));
+ }
+ show();
+ }
+
+Tab_widget::action_type_t Tab_widget::type( const Action_data* data_P )
+ {
+ Tab_widget::action_type_t ret = Tab_widget::TYPE_GENERIC;
+ if( typeid( *data_P ) == typeid( Generic_action_data ))
+ ret = Tab_widget::TYPE_GENERIC;
+ else if( typeid( *data_P ) == typeid( Command_url_shortcut_action_data ))
+ ret = Tab_widget::TYPE_COMMAND_URL_SHORTCUT;
+ else if( typeid( *data_P ) == typeid( Menuentry_shortcut_action_data ))
+ ret = Tab_widget::TYPE_MENUENTRY_SHORTCUT;
+ else if( typeid( *data_P ) == typeid( Dcop_shortcut_action_data ))
+ ret = Tab_widget::TYPE_DCOP_SHORTCUT;
+ else if( typeid( *data_P ) == typeid( Keyboard_input_shortcut_action_data ))
+ ret = Tab_widget::TYPE_KEYBOARD_INPUT_SHORTCUT;
+ else if( typeid( *data_P ) == typeid( Keyboard_input_gesture_action_data ))
+ ret = Tab_widget::TYPE_KEYBOARD_INPUT_GESTURE;
+ else if( typeid( *data_P ) == typeid( Activate_window_shortcut_action_data ))
+ ret = Tab_widget::TYPE_ACTIVATE_WINDOW_SHORTCUT;
+ else
+ assert( false );
+ return ret;
+ }
+
+} // namespace KHotKeys
+
+#include "tab_widget.moc"
diff --git a/khotkeys/kcontrol/tab_widget.h b/khotkeys/kcontrol/tab_widget.h
new file mode 100644
index 000000000..eedaa541a
--- /dev/null
+++ b/khotkeys/kcontrol/tab_widget.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _TAB_WIDGET_H_
+#define _TAB_WIDGET_H_
+
+#include <qtabwidget.h>
+
+#include <actions.h>
+
+namespace KHotKeys
+{
+
+class Tab_widget
+ : public QTabWidget
+ {
+ Q_OBJECT
+ public:
+ enum action_type_t
+ {
+ TYPE_FIRST,
+ TYPE_GENERIC = TYPE_FIRST,
+ TYPE_COMMAND_URL_SHORTCUT,
+ TYPE_MENUENTRY_SHORTCUT,
+ TYPE_DCOP_SHORTCUT,
+ TYPE_KEYBOARD_INPUT_SHORTCUT,
+ TYPE_KEYBOARD_INPUT_GESTURE,
+ TYPE_ACTIVATE_WINDOW_SHORTCUT,
+ TYPE_END
+ };
+ Tab_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ virtual ~Tab_widget();
+ void set_action_type( action_type_t type_P, bool force_P = false );
+ void save_current_action_changes();
+ void load_current_action();
+ void clear_pages();
+ static action_type_t type( const Action_data* data_P );
+ signals: // internal
+ void clear_pages_signal();
+ protected slots:
+ void set_action_type_slot( int type_P );
+ protected:
+ void check_action_type();
+ class Pages_set;
+ void show_pages( const Pages_set& pages_P );
+ enum tab_pos_t { TAB_FIRST, TAB_INFO = TAB_FIRST, TAB_GENERAL_SETTINGS, TAB_GESTURES_SETTINGS,
+ TAB_GENERAL, TAB_GROUP_GENERAL,
+ TAB_TRIGGERS, TAB_SHORTCUT_TRIGGER, TAB_GESTURE_TRIGGER, TAB_ACTIONS, TAB_COMMAND_URL,
+ TAB_MENUENTRY, TAB_DCOP, TAB_KEYBOARD_INPUT, TAB_WINDOW, TAB_CONDITIONS, TAB_VOICE_SETTINGS, TAB_END };
+ QWidget* pages[ TAB_END ];
+ enum tab_show_type_t { NONE, DATA, GROUP };
+ tab_show_type_t current_type;
+ action_type_t current_data_type;
+ static const char* const tab_labels[];
+ class Pages_set // that main reason for existence of this class is the fact that
+ { // I was very curious if overloading operator, ( = comma ) really
+ public: // works ( it does, but not exactly as I expected :( )
+ Pages_set( tab_pos_t page_P );
+ Pages_set& operator,( tab_pos_t page_P );
+ bool is_set( tab_pos_t page_P ) const;
+ protected:
+ bool set[ TAB_END ];
+ };
+ friend Pages_set operator,( tab_pos_t page1_P, tab_pos_t page2_P ); // CHECKME
+ friend tab_pos_t& operator++( tab_pos_t& val_P ); // CHECKME
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Tab_widget
+
+// grrrr
+inline
+Tab_widget::tab_pos_t& operator++( Tab_widget::tab_pos_t& val_P )
+ {
+ val_P = static_cast< Tab_widget::tab_pos_t >( val_P + 1 );
+ return val_P;
+ }
+
+inline
+void Tab_widget::clear_pages()
+ {
+ emit clear_pages_signal();
+ }
+
+// Tab_widget::Pages_set
+
+inline
+Tab_widget::Pages_set::Pages_set( tab_pos_t page_P )
+ {
+ for( tab_pos_t i = TAB_FIRST;
+ i < TAB_END;
+ ++i )
+ set[ i ] = false;
+ set[ page_P ] = true;
+ }
+
+inline
+bool Tab_widget::Pages_set::is_set( tab_pos_t page_P ) const
+ {
+ return set[ page_P ];
+ }
+
+inline
+Tab_widget::Pages_set& Tab_widget::Pages_set::operator,( tab_pos_t page_P )
+ {
+ set[ page_P ] = true;
+ return *this;
+ }
+
+inline
+Tab_widget::Pages_set operator,( Tab_widget::tab_pos_t page1_P, Tab_widget::tab_pos_t page2_P )
+ {
+ return Tab_widget::Pages_set( page1_P ), page2_P;
+ }
+
+// grrrr
+inline
+Tab_widget::action_type_t& operator++( Tab_widget::action_type_t& val_P )
+ {
+ val_P = static_cast< Tab_widget::action_type_t >( val_P + 1 );
+ return val_P;
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/triggers_tab.cpp b/khotkeys/kcontrol/triggers_tab.cpp
new file mode 100644
index 000000000..8c4a13fda
--- /dev/null
+++ b/khotkeys/kcontrol/triggers_tab.cpp
@@ -0,0 +1,366 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _TRIGGERS_TAB_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "triggers_tab.h"
+
+#include <assert.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qpopupmenu.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qheader.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kshortcut.h>
+#include <kconfig.h>
+#include <kshortcutlist.h>
+#include <kkeybutton.h>
+#include <kkeydialog.h>
+
+#include "kcmkhotkeys.h"
+#include "windowdef_list_widget.h"
+#include "window_trigger_widget.h"
+#include "gesturerecordpage.h"
+#include "voicerecordpage.h"
+
+namespace KHotKeys
+{
+
+// Triggers_tab
+
+Triggers_tab::Triggers_tab( QWidget* parent_P, const char* name_P )
+ : Triggers_tab_ui( parent_P, name_P ), selected_item( NULL )
+ {
+ QPopupMenu* popup = new QPopupMenu; // CHECKME looks like setting parent doesn't work
+ popup->insertItem( i18n( "Shortcut Trigger..." ), TYPE_SHORTCUT_TRIGGER );
+ popup->insertItem( i18n( "Gesture Trigger..." ), TYPE_GESTURE_TRIGGER );
+ popup->insertItem( i18n( "Window Trigger..." ), TYPE_WINDOW_TRIGGER );
+#ifdef HAVE_ARTS
+ if( haveArts())
+ popup->insertItem( i18n( "Voice Trigger..." ), TYPE_VOICE_TRIGGER );
+#endif
+ connect( popup, SIGNAL( activated( int )), SLOT( new_selected( int )));
+ connect( triggers_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( modify_pressed() ) );
+
+ new_button->setPopup( popup );
+ copy_button->setEnabled( false );
+ modify_button->setEnabled( false );
+ delete_button->setEnabled( false );
+ triggers_listview->header()->hide();
+ triggers_listview->addColumn( "" );
+ triggers_listview->setSorting( -1 );
+ triggers_listview->setForceSelect( true );
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( new_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( copy_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( modify_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( delete_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+Triggers_tab::~Triggers_tab()
+ {
+ delete new_button->popup(); // CHECKME
+ }
+
+void Triggers_tab::clear_data()
+ {
+ comment_lineedit->clear();
+ triggers_listview->clear();
+ }
+
+void Triggers_tab::set_data( const Trigger_list* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ comment_lineedit->setText( data_P->comment());
+ Trigger_list_item* after = NULL;
+ triggers_listview->clear();
+ for( Trigger_list::Iterator it( *data_P );
+ *it;
+ ++it )
+ after = create_listview_item( *it, triggers_listview, after, true );
+ }
+
+Trigger_list* Triggers_tab::get_data( Action_data* data_P ) const
+ {
+ Trigger_list* list = new Trigger_list( comment_lineedit->text());
+ for( QListViewItem* pos = triggers_listview->firstChild();
+ pos != NULL;
+ pos = pos->nextSibling())
+ list->append( static_cast< Trigger_list_item* >( pos )->trigger()->copy( data_P ));
+ return list;
+ }
+
+void Triggers_tab::new_selected( int type_P )
+ {
+ Trigger_dialog* dlg = NULL;
+ switch( type_P )
+ {
+ case TYPE_SHORTCUT_TRIGGER: // Shortcut_trigger
+ dlg = new Shortcut_trigger_dialog(
+ new Shortcut_trigger( NULL, KShortcut())); // CHECKME NULL ?
+ break;
+ case TYPE_GESTURE_TRIGGER: // Gesture trigger
+ dlg = new Gesture_trigger_dialog(
+ new Gesture_trigger( NULL, QString::null )); // CHECKME NULL ?
+ break;
+ case TYPE_WINDOW_TRIGGER: // Window trigger
+ dlg = new Window_trigger_dialog( new Window_trigger( NULL, new Windowdef_list( "" ),
+ 0 )); // CHECKME NULL ?
+ break;
+ case TYPE_VOICE_TRIGGER: // Voice trigger
+ dlg = new Voice_trigger_dialog( new Voice_trigger(NULL,QString::null,VoiceSignature(),VoiceSignature())); // CHECKME NULL ?
+ break;
+ }
+ if( dlg != NULL )
+ {
+ Trigger* trg = dlg->edit_trigger();
+ if( trg != NULL )
+ triggers_listview->setSelected( create_listview_item( trg, triggers_listview,
+ selected_item, false ), true );
+ delete dlg;
+ }
+ }
+
+void Triggers_tab::copy_pressed()
+ {
+ if ( selected_item )
+ {
+ triggers_listview->setSelected( create_listview_item( selected_item->trigger(),triggers_listview, selected_item, true ), true );
+ }
+ }
+
+void Triggers_tab::delete_pressed()
+ {
+ delete selected_item; // CHECKME snad vyvola signaly pro enable()
+ selected_item = NULL;
+ }
+
+void Triggers_tab::modify_pressed()
+{
+ if ( selected_item )
+ edit_listview_item( selected_item );
+}
+
+void Triggers_tab::current_changed( QListViewItem* item_P )
+ {
+// if( item_P == selected_item )
+// return;
+ selected_item = static_cast< Trigger_list_item* >( item_P );
+// triggers_listview->setSelected( item_P, true );
+ copy_button->setEnabled( item_P != NULL );
+ modify_button->setEnabled( item_P != NULL );
+ delete_button->setEnabled( item_P != NULL );
+ }
+
+Trigger_list_item* Triggers_tab::create_listview_item( Trigger* trigger_P,
+ QListView* parent_P, QListViewItem* after_P, bool copy_P )
+ {
+ Trigger* new_trg = copy_P ? trigger_P->copy( NULL ) : trigger_P; // CHECKME NULL ?
+// CHECKME uz by nemelo byt treba if( after_P == NULL )
+// return new Trigger_list_item( parent_P, new_trg );
+// else
+ return new Trigger_list_item( parent_P, after_P, new_trg );
+ }
+
+void Triggers_tab::edit_listview_item( Trigger_list_item* item_P )
+ {
+ Trigger_dialog* dlg = NULL;
+ if( Shortcut_trigger* trg = dynamic_cast< Shortcut_trigger* >( item_P->trigger()))
+ dlg = new Shortcut_trigger_dialog( trg );
+ else if( Gesture_trigger* trg = dynamic_cast< Gesture_trigger* >( item_P->trigger()))
+ dlg = new Gesture_trigger_dialog( trg );
+ else if( Window_trigger* trg = dynamic_cast< Window_trigger* >( item_P->trigger()))
+ dlg = new Window_trigger_dialog( trg );
+ else if( Voice_trigger* trg = dynamic_cast< Voice_trigger* >( item_P->trigger()))
+ dlg = new Voice_trigger_dialog( trg );
+// CHECKME TODO dalsi
+ else
+ assert( false );
+ Trigger* new_trigger = dlg->edit_trigger();
+ if( new_trigger != NULL )
+ item_P->set_trigger( new_trigger );
+ delete dlg;
+ }
+
+// Trigger_list_item
+
+QString Trigger_list_item::text( int column_P ) const
+ {
+ return column_P == 0 ? trigger()->description() : QString::null;
+ }
+
+// Shortcut_trigger_widget
+
+Shortcut_trigger_widget::Shortcut_trigger_widget( QWidget* parent_P, const char* )
+ : QWidget( parent_P )
+ {
+ QVBoxLayout* lay = new QVBoxLayout( this, 11, 6 );
+ QLabel* lbl = new QLabel( i18n( "Select keyboard shortcut:" ), this );
+ lay->addWidget( lbl );
+ lay->addSpacing( 10 );
+ bt = new KKeyButton( this );
+ lay->addWidget( bt, 0 , Qt::AlignHCenter );
+ lay->addStretch();
+ clear_data();
+ connect( bt, SIGNAL( capturedShortcut( const KShortcut& )),
+ this, SLOT( capturedShortcut( const KShortcut& )));
+ }
+
+void Shortcut_trigger_widget::clear_data()
+ {
+ bt->setShortcut( KShortcut(), false );
+ }
+
+void Shortcut_trigger_widget::capturedShortcut( const KShortcut& s_P )
+ {
+ if( KKeyChooser::checkGlobalShortcutsConflict( s_P, true, topLevelWidget())
+ || KKeyChooser::checkStandardShortcutsConflict( s_P, true, topLevelWidget()))
+ return;
+ // KHotKeys::Module::changed()
+ module->changed();
+ bt->setShortcut( s_P, false );
+ }
+
+void Shortcut_trigger_widget::set_data( const Shortcut_trigger* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ bt->setShortcut( data_P->shortcut(), false );
+ }
+
+Shortcut_trigger* Shortcut_trigger_widget::get_data( Action_data* data_P ) const
+ {
+ return !bt->shortcut().isNull()
+ ? new Shortcut_trigger( data_P, bt->shortcut()) : NULL;
+ }
+
+// Shortcut_trigger_dialog
+
+Shortcut_trigger_dialog::Shortcut_trigger_dialog( Shortcut_trigger* trigger_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption
+ trigger( NULL )
+ {
+ widget = new Shortcut_trigger_widget( this );
+ widget->set_data( trigger_P );
+ setMainWidget( widget );
+ }
+
+Trigger* Shortcut_trigger_dialog::edit_trigger()
+ {
+ exec();
+ return trigger;
+ }
+
+void Shortcut_trigger_dialog::accept()
+ {
+ KDialogBase::accept();
+ trigger = widget->get_data( NULL ); // CHECKME NULL ?
+ }
+
+// Window_trigger_dialog
+
+Window_trigger_dialog::Window_trigger_dialog( Window_trigger* trigger_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption
+ trigger( NULL )
+ {
+ widget = new Window_trigger_widget( this );
+ widget->set_data( trigger_P );
+ setMainWidget( widget );
+ }
+
+Trigger* Window_trigger_dialog::edit_trigger()
+ {
+ exec();
+ return trigger;
+ }
+
+void Window_trigger_dialog::accept()
+ {
+ KDialogBase::accept();
+ trigger = widget->get_data( NULL ); // CHECKME NULL ?
+ }
+
+// Gesture_trigger_dialog
+
+Gesture_trigger_dialog::Gesture_trigger_dialog( Gesture_trigger* trigger_P )
+ : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption
+ _trigger( trigger_P ), _page( NULL )
+ {
+ _page = new GestureRecordPage( _trigger->gesturecode(),
+ this, "GestureRecordPage");
+
+ connect(_page, SIGNAL(gestureRecorded(bool)),
+ this, SLOT(enableButtonOK(bool)));
+
+ setMainWidget( _page );
+ }
+
+Trigger* Gesture_trigger_dialog::edit_trigger()
+ {
+ if( exec())
+ return new Gesture_trigger( NULL, _page->getGesture()); // CHECKME NULL?
+ else
+ return NULL;
+ }
+
+
+// Voice_trigger_dialog
+
+Voice_trigger_dialog::Voice_trigger_dialog( Voice_trigger* trigger_P )
+: KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption
+_trigger( trigger_P ), _page( NULL )
+{
+ _page = new VoiceRecordPage( _trigger ? _trigger->voicecode() : QString::null , this, "VoiceRecordPage");
+
+ connect(_page, SIGNAL(voiceRecorded(bool)), this, SLOT(enableButtonOK(bool)));
+
+ setMainWidget( _page );
+}
+
+Trigger* Voice_trigger_dialog::edit_trigger()
+{
+ if( exec())
+ return new Voice_trigger(NULL, _page->getVoiceId(),
+ (_page->isModifiedSignature(1) || !_trigger) ? _page->getVoiceSignature(1) : _trigger->voicesignature(1) ,
+ (_page->isModifiedSignature(2) || !_trigger) ? _page->getVoiceSignature(2) : _trigger->voicesignature(2) );
+ else
+ return NULL;
+}
+
+
+
+
+} // namespace KHotKeys
+
+#include "triggers_tab.moc"
diff --git a/khotkeys/kcontrol/triggers_tab.h b/khotkeys/kcontrol/triggers_tab.h
new file mode 100644
index 000000000..57cce3e3e
--- /dev/null
+++ b/khotkeys/kcontrol/triggers_tab.h
@@ -0,0 +1,206 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _TRIGGERS_TAB_H_
+#define _TRIGGERS_TAB_H_
+
+#include <kdialogbase.h>
+
+#include <khlistview.h>
+
+#include <triggers.h>
+#include <triggers_tab_ui.h>
+#include <window_trigger_widget.h>
+
+class KKeyButton;
+class KShortcut;
+
+namespace KHotKeys
+{
+
+class Windowdef_list;
+class Action_data;
+class Trigger_list_item;
+class KHotKeysShortcutList;
+
+// A listbox here would do too, but unlike QListView, QListBox now even cannot be subclassed
+// to behave sanely WRT selecting and the current item
+class Triggers_tab
+ : public Triggers_tab_ui
+ {
+ Q_OBJECT
+ public:
+ Triggers_tab( QWidget* parent_P = NULL, const char* name_P = NULL );
+ virtual ~Triggers_tab();
+ void set_data( const Trigger_list* data_P );
+ Trigger_list* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ protected:
+ Trigger_list_item* create_listview_item( Trigger* trigger_P, QListView* parent_P,
+ QListViewItem* after_P, bool copy_P );
+ void edit_listview_item( Trigger_list_item* item_P );
+ Trigger_list_item* selected_item;
+ enum type_t { TYPE_SHORTCUT_TRIGGER, TYPE_GESTURE_TRIGGER, TYPE_WINDOW_TRIGGER, TYPE_VOICE_TRIGGER };
+ protected slots:
+ void new_selected( int type_P );
+ virtual void copy_pressed();
+ virtual void delete_pressed();
+ virtual void modify_pressed();
+ virtual void current_changed( QListViewItem* item_P );
+ };
+
+class Trigger_list_item
+ : public QListViewItem
+ {
+ public:
+ Trigger_list_item( QListView* parent_P, Trigger* trigger_P );
+ Trigger_list_item( QListView* parent_P, QListViewItem* after_P, Trigger* trigger_P );
+ virtual ~Trigger_list_item();
+ virtual QString text( int column_P ) const;
+ Trigger* trigger() const;
+ void set_trigger( Trigger* trigger_P );
+ protected:
+ Trigger* _trigger; // owns
+ };
+
+class Trigger_dialog
+ {
+ public:
+ virtual Trigger* edit_trigger() = 0;
+ virtual ~Trigger_dialog();
+ };
+
+// TODO no need for such extra class?
+class Shortcut_trigger_widget
+ : public QWidget
+ {
+ Q_OBJECT
+ public:
+ Shortcut_trigger_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Shortcut_trigger* trigger_P );
+ Shortcut_trigger* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ private slots:
+ void capturedShortcut( const KShortcut& );
+ private:
+ KKeyButton* bt;
+ };
+
+typedef Shortcut_trigger_widget Shortcut_trigger_tab;
+
+class Shortcut_trigger_dialog
+ : public KDialogBase, public Trigger_dialog
+ {
+ Q_OBJECT
+ public:
+ Shortcut_trigger_dialog( Shortcut_trigger* trigger_P );
+ virtual Trigger* edit_trigger();
+ protected:
+ virtual void accept();
+ Shortcut_trigger_widget* widget;
+ Shortcut_trigger* trigger;
+ };
+
+class Window_trigger_dialog
+ : public KDialogBase, public Trigger_dialog
+ {
+ Q_OBJECT
+ public:
+ Window_trigger_dialog( Window_trigger* trigger_P );
+ virtual Trigger* edit_trigger();
+ protected:
+ virtual void accept();
+ Window_trigger_widget* widget;
+ Window_trigger* trigger;
+ };
+
+class GestureRecordPage;
+
+class Gesture_trigger_dialog
+ : public KDialogBase, public Trigger_dialog
+ {
+ Q_OBJECT
+ public:
+ Gesture_trigger_dialog( Gesture_trigger* trigger_P );
+ virtual Trigger* edit_trigger();
+ private:
+ // CHECKME accept() ?
+ Gesture_trigger* _trigger;
+ GestureRecordPage *_page;
+ };
+
+
+class VoiceRecordPage;
+
+class Voice_trigger_dialog
+ : public KDialogBase, public Trigger_dialog
+{
+ Q_OBJECT
+ public:
+ Voice_trigger_dialog( Voice_trigger* trigger_P );
+ virtual Trigger* edit_trigger();
+ private:
+ // CHECKME accept() ?
+ Voice_trigger* _trigger;
+ VoiceRecordPage *_page;
+};
+
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Trigger_list_item
+
+inline
+Trigger_list_item::Trigger_list_item( QListView* parent_P, Trigger* trigger_P )
+ : QListViewItem( parent_P ), _trigger( trigger_P )
+ {
+ }
+
+inline
+Trigger_list_item::Trigger_list_item( QListView* parent_P, QListViewItem* after_P,
+ Trigger* trigger_P )
+ : QListViewItem( parent_P, after_P ), _trigger( trigger_P )
+ {
+ }
+
+inline
+Trigger_list_item::~Trigger_list_item()
+ { // CHECKME if the listview will ever be used hiearchically,
+ delete _trigger; // this will be wrong, the triggers tree will have to be kept
+ } // and deleted separately
+
+inline
+Trigger* Trigger_list_item::trigger() const
+ {
+ return _trigger;
+ }
+
+inline
+void Trigger_list_item::set_trigger( Trigger* trigger_P )
+ {
+ delete _trigger;
+ _trigger = trigger_P;
+ }
+
+// Trigger_dialog
+
+inline
+Trigger_dialog::~Trigger_dialog()
+ {
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/ui/Makefile.am b/khotkeys/kcontrol/ui/Makefile.am
new file mode 100644
index 000000000..8242b0b75
--- /dev/null
+++ b/khotkeys/kcontrol/ui/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libui.la
+libui_la_SOURCES = dummy.cpp windowdef_simple_widget_ui.ui windowdef_list_widget_ui.ui \
+ command_url_widget_ui.ui menuentry_widget_ui.ui triggers_tab_ui.ui general_tab_ui.ui \
+ action_group_tab_ui.ui dcop_widget_ui.ui main_buttons_widget_ui.ui \
+ actions_listview_widget_ui.ui info_tab_ui.ui window_trigger_widget_ui.ui \
+ action_list_widget_ui.ui keyboard_input_widget_ui.ui condition_list_widget_ui.ui \
+ gesture_triggers_tab_ui.ui gestures_settings_tab_ui.ui general_settings_tab_ui.ui \
+ voice_input_widget_ui.ui voice_settings_tab_ui.ui
+
+libui_la_LIBADD = ../../shared/libkhotkeys_shared.la $(LIB_KDEUI)
+libui_la_LDFLAGS = $(all_libraries)
+
+INCLUDES= -I$(srcdir)/.. -I$(top_srcdir)/khotkeys/shared $(all_includes)
+
+dummy.cpp:
+ echo > dummy.cpp
+
+DISTCLEANFILES = dummy.cpp
+
+METASOURCES = AUTO
+
diff --git a/khotkeys/kcontrol/ui/action_group_tab_ui.ui b/khotkeys/kcontrol/ui/action_group_tab_ui.ui
new file mode 100644
index 000000000..ad4bcceaf
--- /dev/null
+++ b/khotkeys/kcontrol/ui/action_group_tab_ui.ui
@@ -0,0 +1,108 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Action_group_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Action_group_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>596</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>action_group_name_label</cstring>
+ </property>
+ <property name="text">
+ <string>Action group &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>action_name_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>action_name_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>disable_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Disable</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_multilineedit</cstring>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>comment_multilineedit</cstring>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<slots>
+ <slot access="protected" specifier="pure virtual">action_group_name_changed( const QString&amp; )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/action_list_widget_ui.ui b/khotkeys/kcontrol/ui/action_list_widget_ui.ui
new file mode 100644
index 000000000..696b5106a
--- /dev/null
+++ b/khotkeys/kcontrol/ui/action_list_widget_ui.ui
@@ -0,0 +1,171 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Action_list_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Action_list_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>560</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KHotKeys::KHListView">
+ <property name="name">
+ <cstring>actions_listview</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>new_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>modify_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Modify...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>copy_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delete_button</cstring>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::KHListView</class>
+ <header location="global">khlistview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <signal>current_changed(QListViewItem*)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>copy_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Action_list_widget_ui</receiver>
+ <slot>copy_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>modify_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Action_list_widget_ui</receiver>
+ <slot>modify_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>delete_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Action_list_widget_ui</receiver>
+ <slot>delete_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>actions_listview</sender>
+ <signal>current_changed(QListViewItem*)</signal>
+ <receiver>Action_list_widget_ui</receiver>
+ <slot>current_changed(QListViewItem*)</slot>
+ </connection>
+</connections>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<slots>
+ <slot access="protected" specifier="pure virtual">copy_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">current_changed(QListViewItem*)</slot>
+ <slot access="protected" specifier="pure virtual">delete_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">modify_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/actions_listview_widget_ui.ui b/khotkeys/kcontrol/ui/actions_listview_widget_ui.ui
new file mode 100644
index 000000000..7c0a88a6f
--- /dev/null
+++ b/khotkeys/kcontrol/ui/actions_listview_widget_ui.ui
@@ -0,0 +1,83 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KHotKeys::Actions_listview_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Actions_listview_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>592</width>
+ <height>495</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>actions_listview_groupbox</cstring>
+ </property>
+ <property name="title">
+ <string>Actions</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KHotKeys::Actions_listview">
+ <property name="name">
+ <cstring>actions_listview</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::Actions_listview</class>
+ <header location="global">actions_listview_widget.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data>
+ </image>
+</images>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+ <include location="global" impldecl="in implementation">config.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/command_url_widget_ui.ui b/khotkeys/kcontrol/ui/command_url_widget_ui.ui
new file mode 100644
index 000000000..266dd90d9
--- /dev/null
+++ b/khotkeys/kcontrol/ui/command_url_widget_ui.ui
@@ -0,0 +1,66 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Command_url_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Command_url_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>649</width>
+ <height>361</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>command_url_label</cstring>
+ </property>
+ <property name="text">
+ <string>Command/URL to execute:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>command_url_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>command_url_lineedit</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<slots>
+ <slot access="protected" specifier="pure virtual">browse_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/condition_list_widget_ui.ui b/khotkeys/kcontrol/ui/condition_list_widget_ui.ui
new file mode 100644
index 000000000..a64ef33c1
--- /dev/null
+++ b/khotkeys/kcontrol/ui/condition_list_widget_ui.ui
@@ -0,0 +1,170 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Condition_list_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Condition_list_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>568</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KHotKeys::KHListView">
+ <property name="name">
+ <cstring>conditions_listview</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>new_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>modify_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Modify...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>copy_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delete_button</cstring>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::KHListView</class>
+ <header location="global">khlistview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>current_changed(QListViewItem*)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>copy_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Condition_list_widget_ui</receiver>
+ <slot>copy_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>modify_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Condition_list_widget_ui</receiver>
+ <slot>modify_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>delete_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Condition_list_widget_ui</receiver>
+ <slot>delete_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>conditions_listview</sender>
+ <signal>current_changed(QListViewItem*)</signal>
+ <receiver>Condition_list_widget_ui</receiver>
+ <slot>current_changed(QListViewItem*)</slot>
+ </connection>
+</connections>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<slots>
+ <slot access="protected" specifier="pure virtual">copy_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">current_changed(QListViewItem*)</slot>
+ <slot access="protected" specifier="pure virtual">delete_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">modify_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/dcop_widget_ui.ui b/khotkeys/kcontrol/ui/dcop_widget_ui.ui
new file mode 100644
index 000000000..ed6e90337
--- /dev/null
+++ b/khotkeys/kcontrol/ui/dcop_widget_ui.ui
@@ -0,0 +1,273 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Dcop_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Dcop_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>576</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>remote_app_label</cstring>
+ </property>
+ <property name="text">
+ <string>Remote &amp;application:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>remote_app_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>remote_app_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>remote_object_label</cstring>
+ </property>
+ <property name="text">
+ <string>Remote &amp;object:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>remote_object_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>remote_object_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>called_function_label</cstring>
+ </property>
+ <property name="text">
+ <string>Called &amp;function:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>called_function_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>called_function_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>arguments_label</cstring>
+ </property>
+ <property name="text">
+ <string>Arguments:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>arguments_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>arguments_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>try_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Try</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Run &amp;KDCOP</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>try_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Dcop_widget_ui</receiver>
+ <slot>try_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>Dcop_widget_ui</receiver>
+ <slot>run_kdcop_pressed()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>remote_app_lineedit</tabstop>
+ <tabstop>remote_object_lineedit</tabstop>
+ <tabstop>called_function_lineedit</tabstop>
+ <tabstop>arguments_lineedit</tabstop>
+ <tabstop>try_button</tabstop>
+ <tabstop>PushButton1</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected" specifier="pure virtual">run_kdcop_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">try_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/general_settings_tab_ui.ui b/khotkeys/kcontrol/ui/general_settings_tab_ui.ui
new file mode 100644
index 000000000..60dc34237
--- /dev/null
+++ b/khotkeys/kcontrol/ui/general_settings_tab_ui.ui
@@ -0,0 +1,117 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>General_settings_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>General_settings_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>485</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>disable_daemon_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Disable KHotKeys daemon</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>import_button</cstring>
+ </property>
+ <property name="text">
+ <string>Import New Actions...</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>import_button</sender>
+ <signal>clicked()</signal>
+ <receiver>General_settings_tab_ui</receiver>
+ <slot>import_clicked()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected" specifier="pure virtual">import_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/general_tab_ui.ui b/khotkeys/kcontrol/ui/general_tab_ui.ui
new file mode 100644
index 000000000..93f3a6a2c
--- /dev/null
+++ b/khotkeys/kcontrol/ui/general_tab_ui.ui
@@ -0,0 +1,148 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::General_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>General_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>596</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>action_name_label</cstring>
+ </property>
+ <property name="text">
+ <string>Action &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>action_name_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>action_name_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>action_type_label</cstring>
+ </property>
+ <property name="text">
+ <string>Action &amp;type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>action_type_combo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>action_type_combo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>disable_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Disable</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_multilineedit</cstring>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>comment_multilineedit</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<slots>
+ <slot access="protected" specifier="pure virtual">action_name_changed( const QString&amp; )</slot>
+ <slot access="protected" specifier="pure virtual">action_type_changed(int)</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/gesture_triggers_tab_ui.ui b/khotkeys/kcontrol/ui/gesture_triggers_tab_ui.ui
new file mode 100644
index 000000000..29f8f88d5
--- /dev/null
+++ b/khotkeys/kcontrol/ui/gesture_triggers_tab_ui.ui
@@ -0,0 +1,519 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>KHotKeys::Gesture_triggers_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Gesture_triggers_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string>Gestures:</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer29</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>gesture_lineedit1</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KHotKeys::GestureDrawer">
+ <property name="name">
+ <cstring>gesture_drawer1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>100</height>
+ </size>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer19</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>gesture_edit_button1</cstring>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer30</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer21</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>gesture_lineedit2</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer22</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KHotKeys::GestureDrawer">
+ <property name="name">
+ <cstring>gesture_drawer2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>100</height>
+ </size>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>gesture_edit_button2</cstring>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer24</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer31</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer25</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>gesture_lineedit3</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer26</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KHotKeys::GestureDrawer">
+ <property name="name">
+ <cstring>gesture_drawer3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>100</height>
+ </size>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer27</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>gesture_edit_button3</cstring>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer28</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer32</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::GestureDrawer</class>
+ <header location="global">gesturedrawer.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4350">789c6dd7594f23471007f0f7fd14d6d6db2aaaf58c3db647511eb831b7317794879ac30760cc61c010e5bba7dcf5af5688167664fdb66bbaababbb67cccf1f8dab93c3c68f9fdf5e16b298968d7222cf8d1fd5eb6cf6f1e75f7ffcfded7b9a3656ff9aad46fafdb76fdf078b46d9389a3fd42bf04841699e964933b830b79a7019dd0b96955b895b5a703bcd572e08eea576ff6570ae0eedd477b792103f854b8b2fc6d1163f77237e646e37113f89b6f8307e3bf1785a8b0eedbc696eb7ad9db7e01ee6476ee4ffe0c6fd158c7c69182cde4eec6e87fea50dfbf8176e6ba7d07f96669999cfa325ccaf862bcc97a36dbccf60f178cee11cde706761f16917ae30fe6b7488a7851bf14d7327417f676eb4f756eea41e2f57e6d83e83919f6cba117f04235fd9765b3b0fa36dfc398cf973edc67a6fb951ffe768ab6765ee26b8dff213ef5f4630e2b9e7463ea7ee8ee5ff60ee2618af8eb6fe3238437eb91bf1299cdbfacad3cadd5617f5a11738c7fe4adcb8ffd68d7aeec15e8fc3683b9f62ee2518ef33dafa3f75e3bc957086f86eb4d56f3db8e8e6dd56f01a5cc1bbe65e629673d8ebd18d0efdc9058cf9f2c08df9e630ce037db8719ec37c7a9a7fb708f10267b65e7cef46fb3e9ca3fd23dad6ef0cf67abe99f304f95ec3a8871cbb71be52d8d777e8b6fee412f6f958be3adf5ea817b561afe7d86ded7c67ce13c46fc37ede2766c17a17059cd9f38e466e8c3f8eb6fd700f0b9ef7095c37cd3d37de178f2be76dcf876fa343bd790267f012f67a77cc319f69b4ed872e2ca8e732daeabfe3c6fa9cc235f21f9b8bd4f2a5cd687bfedbfd659ee7ede017b842becf6eb44fa3cbd0df8559b0ffe808ceb0ff37e01afba3652e52cc87a26dbe276ecca7097790ff73b4cdef0616ac4fdf6df1c2d1d67ee8c6f80318eb4bd1180ff529513f0ecf7b694b62f5a002ceccb2662e523c2fb7605f9f0fd8fbbf75e3bc2dcd3e9ebcb9f17ce8c05e8f83685bcf701e44eb2db65e4fd1b65eebe62245be53b8c6f3ffdd8dfd3933fbf884761f5f0edcd88f951bf118bf44bde926dae24fe01ae7af76e3f9169e2f45bb143c0f5fdcf6fea23b18f773eac6f3e63ddac6db75e37df5e8c6fbae65aebcde6d37beaf84f528aa52f03c9dc3359ea79939c627d136deab1befaf75b883ef23e76e3ccfaea36d7dc2f795322b05ebfb0ad738af7db7ad371f99fd7e59b8b13f276e9cdf1318f5e54337e6d78cb67cf761ec170efba1acaa1afd9db92d3f3a36d729ea77efc6f33cbccf2beddfe6478fe6d85e45dbfd851bf1577007f5d877e3bc86f5a9ea3a2d6cffdfc1debe116df5db73a39e37b0e777191dda257c7fa83b6e8a2eaae00eeceb13d6b7d69f325b79b058fd32b170c1a55ebffaac2ccae2b9e6118f79c253bd6ef9ee3fd7587fef79c60f7acf3cc617fcc84ffcac6d8ffcc20b7ee5377ee7257ff027aff1bac66ff0269716cf5b1ab7cd3bbcabb17ddee37d3ee0433ee2633ee1019ff290cff89c2ff89229c48b66f1ac3d5df135df7093134eb9c56dcef4b3c35dee71ce393111dbfa8c784a4205955451cd1d1ad1982634a55bbad3f80eddd38c1ef882e66cf52ab5ff2b8d7ea4277aa6175ad06bb866f446efb4d4df0ffad4fed762ffb7b44e1b9cd2266dd142c75e5ddb3cd0bb3e347a477bd9d5f83ee245e3f7689f0ee830f67d44c77412ee186946033aa5e197fecfe85c7bf7be2fe892aee89a6ea84989f6bfa434f4eff9df52c509b5d0779b32ea684d13ea528f728d1e882ebfce37f6cf077422b4ea5b440ad14af1a15452ab473aee52c65ff39789b64fe955f44eb9937b5d858c5b32d377c0c32a7fee7ecd5fe61aff284ff22c2fb290577993775db1443fb53ef2219f5ff2bf93356d5b970dd9d41eb77820dbb223bbab155ed55ffab2f725ffb1eccb81aed6931cca116ab490633909d10339fd5ffdef795d869ae7923bc27226e772415d5986b51d683663b9d4fcfbb1ff190fe54aaec35aeaa577ee20f24673e94b531249a585fc2b69ebfe3ed7dae91f75ba964b5c03e9d344ba1add93bce0826c3f87f3b2a9fb6f18aeba10ba2f563f25eb1b563771a5d17531e2513c5fba538b3111cd690dd73c7ef6a95f4c8aa99de12fe77da4951de9ffffea730be7fd9fdfbffd0b690edc6c</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>gesture_edit_button1</sender>
+ <signal>clicked()</signal>
+ <receiver>Gesture_triggers_tab_ui</receiver>
+ <slot>edit_gesture_pressed1()</slot>
+ </connection>
+ <connection>
+ <sender>gesture_edit_button2</sender>
+ <signal>clicked()</signal>
+ <receiver>Gesture_triggers_tab_ui</receiver>
+ <slot>edit_gesture_pressed2()</slot>
+ </connection>
+ <connection>
+ <sender>gesture_edit_button3</sender>
+ <signal>clicked()</signal>
+ <receiver>Gesture_triggers_tab_ui</receiver>
+ <slot>edit_gesture_pressed3()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot access="protected" specifier="pure virtual">edit_gesture_pressed1()</slot>
+ <slot access="protected" specifier="pure virtual">edit_gesture_pressed2()</slot>
+ <slot access="protected" specifier="pure virtual">edit_gesture_pressed3()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/gestures_settings_tab_ui.ui b/khotkeys/kcontrol/ui/gestures_settings_tab_ui.ui
new file mode 100644
index 000000000..3bee7daf0
--- /dev/null
+++ b/khotkeys/kcontrol/ui/gestures_settings_tab_ui.ui
@@ -0,0 +1,160 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Gestures_settings_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Gestures_settings_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>492</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>mouse_gestures_globally</cstring>
+ </property>
+ <property name="text">
+ <string>Disable mouse gestures globally</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>mouse_button_label</cstring>
+ </property>
+ <property name="text">
+ <string>Mouse button:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mouse_button_combo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>mouse_button_combo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>timeout_label</cstring>
+ </property>
+ <property name="text">
+ <string>Gesture timeout (ms):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>timeout_input</cstring>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>timeout_input</cstring>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>100000</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>window_groupbox</cstring>
+ </property>
+ <property name="title">
+ <string>Windows to Exclude</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KHotKeys::Windowdef_list_widget">
+ <property name="name">
+ <cstring>windowdef_list_widget</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::Windowdef_list_widget</class>
+ <header location="local">windowdef_list_widget.h</header>
+ <sizehint>
+ <width>200</width>
+ <height>100</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>autodetect_pressed()</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="1114">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042149444154789c8d95c18b1c4514c67fbb29e5b54ea05b26da1d36b08d096e8b11261871837bc8e282ac7ac82187e049a317e32d37110992bf42123c694eea414c0e0bf1b0ec6c402139485a54e8810c54c10e741146fa110bd643f74c12bd642e4d75f77cf5d5ef7dafdfc2ce7087d9eff32fdfdff74e5114104011e489d6e952cce5cfbe5998692dec0c77b87aedd3fddd9f2b3efce02291082209aa3504685022e4ffd7a000a82a765c515615ce95acae659c3f7765c100ec6e575cf8f822e991025f3b6a6f890c484f181ccfc1583428f5d4e2fe84da039aa04121b40eb32483a0ec6e5bce9f8385d36fa7fb9b1b17c8f31cbfe7a95c45be94520c72b2141a1caa160d1666e24ea94aa11ee7685054159d2ada34d41387c40dc63b8844f0b5c73a4bb19cb3f9de001f2aac1fa23aa209168c004224902e29d22ff1e38abbdb275055c4800610233867311a1491847a62c98f66ac6f14d8e99072f22daa15b68a8108424d6422e24c88e3966fbce4c9d786945b27f0be0103ed13c16004d59a2c4d58df28a87548e9aee2274ab95d60c7193c9a0281fc959ae2a4450364a9e2572c7a2b43438374ef2dd2154012d050514dbec7396578a3130d9d6850066f0ad9d186f2d78cdbbb799b0a202f2c48d3aebbb418310240b112637588574bf54b8efaa4fd9b691dacbf5b305813542bae63a9eee4c4694d967b5494eca8c7ef0933bdc5d90e6a2caa0e3f013b7adce9fa5b03d637561113a30106a71d18c5fd9677058338ad01e91c0b8b743b880182ce19cd9c0e5e2b583fbdda565d3d04cfedad180942133af201b2bc3588e111c680068f489780ce69b192b279768088524f2b3458ea694d3de99a4323bc976ed34eb86b98c51993f6be10f77240c99685cd731991f1582df15aa15a213d583f5313a7806988fb8a0640e336359d9e9933568bf44062214ba19e2a7652a13d8b068ff596b807182189234e9da9f1ceb78c81b28c3ac6fe21e306c58e41d5118952acd6a0c2f56b9e6a5c72f346cdcd6b19a3bf8010010d714f89533b674c90c7189b598eab12a45fb5c75b8253672b863fbcccf5af93b6904119fe9851bf5153ac3a746ae7b9d5698c1dc58f313e70e4707ce9d84bafa2f79fc23fb8c7c1438ef04031a2642fee21060ec69ee47020796ecaa12313ccd333d1b67935047acf2be3bb11aa010dbe656cc755dbe3b772084a7ebc6d5711253b593dfcc0cc8fcd3cafda455512c7f200ec56cbfac0f1d7d34b7fdf0f98fd88a92a7e9cb0e70cc933c0b38a2c823ea0bd76c70c016adb67f47bc2a117a6d40abeea33fa23c2fb867edfb413e4a34fded94ffb3991c46dc7754cd3634ad2af490b857f5a5137126a97e02a8120a485235b6a28ef80bd077ee2b9f2d54fed04595dcbd8ddb6c4bd87334c10cadb2064e856177e7864e669fbe1df154a0142839f7ad2e5b6880bff1da66eece78e315d959f609da670f98befe6c3f45fb42672c9acff7f660000000049454e44ae426082</data>
+ </image>
+</images>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/info_tab_ui.ui b/khotkeys/kcontrol/ui/info_tab_ui.ui
new file mode 100644
index 000000000..9f82ccdcc
--- /dev/null
+++ b/khotkeys/kcontrol/ui/info_tab_ui.ui
@@ -0,0 +1,64 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KHotKeys::Info_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Info_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>388</width>
+ <height>317</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Info_tab_ui</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>warning_label</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;This module allows configuring input actions, like mouse gestures, keyboard shortcuts for performing commands, launching applications or DCOP calls, and similar.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;NOTE: &lt;/b&gt;If you are not an experienced user, you should be careful with modifying the actions, and should limit your changes mainly to enabling/disabling actions, and changing triggers.&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/keyboard_input_widget_ui.ui b/khotkeys/kcontrol/ui/keyboard_input_widget_ui.ui
new file mode 100644
index 000000000..f3947dd54
--- /dev/null
+++ b/khotkeys/kcontrol/ui/keyboard_input_widget_ui.ui
@@ -0,0 +1,193 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KHotKeys::Keyboard_input_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Keyboard_input_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>548</width>
+ <height>544</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Keyboard_input_widget_ui</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>keyboard_input_label</cstring>
+ </property>
+ <property name="text">
+ <string>Keyboard input:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>keyboard_input_multilineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>keyboard_input_multilineedit</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>modify_button</cstring>
+ </property>
+ <property name="text">
+ <string>Modify...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Send Input To</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Specify the window where the keyboard input should be sent to:&lt;ul&gt;
+&lt;li&gt;&lt;em&gt;Action window:&lt;/em&gt; The window where the triggering action happened; this is usually the currently active window, except for mouse gesture triggers - where it is the window under mouse - and window triggers -where it is the window triggering the action.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Active window:&lt;/em&gt; The currently active window.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Specific window:&lt;/em&gt; Any window matching the given criteria.&lt;/li&gt;
+&lt;/ul&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>action_window_radio</cstring>
+ </property>
+ <property name="text">
+ <string>Action window</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>active_window_radio</cstring>
+ </property>
+ <property name="text">
+ <string>Active window</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>specific_window_radio</cstring>
+ </property>
+ <property name="text">
+ <string>Specific window</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>window_groupbox</cstring>
+ </property>
+ <property name="title">
+ <string>Window</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KHotKeys::Windowdef_list_widget">
+ <property name="name">
+ <cstring>windowdef_list_widget</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::Windowdef_list_widget</class>
+ <header location="local">windowdef_list_widget.h</header>
+ <sizehint>
+ <width>200</width>
+ <height>100</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>autodetect_pressed()</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="1114">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042149444154789c8d95c18b1c4514c67fbb29e5b54ea05b26da1d36b08d096e8b11261871837bc8e282ac7ac82187e049a317e32d37110992bf42123c694eea414c0e0bf1b0ec6c402139485a54e8810c54c10e741146fa110bd643f74c12bd642e4d75f77cf5d5ef7dafdfc2ce7087d9eff32fdfdff74e5114104011e489d6e952cce5cfbe5998692dec0c77b87aedd3fddd9f2b3efce02291082209aa3504685022e4ffd7a000a82a765c515615ce95acae659c3f7765c100ec6e575cf8f822e991025f3b6a6f890c484f181ccfc1583428f5d4e2fe84da039aa04121b40eb32483a0ec6e5bce9f8385d36fa7fb9b1b17c8f31cbfe7a95c45be94520c72b2141a1caa160d1666e24ea94aa11ee7685054159d2ada34d41387c40dc63b8844f0b5c73a4bb19cb3f9de001f2aac1fa23aa209168c004224902e29d22ff1e38abbdb275055c4800610233867311a1491847a62c98f66ac6f14d8e99072f22daa15b68a8108424d6422e24c88e3966fbce4c9d786945b27f0be0103ed13c16004d59a2c4d58df28a87548e9aee2274ab95d60c7193c9a0281fc959ae2a4450364a9e2572c7a2b43438374ef2dd2154012d050514dbec7396578a3130d9d6850066f0ad9d186f2d78cdbbb799b0a202f2c48d3aebbb418310240b112637588574bf54b8efaa4fd9b691dacbf5b305813542bae63a9eee4c4694d967b5494eca8c7ef0933bdc5d90e6a2caa0e3f013b7adce9fa5b03d637561113a30106a71d18c5fd9677058338ad01e91c0b8b743b880182ce19cd9c0e5e2b583fbdda565d3d04cfedad180942133af201b2bc3588e111c680068f489780ce69b192b279768088524f2b3458ea694d3de99a4323bc976ed34eb86b98c51993f6be10f77240c99685cd731991f1582df15aa15a213d583f5313a7806988fb8a0640e336359d9e9933568bf44062214ba19e2a7652a13d8b068ff596b807182189234e9da9f1ceb78c81b28c3ac6fe21e306c58e41d5118952acd6a0c2f56b9e6a5c72f346cdcd6b19a3bf8010010d714f89533b674c90c7189b598eab12a45fb5c75b8253672b863fbcccf5af93b6904119fe9851bf5153ac3a746ae7b9d5698c1dc58f313e70e4707ce9d84bafa2f79fc23fb8c7c1438ef04031a2642fee21060ec69ee47020796ecaa12313ccd333d1b67935047acf2be3bb11aa010dbe656cc755dbe3b772084a7ebc6d5711253b593dfcc0cc8fcd3cafda455512c7f200ec56cbfac0f1d7d34b7fdf0f98fd88a92a7e9cb0e70cc933c0b38a2c823ea0bd76c70c016adb67f47bc2a117a6d40abeea33fa23c2fb867edfb413e4a34fded94ffb3991c46dc7754cd3634ad2af490b857f5a5137126a97e02a8120a485235b6a28ef80bd077ee2b9f2d54fed04595dcbd8ddb6c4bd87334c10cadb2064e856177e7864e669fbe1df154a0142839f7ad2e5b6880bff1da66eece78e315d959f609da670f98befe6c3f45fb42672c9acff7f660000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>modify_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Keyboard_input_widget_ui</receiver>
+ <slot>modify_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>specific_window_radio</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>window_groupbox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected" specifier="pure virtual">modify_pressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/main_buttons_widget_ui.ui b/khotkeys/kcontrol/ui/main_buttons_widget_ui.ui
new file mode 100644
index 000000000..a46ee0a0f
--- /dev/null
+++ b/khotkeys/kcontrol/ui/main_buttons_widget_ui.ui
@@ -0,0 +1,86 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Main_buttons_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Main_buttons_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>828</width>
+ <height>66</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>new_action_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New Action</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>new_action_group_button</cstring>
+ </property>
+ <property name="text">
+ <string>New &amp;Group</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delete_action_button</cstring>
+ </property>
+ <property name="text">
+ <string>Delete Action</string>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>Line3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>VLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>global_settings_button</cstring>
+ </property>
+ <property name="text">
+ <string>Global &amp;Settings</string>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/menuentry_widget_ui.ui b/khotkeys/kcontrol/ui/menuentry_widget_ui.ui
new file mode 100644
index 000000000..ae6c613f3
--- /dev/null
+++ b/khotkeys/kcontrol/ui/menuentry_widget_ui.ui
@@ -0,0 +1,100 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Menuentry_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Menuentry_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>580</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>menuentry_label</cstring>
+ </property>
+ <property name="text">
+ <string>Menu entry to execute:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>command_url_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>menuentry_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>browse_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Browse...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>browse_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Menuentry_widget_ui</receiver>
+ <slot>browse_pressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot access="protected" specifier="pure virtual">browse_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/triggers_tab_ui.ui b/khotkeys/kcontrol/ui/triggers_tab_ui.ui
new file mode 100644
index 000000000..13ac0530b
--- /dev/null
+++ b/khotkeys/kcontrol/ui/triggers_tab_ui.ui
@@ -0,0 +1,171 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Triggers_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Triggers_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>564</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KHotKeys::KHListView">
+ <property name="name">
+ <cstring>triggers_listview</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>new_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>modify_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Modify...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>copy_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delete_button</cstring>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::KHListView</class>
+ <header location="global">khlistview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <signal>current_changed(QListViewItem*)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>modify_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Triggers_tab_ui</receiver>
+ <slot>modify_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>delete_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Triggers_tab_ui</receiver>
+ <slot>delete_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>copy_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Triggers_tab_ui</receiver>
+ <slot>copy_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>triggers_listview</sender>
+ <signal>current_changed(QListViewItem*)</signal>
+ <receiver>Triggers_tab_ui</receiver>
+ <slot>current_changed(QListViewItem*)</slot>
+ </connection>
+</connections>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<slots>
+ <slot access="protected" specifier="pure virtual">copy_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">current_changed(QListViewItem*)</slot>
+ <slot access="protected" specifier="pure virtual">delete_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">modify_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/voice_input_widget_ui.ui b/khotkeys/kcontrol/ui/voice_input_widget_ui.ui
new file mode 100644
index 000000000..007610fca
--- /dev/null
+++ b/khotkeys/kcontrol/ui/voice_input_widget_ui.ui
@@ -0,0 +1,104 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Voice_input_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>486</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>buttonPlay</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Play</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>buttonRecord</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Record</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>buttonStop</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Stop</string>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonRecord</sender>
+ <signal>pressed()</signal>
+ <receiver>Form1</receiver>
+ <slot>slotRecordPressed()</slot>
+ </connection>
+ <connection>
+ <sender>buttonStop</sender>
+ <signal>pressed()</signal>
+ <receiver>Form1</receiver>
+ <slot>slotStopPressed()</slot>
+ </connection>
+ <connection>
+ <sender>buttonStop</sender>
+ <signal>&lt;No Signal&gt;</signal>
+ <receiver>buttonStop</receiver>
+ <slot>&lt;No)</slot>
+ </connection>
+ <connection>
+ <sender>buttonPlay</sender>
+ <signal>pressed()</signal>
+ <receiver>Form1</receiver>
+ <slot>slotPlayPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot access="protected" specifier="pure virtual">slotRecordPressed()</slot>
+ <slot access="protected" specifier="pure virtual">slotPlayPressed()</slot>
+ <slot access="protected" specifier="pure virtual">slotStopPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/voice_settings_tab_ui.ui b/khotkeys/kcontrol/ui/voice_settings_tab_ui.ui
new file mode 100644
index 000000000..2c254dcc8
--- /dev/null
+++ b/khotkeys/kcontrol/ui/voice_settings_tab_ui.ui
@@ -0,0 +1,107 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Voice_settings_tab_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Voice_settings_tab_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>473</width>
+ <height>380</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>In order to trigger a spoken action, you have to press the key (or combination of keys) configured below, speak the command and then press the same key again once you have finished speaking.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Shortcut:</string>
+ </property>
+ </widget>
+ <widget class="KKeyButton">
+ <property name="name">
+ <cstring>keyButton</cstring>
+ </property>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>241</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>90</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Note:&lt;/b&gt; To get voice recognition working correctly and in full duplex mode:
+make sure &lt;i&gt;Full duplex&lt;/i&gt; is checked in your &lt;i&gt;Sound System&lt;/i&gt; options.</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kkeybutton.h</includehint>
+</includehints>
+</UI>
diff --git a/khotkeys/kcontrol/ui/window_trigger_widget_ui.ui b/khotkeys/kcontrol/ui/window_trigger_widget_ui.ui
new file mode 100644
index 000000000..58d15e3cf
--- /dev/null
+++ b/khotkeys/kcontrol/ui/window_trigger_widget_ui.ui
@@ -0,0 +1,131 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>KHotKeys::Window_trigger_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Window_trigger_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>592</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Trigger When</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>window_appears_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Window appears</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>window_disappears_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Window disappears</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>window_activates_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Window activates</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>window_deactivates_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Window deactivates</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>window_groupbox</cstring>
+ </property>
+ <property name="title">
+ <string>Window</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KHotKeys::Windowdef_list_widget">
+ <property name="name">
+ <cstring>windowdef_list_widget</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>Windowdef_list_widget</class>
+ <header location="local">windowdef_list_widget.h</header>
+ <sizehint>
+ <width>200</width>
+ <height>100</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>autodetect_pressed()</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/windowdef_list_widget_ui.ui b/khotkeys/kcontrol/ui/windowdef_list_widget_ui.ui
new file mode 100644
index 000000000..5e9007e9e
--- /dev/null
+++ b/khotkeys/kcontrol/ui/windowdef_list_widget_ui.ui
@@ -0,0 +1,170 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KHotKeys::Windowdef_list_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Windowdef_list_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>572</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KHotKeys::KHListView">
+ <property name="name">
+ <cstring>windows_listview</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>new_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>modify_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Modify...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>copy_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delete_button</cstring>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KHotKeys::KHListView</class>
+ <header location="global">khlistview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>current_changed(QListViewItem*)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>copy_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Windowdef_list_widget_ui</receiver>
+ <slot>copy_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>modify_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Windowdef_list_widget_ui</receiver>
+ <slot>modify_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>delete_button</sender>
+ <signal>clicked()</signal>
+ <receiver>Windowdef_list_widget_ui</receiver>
+ <slot>delete_pressed()</slot>
+ </connection>
+ <connection>
+ <sender>windows_listview</sender>
+ <signal>current_changed(QListViewItem*)</signal>
+ <receiver>Windowdef_list_widget_ui</receiver>
+ <slot>current_changed(QListViewItem*)</slot>
+ </connection>
+</connections>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<slots>
+ <slot access="protected" specifier="pure virtual">copy_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">current_changed(QListViewItem*)</slot>
+ <slot access="protected" specifier="pure virtual">delete_pressed()</slot>
+ <slot access="protected" specifier="pure virtual">modify_pressed()</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/ui/windowdef_simple_widget_ui.ui b/khotkeys/kcontrol/ui/windowdef_simple_widget_ui.ui
new file mode 100644
index 000000000..01d54da98
--- /dev/null
+++ b/khotkeys/kcontrol/ui/windowdef_simple_widget_ui.ui
@@ -0,0 +1,493 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KHotKeys::Windowdef_simple_widget_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Windowdef_simple_widget_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>588</width>
+ <height>497</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>comment_label</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Comment:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>comment_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>window_title_label</cstring>
+ </property>
+ <property name="text">
+ <string>Window &amp;title:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>window_title_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Is Not Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Contains</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Is</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Matches Regular Expression</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Does Not Contain</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Is Not</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Does Not Match Regular Expression</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>window_title_combo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>window_title_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>window_class_label</cstring>
+ </property>
+ <property name="text">
+ <string>Window c&amp;lass:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>window_class_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Is Not Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Contains</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Is</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Matches Regular Expression</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Does Not Contain</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Is Not</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Does Not Match Regular Expression</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>window_class_combo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>window_class_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>window_role_label</cstring>
+ </property>
+ <property name="text">
+ <string>Window &amp;role:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>window_role_lineedit</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Is Not Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Contains</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Is</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Matches Regular Expression</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Does Not Contain</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Is Not</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Does Not Match Regular Expression</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>window_role_combo</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>window_role_lineedit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>autodetect_button</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Autodetect</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>window_types_groupbox</cstring>
+ </property>
+ <property name="title">
+ <string>Window Types</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>type_normal_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Normal</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>type_dialog_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Dialog</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>type_desktop_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Desktop</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>type_dock_checkbox</cstring>
+ </property>
+ <property name="text">
+ <string>Dock</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>window_class_combo</sender>
+ <signal>activated(int)</signal>
+ <receiver>Windowdef_simple_widget_ui</receiver>
+ <slot>window_class_combo_changed(int)</slot>
+ </connection>
+ <connection>
+ <sender>window_role_combo</sender>
+ <signal>activated(int)</signal>
+ <receiver>Windowdef_simple_widget_ui</receiver>
+ <slot>window_role_combo_changed(int)</slot>
+ </connection>
+ <connection>
+ <sender>window_title_combo</sender>
+ <signal>activated(int)</signal>
+ <receiver>Windowdef_simple_widget_ui</receiver>
+ <slot>window_title_combo_changed(int)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>comment_lineedit</tabstop>
+ <tabstop>window_title_combo</tabstop>
+ <tabstop>window_title_lineedit</tabstop>
+ <tabstop>window_class_combo</tabstop>
+ <tabstop>window_class_lineedit</tabstop>
+ <tabstop>window_role_combo</tabstop>
+ <tabstop>window_role_lineedit</tabstop>
+ <tabstop>autodetect_button</tabstop>
+</tabstops>
+<slots>
+ <slot access="protected" specifier="pure virtual">window_class_combo_changed(int)</slot>
+ <slot access="protected" specifier="pure virtual">window_role_combo_changed(int)</slot>
+ <slot access="protected" specifier="pure virtual">window_title_combo_changed(int)</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/khotkeys/kcontrol/voice_settings_tab.cpp b/khotkeys/kcontrol/voice_settings_tab.cpp
new file mode 100644
index 000000000..684ca0cdf
--- /dev/null
+++ b/khotkeys/kcontrol/voice_settings_tab.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include "voice_settings_tab.h"
+
+#include <klocale.h>
+#include <qcombobox.h>
+#include <knuminput.h>
+#include <qcheckbox.h>
+#include <kkeybutton.h>
+#include <kkeydialog.h>
+
+#include "kcmkhotkeys.h"
+#include "windowdef_list_widget.h"
+
+namespace KHotKeys
+{
+
+Voice_settings_tab::Voice_settings_tab( QWidget* parent_P, const char* name_P )
+ : Voice_settings_tab_ui( parent_P, name_P )
+ {
+ connect( keyButton , SIGNAL(capturedShortcut (const KShortcut &)) , this, SLOT(slotCapturedKey( const KShortcut& )));
+ }
+
+void Voice_settings_tab::read_data()
+ {
+ keyButton->setShortcut( module->voice_shortcut() );
+ }
+
+void Voice_settings_tab::write_data() const
+ {
+ module->set_voice_shortcut( keyButton->shortcut() );
+ }
+
+void Voice_settings_tab::clear_data()
+ {
+ // "global" tab, not action specific, do nothing
+ }
+
+void Voice_settings_tab::slotCapturedKey( const KShortcut& cut)
+ {
+ /*for(uint seq=0; seq<KShortcut::MAX_SEQUENCES; seq++)
+ {
+ KKeySequance key=cut.seq(seq);
+ if(key.isNull())
+ continue;
+ if(key.count() > 1)
+ return;
+ }*/
+
+ if(KKeyChooser::checkGlobalShortcutsConflict(cut,true,this))
+ return;
+ if(KKeyChooser::checkStandardShortcutsConflict(cut,true,this))
+ return;
+
+ keyButton->setShortcut(cut);
+ module->changed();
+ }
+} // namespace KHotKeys
+
+#include "voice_settings_tab.moc"
diff --git a/khotkeys/kcontrol/voice_settings_tab.h b/khotkeys/kcontrol/voice_settings_tab.h
new file mode 100644
index 000000000..7b7abd3c5
--- /dev/null
+++ b/khotkeys/kcontrol/voice_settings_tab.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef VOICE_SETTINGS_TAB_H_
+#define VOICE_SETTINGS_TAB_H_
+
+#include <voice_settings_tab_ui.h>
+
+class KShortcut;
+
+namespace KHotKeys
+{
+
+class Voice_settings_tab
+ : public Voice_settings_tab_ui
+ {
+ Q_OBJECT
+ public:
+ Voice_settings_tab( QWidget* parent = NULL, const char* name = NULL );
+ void read_data();
+ void write_data() const;
+ public slots:
+ void clear_data();
+ private slots:
+ void slotCapturedKey( const KShortcut& );
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/voicerecorder.cpp b/khotkeys/kcontrol/voicerecorder.cpp
new file mode 100644
index 000000000..92458c2ee
--- /dev/null
+++ b/khotkeys/kcontrol/voicerecorder.cpp
@@ -0,0 +1,203 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffgart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include <qcolor.h>
+#include <qevent.h>
+
+#include "voicerecorder.h"
+#include "soundrecorder.h"
+#include "voicesignature.h"
+#include "voices.h"
+#include "khotkeysglobal.h"
+#include <kpushbutton.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <ktempfile.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <kmessagebox.h>
+#include <klibloader.h>
+#include <kstandarddirs.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace KHotKeys
+{
+
+VoiceRecorder::arts_play_fun VoiceRecorder::arts_play = NULL;
+
+bool VoiceRecorder::init( KLibrary* lib )
+{
+#ifdef HAVE_ARTS
+ if( arts_play == NULL && lib != NULL )
+ arts_play = (arts_play_fun) lib->symbol( "khotkeys_voicerecorder_arts_play" );
+#endif
+// kdDebug( 1217 ) << "voicerecorder:" << arts_play << ":" << lib << endl;
+ return arts_play != NULL;
+}
+
+VoiceRecorder::VoiceRecorder(const Sound& sound_P, const QString &voiceId, QWidget *parent, const char *name)
+ : Voice_input_widget_ui(parent, name) , _recorder( SoundRecorder::create(this)) , _state(sNotModified), _tempFile(0L) , _voiceId(voiceId)
+{
+ _sound=sound_P;
+ buttonPlay->setEnabled(sound_P.size() > 50);
+ buttonStop->setEnabled(false);
+
+ connect (_recorder , SIGNAL(recorded(const Sound& )) , this , SLOT(slotSoundRecorded(const Sound& ) ));
+
+ //if(voiceid_P.isEmpty())
+ emit recorded(false);
+
+ drawSound();
+}
+
+VoiceRecorder::~VoiceRecorder()
+{
+ delete _tempFile;
+}
+
+void VoiceRecorder::slotRecordPressed()
+{
+ buttonRecord->setEnabled(false);
+ buttonPlay->setEnabled(false);
+ buttonStop->setEnabled(true);
+ _recorder->start();
+ label->setText(i18n("Recording..."));
+}
+
+void VoiceRecorder::slotStopPressed()
+{
+ buttonRecord->setEnabled(true);
+ buttonPlay->setEnabled(false);
+ buttonStop->setEnabled(false);
+ _recorder->stop();
+}
+
+void VoiceRecorder::slotPlayPressed()
+{
+#ifdef HAVE_ARTS
+ if( !haveArts() || arts_play == NULL )
+ return;
+ /*if(!_modified)
+ {
+ QString fileName = locateLocal( "appdata", _original_voiuceid + ".wav" );
+ arts_play( fileName );
+ }
+ else
+ {*/
+ if(!_tempFile)
+ {
+ _tempFile=new KTempFile(QString::null,".wav");
+ _tempFile->setAutoDelete(true);
+ }
+ _sound.save(_tempFile->name());
+ arts_play( _tempFile->name());
+#endif
+}
+
+Sound VoiceRecorder::sound() const
+{
+ return _sound;
+}
+
+
+void VoiceRecorder::slotSoundRecorded(const Sound &sound)
+{
+ buttonPlay->setEnabled(true);
+ _sound=sound;
+
+ bool correct=drawSound() && sound.size()>50;
+ if(correct)
+ {
+ QString vm=voice_handler->isNewSoundFarEnough( VoiceSignature(sound), _voiceId);
+ if(!vm.isNull())
+ {
+ KMessageBox::sorry (this, i18n("The word you recorded is too close to the existing reference '%1'. Please record another word.").arg(vm) );
+ //TODO: messagebox saying there are too much noise
+ correct=false;
+ }
+ }
+ else
+ {
+ KMessageBox::sorry (this, i18n("Unable to extract voice information from noise.\nIf this error occurs repeatedly, it suggests that there is either too much background noise, or the quality of your microphone is too poor.") );
+ }
+
+ _state=correct ? sModified : sIncorrect;
+ emit recorded(correct);
+}
+
+
+/*VoiceSignature VoiceRecorder::voiceSig() const
+{
+ if(voiceId().isEmpty())
+ return VoiceSignature();
+ QString fileName = locateLocal( "appdata", voiceId() + ".wav" );
+ _sound.save( fileName );
+ return VoiceSignature(_sound);
+}*/
+
+bool VoiceRecorder::drawSound()
+{
+ label->setText(QString::null);
+ uint length=_sound.size();
+
+ if(length < 2)
+ return false;
+
+ int width=label->width();
+ int height=label->height();
+ QPixmap pix(width,height);
+ pix.fill(QColor(255,255,255));
+ QPainter p;
+ p.begin(&pix);
+
+ p.setPen(QPen(QColor("green"),1));
+ p.drawLine(0,height/2,width,height/2);
+
+ p.setPen(QPen(QColor("red"),1));
+
+ uint lx=0;
+ uint ly=height/2;
+
+ /*** DRAW THE SIGNAL ******/
+ for(uint f=1; f<length; f++)
+ {
+ uint nx=f*width/length;
+ uint ny=(uint)(height/2* (1.0 - _sound.at(f)));
+ p.drawLine(lx,ly,nx,ny);
+ lx=nx; ly=ny;
+ }
+
+ unsigned int start=0 , stop=0;
+ bool res=KHotKeys::VoiceSignature::window(_sound,&start,&stop);
+ p.setPen(QPen(QColor("blue"),1));
+ if(res)
+ {
+ p.drawLine(start*width/length ,0,start*width/length ,height);
+ p.drawLine(stop*width/length ,0,stop*width/length ,height);
+ }
+ else
+ {
+ p.drawLine(0 ,0, width ,height);
+ p.drawLine(width ,0, 0 ,height);
+ }
+
+ p.end();
+
+ label->setPixmap(pix);
+ return res;
+}
+
+
+} // namespace KHotKeys
+
+#include "voicerecorder.moc"
diff --git a/khotkeys/kcontrol/voicerecorder.h b/khotkeys/kcontrol/voicerecorder.h
new file mode 100644
index 000000000..579f53893
--- /dev/null
+++ b/khotkeys/kcontrol/voicerecorder.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffgart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef VOICE_RECORDER_H
+#define VOICE_RECORDER_H
+
+#include <qframe.h>
+#include "ui/voice_input_widget_ui.h"
+#include <qmemarray.h>
+
+#include "sound.h"
+class QMouseEvent;
+class KAudioRecordStream ;
+class KArtsServer;
+class KTempFile;
+class KLibrary;
+
+namespace KHotKeys
+{
+
+ class SoundRecorder;
+ class Voice_trigger;
+
+class VoiceRecorder : public Voice_input_widget_ui
+ {
+ Q_OBJECT
+
+ public:
+ VoiceRecorder(const Sound& sound_P, const QString &voiceId, QWidget *parent, const char *name);
+ ~VoiceRecorder();
+
+ Sound sound() const;
+
+ enum State { sNotModified , sIncorrect, sModified };
+
+ inline State state() const
+ {
+ return _state;
+ }
+
+ static bool init( KLibrary* lib );
+ typedef void (*arts_play_fun)( const QString& file );
+
+ protected slots:
+ void slotStopPressed();
+ void slotRecordPressed();
+ void slotPlayPressed();
+
+ signals:
+ void recorded(bool);
+ private slots:
+ void slotSoundRecorded(const Sound& sound);
+ bool drawSound();
+
+ private:
+ SoundRecorder *_recorder;
+ Sound _sound;
+ State _state;
+ KTempFile *_tempFile;
+ QString _voiceId;
+ static arts_play_fun arts_play;
+ };
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/voicerecordpage.cpp b/khotkeys/kcontrol/voicerecordpage.cpp
new file mode 100644
index 000000000..385d78dda
--- /dev/null
+++ b/khotkeys/kcontrol/voicerecordpage.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffart < ogoffart @ kde.org >
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#include <qwidget.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <klineedit.h>
+#include <kstandarddirs.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "voicerecordpage.h"
+#include "voicerecorder.h"
+#include "voicesignature.h"
+#include "voices.h"
+
+namespace KHotKeys
+{
+
+VoiceRecordPage::VoiceRecordPage( const QString &voiceid_P, QWidget *parent, const char *name)
+ : QVBox(parent, name) , _original_voiceId(voiceid_P)
+ {
+ _message = i18n("Enter a code for the sound (e.g. the word you are saying) and record the same word twice.");
+
+ _label = new QLabel(_message, this, "label");
+ _label->setAlignment(QLabel::AlignLeft | QLabel::WordBreak |
+ QLabel::AlignVCenter);
+
+ _lineEdit = new KLineEdit( this );
+ _lineEdit->setText(voiceid_P);
+
+
+ Sound s;
+ if(voiceid_P!=QString::null)
+ {
+ QString fileName = locateLocal( "data", "khotkeys/" + voiceid_P + "1.wav" );
+ s.load(fileName);
+ }
+ _recorder1 = new VoiceRecorder(s, voiceid_P, this, "recorder");
+ if(voiceid_P!=QString::null)
+ {
+ QString fileName = locateLocal( "data", "khotkeys/" + voiceid_P + "2.wav" );
+ s.load(fileName);
+ }
+ _recorder2 = new VoiceRecorder(s, voiceid_P, this, "recorder");
+
+ //_recorder->setMinimumHeight(150);
+ //setStretchFactor(_recorder, 1);
+
+ QWidget *spacer = new QWidget(this, "spacer");
+ setStretchFactor(spacer, 1);
+
+
+ connect(_recorder1, SIGNAL(recorded(bool)) , this, SLOT(slotChanged()));
+ connect(_recorder2, SIGNAL(recorded(bool)) , this, SLOT(slotChanged()));
+ connect(_lineEdit , SIGNAL( textChanged (const QString&)) , this , SLOT(slotChanged()));
+
+
+ }
+
+VoiceRecordPage::~VoiceRecordPage()
+ {
+ }
+
+void VoiceRecordPage::slotChanged()
+ {
+ bool voiceCodeOK=!_lineEdit->text().isEmpty();
+ if( voiceCodeOK && _lineEdit->text() != _original_voiceId)
+ {
+ voiceCodeOK=!voice_handler->doesVoiceCodeExists(_lineEdit->text());
+ if(!voiceCodeOK)
+ {
+ _label->setText(i18n("<qt>%1<br><font color='red'>The sound code already exists</font></qt>").arg(_message));
+ }
+ }
+ if( voiceCodeOK )
+ {
+ voiceCodeOK=_recorder1->state()!=VoiceRecorder::sIncorrect && _recorder2->state()!=VoiceRecorder::sIncorrect;
+ if(!voiceCodeOK)
+ {
+ _label->setText(i18n("<qt>%1<br><font color='red'>One of the sound references is not correct</font></qt>").arg(_message));
+ }
+ }
+ if( voiceCodeOK )
+ _label->setText(_message);
+
+ emit voiceRecorded( voiceCodeOK &&
+ ( ( (_recorder1->state()==VoiceRecorder::sModified || _recorder2->state()==VoiceRecorder::sModified || _lineEdit->text() != _original_voiceId)
+ && !_original_voiceId.isEmpty())
+ || (_recorder1->state()==VoiceRecorder::sModified && _recorder2->state()==VoiceRecorder::sModified ) ) );
+ }
+
+QString VoiceRecordPage::getVoiceId() const
+ {
+ return _lineEdit->text();
+ }
+
+VoiceSignature VoiceRecordPage::getVoiceSignature(int ech) const
+ {
+ VoiceRecorder *recorder= (ech==1) ? _recorder1 : _recorder2 ;
+ QString fileName = locateLocal( "data", "khotkeys/" + getVoiceId() + QString::number(ech) + ".wav" );
+ Sound s=recorder->sound();
+ s.save(fileName);
+ return VoiceSignature(s);
+ }
+
+bool VoiceRecordPage::isModifiedSignature(int ech) const
+ {
+ VoiceRecorder *recorder= (ech==1) ? _recorder1 : _recorder2 ;
+ return recorder->state()==VoiceRecorder::sModified;
+ }
+
+
+} // namespace KHotKeys
+
+#include "voicerecordpage.moc"
diff --git a/khotkeys/kcontrol/voicerecordpage.h b/khotkeys/kcontrol/voicerecordpage.h
new file mode 100644
index 000000000..13389b9dc
--- /dev/null
+++ b/khotkeys/kcontrol/voicerecordpage.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffart < ogoffart @ kde.org >
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef VOICE_RECORD_PAGE_H
+#define VOICE_RECORD_PAGE_H
+
+#include <qvbox.h>
+
+
+
+class QWidget;
+class QPushButton;
+class QLabel;
+class KLineEdit;
+
+
+
+namespace KHotKeys
+{
+
+class Voice;
+class VoiceRecorder;
+class VoiceSignature;
+
+class VoiceRecordPage : public QVBox
+ {
+ Q_OBJECT
+
+ public:
+ VoiceRecordPage(const QString &voiceip_P, QWidget *parent, const char *name);
+ ~VoiceRecordPage();
+
+ QString getVoiceId() const ;
+ VoiceSignature getVoiceSignature(int) const;
+ bool isModifiedSignature(int) const;
+
+ protected slots:
+ void slotChanged();
+
+ signals:
+ void voiceRecorded(bool);
+
+ private:
+ VoiceRecorder *_recorder1;
+ VoiceRecorder *_recorder2;
+ KLineEdit *_lineEdit;
+ QLabel *_label;
+ QString _message;
+
+ QString _original_voiceId;
+
+
+ };
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/window_trigger_widget.cpp b/khotkeys/kcontrol/window_trigger_widget.cpp
new file mode 100644
index 000000000..882112cce
--- /dev/null
+++ b/khotkeys/kcontrol/window_trigger_widget.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _WINDOW_TRIGGER_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "window_trigger_widget.h"
+
+#include <qcheckbox.h>
+
+#include <triggers.h>
+#include <actions.h>
+#include <action_data.h>
+
+#include "windowdef_list_widget.h"
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+Window_trigger_widget::Window_trigger_widget( QWidget* parent_P, const char* name_P )
+ : Window_trigger_widget_ui( parent_P, name_P )
+ {
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( window_appears_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( window_disappears_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( window_activates_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( window_deactivates_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ }
+
+void Window_trigger_widget::clear_data()
+ {
+ windowdef_list_widget->clear_data();
+ window_appears_checkbox->setChecked( false );
+ window_disappears_checkbox->setChecked( false );
+ window_activates_checkbox->setChecked( false );
+ window_deactivates_checkbox->setChecked( false );
+ }
+
+void Window_trigger_widget::set_data( const Window_trigger* trigger_P )
+ {
+ if( trigger_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ windowdef_list_widget->set_data( trigger_P->windows());
+ window_appears_checkbox->setChecked(
+ trigger_P->triggers_on( Window_trigger::WINDOW_APPEARS ));
+ window_disappears_checkbox->setChecked(
+ trigger_P->triggers_on( Window_trigger::WINDOW_DISAPPEARS ));
+ window_activates_checkbox->setChecked(
+ trigger_P->triggers_on( Window_trigger::WINDOW_ACTIVATES ));
+ window_deactivates_checkbox->setChecked(
+ trigger_P->triggers_on( Window_trigger::WINDOW_DEACTIVATES ));
+ }
+
+Window_trigger* Window_trigger_widget::get_data( Action_data* data_P ) const
+ {
+ return new Window_trigger( data_P, windowdef_list_widget->get_data(),
+ ( window_appears_checkbox->isChecked() ? Window_trigger::WINDOW_APPEARS : 0 )
+ | ( window_disappears_checkbox->isChecked() ? Window_trigger::WINDOW_DISAPPEARS : 0 )
+ | ( window_activates_checkbox->isChecked() ? Window_trigger::WINDOW_ACTIVATES : 0 )
+ | ( window_deactivates_checkbox->isChecked() ? Window_trigger::WINDOW_DEACTIVATES : 0 ));
+ }
+
+} // namespace KHotKeys
+
+#include "window_trigger_widget.moc"
diff --git a/khotkeys/kcontrol/window_trigger_widget.h b/khotkeys/kcontrol/window_trigger_widget.h
new file mode 100644
index 000000000..02f54df1d
--- /dev/null
+++ b/khotkeys/kcontrol/window_trigger_widget.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _WINDOW_TRIGGER_WIDGET_H_
+#define _WINDOW_TRIGGER_WIDGET_H_
+
+#include <window_trigger_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Window_trigger;
+class Action_data;
+
+class Window_trigger_widget
+ : public Window_trigger_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Window_trigger_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Window_trigger* trigger_P );
+ Window_trigger* get_data( Action_data* data_P ) const;
+ public slots:
+ void clear_data();
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/windowdef_list_widget.cpp b/khotkeys/kcontrol/windowdef_list_widget.cpp
new file mode 100644
index 000000000..e4dffc9c4
--- /dev/null
+++ b/khotkeys/kcontrol/windowdef_list_widget.cpp
@@ -0,0 +1,239 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _WINDOWDEF_LIST_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "windowdef_list_widget.h"
+
+#include <assert.h>
+#include <qpushbutton.h>
+#include <qheader.h>
+#include <qlineedit.h>
+#include <qpopupmenu.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+
+#include <khlistview.h>
+
+#include <windows.h>
+
+#include "windowdef_simple_widget.h"
+#include "kcmkhotkeys.h"
+
+namespace KHotKeys
+{
+
+// Windowdef_list_widget
+
+Windowdef_list_widget::Windowdef_list_widget( QWidget* parent_P, const char* name_P )
+ : Windowdef_list_widget_ui( parent_P, name_P ), autodetect_object( NULL ),
+ autodetect_slot( NULL ), selected_item( NULL )
+ {
+ QPopupMenu* popup = new QPopupMenu; // CHECKME looks like setting parent doesn't work
+ popup->insertItem( i18n( "Simple Window..." ), TYPE_WINDOWDEF_SIMPLE );
+ connect( popup, SIGNAL( activated( int )), SLOT( new_selected( int )));
+
+ connect( windows_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( modify_pressed() ) );
+ new_button->setPopup( popup );
+ windows_listview->header()->hide();
+ windows_listview->addColumn( "" );
+ windows_listview->setSorting( -1 );
+ windows_listview->setForceSelect( true );
+ copy_button->setEnabled( false );
+ modify_button->setEnabled( false );
+ delete_button->setEnabled( false );
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( new_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( copy_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( modify_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( delete_button, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+Windowdef_list_widget::~Windowdef_list_widget()
+ {
+ delete new_button->popup();
+ }
+
+void Windowdef_list_widget::clear_data()
+ {
+ comment_lineedit->clear();
+ windows_listview->clear();
+ }
+
+void Windowdef_list_widget::set_data( const Windowdef_list* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ comment_lineedit->setText( data_P->comment());
+ Windowdef_list_item* after = NULL;
+ windows_listview->clear();
+ for( Windowdef_list::Iterator it( *data_P );
+ *it;
+ ++it )
+ after = create_listview_item( *it, windows_listview, NULL, after, true );
+ }
+
+Windowdef_list* Windowdef_list_widget::get_data() const
+ {
+// CHECKME TODO hmm, tady to bude chtit asi i children :(
+ Windowdef_list* list = new Windowdef_list( comment_lineedit->text());
+ for( QListViewItem* pos = windows_listview->firstChild();
+ pos != NULL;
+ pos = pos->nextSibling())
+ list->append( static_cast< Windowdef_list_item* >( pos )->window()->copy());
+ return list;
+ }
+
+void Windowdef_list_widget::new_selected( int type_P )
+ {
+ Windowdef_dialog* dlg = NULL;
+ switch( type_P )
+ {
+ case TYPE_WINDOWDEF_SIMPLE: // Windowdef_simple
+ dlg = new Windowdef_simple_dialog(
+ new Windowdef_simple( "", "", Windowdef_simple::NOT_IMPORTANT, "",
+ Windowdef_simple::NOT_IMPORTANT, "", Windowdef_simple::NOT_IMPORTANT,
+ Windowdef_simple::WINDOW_TYPE_NORMAL | Windowdef_simple::WINDOW_TYPE_DIALOG ),
+ NULL, NULL ); // CHECKME tady pak autodetect
+ break;
+ }
+ if( dlg != NULL )
+ {
+ Windowdef* window = dlg->edit_windowdef();
+ if( window != NULL )
+ windows_listview->setSelected( create_listview_item( window, windows_listview,
+ NULL, selected_item, false ), true );
+ // CHECKME tady pak jeste spravne vnoreni, kdyz bude skupina
+ delete dlg;
+ }
+ }
+
+void Windowdef_list_widget::copy_pressed()
+ {
+ windows_listview->setSelected( create_listview_item( selected_item->window(),
+ selected_item->parent() ? NULL : windows_listview, selected_item->parent(),
+ selected_item, true ), true );
+ }
+
+void Windowdef_list_widget::delete_pressed()
+ {
+ delete selected_item; // CHECKME snad vyvola signaly pro enable()
+ }
+
+void Windowdef_list_widget::modify_pressed()
+ {
+ edit_listview_item( selected_item );
+ }
+
+void Windowdef_list_widget::current_changed( QListViewItem* item_P )
+ {
+// if( item_P == selected_item )
+// return;
+ selected_item = static_cast< Windowdef_list_item* >( item_P );
+// windows_listview->setSelected( item_P, true );
+ copy_button->setEnabled( item_P != NULL );
+ modify_button->setEnabled( item_P != NULL );
+ delete_button->setEnabled( item_P != NULL );
+ }
+
+Windowdef_list_item* Windowdef_list_widget::create_listview_item( Windowdef* window_P,
+ QListView* parent1_P, QListViewItem* parent2_P, QListViewItem* after_P, bool copy_P )
+ {
+ Windowdef* new_win = copy_P ? window_P->copy() : window_P;
+// CHECKME uz by nemelo byt treba
+/* if( after_P == NULL )
+ {
+ if( parent1_P == NULL )
+ return new Windowdef_list_item( parent2_P, new_win );
+ else
+ return new Windowdef_list_item( parent1_P, new_win );
+ }
+ else*/
+ {
+ if( parent1_P == NULL )
+ return new Windowdef_list_item( parent2_P, after_P, new_win );
+ else
+ return new Windowdef_list_item( parent1_P, after_P, new_win );
+ }
+ }
+
+void Windowdef_list_widget::edit_listview_item( Windowdef_list_item* item_P )
+ {
+ Windowdef_dialog* dlg = NULL;
+ if( Windowdef_simple* window = dynamic_cast< Windowdef_simple* >( item_P->window()))
+ dlg = new Windowdef_simple_dialog( window, autodetect_object, autodetect_slot );
+ else // CHECKME TODO pridat dalsi
+ assert( false );
+ Windowdef* new_window = dlg->edit_windowdef();
+ if( new_window != NULL )
+ {
+ item_P->set_window( new_window );
+ item_P->widthChanged( 0 ); // SELI tohle i u dalsich listview?
+ windows_listview->repaintItem( item_P );
+ }
+ delete dlg;
+ }
+
+// Windowdef_list_item
+
+QString Windowdef_list_item::text( int column_P ) const
+ {
+ return column_P == 0 ? window()->description() : QString::null;
+ }
+
+Windowdef_list_item::~Windowdef_list_item()
+ { // CHECKME if the listview will ever be used hiearchically,
+ delete _window; // this will be wrong, the windows tree will have to be kept
+ } // and deleted separately
+
+// Windowdef_simple_dialog
+
+Windowdef_simple_dialog::Windowdef_simple_dialog( Windowdef_simple* window_P, QObject* obj_P,
+ const char* slot_P )
+ : KDialogBase( NULL, NULL, true, i18n( "Window Details" ), Ok | Cancel ), window( NULL )
+ {
+ widget = new Windowdef_simple_widget( this );
+ widget->set_autodetect( obj_P, slot_P );
+ widget->set_data( window_P );
+ setMainWidget( widget );
+ }
+
+Windowdef* Windowdef_simple_dialog::edit_windowdef()
+ {
+ exec();
+ return window;
+ }
+
+void Windowdef_simple_dialog::accept()
+ {
+ KDialogBase::accept();
+ window = widget->get_data(); // CHECKME NULL ?
+ }
+
+
+} // namespace KHotKeys
+
+#include "windowdef_list_widget.moc"
diff --git a/khotkeys/kcontrol/windowdef_list_widget.h b/khotkeys/kcontrol/windowdef_list_widget.h
new file mode 100644
index 000000000..8a69fc5eb
--- /dev/null
+++ b/khotkeys/kcontrol/windowdef_list_widget.h
@@ -0,0 +1,160 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _WINDOWDEF_LIST_WIDGET_H_
+#define _WINDOWDEF_LIST_WIDGET_H_
+
+#include <qlistview.h>
+
+#include <kdialogbase.h>
+
+#include <windows.h>
+#include <windowdef_list_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Action_data;
+class Action_data_base;
+class Windowdef_simple_widget;
+
+class Windowdef_list_item;
+
+class Windowdef_list_widget
+ : public Windowdef_list_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Windowdef_list_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ virtual ~Windowdef_list_widget();
+ void set_data( const Windowdef_list* data_P );
+ Windowdef_list* get_data() const;
+ void set_autodetect( QObject* obj_P, const char* slot_P );
+ public slots:
+ void clear_data();
+ protected:
+ Windowdef_list_item* create_listview_item( Windowdef* window_P, QListView* parent1_P,
+ QListViewItem* parent2_P, QListViewItem* after_P, bool copy_P );
+ void edit_listview_item( Windowdef_list_item* item_P );
+ enum type_t { TYPE_WINDOWDEF_SIMPLE };
+ protected slots:
+ void new_selected( int type_P );
+ virtual void copy_pressed();
+ virtual void delete_pressed();
+ virtual void modify_pressed();
+ virtual void current_changed( QListViewItem* item_P );
+ protected:
+ QObject* autodetect_object;
+ const char* autodetect_slot;
+ Windowdef_list_item* selected_item;
+ };
+
+typedef Windowdef_list_widget Windowdef_list_tab;
+
+class Windowdef_list_item
+ : public QListViewItem
+ {
+ public:
+ Windowdef_list_item( QListView* parent_P, Windowdef* window_P );
+ Windowdef_list_item( QListViewItem* parent_P, Windowdef* window_P );
+ Windowdef_list_item( QListView* parent_P, QListViewItem* after_P, Windowdef* window_P );
+ Windowdef_list_item( QListViewItem* parent_P, QListViewItem* after_P, Windowdef* window_P );
+ virtual ~Windowdef_list_item();
+ virtual QString text( int column_P ) const;
+ Windowdef* window() const;
+ void set_window( Windowdef* window_P );
+ protected:
+ Windowdef* _window; // owns it
+ };
+
+class Windowdef_dialog
+ {
+ public:
+ virtual Windowdef* edit_windowdef() = 0;
+ virtual ~Windowdef_dialog();
+ };
+
+class Windowdef_simple_dialog
+ : public KDialogBase, public Windowdef_dialog
+ {
+ Q_OBJECT
+ public:
+ Windowdef_simple_dialog( Windowdef_simple* window_P, QObject* obj_P, const char* slot_P );
+ virtual Windowdef* edit_windowdef();
+ protected:
+ virtual void accept();
+ Windowdef_simple_widget* widget;
+ Windowdef_simple* window;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Windowdef_list_widget
+
+inline
+void Windowdef_list_widget::set_autodetect( QObject* obj_P, const char* slot_P )
+ {
+ autodetect_object = obj_P;
+ autodetect_slot = slot_P;
+ }
+
+// Windowdef_list_item
+
+inline
+Windowdef_list_item::Windowdef_list_item( QListView* parent_P, Windowdef* window_P )
+ : QListViewItem( parent_P ), _window( window_P )
+ {
+ }
+
+inline
+Windowdef_list_item::Windowdef_list_item( QListViewItem* parent_P, Windowdef* window_P )
+ : QListViewItem( parent_P ), _window( window_P )
+ {
+ }
+
+inline
+Windowdef_list_item::Windowdef_list_item( QListView* parent_P, QListViewItem* after_P,
+ Windowdef* window_P )
+ : QListViewItem( parent_P, after_P ), _window( window_P )
+ {
+ }
+
+inline
+Windowdef_list_item::Windowdef_list_item( QListViewItem* parent_P, QListViewItem* after_P,
+ Windowdef* window_P )
+ : QListViewItem( parent_P, after_P ), _window( window_P )
+ {
+ }
+
+inline
+Windowdef* Windowdef_list_item::window() const
+ {
+ return _window;
+ }
+
+inline
+void Windowdef_list_item::set_window( Windowdef* window_P )
+ {
+ delete _window;
+ _window = window_P;
+ }
+
+// Windowdef_dialog
+
+inline
+Windowdef_dialog::~Windowdef_dialog()
+ {
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/windowdef_simple_widget.cpp b/khotkeys/kcontrol/windowdef_simple_widget.cpp
new file mode 100644
index 000000000..f0749e476
--- /dev/null
+++ b/khotkeys/kcontrol/windowdef_simple_widget.cpp
@@ -0,0 +1,183 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _WINDOWDEF_SIMPLE_WIDGET_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "windowdef_simple_widget.h"
+
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <kdebug.h>
+
+#include <windows.h>
+
+#include "windowdef_list_widget.h"
+#include "kcmkhotkeys.h"
+#include "windowselector.h"
+
+namespace KHotKeys
+{
+
+Windowdef_simple_widget::Windowdef_simple_widget( QWidget* parent_P, const char* name_P )
+ : Windowdef_simple_widget_ui( parent_P, name_P )
+ {
+ window_title_lineedit->setEnabled( false );
+ window_class_lineedit->setEnabled( false );
+ window_role_lineedit->setEnabled( false );
+ connect( autodetect_button, SIGNAL( clicked()), SLOT( autodetect_clicked()));
+ clear_data();
+ // KHotKeys::Module::changed()
+ connect( window_title_combo, SIGNAL( activated( int )),
+ module, SLOT( changed()));
+ connect( window_title_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( window_class_combo, SIGNAL( activated( int )),
+ module, SLOT( changed()));
+ connect( window_class_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( window_role_combo, SIGNAL( activated( int )),
+ module, SLOT( changed()));
+ connect( window_role_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ connect( type_normal_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( type_dialog_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( type_dock_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( type_desktop_checkbox, SIGNAL( clicked()),
+ module, SLOT( changed()));
+ connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
+ module, SLOT( changed()));
+ }
+
+void Windowdef_simple_widget::clear_data()
+ {
+ comment_lineedit->clear();
+ window_title_combo->setCurrentItem( 0 );
+ window_title_lineedit->clear();
+ window_title_lineedit->setEnabled( false );
+ window_class_combo->setCurrentItem( 0 );
+ window_class_lineedit->clear();
+ window_class_lineedit->setEnabled( false );
+ window_role_combo->setCurrentItem( 0 );
+ window_role_lineedit->clear();
+ window_role_lineedit->setEnabled( false );
+ type_normal_checkbox->setChecked( true );
+ type_dialog_checkbox->setChecked( true );
+ type_dock_checkbox->setChecked( false );
+// type_tool_checkbox->setChecked( false );
+// type_menu_checkbox->setChecked( false );
+ type_desktop_checkbox->setChecked( false );
+ }
+
+void Windowdef_simple_widget::set_data( const Windowdef_simple* data_P )
+ {
+ if( data_P == NULL )
+ {
+ clear_data();
+ return;
+ }
+ comment_lineedit->setText( data_P->comment());
+ window_title_combo->setCurrentItem( data_P->title_match_type());
+ window_title_lineedit->setText( data_P->title());
+ window_title_lineedit->setEnabled( window_title_combo->currentItem() != 0 );
+ window_class_combo->setCurrentItem( data_P->wclass_match_type());
+ window_class_lineedit->setText( data_P->wclass());
+ window_class_lineedit->setEnabled( window_class_combo->currentItem() != 0 );
+ window_role_combo->setCurrentItem( data_P->role_match_type());
+ window_role_lineedit->setText( data_P->role());
+ window_role_lineedit->setEnabled( window_role_combo->currentItem() != 0 );
+ type_normal_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_NORMAL ));
+ type_dialog_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_DIALOG ));
+ type_dock_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_DOCK ));
+// type_tool_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_TOOL ));
+// type_menu_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_MENU ));
+ type_desktop_checkbox->setChecked(
+ data_P->type_match( Windowdef_simple::WINDOW_TYPE_DESKTOP ));
+ }
+
+Windowdef_simple* Windowdef_simple_widget::get_data() const
+ {
+ return new Windowdef_simple( comment_lineedit->text(), window_title_lineedit->text(),
+ static_cast< Windowdef_simple::substr_type_t >( window_title_combo->currentItem()),
+ window_class_lineedit->text(),
+ static_cast< Windowdef_simple::substr_type_t >( window_class_combo->currentItem()),
+ window_role_lineedit->text(),
+ static_cast< Windowdef_simple::substr_type_t >( window_role_combo->currentItem()),
+ ( type_normal_checkbox->isChecked() ? Windowdef_simple::WINDOW_TYPE_NORMAL : 0 )
+ | ( type_dialog_checkbox->isChecked() ? Windowdef_simple::WINDOW_TYPE_DIALOG : 0 )
+ | ( type_dock_checkbox->isChecked() ? Windowdef_simple::WINDOW_TYPE_DOCK : 0 )
+// | ( type_tool_checkbox->isChecked() ? Windowdef_simple::WINDOW_TYPE_TOOL : 0 )
+// | ( type_menu_checkbox->isChecked() ? Windowdef_simple::WINDOW_TYPE_MENU : 0 )
+ | ( type_desktop_checkbox->isChecked() ? Windowdef_simple::WINDOW_TYPE_DESKTOP : 0 )
+ );
+ }
+
+void Windowdef_simple_widget::window_role_combo_changed( int item_P )
+ { // CHECKME nebo je connect() na highlighted() ?
+ window_role_lineedit->setEnabled( item_P != 0 );
+ }
+
+void Windowdef_simple_widget::window_class_combo_changed( int item_P )
+ {
+ window_class_lineedit->setEnabled( item_P != 0 );
+ }
+
+void Windowdef_simple_widget::window_title_combo_changed( int item_P )
+ {
+ window_title_lineedit->setEnabled( item_P != 0 );
+ }
+
+void Windowdef_simple_widget::set_autodetect( QObject* obj_P, const char* slot_P )
+ {
+ disconnect( SIGNAL( autodetect_signal()));
+ if( obj_P != NULL )
+ connect( this, SIGNAL( autodetect_signal()), obj_P, slot_P );
+ }
+
+void Windowdef_simple_widget::autodetect_clicked()
+ {
+ emit autodetect_signal();
+ autodetect();
+ }
+
+void Windowdef_simple_widget::autodetect()
+ {
+ WindowSelector* sel = new WindowSelector( this, SLOT( autodetect_window_selected( WId )));
+ sel->select();
+ }
+
+void Windowdef_simple_widget::autodetect_window_selected( WId window )
+ {
+ if( window )
+ {
+ Window_data data( window );
+ window_title_lineedit->setText( data.title );
+ window_role_lineedit->setText( data.role );
+ window_class_lineedit->setText( data.wclass );
+ type_normal_checkbox->setChecked( data.type == NET::Normal );
+ type_dialog_checkbox->setChecked( data.type == NET::Dialog );
+ type_dock_checkbox->setChecked( data.type == NET::Dock );
+// type_tool_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_TOOL ));
+// type_menu_checkbox->setChecked( data_P->type_match( Windowdef_simple::WINDOW_TYPE_MENU ));
+ type_desktop_checkbox->setChecked( data.type == NET::Desktop );
+ }
+ }
+
+} // namespace KHotKeys
+
+#include "windowdef_simple_widget.moc"
diff --git a/khotkeys/kcontrol/windowdef_simple_widget.h b/khotkeys/kcontrol/windowdef_simple_widget.h
new file mode 100644
index 000000000..e6777b6ee
--- /dev/null
+++ b/khotkeys/kcontrol/windowdef_simple_widget.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _WINDOWDEF_SIMPLE_WIDGET_H_
+#define _WINDOWDEF_SIMPLE_WIDGET_H_
+
+#include <windowdef_simple_widget_ui.h>
+
+namespace KHotKeys
+{
+
+class Windowdef_simple;
+class Windowdef_list_item;
+
+class Windowdef_simple_widget
+ : public Windowdef_simple_widget_ui
+ {
+ Q_OBJECT
+ public:
+ Windowdef_simple_widget( QWidget* parent_P = NULL, const char* name_P = NULL );
+ void set_data( const Windowdef_simple* data_P );
+ Windowdef_simple* get_data() const;
+ void set_autodetect( QObject* obj_P, const char* slot_P );
+ public slots:
+ void clear_data();
+ protected:
+ void autodetect();
+ protected slots:
+ virtual void autodetect_clicked();
+ virtual void window_role_combo_changed( int item_P );
+ virtual void window_class_combo_changed( int item_P );
+ virtual void window_title_combo_changed( int item_P );
+ void autodetect_window_selected( WId window );
+ signals:
+ void autodetect_signal();
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/kcontrol/windowselector.cpp b/khotkeys/kcontrol/windowselector.cpp
new file mode 100644
index 000000000..a754b422d
--- /dev/null
+++ b/khotkeys/kcontrol/windowselector.cpp
@@ -0,0 +1,92 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _WINDOWSELECTOR_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "windowselector.h"
+
+#include "voices.h"
+
+#include <qcursor.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+
+namespace KHotKeys
+{
+
+WindowSelector::WindowSelector( QObject* receiver_P, const char* slot_P )
+ {
+ connect( this, SIGNAL( selected_signal( WId )), receiver_P, slot_P );
+ }
+
+void WindowSelector::select()
+ {
+ kapp->desktop()->grabMouse( QCursor( crossCursor ));
+ kapp->installX11EventFilter( this );
+ }
+
+bool WindowSelector::x11Event( XEvent* e )
+ {
+ if( e->type != ButtonPress )
+ return false;
+ kapp->desktop()->releaseMouse();
+ if( e->xbutton.button == Button1 )
+ {
+ WId window = findRealWindow( e->xbutton.subwindow );
+ if( window )
+ selected_signal( window );
+ }
+ delete this;
+ return true;
+ }
+
+WId WindowSelector::findRealWindow( WId w, int depth )
+ {
+ if( depth > 5 )
+ return None;
+ static Atom wm_state = XInternAtom( qt_xdisplay(), "WM_STATE", False );
+ Atom type;
+ int format;
+ unsigned long nitems, after;
+ unsigned char* prop;
+ if( XGetWindowProperty( qt_xdisplay(), w, wm_state, 0, 0, False, AnyPropertyType,
+ &type, &format, &nitems, &after, &prop ) == Success )
+ {
+ if( prop != NULL )
+ XFree( prop );
+ if( type != None )
+ return w;
+ }
+ Window root, parent;
+ Window* children;
+ unsigned int nchildren;
+ Window ret = None;
+ if( XQueryTree( qt_xdisplay(), w, &root, &parent, &children, &nchildren ) != 0 )
+ {
+ for( unsigned int i = 0;
+ i < nchildren && ret == None;
+ ++i )
+ ret = findRealWindow( children[ i ], depth + 1 );
+ if( children != NULL )
+ XFree( children );
+ }
+ return ret;
+}
+
+
+} // namespace KHotKeys
+
+#include "windowselector.moc"
diff --git a/khotkeys/kcontrol/windowselector.h b/khotkeys/kcontrol/windowselector.h
new file mode 100644
index 000000000..3a28853ed
--- /dev/null
+++ b/khotkeys/kcontrol/windowselector.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _WINDOWSELECTOR_H_
+#define _WINDOWSELECTOR_H_
+
+#include <qwidget.h>
+
+namespace KHotKeys
+{
+
+class WindowSelector
+ : public QWidget
+ {
+ Q_OBJECT
+ public:
+ WindowSelector( QObject* receiver, const char* slot );
+ void select();
+ protected:
+ virtual bool x11Event( XEvent* e );
+ signals:
+ void selected_signal( WId w );
+ private:
+ WId findRealWindow( WId w, int depth = 0 );
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/khotkeys.desktop b/khotkeys/khotkeys.desktop
new file mode 100644
index 000000000..e1e3e1732
--- /dev/null
+++ b/khotkeys/khotkeys.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/khotkeys/shared/Makefile.am b/khotkeys/shared/Makefile.am
new file mode 100644
index 000000000..4e20f6083
--- /dev/null
+++ b/khotkeys/shared/Makefile.am
@@ -0,0 +1,15 @@
+lib_LTLIBRARIES = libkhotkeys_shared.la
+
+libkhotkeys_shared_la_SOURCES = action_data.cpp khotkeysglobal.cpp triggers.cpp windows.cpp \
+ settings.cpp actions.cpp input.cpp conditions.cpp khlistview.cpp khlistbox.cpp \
+ gestures.cpp voices.cpp voicesignature.cpp sound.cpp soundrecorder.cpp
+libkhotkeys_shared_la_LIBADD = $(LIB_KIO) $(XTESTLIB) -lXext -lX11 $(X_PRE_LIBS)
+libkhotkeys_shared_la_LDFLAGS = $(all_libraries) $(X_LDFLAGS) -version-info 1:0:0 -no-undefined
+
+INCLUDES = $(all_includes)
+
+noinst_HEADERS = action_data.h khotkeysglobal.h triggers.h windows.h actions.h input.h \
+ settings.h conditions.h khlistview.h khlistbox.h gestures.h voices.h \
+ voicesignature.h sound.h soundrecorder.h
+
+METASOURCES = AUTO
diff --git a/khotkeys/shared/action_data.cpp b/khotkeys/shared/action_data.cpp
new file mode 100644
index 000000000..96e3e5559
--- /dev/null
+++ b/khotkeys/shared/action_data.cpp
@@ -0,0 +1,378 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _ACTION_DATA_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "action_data.h"
+
+#include <kconfig.h>
+
+#include "actions.h"
+
+namespace KHotKeys
+{
+
+// Action_data_base
+
+Action_data_base::Action_data_base( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Condition_list* conditions_P, bool enabled_P )
+ : _parent( parent_P ), _conditions( conditions_P ), _name( name_P ), _comment( comment_P ),
+ _enabled( enabled_P )
+ {
+ if( parent())
+ parent()->add_child( this );
+ if( _conditions != NULL )
+ _conditions->set_data( this );
+ }
+
+Action_data_base::Action_data_base( KConfig& cfg_P, Action_data_group* parent_P )
+ : _parent( parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ _name = cfg_P.readEntry( "Name" );
+ _comment = cfg_P.readEntry( "Comment" );
+ _enabled = cfg_P.readBoolEntry( "Enabled", true );
+ cfg_P.setGroup( save_cfg_group + "Conditions" );
+ _conditions = new Condition_list( cfg_P, this );
+ cfg_P.setGroup( save_cfg_group );
+ if( parent())
+ parent()->add_child( this );
+ }
+
+Action_data_base::~Action_data_base()
+ {
+// kdDebug( 1217 ) << "~Action_data_base() :" << this << endl;
+ if( parent())
+ parent()->remove_child( this );
+ delete _conditions;
+ }
+
+void Action_data_base::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Type", "ERROR" ); // derived classes should call with their type
+ cfg_P.writeEntry( "Name", name());
+ cfg_P.writeEntry( "Comment", comment());
+ cfg_P.writeEntry( "Enabled", enabled( true ));
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Conditions" );
+ assert( conditions() != NULL );
+ conditions()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+
+Action_data_base* Action_data_base::create_cfg_read( KConfig& cfg_P, Action_data_group* parent_P )
+ {
+ QString type = cfg_P.readEntry( "Type" );
+ if( type == "ACTION_DATA_GROUP" )
+ {
+ if( cfg_P.readBoolEntry( "AllowMerge", false ))
+ {
+ for( Action_data_group::Iterator it = parent_P->first_child();
+ it;
+ ++it )
+ {
+ if( Action_data_group* existing = dynamic_cast< Action_data_group* >( *it ))
+ {
+ if( cfg_P.readEntry( "Name" ) == existing->name())
+ return existing;
+ }
+ }
+ }
+ return new Action_data_group( cfg_P, parent_P );
+ }
+ if( type == "GENERIC_ACTION_DATA" )
+ return new Generic_action_data( cfg_P, parent_P );
+ if( type == "COMMAND_URL_SHORTCUT_ACTION_DATA" )
+ return new Command_url_shortcut_action_data( cfg_P, parent_P );
+ if( type == "MENUENTRY_SHORTCUT_ACTION_DATA" )
+ return new Menuentry_shortcut_action_data( cfg_P, parent_P );
+ if( type == "DCOP_SHORTCUT_ACTION_DATA" )
+ return new Dcop_shortcut_action_data( cfg_P, parent_P );
+ if( type == "KEYBOARD_INPUT_SHORTCUT_ACTION_DATA" )
+ return new Keyboard_input_shortcut_action_data( cfg_P, parent_P );
+ if( type == "KEYBOARD_INPUT_GESTURE_ACTION_DATA" )
+ return new Keyboard_input_gesture_action_data( cfg_P, parent_P );
+ if( type == "ACTIVATE_WINDOW_SHORTCUT_ACTION_DATA" )
+ return new Activate_window_shortcut_action_data( cfg_P, parent_P );
+ kdWarning( 1217 ) << "Unknown Action_data_base type read from cfg file\n";
+ return NULL;
+ }
+
+bool Action_data_base::cfg_is_enabled( KConfig& cfg_P )
+ {
+ return cfg_P.readBoolEntry( "Enabled", true );
+ }
+
+void Action_data_base::reparent( Action_data_group* new_parent_P )
+ {
+ if( parent())
+ parent()->remove_child( this );
+ _parent = new_parent_P;
+ if( parent())
+ parent()->add_child( this );
+ }
+
+bool Action_data_base::enabled( bool ignore_group_P ) const
+ {
+ if( ignore_group_P )
+ return _enabled;
+ else
+ return _enabled && ( parent() == NULL || parent()->enabled( false ));
+ }
+
+bool Action_data_base::conditions_match() const
+ {
+ return ( conditions() ? conditions()->match() : true )
+ && ( parent() ? parent()->conditions_match() : true );
+ }
+
+// Action_data_group
+
+Action_data_group::Action_data_group( KConfig& cfg_P, Action_data_group* parent_P )
+ : Action_data_base( cfg_P, parent_P )
+ {
+ unsigned int system_group_tmp = cfg_P.readUnsignedNumEntry( "SystemGroup", 0 );
+ if( system_group_tmp >= SYSTEM_MAX )
+ system_group_tmp = 0;
+ _system_group = static_cast< system_group_t >( system_group_tmp );
+ }
+
+void Action_data_group::cfg_write( KConfig& cfg_P ) const
+ {
+ Action_data_base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "SystemGroup", system_group());
+ cfg_P.writeEntry( "Type", "ACTION_DATA_GROUP" );
+ }
+
+void Action_data_group::update_triggers()
+ {
+ for( Action_data_group::Iterator it = first_child();
+ it;
+ ++it )
+ ( *it )->update_triggers();
+ }
+
+// Action_data
+
+Action_data::Action_data( KConfig& cfg_P, Action_data_group* parent_P )
+ : Action_data_base( cfg_P, parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Triggers" );
+ _triggers = new Trigger_list( cfg_P, this );
+ cfg_P.setGroup( save_cfg_group + "Actions" );
+ _actions = new Action_list( cfg_P, this );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+Action_data::~Action_data()
+ {
+// kdDebug( 1217 ) << "~Action_data" << this << endl;
+ delete _triggers;
+ delete _actions;
+ // CHECKME jeste remove z parenta ?
+ }
+
+void Action_data::cfg_write( KConfig& cfg_P ) const
+ {
+ Action_data_base::cfg_write( cfg_P );
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Triggers" );
+ triggers()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group + "Actions" );
+ actions()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+void Action_data::execute()
+ {
+ for( Action_list::Iterator it( *_actions );
+ it;
+ ++it )
+ it.current()->execute();
+// CHECKME nebo nejak zpozdeni ?
+ }
+
+void Action_data::add_trigger( Trigger* trigger_P )
+ {
+ _triggers->append( trigger_P );
+ }
+
+void Action_data::add_triggers( Trigger_list* triggers_P )
+ {
+ for( Trigger_list::Iterator it = *triggers_P;
+ it;
+ ++it )
+ _triggers->append( *it );
+ triggers_P->setAutoDelete( false );
+ delete triggers_P;
+ }
+
+void Action_data::set_triggers( Trigger_list* triggers_P )
+ {
+ assert( _triggers == NULL );
+ _triggers = triggers_P;
+ }
+
+void Action_data::add_action( Action* action_P, Action* after_P )
+ {
+ int index = 0;
+ for( Action_list::Iterator it = *_actions;
+ it;
+ ++it )
+ {
+ ++index;
+ if( *it == after_P )
+ break;
+ }
+ _actions->insert( index, action_P );
+ }
+
+void Action_data::add_actions( Action_list* actions_P, Action* after_P )
+ {
+ int index = 0;
+ for( Action_list::Iterator it = *_actions;
+ it;
+ ++it )
+ {
+ ++index;
+ if( *it == after_P )
+ break;
+ }
+ for( Action_list::Iterator it = *actions_P;
+ it;
+ ++it )
+ _actions->insert( index++, *it );
+ actions_P->setAutoDelete( false );
+ delete actions_P;
+ }
+
+void Action_data::set_actions( Action_list* actions_P )
+ {
+ assert( _actions == NULL );
+ _actions = actions_P;
+ }
+
+void Action_data::update_triggers()
+ {
+ bool activate = conditions_match() && enabled( false );
+ kdDebug( 1217 ) << "Update triggers: " << name() << ":" << activate << endl;
+ for( Trigger_list::Iterator it = ( *triggers());
+ it;
+ ++it )
+ ( *it )->activate( activate );
+ }
+
+// Generic_action_data
+
+void Generic_action_data::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "GENERIC_ACTION_DATA" );
+ }
+
+// Command_url_shortcut_action_data
+
+Command_url_shortcut_action_data::Command_url_shortcut_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P,
+ const KShortcut& shortcut_P, const QString& command_url_P, bool enabled_P )
+ : Simple_action_data< Shortcut_trigger, Command_url_action >( parent_P, name_P,
+ comment_P, enabled_P )
+ {
+ set_action( new Command_url_action( this, command_url_P ));
+ set_trigger( new Shortcut_trigger( this, shortcut_P ));
+ }
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Command_url_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "COMMAND_URL_SHORTCUT_ACTION_DATA" );
+ }
+
+// Menuentry_shortcut_action_data
+
+Menuentry_shortcut_action_data::Menuentry_shortcut_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P,
+ const KShortcut& shortcut_P, const QString& menuentry_P, bool enabled_P )
+ : Simple_action_data< Shortcut_trigger, Menuentry_action >( parent_P, name_P,
+ comment_P, enabled_P )
+ {
+ set_action( new Menuentry_action( this, menuentry_P ));
+ set_trigger( new Shortcut_trigger( this, shortcut_P ));
+ }
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Menuentry_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "MENUENTRY_SHORTCUT_ACTION_DATA" );
+ }
+
+// Dcop_shortcut_action_data
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Dcop_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "DCOP_SHORTCUT_ACTION_DATA" );
+ }
+
+// Keyboard_input_shortcut_action_data
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Keyboard_input_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "KEYBOARD_INPUT_SHORTCUT_ACTION_DATA" );
+ }
+
+// Activate_window_shortcut_action_data
+
+template<> KDE_EXPORT
+void Simple_action_data< Shortcut_trigger, Activate_window_action >
+ ::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "ACTIVATE_WINDOW_SHORTCUT_ACTION_DATA" );
+ }
+
+// Keyboard_input_gesture_action_data
+
+void Keyboard_input_gesture_action_data::set_action( Keyboard_input_action* action_P )
+ {
+ Action_list* tmp = new Action_list( "Keyboard_input_gesture_action_data" );
+ tmp->append( action_P );
+ set_actions( tmp );
+ }
+
+const Keyboard_input_action* Keyboard_input_gesture_action_data::action() const
+ {
+ if( actions() == NULL ) // CHECKME tohle poradne zkontrolovat
+ return NULL;
+ return static_cast< Keyboard_input_action* >( const_cast< Action_list* >( actions())->first());
+ }
+
+void Keyboard_input_gesture_action_data::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "KEYBOARD_INPUT_GESTURE_ACTION_DATA" );
+ }
+
+} // namespace KHotKeys
diff --git a/khotkeys/shared/action_data.h b/khotkeys/shared/action_data.h
new file mode 100644
index 000000000..9d6018c2c
--- /dev/null
+++ b/khotkeys/shared/action_data.h
@@ -0,0 +1,446 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _ACTION_DATA_H_
+#define _ACTION_DATA_H_
+
+#include <assert.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <kdebug.h>
+
+class KConfig;
+
+#include "khotkeysglobal.h"
+
+#include "windows.h"
+#include "conditions.h"
+#include "triggers.h"
+#include "actions.h"
+
+namespace KHotKeys
+{
+
+class Action_data_group;
+
+class KDE_EXPORT Action_data_base
+ {
+ public:
+ Action_data_base( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Condition_list* condition_P, bool enabled_P );
+ Action_data_base( KConfig& cfg_P, Action_data_group* parent_P );
+ virtual ~Action_data_base();
+ virtual void cfg_write( KConfig& cfg_P ) const = 0;
+ const Condition_list* conditions() const;
+ Action_data_group* parent() const;
+ void reparent( Action_data_group* new_parent_P );
+ virtual void update_triggers() = 0;
+ bool conditions_match() const;
+ const QString& name() const;
+ void set_name( const QString& name_P );
+ const QString& comment() const;
+ bool enabled( bool ignore_group_P ) const;
+ static Action_data_base* create_cfg_read( KConfig& cfg_P, Action_data_group* parent_P );
+ static bool cfg_is_enabled( KConfig& cfg_P );
+ protected:
+ void set_conditions( Condition_list* conditions_P );
+ private:
+ Action_data_group* _parent;
+ Condition_list* _conditions;
+ QString _name;
+ QString _comment;
+ bool _enabled; // is not really important, only used in conf. module and when reading cfg. file
+ KHOTKEYS_DISABLE_COPY( Action_data_base );
+ };
+
+class KDE_EXPORT Action_data_group
+ : public Action_data_base
+ {
+ public:
+ enum system_group_t { SYSTEM_NONE, SYSTEM_MENUENTRIES,
+ SYSTEM_ROOT, /* last one*/ SYSTEM_MAX }; // don't remove entries
+ Action_data_group( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Condition_list* conditions_P, system_group_t system_group_P,
+ bool enabled_P );
+ Action_data_group( KConfig& cfg_P, Action_data_group* parent_P );
+ virtual ~Action_data_group();
+ virtual void update_triggers();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ typedef QPtrListIterator< Action_data_base > Iterator; // CHECKME neni const :(
+ Iterator first_child() const;
+ bool is_system_group() const;
+ system_group_t system_group() const;
+ using Action_data_base::set_conditions; // make public
+ protected:
+ QPtrList< Action_data_base > list;
+ system_group_t _system_group; // e.g. menuedit entries, can't be deleted or renamed
+ friend class Action_data_base; // CHECKME
+ void add_child( Action_data_base* child_P );
+ void remove_child( Action_data_base* child_P );
+ };
+
+// this one represents a "whole" action, i.e. triggers, resulting actions, etc.
+class KDE_EXPORT Action_data
+ : public Action_data_base
+ {
+ typedef Action_data_base base;
+ public:
+ Action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Trigger_list* triggers_P, Condition_list* conditions_P,
+ Action_list* actions_P, bool enabled_P = true );
+ Action_data( KConfig& cfg_P, Action_data_group* parent_P );
+ virtual ~Action_data();
+ virtual void update_triggers();
+ virtual void cfg_write( KConfig& cfg_P ) const = 0;
+ virtual void execute();
+ const Trigger_list* triggers() const;
+ const Action_list* actions() const;
+ protected:
+ virtual void add_trigger( Trigger* trigger_P );
+ virtual void add_triggers(
+ Trigger_list* triggers_P ); // Trigger_list instance will be deleted
+ virtual void set_triggers( Trigger_list* triggers_P );
+ virtual void add_action( Action* action_P, Action* after_P = NULL );
+ virtual void add_actions( Action_list* actions_P,
+ Action* after_P = NULL ); // Action_list will be deleted
+ virtual void set_actions( Action_list* actions_P );
+ private:
+ Trigger_list* _triggers;
+ Action_list* _actions;
+#if 0
+ action_type_t _type;
+ static const char* const types[];
+#endif
+ };
+
+class KDE_EXPORT Generic_action_data
+ : public Action_data
+ {
+ typedef Action_data base;
+ public:
+ Generic_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Trigger_list* triggers_P, Condition_list* conditions_P,
+ Action_list* actions_P, bool enabled_P = true );
+ Generic_action_data( KConfig& cfg_P, Action_data_group* parent_P );
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ using Action_data_base::set_conditions; // make public
+ using Action_data::add_trigger; // make public
+ using Action_data::add_triggers; // make public
+ using Action_data::set_triggers; // make public
+ using Action_data::add_action; // make public
+ using Action_data::add_actions; // make public
+ using Action_data::set_actions; // make public
+ };
+
+template< typename T, typename A >
+class KDE_EXPORT Simple_action_data
+ : public Action_data
+ {
+ typedef Action_data base;
+ public:
+ Simple_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, bool enabled_P = true );
+ Simple_action_data( KConfig& cfg_P, Action_data_group* parent_P );
+ const A* action() const;
+ const T* trigger() const;
+ // CHECKME kontrola, ze se dava jen jedna akce ?
+ void set_action( A* action_P );
+ void set_trigger( T* trigger_P );
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ };
+
+class KDE_EXPORT Command_url_shortcut_action_data
+ : public Simple_action_data< Shortcut_trigger, Command_url_action >
+ {
+ typedef Simple_action_data< Shortcut_trigger, Command_url_action > base;
+ public:
+ Command_url_shortcut_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, bool enabled_P = true );
+ Command_url_shortcut_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, const KShortcut& shortcut_P, const QString& command_url_P,
+ bool enabled_P = true );
+ Command_url_shortcut_action_data( KConfig& cfg_P, Action_data_group* parent_P );
+ };
+
+class KDE_EXPORT Menuentry_shortcut_action_data
+ : public Simple_action_data< Shortcut_trigger, Menuentry_action >
+ {
+ typedef Simple_action_data< Shortcut_trigger, Menuentry_action > base;
+ public:
+ Menuentry_shortcut_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, bool enabled_P = true );
+ Menuentry_shortcut_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, const KShortcut& shortcut_P, const QString& command_url_P,
+ bool enabled_P = true );
+ Menuentry_shortcut_action_data( KConfig& cfg_P, Action_data_group* parent_P );
+ };
+
+typedef Simple_action_data< Shortcut_trigger, Dcop_action > Dcop_shortcut_action_data;
+typedef Simple_action_data< Shortcut_trigger, Keyboard_input_action >
+ Keyboard_input_shortcut_action_data;
+typedef Simple_action_data< Shortcut_trigger, Activate_window_action >
+ Activate_window_shortcut_action_data;
+
+class KDE_EXPORT Keyboard_input_gesture_action_data
+ : public Action_data
+ {
+ typedef Action_data base;
+ public:
+ Keyboard_input_gesture_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, bool enabled_P = true );
+ Keyboard_input_gesture_action_data( KConfig& cfg_P, Action_data_group* parent_P );
+ const Keyboard_input_action* action() const;
+ // CHECKME kontrola, ze se dava jen jedna akce ?
+ void set_action( Keyboard_input_action* action_P );
+ enum { NUM_TRIGGERS = 3 }; // needs changing code elsewhere
+ using Action_data::set_triggers; // make public // CHECKME kontrola poctu?
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Action_data_base
+
+inline
+const Condition_list* Action_data_base::conditions() const
+ {
+// assert( _conditions != NULL );
+ return _conditions;
+ }
+
+inline
+void Action_data_base::set_conditions( Condition_list* conditions_P )
+ {
+ assert( _conditions == NULL );
+ _conditions = conditions_P;
+ }
+
+inline
+Action_data_group* Action_data_base::parent() const
+ {
+ return _parent;
+ }
+
+inline
+void Action_data_base::set_name( const QString& name_P )
+ {
+ _name = name_P;
+ }
+
+inline
+const QString& Action_data_base::name() const
+ {
+ return _name;
+ }
+
+inline
+const QString& Action_data_base::comment() const
+ {
+ return _comment;
+ }
+
+// Action_data_group
+
+inline
+Action_data_group::Action_data_group( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Condition_list* conditions_P, system_group_t system_group_P,
+ bool enabled_P )
+ : Action_data_base( parent_P, name_P, comment_P, conditions_P, enabled_P ),
+ _system_group( system_group_P )
+ {
+ }
+
+inline
+Action_data_group::~Action_data_group()
+ {
+// kdDebug( 1217 ) << "~Action_data_group() :" << list.count() << endl;
+ while( list.first())
+ delete list.first();
+ }
+
+inline
+Action_data_group::Iterator Action_data_group::first_child() const
+ {
+ return Iterator( list );
+ }
+
+inline
+bool Action_data_group::is_system_group() const
+ {
+ return _system_group != SYSTEM_NONE;
+ }
+
+inline
+Action_data_group::system_group_t Action_data_group::system_group() const
+ {
+ return _system_group;
+ }
+
+inline
+void Action_data_group::add_child( Action_data_base* child_P )
+ {
+ list.append( child_P ); // CHECKME tohle asi znemozni je mit nejak rucne serazene
+ }
+
+inline
+void Action_data_group::remove_child( Action_data_base* child_P )
+ {
+ list.removeRef( child_P ); // is not auto-delete
+ }
+
+// Action_data
+
+inline
+Action_data::Action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Trigger_list* triggers_P, Condition_list* conditions_P,
+ Action_list* actions_P, bool enabled_P )
+ : Action_data_base( parent_P, name_P, comment_P, conditions_P, enabled_P ),
+ _triggers( triggers_P ), _actions( actions_P )
+ {
+ }
+
+inline
+const Trigger_list* Action_data::triggers() const
+ {
+// assert( _triggers != NULL );
+ return _triggers;
+ }
+
+inline
+const Action_list* Action_data::actions() const
+ {
+// assert( _actions != NULL );
+ return _actions;
+ }
+
+// Generic_action_data
+
+inline
+Generic_action_data::Generic_action_data( Action_data_group* parent_P, const QString& name_P,
+ const QString& comment_P, Trigger_list* triggers_P, Condition_list* conditions_P,
+ Action_list* actions_P, bool enabled_P )
+ : Action_data( parent_P, name_P, comment_P, triggers_P, conditions_P, actions_P, enabled_P )
+ {
+ }
+
+inline
+Generic_action_data::Generic_action_data( KConfig& cfg_P, Action_data_group* parent_P )
+ : Action_data( cfg_P, parent_P )
+ { // CHECKME do nothing ?
+ }
+
+// Simple_action_data
+
+template< typename T, typename A >
+inline
+Simple_action_data< T, A >::Simple_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P, bool enabled_P )
+ : Action_data( parent_P, name_P, comment_P, NULL,
+ new Condition_list( "", this ), NULL, enabled_P )
+ {
+ }
+
+template< typename T, typename A >
+inline
+Simple_action_data< T, A >::Simple_action_data( KConfig& cfg_P, Action_data_group* parent_P )
+ : Action_data( cfg_P, parent_P )
+ { // CHECKME nothing ?
+ }
+
+template< typename T, typename A >
+void Simple_action_data< T, A >::set_action( A* action_P )
+ {
+ Action_list* tmp = new Action_list( "Simple_action_data" );
+ tmp->append( action_P );
+ set_actions( tmp );
+ }
+
+template< typename T, typename A >
+void Simple_action_data< T, A >::set_trigger( T* trigger_P )
+ {
+ Trigger_list* tmp = new Trigger_list( "Simple_action" );
+ tmp->append( trigger_P );
+ set_triggers( tmp );
+ }
+
+template< typename T, typename A >
+const A* Simple_action_data< T, A >::action() const
+ {
+ if( actions() == NULL || actions()->count() == 0 ) // CHECKME tohle poradne zkontrolovat
+ return NULL;
+ return static_cast< A* >( const_cast< Action_list* >( actions())->first());
+ }
+
+template< typename T, typename A >
+const T* Simple_action_data< T, A >::trigger() const
+ {
+ if( triggers() == NULL || triggers()->count() == 0 ) // CHECKME tohle poradne zkontrolovat
+ return NULL;
+ return static_cast< T* >( const_cast< Trigger_list* >( triggers())->first());
+ }
+
+// Command_url_action_data
+
+inline
+Command_url_shortcut_action_data::Command_url_shortcut_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P, bool enabled_P )
+ : Simple_action_data< Shortcut_trigger, Command_url_action >( parent_P, name_P,
+ comment_P, enabled_P )
+ {
+ }
+
+inline
+Command_url_shortcut_action_data::Command_url_shortcut_action_data( KConfig& cfg_P,
+ Action_data_group* parent_P )
+ : Simple_action_data< Shortcut_trigger, Command_url_action >( cfg_P, parent_P )
+ {
+ }
+
+// Menuentry_action_data
+
+inline
+Menuentry_shortcut_action_data::Menuentry_shortcut_action_data( Action_data_group* parent_P,
+ const QString& name_P, const QString& comment_P, bool enabled_P )
+ : Simple_action_data< Shortcut_trigger, Menuentry_action >( parent_P, name_P,
+ comment_P, enabled_P )
+ {
+ }
+
+inline
+Menuentry_shortcut_action_data::Menuentry_shortcut_action_data( KConfig& cfg_P,
+ Action_data_group* parent_P )
+ : Simple_action_data< Shortcut_trigger, Menuentry_action >( cfg_P, parent_P )
+ {
+ }
+
+// Keyboard_input_gesture_action_data
+
+inline
+Keyboard_input_gesture_action_data::Keyboard_input_gesture_action_data(
+ Action_data_group* parent_P, const QString& name_P, const QString& comment_P, bool enabled_P )
+ : Action_data( parent_P, name_P, comment_P, NULL,
+ new Condition_list( "", this ), NULL, enabled_P )
+ {
+ }
+
+inline
+Keyboard_input_gesture_action_data::Keyboard_input_gesture_action_data( KConfig& cfg_P,
+ Action_data_group* parent_P )
+ : Action_data( cfg_P, parent_P )
+ { // CHECKME nothing ?
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/actions.cpp b/khotkeys/shared/actions.cpp
new file mode 100644
index 000000000..144a277af
--- /dev/null
+++ b/khotkeys/shared/actions.cpp
@@ -0,0 +1,450 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _ACTIONS_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "actions.h"
+
+#include <krun.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kurifilter.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <kdesktopfile.h>
+#include <klocale.h>
+#include <kaccel.h>
+#include <kservice.h>
+#include <kprocess.h>
+
+#include "windows.h"
+#include "action_data.h"
+
+#include <X11/X.h>
+
+namespace KHotKeys
+{
+
+// Action
+
+Action* Action::create_cfg_read( KConfig& cfg_P, Action_data* data_P )
+ {
+ QString type = cfg_P.readEntry( "Type" );
+ if( type == "COMMAND_URL" )
+ return new Command_url_action( cfg_P, data_P );
+ if( type == "MENUENTRY" )
+ return new Menuentry_action( cfg_P, data_P );
+ if( type == "DCOP" )
+ return new Dcop_action( cfg_P, data_P );
+ if( type == "KEYBOARD_INPUT" )
+ return new Keyboard_input_action( cfg_P, data_P );
+ if( type == "ACTIVATE_WINDOW" )
+ return new Activate_window_action( cfg_P, data_P );
+ kdWarning( 1217 ) << "Unknown Action type read from cfg file\n";
+ return NULL;
+ }
+
+void Action::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Type", "ERROR" ); // derived classes should call with their type
+ }
+
+// Action_list
+
+Action_list::Action_list( KConfig& cfg_P, Action_data* data_P )
+ : QPtrList< Action >()
+ {
+ setAutoDelete( true );
+ QString save_cfg_group = cfg_P.group();
+ int cnt = cfg_P.readNumEntry( "ActionsCount", 0 );
+ for( int i = 0;
+ i < cnt;
+ ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ Action* action = Action::create_cfg_read( cfg_P, data_P );
+ if( action )
+ append( action );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+void Action_list::cfg_write( KConfig& cfg_P ) const
+ {
+ QString save_cfg_group = cfg_P.group();
+ int i = 0;
+ for( Iterator it( *this );
+ it;
+ ++it, ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ it.current()->cfg_write( cfg_P );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "ActionsCount", i );
+ }
+
+// Command_url_action
+
+Command_url_action::Command_url_action( KConfig& cfg_P, Action_data* data_P )
+ : Action( cfg_P, data_P )
+ {
+ _command_url = cfg_P.readEntry( "CommandURL" );
+ }
+
+void Command_url_action::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "CommandURL", command_url());
+ cfg_P.writeEntry( "Type", "COMMAND_URL" ); // overwrites value set in base::cfg_write()
+ }
+
+void Command_url_action::execute()
+ {
+ if( command_url().isEmpty())
+ return;
+ KURIFilterData uri;
+ QString cmd = command_url();
+ static bool sm_ready = false;
+ if( !sm_ready )
+ {
+ kapp->propagateSessionManager();
+ sm_ready = true;
+ }
+// int space_pos = command_url().find( ' ' );
+// if( command_url()[ 0 ] != '\'' && command_url()[ 0 ] != '"' && space_pos > -1
+// && command_url()[ space_pos - 1 ] != '\\' )
+// cmd = command_url().left( space_pos ); // get first 'word'
+ uri.setData( cmd );
+ KURIFilter::self()->filterURI( uri );
+ if( uri.uri().isLocalFile() && !uri.uri().hasRef() )
+ cmd = uri.uri().path();
+ else
+ cmd = uri.uri().url();
+ switch( uri.uriType())
+ {
+ case KURIFilterData::LOCAL_FILE:
+ case KURIFilterData::LOCAL_DIR:
+ case KURIFilterData::NET_PROTOCOL:
+ case KURIFilterData::HELP:
+ {
+ ( void ) new KRun( uri.uri());
+ break;
+ }
+ case KURIFilterData::EXECUTABLE:
+ {
+ if (!kapp->authorize("shell_access"))
+ return;
+ if( !uri.hasArgsAndOptions())
+ {
+ KService::Ptr service = KService::serviceByDesktopName( cmd );
+ if( service != NULL )
+ {
+ KRun::run( *service, KURL::List());
+ break;
+ }
+ }
+ // fall though
+ }
+ case KURIFilterData::SHELL:
+ {
+ if (!kapp->authorize("shell_access"))
+ return;
+ if( !KRun::runCommand(
+ cmd + ( uri.hasArgsAndOptions() ? uri.argsAndOptions() : "" ),
+ cmd, uri.iconName())) {
+ // CHECKME ?
+ }
+ break;
+ }
+ default: // error
+ return;
+ }
+ timeout.start( 1000, true ); // 1sec timeout
+ }
+
+QString Command_url_action::description() const
+ {
+ return i18n( "Command/URL : " ) + command_url();
+ }
+
+Action* Command_url_action::copy( Action_data* data_P ) const
+ {
+ return new Command_url_action( data_P, command_url());
+ }
+
+// Menuentry_action
+
+void Menuentry_action::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "MENUENTRY" ); // overwrites value set in base::cfg_write()
+ }
+
+KService::Ptr Menuentry_action::service() const
+ {
+ if (!_service)
+ {
+ const_cast<Menuentry_action *>(this)->_service = KService::serviceByStorageId(command_url());
+ }
+ return _service;
+ }
+
+void Menuentry_action::execute()
+ {
+ (void) service();
+ if (!_service)
+ return;
+ KRun::run( *_service, KURL::List());
+ timeout.start( 1000, true ); // 1sec timeout
+ }
+
+QString Menuentry_action::description() const
+ {
+ (void) service();
+ return i18n( "Menuentry : " ) + (_service ? _service->name() : QString::null);
+ }
+
+Action* Menuentry_action::copy( Action_data* data_P ) const
+ {
+ return new Menuentry_action( data_P, command_url());
+ }
+
+// Dcop_action
+
+Dcop_action::Dcop_action( KConfig& cfg_P, Action_data* data_P )
+ : Action( cfg_P, data_P )
+ {
+ app = cfg_P.readEntry( "RemoteApp" );
+ obj = cfg_P.readEntry( "RemoteObj" );
+ call = cfg_P.readEntry( "Call" );
+ args = cfg_P.readEntry( "Arguments" );
+ }
+
+void Dcop_action::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "DCOP" ); // overwrites value set in base::cfg_write()
+ cfg_P.writeEntry( "RemoteApp", app );
+ cfg_P.writeEntry( "RemoteObj", obj );
+ cfg_P.writeEntry( "Call", call );
+ cfg_P.writeEntry( "Arguments", args );
+ }
+
+void Dcop_action::execute()
+ {
+ if( app.isEmpty() || obj.isEmpty() || call.isEmpty())
+ return;
+ QStringList args_list;
+ QString args_str = args;
+ while( !args_str.isEmpty())
+ {
+ unsigned int pos = 0;
+ while( args_str[ pos ] == ' ' )
+ ++pos;
+ if( args_str[ pos ] == '\"' || args_str[ pos ] == '\'' )
+ {
+ QString val = "";
+ QChar sep = args_str[ pos ];
+ bool skip = false;
+ ++pos;
+ for(;
+ pos < args_str.length();
+ ++pos )
+ {
+ if( args_str[ pos ] == '\\' )
+ {
+ skip = true;
+ continue;
+ }
+ if( !skip && args_str[ pos ] == sep )
+ break;
+ skip = false;
+ val += args_str[ pos ];
+ }
+ if( pos >= args_str.length())
+ return;
+ ++pos;
+ args_str = args_str.mid( pos );
+ args_list.append( val );
+ }
+ else
+ {
+ // one word
+ if( pos != 0 )
+ args_str = args_str.mid( pos );
+ int nxt_pos = args_str.find( ' ' );
+ args_list.append( args_str.left( nxt_pos )); // should be ok if nxt_pos is -1
+ args_str = nxt_pos >= 0 ? args_str.mid( nxt_pos ) : "";
+ }
+ }
+ kdDebug( 1217 ) << "DCOP call:" << app << ":" << obj << ":" << call << ":" << args_list << endl;
+ KProcess proc;
+ proc << "dcop" << app << obj << call << args_list;
+ proc.start( KProcess::DontCare );
+ }
+
+QString Dcop_action::description() const
+ {
+ return i18n( "DCOP : " ) + remote_application() + "::" + remote_object() + "::"
+ + called_function();
+ }
+
+Action* Dcop_action::copy( Action_data* data_P ) const
+ {
+ return new Dcop_action( data_P, remote_application(), remote_object(),
+ called_function(), arguments());
+ }
+
+// Keyboard_input_action
+
+Keyboard_input_action::Keyboard_input_action( KConfig& cfg_P, Action_data* data_P )
+ : Action( cfg_P, data_P )
+ {
+ _input = cfg_P.readEntry( "Input" );
+ if( cfg_P.readBoolEntry( "IsDestinationWindow" ))
+ {
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "DestinationWindow" );
+ _dest_window = new Windowdef_list( cfg_P );
+ _active_window = false; // ignored with _dest_window set anyway
+ cfg_P.setGroup( save_cfg_group );
+ }
+ else
+ {
+ _dest_window = NULL;
+ _active_window = cfg_P.readBoolEntry( "ActiveWindow" );
+ }
+ }
+
+Keyboard_input_action::~Keyboard_input_action()
+ {
+ delete _dest_window;
+ }
+
+void Keyboard_input_action::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "KEYBOARD_INPUT" ); // overwrites value set in base::cfg_write()
+ cfg_P.writeEntry( "Input", input());
+ if( dest_window() != NULL )
+ {
+ cfg_P.writeEntry( "IsDestinationWindow", true );
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "DestinationWindow" );
+ dest_window()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+ else
+ cfg_P.writeEntry( "IsDestinationWindow", false );
+ cfg_P.writeEntry( "ActiveWindow", _active_window );
+ }
+
+void Keyboard_input_action::execute()
+ {
+ if( input().isEmpty())
+ return;
+ Window w = InputFocus;
+ if( dest_window() != NULL )
+ {
+ w = windows_handler->find_window( dest_window());
+ if( w == None )
+ w = InputFocus;
+ }
+ else
+ {
+ if( !_active_window )
+ w = windows_handler->action_window();
+ if( w == None )
+ w = InputFocus;
+ }
+ int last_index = -1, start = 0;
+ while(( last_index = input().find( ':', last_index + 1 )) != -1 ) // find next ';'
+ {
+ QString key = input().mid( start, last_index - start ).stripWhiteSpace();
+ if( key == "Enter" && KKey( key ).keyCodeQt() == 0 )
+ key = "Return"; // CHECKE hack
+ keyboard_handler->send_macro_key( KKey( key ), w );
+ start = last_index + 1;
+ }
+ // and the last one
+ QString key = input().mid( start, input().length()).stripWhiteSpace();
+ if( key == "Enter" && KKey( key ).keyCodeQt() == 0 )
+ key = "Return";
+ keyboard_handler->send_macro_key( KKey( key ), w ); // the rest
+ XFlush( qt_xdisplay());
+ }
+
+QString Keyboard_input_action::description() const
+ {
+ QString tmp = input();
+ tmp.replace( '\n', ' ' );
+ tmp.truncate( 30 );
+ return i18n( "Keyboard input : " ) + tmp;
+ }
+
+Action* Keyboard_input_action::copy( Action_data* data_P ) const
+ {
+ return new Keyboard_input_action( data_P, input(),
+ dest_window() ? dest_window()->copy() : NULL, _active_window );
+ }
+
+// Activate_window_action
+
+Activate_window_action::Activate_window_action( KConfig& cfg_P, Action_data* data_P )
+ : Action( cfg_P, data_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Window" );
+ _window = new Windowdef_list( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+Activate_window_action::~Activate_window_action()
+ {
+ delete _window;
+ }
+
+void Activate_window_action::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "ACTIVATE_WINDOW" ); // overwrites value set in base::cfg_write()
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Window" );
+ window()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+void Activate_window_action::execute()
+ {
+ if( window()->match( windows_handler->active_window()))
+ return; // is already active
+ WId win_id = windows_handler->find_window( window());
+ if( win_id != None )
+ windows_handler->activate_window( win_id );
+ }
+
+QString Activate_window_action::description() const
+ {
+ return i18n( "Activate window : " ) + window()->comment();
+ }
+
+Action* Activate_window_action::copy( Action_data* data_P ) const
+ {
+ return new Activate_window_action( data_P, window()->copy());
+ }
+
+} // namespace KHotKeys
diff --git a/khotkeys/shared/actions.h b/khotkeys/shared/actions.h
new file mode 100644
index 000000000..5295d5be9
--- /dev/null
+++ b/khotkeys/shared/actions.h
@@ -0,0 +1,305 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _ACTIONS_H_
+#define _ACTIONS_H_
+
+
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qtimer.h>
+
+#include <kservice.h>
+
+class KConfig;
+
+#include "khotkeysglobal.h"
+
+namespace KHotKeys
+{
+
+class Action_data;
+class Windowdef_list;
+
+// this one is a base for all "real" resulting actions, e.g. running a command,
+// Action_data instances usually contain at least one Action
+class KDE_EXPORT Action
+ {
+ public:
+ Action( Action_data* data_P );
+ Action( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Action();
+ virtual void execute() = 0;
+ virtual QString description() const = 0;
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual Action* copy( Action_data* data_P ) const = 0;
+ static Action* create_cfg_read( KConfig& cfg_P, Action_data* data_P );
+ protected:
+ Action_data* const data;
+ KHOTKEYS_DISABLE_COPY( Action );
+ };
+
+class KDE_EXPORT Action_list
+ : public QPtrList< Action >
+ {
+ public:
+ Action_list( const QString& comment_P ); // CHECKME nebo i data ?
+ Action_list( KConfig& cfg_P, Action_data* data_P );
+ void cfg_write( KConfig& cfg_P ) const;
+ typedef QPtrListIterator< Action > Iterator;
+ const QString& comment() const;
+ private:
+ QString _comment;
+ KHOTKEYS_DISABLE_COPY( Action_list );
+ };
+
+class KDE_EXPORT Command_url_action
+ : public Action
+ {
+ typedef Action base;
+ public:
+ Command_url_action( Action_data* data_P, const QString& command_url_P );
+ Command_url_action( KConfig& cfg_P, Action_data* data_P );
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual void execute();
+ virtual QString description() const;
+ const QString& command_url() const;
+ virtual Action* copy( Action_data* data_P ) const;
+ protected:
+ QTimer timeout;
+ private:
+ QString _command_url;
+ };
+
+class KDE_EXPORT Menuentry_action
+ : public Command_url_action
+ {
+ typedef Command_url_action base;
+ public:
+ Menuentry_action( Action_data* data_P, const QString& menuentry_P );
+ Menuentry_action( KConfig& cfg_P, Action_data* data_P );
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual void execute();
+ virtual QString description() const;
+ virtual Action* copy( Action_data* data_P ) const;
+ KService::Ptr service() const;
+ private:
+ KService::Ptr _service;
+ };
+
+class KDE_EXPORT Dcop_action
+ : public Action
+ {
+ typedef Action base;
+ public:
+ Dcop_action( Action_data* data_P, const QString& app_P, const QString& obj_P,
+ const QString& call_P, const QString& args_P );
+ Dcop_action( KConfig& cfg_P, Action_data* data_P );
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual void execute();
+ const QString& remote_application() const;
+ const QString& remote_object() const;
+ const QString& called_function() const;
+ const QString& arguments() const;
+ virtual QString description() const;
+ virtual Action* copy( Action_data* data_P ) const;
+ private:
+ QString app; // CHECKME QCString ?
+ QString obj;
+ QString call;
+ QString args;
+ };
+
+class KDE_EXPORT Keyboard_input_action
+ : public Action
+ {
+ typedef Action base;
+ public:
+ Keyboard_input_action( Action_data* data_P, const QString& input_P,
+ const Windowdef_list* dest_window_P, bool active_window_P );
+ Keyboard_input_action( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Keyboard_input_action();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual void execute();
+ const QString& input() const;
+ // send to specific window: dest_window != NULL
+ // send to active window: dest_window == NULL && activeWindow() == true
+ // send to action window: dest_window == NULL && activeWindow() == false
+ const Windowdef_list* dest_window() const;
+ bool activeWindow() const;
+ virtual QString description() const;
+ virtual Action* copy( Action_data* data_P ) const;
+ private:
+ QString _input;
+ const Windowdef_list* _dest_window;
+ bool _active_window;
+ };
+
+class KDE_EXPORT Activate_window_action
+ : public Action
+ {
+ typedef Action base;
+ public:
+ Activate_window_action( Action_data* data_P, const Windowdef_list* window_P );
+ Activate_window_action( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Activate_window_action();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual void execute();
+ const Windowdef_list* window() const;
+ virtual QString description() const;
+ virtual Action* copy( Action_data* data_P ) const;
+ private:
+ const Windowdef_list* _window;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Action
+
+inline
+Action::Action( Action_data* data_P )
+ : data( data_P )
+ {
+ }
+
+inline
+Action::Action( KConfig&, Action_data* data_P )
+ : data( data_P )
+ {
+ }
+
+inline
+Action::~Action()
+ {
+ }
+
+// Action_list
+
+inline
+Action_list::Action_list( const QString& comment_P )
+ : QPtrList< Action >(), _comment( comment_P )
+ {
+ setAutoDelete( true );
+ }
+
+inline
+const QString& Action_list::comment() const
+ {
+ return _comment;
+ }
+
+// Command_url_action
+
+inline
+Command_url_action::Command_url_action( Action_data* data_P, const QString& command_url_P )
+ : Action( data_P ), _command_url( command_url_P )
+ {
+ }
+
+inline
+const QString& Command_url_action::command_url() const
+ {
+ return _command_url;
+ }
+
+// Menuentry_action
+
+inline
+Menuentry_action::Menuentry_action( Action_data* data_P, const QString& menuentry_P )
+ : Command_url_action( data_P, menuentry_P )
+ {
+ }
+
+inline
+Menuentry_action::Menuentry_action( KConfig& cfg_P, Action_data* data_P )
+ : Command_url_action( cfg_P, data_P )
+ {
+ }
+
+// DCOP_action
+
+inline
+Dcop_action::Dcop_action( Action_data* data_P, const QString& app_P, const QString& obj_P,
+ const QString& call_P, const QString& args_P )
+ : Action( data_P ), app( app_P ), obj( obj_P ), call( call_P ), args( args_P )
+ {
+ }
+
+inline
+const QString& Dcop_action::remote_application() const
+ {
+ return app;
+ }
+
+inline
+const QString& Dcop_action::remote_object() const
+ {
+ return obj;
+ }
+
+inline
+const QString& Dcop_action::called_function() const
+ {
+ return call;
+ }
+
+inline
+const QString& Dcop_action::arguments() const
+ {
+ return args;
+ }
+
+// Keyboard_input_action
+
+inline
+Keyboard_input_action::Keyboard_input_action( Action_data* data_P, const QString& input_P,
+ const Windowdef_list* dest_window_P, bool active_window_P )
+ : Action( data_P ), _input( input_P ), _dest_window( dest_window_P ), _active_window( active_window_P )
+ {
+ }
+
+inline
+const QString& Keyboard_input_action::input() const
+ {
+ return _input;
+ }
+
+inline
+const Windowdef_list* Keyboard_input_action::dest_window() const
+ {
+ return _dest_window;
+ }
+
+inline
+bool Keyboard_input_action::activeWindow() const
+ {
+ return _active_window;
+ }
+
+// Activate_window_action
+
+inline
+Activate_window_action::Activate_window_action( Action_data* data_P,
+ const Windowdef_list* window_P )
+ : Action( data_P ), _window( window_P )
+ {
+ }
+
+inline
+const Windowdef_list* Activate_window_action::window() const
+ {
+ return _window;
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/conditions.cpp b/khotkeys/shared/conditions.cpp
new file mode 100644
index 000000000..01d236934
--- /dev/null
+++ b/khotkeys/shared/conditions.cpp
@@ -0,0 +1,504 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _CONDITIONS_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "conditions.h"
+
+#ifdef KHOTKEYS_DEBUG
+#include <typeinfo>
+#endif
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <assert.h>
+
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+
+#include "action_data.h"
+
+namespace KHotKeys
+{
+
+// Condition
+
+Condition::Condition( Condition_list_base* parent_P )
+ : _parent( parent_P )
+ {
+ if( _parent )
+ _parent->append( this );
+ }
+
+Condition::Condition( KConfig&, Condition_list_base* parent_P )
+ : _parent( parent_P )
+ {
+ if( _parent )
+ _parent->append( this );
+ }
+
+Condition* Condition::create_cfg_read( KConfig& cfg_P, Condition_list_base* parent_P )
+ {
+ QString type = cfg_P.readEntry( "Type" );
+ if( type == "ACTIVE_WINDOW" )
+ return new Active_window_condition( cfg_P, parent_P );
+ if( type == "EXISTING_WINDOW" )
+ return new Existing_window_condition( cfg_P, parent_P );
+ if( type == "NOT" )
+ return new Not_condition( cfg_P, parent_P );
+ if( type == "AND" )
+ return new And_condition( cfg_P, parent_P );
+ if( type == "OR" )
+ return new Or_condition( cfg_P, parent_P );
+ kdWarning( 1217 ) << "Unknown Condition type read from cfg file\n";
+ return NULL;
+ }
+
+Condition::~Condition()
+ {
+ if( _parent )
+ _parent->remove( this );
+ }
+
+
+void Condition::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Type", "ERROR" );
+ }
+
+void Condition::updated() const
+ {
+ if( !khotkeys_active())
+ return;
+ assert( _parent != NULL );
+ _parent->updated();
+ }
+
+#ifdef KHOTKEYS_DEBUG
+void Condition::debug( int depth_P )
+ {
+ char tmp[ 1024 ];
+ int i;
+ for( i = 0;
+ i < depth_P;
+ ++i )
+ tmp[ i ] = ' ';
+ tmp[ i ] = '\0';
+ kdDebug( 1217 ) << tmp << description() << ":(" << this << ")" << endl;
+ }
+
+void Condition::debug_list( const QPtrList< Condition >& list_P, int depth_P )
+ {
+ char tmp[ 1024 ];
+ int i;
+ for( i = 0;
+ i < depth_P;
+ ++i )
+ tmp[ i ] = ' ';
+ tmp[ i ] = '\0';
+ for( QPtrListIterator< Condition > it( list_P );
+ it;
+ ++it )
+ (*it)->debug( depth_P + 1 );
+ }
+#endif
+
+
+// Condition_list_base
+
+Condition_list_base::Condition_list_base( KConfig& cfg_P, Condition_list_base* parent_P )
+ : Condition( parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ int cnt = cfg_P.readNumEntry( "ConditionsCount", 0 );
+ for( int i = 0;
+ i < cnt;
+ ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ (void) Condition::create_cfg_read( cfg_P, this );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+Condition_list_base::~Condition_list_base()
+ {
+ while( !isEmpty())
+ {
+ Condition* c = getFirst();
+ remove( c );
+ delete c;
+ }
+ }
+
+void Condition_list_base::cfg_write( KConfig& cfg_P ) const
+ {
+ QString save_cfg_group = cfg_P.group();
+ int i = 0;
+ for( Iterator it( *this );
+ it;
+ ++it, ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ it.current()->cfg_write( cfg_P );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "ConditionsCount", i );
+ }
+
+bool Condition_list_base::accepts_children() const
+ {
+ return true;
+ }
+
+#ifdef KHOTKEYS_DEBUG
+void Condition_list_base::debug( int depth_P )
+ {
+ char tmp[ 1024 ];
+ int i;
+ for( i = 0;
+ i < depth_P;
+ ++i )
+ tmp[ i ] = ' ';
+ tmp[ i ] = '\0';
+ kdDebug( 1217 ) << tmp << typeid( *this ).name() << ":(" << this << ")" << endl;
+ debug_list( *this, depth_P + 1 );
+ }
+#endif
+
+// Condition_list
+
+Condition_list::Condition_list( KConfig& cfg_P, Action_data_base* data_P )
+ : Condition_list_base( cfg_P, NULL ), data( data_P )
+ {
+ _comment = cfg_P.readEntry( "Comment" );
+ }
+
+void Condition_list::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Comment", comment());
+ }
+
+Condition_list* Condition_list::copy( Action_data_base* data_P ) const
+ {
+ Condition_list* ret = new Condition_list( comment(), data_P );
+ for( Iterator it( *this );
+ it;
+ ++it )
+ ret->append( it.current()->copy( ret ));
+ return ret;
+ }
+
+
+bool Condition_list::match() const
+ {
+ if( count() == 0 ) // no conditions to match => ok
+ return true;
+ for( Iterator it( *this );
+ it;
+ ++it )
+ if( it.current()->match()) // OR
+ return true;
+ return false;
+ }
+
+void Condition_list::updated() const
+ {
+ if( !khotkeys_active())
+ return;
+ data->update_triggers();
+// base::updated(); no need to, doesn't have parent
+ }
+
+// CHECKME tohle je drobet hack, jeste to zvazit
+void Condition_list::set_data( Action_data_base* data_P )
+ {
+ assert( data == NULL || data == data_P );
+ data = data_P;
+ }
+
+const QString Condition_list::description() const
+ {
+ assert( false );
+ return QString::null;
+ }
+
+Condition_list* Condition_list::copy( Condition_list_base* ) const
+ {
+ assert( false );
+ return NULL;
+ }
+
+// Active_window_condition
+
+Active_window_condition::Active_window_condition( KConfig& cfg_P, Condition_list_base* parent_P )
+ : Condition( cfg_P, parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Window" );
+ _window = new Windowdef_list( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ init();
+ set_match();
+ }
+
+void Active_window_condition::init()
+ {
+ connect( windows_handler, SIGNAL( active_window_changed( WId )),
+ this, SLOT( active_window_changed( WId )));
+ }
+
+bool Active_window_condition::match() const
+ {
+ return is_match;
+ }
+
+void Active_window_condition::set_match()
+ {
+ is_match = window()->match( Window_data( windows_handler->active_window()));
+ kdDebug( 1217 ) << "Active_window_condition::set_match :" << is_match << endl;
+ updated();
+ }
+
+void Active_window_condition::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Window" );
+ window()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "Type", "ACTIVE_WINDOW" ); // overwrites value set in base::cfg_write()
+ }
+
+#ifndef COVARIANT_RETURN_BROKEN
+Active_window_condition* Active_window_condition::copy( Condition_list_base* parent_P ) const
+#else
+Condition* Active_window_condition::copy( Condition_list_base* parent_P ) const
+#endif
+ {
+ return new Active_window_condition( window()->copy(), parent_P );
+ }
+
+const QString Active_window_condition::description() const
+ {
+ return i18n( "Active window: " ) + window()->comment();
+ }
+
+void Active_window_condition::active_window_changed( WId )
+ {
+ set_match();
+ }
+
+Active_window_condition::~Active_window_condition()
+ {
+ disconnect( windows_handler, NULL, this, NULL );
+ delete _window;
+ }
+
+// Existing_window_condition
+
+Existing_window_condition::Existing_window_condition( KConfig& cfg_P, Condition_list_base* parent_P )
+ : Condition( cfg_P, parent_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Window" );
+ _window = new Windowdef_list( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ init();
+ set_match();
+ }
+
+void Existing_window_condition::init()
+ {
+ connect( windows_handler, SIGNAL( window_added( WId )), this, SLOT( window_added( WId )));
+ connect( windows_handler, SIGNAL( window_removed( WId )), this, SLOT( window_removed( WId )));
+ }
+
+bool Existing_window_condition::match() const
+ {
+ return is_match;
+ }
+
+void Existing_window_condition::set_match( WId w_P )
+ {
+ if( w_P != None && !is_match )
+ is_match = window()->match( Window_data( w_P ));
+ else
+ is_match = windows_handler->find_window( window()) != None;
+ kdDebug( 1217 ) << "Existing_window_condition::set_match :" << is_match << endl;
+ updated();
+ }
+
+void Existing_window_condition::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Window" );
+ window()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "Type", "EXISTING_WINDOW" ); // overwrites value set in base::cfg_write()
+ }
+
+#ifndef COVARIANT_RETURN_BROKEN
+Existing_window_condition* Existing_window_condition::copy( Condition_list_base* parent_P ) const
+#else
+Condition* Existing_window_condition::copy( Condition_list_base* parent_P ) const
+#endif
+ {
+ return new Existing_window_condition( window()->copy(), parent_P );
+ }
+
+const QString Existing_window_condition::description() const
+ {
+ return i18n( "Existing window: " ) + window()->comment();
+ }
+
+void Existing_window_condition::window_added( WId w_P )
+ {
+ set_match( w_P );
+ }
+
+void Existing_window_condition::window_removed( WId )
+ {
+ set_match();
+ }
+
+Existing_window_condition::~Existing_window_condition()
+ {
+ disconnect( windows_handler, NULL, this, NULL );
+ delete _window;
+ }
+
+// Not_condition
+
+Not_condition::Not_condition( KConfig& cfg_P, Condition_list_base* parent_P )
+ : Condition_list_base( cfg_P, parent_P )
+ {
+ // CHECKME kontrola poctu ?
+ }
+
+bool Not_condition::match() const
+ {
+ return condition() ? !condition()->match() : false;
+ }
+
+void Not_condition::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "NOT" ); // overwrites value set in base::cfg_write()
+ }
+
+Not_condition* Not_condition::copy( Condition_list_base* parent_P ) const
+ {
+ Not_condition* ret = new Not_condition( parent_P );
+ if( condition())
+ ret->append( condition()->copy( ret ));
+ return ret;
+ }
+
+const QString Not_condition::description() const
+ {
+ return i18n( "Not_condition", "Not" );
+ }
+
+bool Not_condition::accepts_children() const
+ {
+ return count() == 0;
+ }
+
+// And_condition
+
+And_condition::And_condition( KConfig& cfg_P, Condition_list_base* parent_P )
+ : Condition_list_base( cfg_P, parent_P )
+ {
+ // CHECKME kontrola poctu ?
+ }
+
+bool And_condition::match() const
+ {
+ for( Iterator it( *this );
+ it;
+ ++it )
+ if( !it.current()->match()) // AND
+ return false;
+ return true; // all true (or empty)
+ }
+
+void And_condition::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "AND" ); // overwrites value set in base::cfg_write()
+ }
+
+And_condition* And_condition::copy( Condition_list_base* parent_P ) const
+ {
+ And_condition* ret = new And_condition( parent_P );
+ for( Iterator it( *this );
+ it;
+ ++it )
+ ret->append( (*it)->copy( ret ));
+ return ret;
+ }
+
+const QString And_condition::description() const
+ {
+ return i18n( "And_condition", "And" );
+ }
+
+// Or_condition
+
+Or_condition::Or_condition( KConfig& cfg_P, Condition_list_base* parent_P )
+ : Condition_list_base( cfg_P, parent_P )
+ {
+ // CHECKME kontrola poctu ?
+ }
+
+bool Or_condition::match() const
+ {
+ if( count() == 0 ) // empty => ok
+ return true;
+ for( Iterator it( *this );
+ it;
+ ++it )
+ if( it.current()->match()) // OR
+ return true;
+ return false;
+ }
+
+void Or_condition::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Type", "OR" ); // overwrites value set in base::cfg_write()
+ }
+
+Or_condition* Or_condition::copy( Condition_list_base* parent_P ) const
+ {
+ Or_condition* ret = new Or_condition( parent_P );
+ for( Iterator it( *this );
+ it;
+ ++it )
+ ret->append( (*it)->copy( ret ));
+ return ret;
+ }
+
+const QString Or_condition::description() const
+ {
+ return i18n( "Or_condition", "Or" );
+ }
+
+} // namespace KHotKeys
+
+#include "conditions.moc"
diff --git a/khotkeys/shared/conditions.h b/khotkeys/shared/conditions.h
new file mode 100644
index 000000000..59133f4d3
--- /dev/null
+++ b/khotkeys/shared/conditions.h
@@ -0,0 +1,296 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _CONDITIONS_H_
+#define _CONDITIONS_H_
+
+#include <qobject.h>
+#include <qptrlist.h>
+#include <qstring.h>
+
+#include "khotkeysglobal.h"
+#include "windows.h"
+
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+
+class KConfig;
+
+namespace KHotKeys
+{
+
+class Action_data_base;
+class Action_data;
+class Condition_list_base;
+
+class KDE_EXPORT Condition
+ {
+ public:
+ Condition( Condition_list_base* parent_P );
+ Condition( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual ~Condition();
+ virtual bool match() const = 0;
+ virtual void updated() const; // called when the condition changes
+ virtual void cfg_write( KConfig& cfg_P ) const = 0;
+ virtual const QString description() const = 0;
+ virtual Condition* copy( Condition_list_base* parent_P ) const = 0;
+ const Condition_list_base* parent() const;
+ Condition_list_base* parent();
+ static Condition* create_cfg_read( KConfig& cfg_P, Condition_list_base* parent_P );
+ protected:
+ Condition_list_base* const _parent;
+ KHOTKEYS_DISABLE_COPY( Condition );
+ };
+
+class KDE_EXPORT Condition_list_base
+ : public Condition, public QPtrList< Condition > // inheritance ?
+ {
+ typedef Condition base;
+ public:
+ Condition_list_base( Condition_list_base* parent_P );
+ Condition_list_base( const QPtrList< Condition >& children_P,
+ Condition_list_base* parent_P );
+ Condition_list_base( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual ~Condition_list_base();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual bool accepts_children() const;
+ typedef QPtrListIterator< Condition > Iterator;
+ };
+
+class KDE_EXPORT Condition_list
+ : public Condition_list_base
+ {
+ typedef Condition_list_base base;
+ public:
+ Condition_list( const QString& comment_P, Action_data_base* data_P );
+ Condition_list( KConfig& cfg_P, Action_data_base* data_P );
+ void cfg_write( KConfig& cfg_P ) const;
+ Condition_list* copy( Action_data_base* data_P ) const;
+ virtual bool match() const;
+ const QString& comment() const;
+ void set_data( Action_data_base* data_P );
+ virtual void updated() const;
+ virtual Condition_list* copy( Condition_list_base* parent_P ) const;
+ virtual const QString description() const;
+ private:
+ QString _comment;
+ Action_data_base* data;
+ };
+
+class KDE_EXPORT Active_window_condition
+ : public QObject, public Condition
+ {
+ Q_OBJECT
+ typedef Condition base;
+ public:
+ Active_window_condition( Windowdef_list* window_P, Condition_list_base* parent_P );
+ Active_window_condition( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual ~Active_window_condition();
+ virtual bool match() const;
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ const Windowdef_list* window() const;
+#ifndef COVARIANT_RETURN_BROKEN
+ virtual Active_window_condition* copy( Condition_list_base* parent_P ) const;
+#else
+ virtual Condition* copy( Condition_list_base* parent_P ) const;
+#endif
+ virtual const QString description() const;
+ public slots:
+ void active_window_changed( WId );
+ private:
+ void init();
+ void set_match();
+ Windowdef_list* _window;
+ bool is_match;
+ };
+
+class KDE_EXPORT Existing_window_condition
+ : public QObject, public Condition
+ {
+ Q_OBJECT
+ typedef Condition base;
+ public:
+ Existing_window_condition( Windowdef_list* window_P, Condition_list_base* parent_P );
+ Existing_window_condition( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual ~Existing_window_condition();
+ virtual bool match() const;
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ const Windowdef_list* window() const;
+#ifndef COVARIANT_RETURN_BROKEN
+ virtual Existing_window_condition* copy( Condition_list_base* parent_P ) const;
+#else
+ virtual Condition* copy( Condition_list_base* parent_P ) const;
+#endif
+ virtual const QString description() const;
+ public slots:
+ void window_added( WId w_P );
+ void window_removed( WId w_P );
+ private:
+ void init();
+ void set_match( WId w_P = None );
+ Windowdef_list* _window;
+ bool is_match;
+ };
+
+class KDE_EXPORT Not_condition
+ : public Condition_list_base
+ {
+ typedef Condition_list_base base;
+ public:
+ Not_condition( Condition_list_base* parent_P );
+ Not_condition( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual bool match() const;
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual Not_condition* copy( Condition_list_base* parent_P ) const;
+ virtual const QString description() const;
+ const Condition* condition() const;
+ virtual bool accepts_children() const;
+ };
+
+class KDE_EXPORT And_condition
+ : public Condition_list_base
+ {
+ typedef Condition_list_base base;
+ public:
+ And_condition( Condition_list_base* parent_P );
+ And_condition( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual bool match() const;
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual And_condition* copy( Condition_list_base* parent_P ) const;
+ virtual const QString description() const;
+ };
+
+class KDE_EXPORT Or_condition
+ : public Condition_list_base
+ {
+ typedef Condition_list_base base;
+ public:
+ Or_condition( Condition_list_base* parent_P );
+ Or_condition( KConfig& cfg_P, Condition_list_base* parent_P );
+ virtual bool match() const;
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual Or_condition* copy( Condition_list_base* parent_P ) const;
+ virtual const QString description() const;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Condition
+
+inline
+const Condition_list_base* Condition::parent() const
+ {
+ return _parent;
+ }
+
+inline
+Condition_list_base* Condition::parent()
+ {
+ return _parent;
+ }
+
+// Condition_list_base
+
+inline
+Condition_list_base::Condition_list_base( Condition_list_base* parent_P )
+ : Condition( parent_P ), QPtrList< Condition >()
+ {
+ }
+
+inline
+Condition_list_base::Condition_list_base( const QPtrList< Condition >& children_P,
+ Condition_list_base* parent_P )
+ : Condition( parent_P ), QPtrList< Condition >( children_P )
+ {
+ }
+
+// Condition_list
+
+inline
+Condition_list::Condition_list( const QString& comment_P, Action_data_base* data_P )
+ : Condition_list_base( NULL ), _comment( comment_P ), data( data_P )
+ {
+ }
+
+inline
+const QString& Condition_list::comment() const
+ {
+ return _comment;
+ }
+
+// Active_window_condition
+
+inline
+Active_window_condition::Active_window_condition( Windowdef_list* window_P,
+ Condition_list_base* parent_P )
+ : Condition( parent_P ), _window( window_P )
+ {
+ init();
+ set_match();
+ }
+
+inline
+const Windowdef_list* Active_window_condition::window() const
+ {
+ return _window;
+ }
+
+// Existing_window_condition
+
+inline
+Existing_window_condition::Existing_window_condition( Windowdef_list* window_P,
+ Condition_list_base* parent_P )
+ : Condition( parent_P ), _window( window_P ), is_match( false )
+ {
+ init();
+ set_match();
+ }
+
+inline
+const Windowdef_list* Existing_window_condition::window() const
+ {
+ return _window;
+ }
+
+// Not_condition
+
+inline
+Not_condition::Not_condition( Condition_list_base* parent_P )
+ : Condition_list_base( parent_P )
+ {
+ }
+
+inline
+const Condition* Not_condition::condition() const
+ {
+ return getFirst();
+ }
+
+// And_condition
+
+inline
+And_condition::And_condition( Condition_list_base* parent_P )
+ : Condition_list_base( parent_P )
+ {
+ }
+
+// Or_condition
+
+inline
+Or_condition::Or_condition( Condition_list_base* parent_P )
+ : Condition_list_base( parent_P )
+ {
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/gestures.cpp b/khotkeys/shared/gestures.cpp
new file mode 100644
index 000000000..11cc44e22
--- /dev/null
+++ b/khotkeys/shared/gestures.cpp
@@ -0,0 +1,449 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+ Based on LibStroke :
+ ( libstroke - an X11 stroke interface library
+ Copyright (c) 1996,1997,1998,1999 Mark F. Willey, ETLA Technical
+ There is a reference application available on the LibStroke Home Page:
+ http://www.etla.net/~willey/projects/libstroke/ )
+
+****************************************************************************/
+
+#define _GESTURES_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gestures.h"
+
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+#include <X11/Xlib.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kxerrorhandler.h>
+#include <kkeynative.h>
+
+#include "input.h"
+#include "windows.h"
+
+#include "voices.h"
+
+namespace KHotKeys
+{
+
+Gesture* gesture_handler;
+
+Gesture::Gesture( bool /*enabled_P*/, QObject* parent_P )
+ : _enabled( false ), recording( false ), button( 0 ), exclude( NULL )
+ {
+ (void) new DeleteObject( this, parent_P );
+ assert( gesture_handler == NULL );
+ gesture_handler = this;
+ connect( &nostroke_timer, SIGNAL( timeout()), SLOT( stroke_timeout()));
+ connect( windows_handler, SIGNAL( active_window_changed( WId )),
+ SLOT( active_window_changed( WId )));
+ }
+
+Gesture::~Gesture()
+ {
+ enable( false );
+ gesture_handler = NULL;
+ }
+
+void Gesture::enable( bool enabled_P )
+ {
+ if( _enabled == enabled_P )
+ return;
+ _enabled = enabled_P;
+ assert( button != 0 );
+ update_grab();
+ }
+
+void Gesture::set_exclude( Windowdef_list* windows_P )
+ {
+ delete exclude;
+ // check for count() > 0 - empty exclude list means no window is excluded,
+ // but empty Windowdef_list matches everything
+ if( windows_P != NULL && windows_P->count() > 0 )
+ exclude = windows_P->copy();
+ else
+ exclude = NULL;
+ update_grab();
+ }
+
+void Gesture::update_grab()
+ {
+ if( _enabled && handlers.count() > 0
+ && ( exclude == NULL || !exclude->match( Window_data( windows_handler->active_window()))))
+ {
+ kapp->removeX11EventFilter( this ); // avoid being installed twice
+ kapp->installX11EventFilter( this );
+ // CHECKME at se grabuje jen kdyz je alespon jedno gesto?
+ grab_mouse( true );
+ }
+ else
+ {
+ grab_mouse( false );
+ kapp->removeX11EventFilter( this );
+ }
+ }
+
+void Gesture::active_window_changed( WId )
+ {
+ update_grab();
+ }
+
+void Gesture::register_handler( QObject* receiver_P, const char* slot_P )
+ {
+ if( handlers.contains( receiver_P ))
+ return;
+ handlers[ receiver_P ] = true;
+ connect( this, SIGNAL( handle_gesture( const QString&, WId )),
+ receiver_P, slot_P );
+ if( handlers.count() == 1 )
+ update_grab();
+ }
+
+void Gesture::unregister_handler( QObject* receiver_P, const char* slot_P )
+ {
+ if( !handlers.contains( receiver_P ))
+ return;
+ handlers.remove( receiver_P );
+ disconnect( this, SIGNAL( handle_gesture( const QString&, WId )),
+ receiver_P, slot_P );
+ if( handlers.count() == 0 )
+ update_grab();
+ }
+
+bool Gesture::x11Event( XEvent* ev_P )
+ {
+/* kdDebug(1217) << k_funcinfo << " ( type = " << ev_P->type << " )" << KeyRelease << " " << KeyPress <<endl;
+ if( ev_P->type == XKeyPress || ev_P->type == XKeyRelease )
+ {
+ return voice_handler->x11Event( ev_P );
+ }*/
+
+ if( ev_P->type == ButtonPress && ev_P->xbutton.button == button )
+ {
+ kdDebug( 1217 ) << "GESTURE: mouse press" << endl;
+ stroke.reset();
+ stroke.record( ev_P->xbutton.x, ev_P->xbutton.y );
+ nostroke_timer.start( timeout, true );
+ recording = true;
+ start_x = ev_P->xbutton.x_root;
+ start_y = ev_P->xbutton.y_root;
+ return true;
+ }
+ else if( ev_P->type == ButtonRelease && ev_P->xbutton.button == button
+ && recording )
+ {
+ recording = false;
+ nostroke_timer.stop();
+ stroke.record( ev_P->xbutton.x, ev_P->xbutton.y );
+ QString gesture( stroke.translate());
+ if( gesture.isEmpty())
+ {
+ kdDebug( 1217 ) << "GESTURE: replay" << endl;
+ XAllowEvents( qt_xdisplay(), AsyncPointer, CurrentTime );
+ XUngrabPointer( qt_xdisplay(), CurrentTime );
+ mouse_replay( true );
+ return true;
+ }
+ kdDebug( 1217 ) << "GESTURE: got: " << gesture << endl;
+ emit handle_gesture( gesture, windows_handler->window_at_position( start_x, start_y ));
+ return true;
+ }
+ else if( ev_P->type == MotionNotify && recording )
+ { // ignore small initial movement
+ if( nostroke_timer.isActive()
+ && abs( start_x - ev_P->xmotion.x_root ) < 10
+ && abs( start_y - ev_P->xmotion.y_root ) < 10 )
+ return true;
+ nostroke_timer.stop();
+ stroke.record( ev_P->xmotion.x, ev_P->xmotion.y );
+ }
+ return false;
+ }
+
+void Gesture::stroke_timeout()
+ {
+ kdDebug( 1217 ) << "GESTURE: timeout" << endl;
+ XAllowEvents( qt_xdisplay(), AsyncPointer, CurrentTime );
+ XUngrabPointer( qt_xdisplay(), CurrentTime );
+ mouse_replay( false );
+ recording = false;
+ }
+
+void Gesture::mouse_replay( bool release_P )
+ {
+ bool was_enabled = _enabled;
+ enable( false );
+ Mouse::send_mouse_button( button, release_P );
+ enable( was_enabled );
+ }
+
+void Gesture::grab_mouse( bool grab_P )
+ {
+ if( grab_P )
+ {
+ KXErrorHandler handler;
+ static int mask[] = { 0, Button1MotionMask, Button2MotionMask, Button3MotionMask,
+ Button4MotionMask, Button5MotionMask, ButtonMotionMask, ButtonMotionMask,
+ ButtonMotionMask, ButtonMotionMask };
+#define XCapL KKeyNative::modXLock()
+#define XNumL KKeyNative::modXNumLock()
+#define XScrL KKeyNative::modXScrollLock()
+ unsigned int mods[ 8 ] =
+ {
+ 0, XCapL, XNumL, XNumL | XCapL,
+ XScrL, XScrL | XCapL,
+ XScrL | XNumL, XScrL | XNumL | XCapL
+ };
+#undef XCapL
+#undef XNumL
+#undef XScrL
+ for( int i = 0;
+ i < 8;
+ ++i )
+ XGrabButton( qt_xdisplay(), button, mods[ i ], qt_xrootwin(), False,
+ ButtonPressMask | ButtonReleaseMask | mask[ button ], GrabModeAsync, GrabModeAsync,
+ None, None );
+ bool err = handler.error( true );
+ kdDebug( 1217 ) << "Gesture grab:" << err << endl;
+ }
+ else
+ {
+ kdDebug( 1217 ) << "Gesture ungrab" << endl;
+ XUngrabButton( qt_xdisplay(), button, AnyModifier, qt_xrootwin());
+ }
+ }
+
+void Gesture::set_mouse_button( unsigned int button_P )
+ {
+ if( button == button_P )
+ return;
+ if( !_enabled )
+ {
+ button = button_P;
+ return;
+ }
+ grab_mouse( false );
+ button = button_P;
+ grab_mouse( true );
+ }
+
+void Gesture::set_timeout( int timeout_P )
+ {
+ timeout = timeout_P;
+ }
+
+Stroke::Stroke()
+ {
+ reset();
+ points = new point[ MAX_POINTS ]; // CHECKME
+ }
+
+Stroke::~Stroke()
+ {
+ delete[] points;
+ }
+
+void Stroke::reset()
+ {
+ min_x = 10000;
+ min_y = 10000;
+ max_x = -1;
+ max_y = -1;
+ point_count = -1;
+ }
+
+bool Stroke::record( int x, int y )
+ {
+ if( point_count >= MAX_POINTS )
+ return false;
+ if( point_count == -1 )
+ {
+ ++point_count;
+ points[ point_count ].x = x;
+ points[ point_count ].y = y;
+ min_x = max_x = x;
+ min_y = max_y = y;
+ }
+ else
+ {
+ // interpolate between last and current point
+ int delx = x - points[ point_count ].x;
+ int dely = y - points[ point_count ].y;
+ if( abs( delx ) > abs( dely )) // step by the greatest delta direction
+ {
+ float iy = points[ point_count ].y;
+ // go from the last point to the current, whatever direction it may be
+ for( int ix = points[ point_count ].x;
+ ( delx > 0 ) ? ( ix < x ) : ( ix > x );
+ ( delx > 0 ) ? ++ix : --ix )
+ {
+ // step the other axis by the correct increment
+ if( dely < 0 )
+ iy -= fabs( dely / ( float ) delx );
+ else
+ iy += fabs( dely / ( float ) delx );
+ // add the interpolated point
+ ++point_count;
+ if( point_count >= MAX_POINTS )
+ return false;
+ points[ point_count ].x = ix;
+ points[ point_count ].y = ( int )iy;
+ }
+ // add the last point
+ ++point_count;
+ if( point_count >= MAX_POINTS )
+ return false;
+ points[ point_count ].x = x;
+ points[ point_count ].y = y;
+ // update metrics, it's ok to do it only for the last point
+ if( x < min_x )
+ min_x = x;
+ if( x > max_x )
+ max_x = x;
+ if( y < min_y )
+ min_y = y;
+ if( y > max_y )
+ max_y = y;
+ }
+ else
+ { // same thing, but for dely larger than delx case...
+ float ix = points[ point_count ].x;
+ // go from the last point to the current, whatever direction it may be
+ for( int iy = points[ point_count ].y;
+ ( dely > 0 ) ? ( iy < y ) : ( iy > y );
+ ( dely > 0 ) ? ++iy : --iy )
+ {
+ // step the other axis by the correct increment
+ if( delx < 0 )
+ ix -= fabs( delx / ( float ) dely );
+ else
+ ix += fabs( delx / ( float ) dely );
+ // add the interpolated point
+ ++point_count;
+ if( point_count >= MAX_POINTS )
+ return false;
+ points[ point_count ].x = ( int )ix;
+ points[ point_count ].y = iy;
+ }
+ // add the last point
+ ++point_count;
+ if( point_count >= MAX_POINTS )
+ return false;
+ points[ point_count ].x = x;
+ points[ point_count ].y = y;
+ // update metrics, ts's ok to do it only for the last point
+ if( x < min_x )
+ min_x = x;
+ if( x > max_x )
+ max_x = x;
+ if( y < min_y )
+ min_y = y;
+ if( y > max_y )
+ max_y = y;
+ }
+ }
+ return true;
+ }
+
+char* Stroke::translate( int min_bin_points_percentage_P, int scale_ratio_P, int min_points_P )
+ {
+ if( point_count < min_points_P )
+ return NULL;
+ // determine size of grid
+ delta_x = max_x - min_x;
+ delta_y = max_y - min_y;
+ if( delta_x > scale_ratio_P * delta_y )
+ {
+ int avg_y = ( max_y + min_y ) / 2;
+ min_y = avg_y - delta_x / 2;
+ max_y = avg_y + delta_x / 2;
+ delta_y = max_y - min_y;
+ }
+ else if( delta_y > scale_ratio_P * delta_x )
+ {
+ int avg_x = ( max_x + min_x ) / 2;
+ min_x = avg_x - delta_y / 2;
+ max_x = avg_x + delta_y / 2;
+ delta_x = max_x - min_x;
+ }
+ // calculate bin boundary positions
+ bound_x_1 = min_x + delta_x / 3;
+ bound_x_2 = min_x + 2 * delta_x / 3;
+ bound_y_1 = min_y + delta_y / 3;
+ bound_y_2 = min_y + 2 * delta_y / 3;
+
+ int sequence_count = 0;
+ // points-->sequence translation scratch variables
+ int prev_bin = 0;
+ int current_bin = 0;
+ int bin_count = 0;
+// build string by placing points in bins, collapsing bins and discarding
+// those with too few points...
+ for( int pos = 0;
+ pos <= point_count;
+ ++pos )
+ {
+ // figure out which bin the point falls in
+ current_bin = bin( points[ pos ].x, points[ pos ].y );
+ // if this is the first point, consider it the previous bin, too.
+ if( prev_bin == 0 )
+ prev_bin = current_bin;
+ if( prev_bin == current_bin )
+ bin_count++;
+ else
+ { // we are moving to a new bin -- consider adding to the sequence
+ // CHECKME tohle taky konfigurovatelne ?
+ if( bin_count >= ( min_bin_points_percentage_P * point_count / 100 )
+ || sequence_count == 0 )
+ {
+ if( sequence_count >= MAX_SEQUENCE )
+ return NULL;
+ ret_val[ sequence_count++ ] = prev_bin + '0';
+ }
+ // restart counting points in the new bin
+ bin_count=0;
+ prev_bin = current_bin;
+ }
+ }
+
+ // add the last run of points to the sequence
+ if( sequence_count >= MAX_SEQUENCE - 1 )
+ return NULL;
+ ret_val[ sequence_count++ ] = current_bin + '0';
+ ret_val[ sequence_count ] = 0; // endmark
+ return ret_val;
+ }
+
+/* figure out which bin the point falls in */
+int Stroke::bin( int x, int y )
+ {
+ int bin_num = 1;
+ if( x > bound_x_1 )
+ ++bin_num;
+ if( x > bound_x_2 )
+ ++bin_num;
+ if( y < bound_y_1 )
+ bin_num += 3;
+ if( y < bound_y_2 )
+ bin_num += 3;
+ return bin_num;
+ }
+
+} // namespace KHotKeys
+
+#include "gestures.moc"
diff --git a/khotkeys/shared/gestures.h b/khotkeys/shared/gestures.h
new file mode 100644
index 000000000..4c210528a
--- /dev/null
+++ b/khotkeys/shared/gestures.h
@@ -0,0 +1,122 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _GESTURES_H_
+#define _GESTURES_H_
+
+#include <qwidget.h>
+#include <qtimer.h>
+
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+
+#include "windows.h"
+
+namespace KHotKeys
+{
+
+class Gesture;
+KDE_EXPORT extern Gesture* gesture_handler;
+
+class KDE_EXPORT Stroke
+ {
+ public:
+ // maximum number of numbers in stroke
+ enum { MAX_SEQUENCE = 25 };
+ // largest number of points allowed to be sampled
+ enum { MAX_POINTS = 5000 };
+ // default percentage of sample points in a bin from all points to be valid
+ enum { MIN_BIN_POINTS_PERCENTAGE = 5 };
+ // default threshold of size of smaller axis needed for it to define its own bin size
+ enum { SCALE_RATIO = 4 };
+ // default number of sample points required to have a valid stroke
+ enum { MIN_POINTS = 10 };
+ Stroke();
+ ~Stroke();
+ bool record( int x, int y );
+ char* translate( int min_bin_points_percentage_P = MIN_BIN_POINTS_PERCENTAGE,
+ int scale_ratio_P = SCALE_RATIO, int min_points_P = MIN_POINTS ); // CHECKME returns ret_val ( see below )
+ void reset();
+ protected:
+ int bin( int x, int y );
+ // metrics for input stroke
+ int min_x, min_y;
+ int max_x, max_y;
+ int point_count;
+ int delta_x, delta_y;
+ int bound_x_1, bound_x_2;
+ int bound_y_1, bound_y_2;
+ struct point
+ {
+ int x;
+ int y;
+ };
+ point* points;
+ char ret_val[ MAX_SEQUENCE ];
+ };
+
+class KDE_EXPORT Gesture
+ : public QWidget // not QObject because of x11EventFilter()
+ {
+ Q_OBJECT
+ public:
+ Gesture( bool enabled_P, QObject* parent_P );
+ virtual ~Gesture();
+ void enable( bool enable_P );
+ void set_mouse_button( unsigned int button_P );
+ void set_timeout( int time_P );
+ void set_exclude( Windowdef_list* windows_P );
+ void register_handler( QObject* receiver_P, const char* slot_P );
+ void unregister_handler( QObject* receiver_P, const char* slot_P );
+ protected:
+ virtual bool x11Event( XEvent* ev_P );
+ private slots:
+ void stroke_timeout();
+ void active_window_changed( WId window_P );
+ signals:
+ void handle_gesture( const QString &gesture, WId window );
+ private:
+ void update_grab();
+ void grab_mouse( bool grab_P );
+ void mouse_replay( bool release_P );
+ bool _enabled;
+ Stroke stroke;
+ int start_x, start_y;
+ QTimer nostroke_timer;
+ bool recording;
+ unsigned int button;
+ int timeout;
+ WId gesture_window;
+ Windowdef_list* exclude;
+ QMap< QObject*, bool > handlers; // bool is just a dummy
+ };
+
+// Gesture class must be QWidget derived because of x11Event()
+// but it should be QObject owned -> use a QObject proxy that will delete it
+class DeleteObject
+ : public QObject
+ {
+ Q_OBJECT
+ public:
+ DeleteObject( QWidget* widget_P, QObject* parent_P )
+ : QObject( parent_P ), widget( widget_P ) {}
+ virtual ~DeleteObject() { delete widget; }
+ private:
+ QWidget* widget;
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/input.cpp b/khotkeys/shared/input.cpp
new file mode 100644
index 000000000..021dedf93
--- /dev/null
+++ b/khotkeys/shared/input.cpp
@@ -0,0 +1,253 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _INPUT_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "input.h"
+
+#include <assert.h>
+#include <qwidget.h>
+
+#include <kglobalaccel.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kdeversion.h>
+#include <qtimer.h>
+#include <kkeynative.h>
+
+#include "khotkeysglobal.h"
+
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+
+#include "windows.h"
+
+namespace KHotKeys
+{
+
+// Kbd
+
+Kbd::Kbd( bool grabbing_enabled_P, QObject* parent_P )
+ : QObject( parent_P )
+ {
+ assert( keyboard_handler == NULL );
+ keyboard_handler = this;
+ kga = new KGlobalAccel( NULL );
+ kga->setEnabled( grabbing_enabled_P );
+ }
+
+Kbd::~Kbd()
+ {
+ keyboard_handler = NULL;
+ delete kga;
+ }
+
+void Kbd::insert_item( const KShortcut& shortcut_P, Kbd_receiver* receiver_P )
+ {
+ Receiver_data& rcv = receivers[ receiver_P ];
+ rcv.shortcuts.append( shortcut_P );
+ if( rcv.active )
+ grab_shortcut( shortcut_P );
+ }
+
+void Kbd::remove_item( const KShortcut& shortcut_P, Kbd_receiver* receiver_P )
+ {
+ Receiver_data& rcv = receivers[ receiver_P ];
+ rcv.shortcuts.remove( shortcut_P );
+ if( rcv.active )
+ ungrab_shortcut( shortcut_P );
+ if( rcv.shortcuts.count() == 0 )
+ receivers.remove( receiver_P );
+ }
+
+void Kbd::activate_receiver( Kbd_receiver* receiver_P )
+ {
+ Receiver_data& rcv = receivers[ receiver_P ];
+ if( rcv.active )
+ return;
+ rcv.active = true;
+ for( QValueList< KShortcut >::ConstIterator it( rcv.shortcuts.begin());
+ it != rcv.shortcuts.end();
+ ++it )
+ grab_shortcut( *it );
+ }
+
+void Kbd::deactivate_receiver( Kbd_receiver* receiver_P )
+ {
+ Receiver_data& rcv = receivers[ receiver_P ];
+ if( !rcv.active )
+ return;
+ rcv.active = false;
+ for( QValueList< KShortcut >::ConstIterator it( rcv.shortcuts.begin());
+ it != rcv.shortcuts.end();
+ ++it )
+ ungrab_shortcut( *it );
+ }
+
+void Kbd::grab_shortcut( const KShortcut& shortcut_P )
+ {
+ if( grabs.contains( shortcut_P ))
+ ++grabs[ shortcut_P ];
+ else
+ {
+ grabs[ shortcut_P ] = 1;
+#if 0
+ // CHECKME ugly ugly hack
+ QString name = ' ' + QString::number( keycode_P );
+ kga->insertItem( "", name, keycode_P );
+ kga->connectItem( name, this, SLOT( key_slot( int )));
+#endif
+ QString name = ' ' + shortcut_P.toStringInternal();
+ kga->insert( name, name, QString::null, shortcut_P, shortcut_P,
+ this, SLOT( key_slot( QString )));
+ QTimer::singleShot( 0, this, SLOT( update_connections()));
+ }
+ }
+
+void Kbd::ungrab_shortcut( const KShortcut& shortcut_P )
+ {
+ if( !grabs.contains( shortcut_P ))
+ return;
+ if( --grabs[ shortcut_P ] == 0 )
+ {
+#if 0
+ // CHECKME workaround for KGlobalAccel::disconnectItem() not working
+ kga->setItemEnabled( ' ' + QString::number( keycode_P ), false );
+ // kga->disconnectItem( ' ' + QString::number( keycode_P ), NULL, NULL );
+ kga->removeItem( ' ' + QString::number( keycode_P ));
+#endif
+ kga->remove( ' ' + shortcut_P.toStringInternal());
+ grabs.remove( shortcut_P );
+ QTimer::singleShot( 0, this, SLOT( update_connections()));
+ }
+ }
+
+void Kbd::update_connections()
+ {
+ kga->updateConnections();
+ }
+
+void Kbd::key_slot( QString key_P )
+ {
+ kdDebug( 1217 ) << "Key pressed:" << key_P << endl;
+ KShortcut shortcut( key_P );
+ if( !grabs.contains( shortcut ))
+ return;
+ for( QMap< Kbd_receiver*, Receiver_data >::ConstIterator it = receivers.begin();
+ it != receivers.end();
+ ++it )
+ if( ( *it ).shortcuts.contains( shortcut ) && ( *it ).active
+ && it.key()->handle_key( shortcut ))
+ return;
+ }
+
+
+#ifdef HAVE_XTEST
+
+} // namespace KHotKeys
+#include <X11/extensions/XTest.h>
+namespace KHotKeys
+{
+
+static bool xtest_available = false;
+static bool xtest_inited = false;
+static bool xtest()
+ {
+ if( xtest_inited )
+ return xtest_available;
+ xtest_inited = true;
+ int dummy1, dummy2, dummy3, dummy4;
+ xtest_available =
+ ( XTestQueryExtension( qt_xdisplay(), &dummy1, &dummy2, &dummy3, &dummy4 ) == True );
+ return xtest_available;
+ }
+#endif
+
+// CHECKME nevola XFlush(), musi se pak volat rucne
+bool Kbd::send_macro_key( const KKey& key, Window window_P )
+ {
+ unsigned int keysym = KKeyNative( key ).sym();
+ KeyCode x_keycode = XKeysymToKeycode( qt_xdisplay(), keysym );
+ if( x_keycode == NoSymbol )
+ return false;
+ unsigned int x_mod = KKeyNative( key ).mod();
+#ifdef HAVE_XTEST
+ if( xtest() && window_P == None )
+ {
+ // CHECKME tohle jeste potrebuje modifikatory
+ bool ret = XTestFakeKeyEvent( qt_xdisplay(), x_keycode, True, CurrentTime );
+ ret = ret && XTestFakeKeyEvent( qt_xdisplay(), x_keycode, False, CurrentTime );
+ return ret;
+ }
+#endif
+ if( window_P == None || window_P == InputFocus )
+ window_P = windows_handler->active_window();
+ if( window_P == None ) // CHECKME tohle cele je ponekud ...
+ window_P = InputFocus;
+ XEvent ev;
+ ev.type = KeyPress;
+ ev.xkey.display = qt_xdisplay();
+ ev.xkey.window = window_P;
+ ev.xkey.root = qt_xrootwin(); // I don't know whether these have to be set
+ ev.xkey.subwindow = None; // to these values, but it seems to work, hmm
+ ev.xkey.time = CurrentTime;
+ ev.xkey.x = 0;
+ ev.xkey.y = 0;
+ ev.xkey.x_root = 0;
+ ev.xkey.y_root = 0;
+ ev.xkey.keycode = x_keycode;
+ ev.xkey.state = x_mod;
+ ev.xkey.same_screen = True;
+ bool ret = XSendEvent( qt_xdisplay(), window_P, True, KeyPressMask, &ev );
+#if 1
+ ev.type = KeyRelease; // is this actually really needed ??
+ ev.xkey.display = qt_xdisplay();
+ ev.xkey.window = window_P;
+ ev.xkey.root = qt_xrootwin();
+ ev.xkey.subwindow = None;
+ ev.xkey.time = CurrentTime;
+ ev.xkey.x = 0;
+ ev.xkey.y = 0;
+ ev.xkey.x_root = 0;
+ ev.xkey.y_root = 0;
+ ev.xkey.state = x_mod;
+ ev.xkey.keycode = x_keycode;
+ ev.xkey.same_screen = True;
+ ret = ret && XSendEvent( qt_xdisplay(), window_P, True, KeyReleaseMask, &ev );
+#endif
+ // Qt's autorepeat compression is broken and can create "aab" from "aba"
+ // XSync() should create delay longer than Qt's max autorepeat interval
+ XSync( qt_xdisplay(), False );
+ return ret;
+ }
+
+bool Mouse::send_mouse_button( int button_P, bool release_P )
+ {
+#ifdef HAVE_XTEST
+ if( xtest())
+ {
+ // CHECKME tohle jeste potrebuje modifikatory
+ // a asi i spravnou timestamp misto CurrentTime
+ bool ret = XTestFakeButtonEvent( qt_xdisplay(), button_P, True, CurrentTime );
+ if( release_P )
+ ret = ret && XTestFakeButtonEvent( qt_xdisplay(), button_P, False, CurrentTime );
+ return ret;
+ }
+#endif
+ return false;
+ }
+
+} // namespace KHotKeys
+
+#include "input.moc"
diff --git a/khotkeys/shared/input.h b/khotkeys/shared/input.h
new file mode 100644
index 000000000..1983bcf0b
--- /dev/null
+++ b/khotkeys/shared/input.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _INPUT_H_
+#define _INPUT_H_
+
+#include <qobject.h>
+#include <qwindowdefs.h>
+#include <qmap.h>
+#include <qwidget.h>
+#include <qvaluelist.h>
+#include <kshortcut.h>
+
+#include <X11/X.h>
+#include <fixx11h.h>
+
+class KGlobalAccel;
+
+namespace KHotKeys
+{
+
+class Kbd_receiver
+ {
+ public:
+ virtual bool handle_key( const KShortcut& shortcut_P ) = 0;
+ };
+
+class Kbd
+ : public QObject
+ {
+ Q_OBJECT
+ public:
+ Kbd( bool grabbing_enabled_P, QObject* parent_P );
+ virtual ~Kbd();
+ void insert_item( const KShortcut& shortcut_P, Kbd_receiver* receiver_P );
+ void remove_item( const KShortcut& shortcut_P, Kbd_receiver* receiver_P );
+ void activate_receiver( Kbd_receiver* receiver_P );
+ void deactivate_receiver( Kbd_receiver* receiver_P );
+ static bool send_macro_key( const KKey& key, Window window_P = InputFocus );
+ protected:
+ bool x11EventFilter( const XEvent* );
+ void grab_shortcut( const KShortcut& shortcut_P );
+ void ungrab_shortcut( const KShortcut& shortcut_P );
+ private slots:
+ void key_slot( QString key_P );
+ void update_connections();
+ private:
+ struct Receiver_data
+ {
+ Receiver_data();
+ QValueList< KShortcut > shortcuts;
+ bool active;
+ };
+ QMap< Kbd_receiver*, Receiver_data > receivers;
+ QMap< KShortcut, int > grabs;
+ KGlobalAccel* kga;
+ };
+
+class Mouse
+ {
+ public:
+ static bool send_mouse_button( int button_P, bool release_P );
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Kbd::Receiver_data
+
+inline
+Kbd::Receiver_data::Receiver_data()
+ : active( false )
+ {
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/khlistbox.cpp b/khotkeys/shared/khlistbox.cpp
new file mode 100644
index 000000000..694fb658b
--- /dev/null
+++ b/khotkeys/shared/khlistbox.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KHLISTBOX_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "khlistbox.h"
+
+#include <kdebug.h>
+
+namespace KHotKeys
+{
+
+KHListBox::KHListBox( QWidget* parent_P, const char* name_P )
+ : QListBox( parent_P, name_P ), saved_current_item( NULL ),
+ in_clear( false ), force_select( false )
+ {
+ connect( this, SIGNAL( selectionChanged( QListBoxItem* )),
+ SLOT( slot_selection_changed( QListBoxItem* )));
+ connect( this, SIGNAL( currentChanged( QListBoxItem* )),
+ SLOT( slot_current_changed( QListBoxItem* )));
+ // CHECKME grrr
+ connect( this, SIGNAL( selectionChanged()),
+ SLOT( slot_selection_changed()));
+ connect( &insert_select_timer, SIGNAL( timeout()),
+ SLOT( slot_insert_select()));
+ }
+
+void KHListBox::slot_selection_changed()
+ {
+ if( saved_current_item == NULL )
+ slot_selection_changed( NULL );
+ else if( !saved_current_item->isSelected()) // no way
+ setSelected( saved_current_item, true );
+ }
+
+void KHListBox::slot_selection_changed( QListBoxItem* item_P )
+ {
+ if( item_P == saved_current_item )
+ return;
+ saved_current_item = item_P;
+ setCurrentItem( saved_current_item );
+ emit current_changed( saved_current_item );
+ }
+
+void KHListBox::slot_current_changed( QListBoxItem* item_P )
+ {
+ insert_select_timer.stop();
+ if( item_P == saved_current_item )
+ return;
+ saved_current_item = item_P;
+ setSelected( saved_current_item, true );
+ emit current_changed( saved_current_item );
+ }
+
+// neni virtual :((
+void KHListBox::clear()
+ {
+ in_clear = true;
+ QListBox::clear();
+ in_clear = false;
+ slot_selection_changed( NULL );
+ }
+
+
+// neni virtual :(( a vubec nefunguje
+void KHListBox::insertItem( QListBoxItem* item_P )
+ {
+ bool set = false;
+ if( !in_clear )
+ set = count() == 0;
+ QListBox::insertItem( item_P );
+ if( set && force_select )
+ {
+ bool block = signalsBlocked();
+ blockSignals( true );
+ setCurrentItem( item_P );
+ blockSignals( block );
+ insert_select_timer.start( 0, true );
+ }
+ }
+
+// items are often inserted using the QListBoxItem constructor,
+// which means that a derived class are not yet fully created
+void KHListBox::slot_insert_select()
+ {
+ slot_current_changed( item( currentItem()));
+ }
+
+
+} // namespace KHotKeys
+
+#include "khlistbox.moc"
diff --git a/khotkeys/shared/khlistbox.h b/khotkeys/shared/khlistbox.h
new file mode 100644
index 000000000..95bd32963
--- /dev/null
+++ b/khotkeys/shared/khlistbox.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KHLISTBOX_H_
+#define _KHLISTBOX_H_
+
+#include <qtimer.h>
+
+#include <klistbox.h>
+
+namespace KHotKeys
+{
+
+class KHListBox
+ : public QListBox
+ {
+ Q_OBJECT
+ Q_PROPERTY( bool forceSelect READ forceSelect WRITE setForceSelect )
+ public:
+ KHListBox( QWidget* parent_P, const char* name_P = NULL );
+ virtual void clear();
+ virtual void insertItem( QListBoxItem* item_P );
+ bool forceSelect() const;
+ void setForceSelect( bool force_P );
+ signals:
+ void current_changed( QListBoxItem* item_P );
+ private slots:
+ void slot_selection_changed( QListBoxItem* item_P );
+ void slot_selection_changed();
+ void slot_current_changed( QListBoxItem* item_P );
+ void slot_insert_select();
+ private:
+ QListBoxItem* saved_current_item;
+ bool in_clear;
+ bool force_select;
+ QTimer insert_select_timer;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+inline
+void KHListBox::setForceSelect( bool force_P )
+ {
+ force_select = force_P;
+ }
+
+inline
+bool KHListBox::forceSelect() const
+ {
+ return force_select;
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/khlistview.cpp b/khotkeys/shared/khlistview.cpp
new file mode 100644
index 000000000..45a1d04f9
--- /dev/null
+++ b/khotkeys/shared/khlistview.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KHLISTVIEW_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "khlistview.h"
+
+#include <kdebug.h>
+
+namespace KHotKeys
+{
+
+KHListView::KHListView( QWidget* parent_P, const char* name_P )
+ : KListView( parent_P, name_P ), saved_current_item( NULL ),
+ in_clear( false ), ignore( false ), force_select( false )
+ {
+ connect( this, SIGNAL( selectionChanged( QListViewItem* )),
+ SLOT( slot_selection_changed( QListViewItem* )));
+ connect( this, SIGNAL( currentChanged( QListViewItem* )),
+ SLOT( slot_current_changed( QListViewItem* )));
+ // CHECKME grrr
+ connect( this, SIGNAL( selectionChanged()),
+ SLOT( slot_selection_changed()));
+ connect( &insert_select_timer, SIGNAL( timeout()),
+ SLOT( slot_insert_select()));
+ }
+
+void KHListView::slot_selection_changed()
+ {
+ if( ignore )
+ return;
+ if( saved_current_item == NULL )
+ slot_selection_changed( NULL );
+ else if( !saved_current_item->isSelected()) // no way
+ setSelected( saved_current_item, true );
+ }
+
+void KHListView::slot_selection_changed( QListViewItem* item_P )
+ {
+ if( ignore )
+ return;
+ if( item_P == saved_current_item )
+ return;
+ saved_current_item = item_P;
+ setCurrentItem( saved_current_item );
+ emit current_changed( saved_current_item );
+ }
+
+void KHListView::slot_current_changed( QListViewItem* item_P )
+ {
+ if( ignore )
+ return;
+ insert_select_timer.stop();
+ if( item_P == saved_current_item )
+ return;
+ saved_current_item = item_P;
+ setSelected( saved_current_item, true );
+ emit current_changed( saved_current_item );
+ }
+
+void KHListView::clear()
+ {
+ in_clear = true;
+ KListView::clear();
+ in_clear = false;
+ slot_selection_changed( NULL );
+ }
+
+void KHListView::insertItem( QListViewItem* item_P )
+ {
+ bool set = false;
+ if( !in_clear )
+ set = childCount() == 0;
+ KListView::insertItem( item_P );
+ if( set && force_select )
+ {
+ bool block = signalsBlocked();
+ blockSignals( true );
+// SELI tohle spis jen blokovat sebe?
+ setCurrentItem( item_P );
+ blockSignals( block );
+ insert_select_timer.start( 0, true );
+ }
+ }
+
+void KHListView::clearSelection()
+ {
+ KListView::clearSelection();
+ slot_current_changed( currentItem());
+ }
+
+// items are often inserted using the QListViewItem constructor,
+// which means that a derived class are not yet fully created
+void KHListView::slot_insert_select()
+ {
+ if( ignore )
+ return;
+ slot_current_changed( currentItem());
+ }
+
+void KHListView::contentsDropEvent( QDropEvent* e )
+ {
+ bool save_ignore = ignore;
+ ignore = true;
+ KListView::contentsDropEvent( e );
+ ignore = save_ignore;
+ }
+
+} // namespace KHotKeys
+
+#include "khlistview.moc"
diff --git a/khotkeys/shared/khlistview.h b/khotkeys/shared/khlistview.h
new file mode 100644
index 000000000..69986299d
--- /dev/null
+++ b/khotkeys/shared/khlistview.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2002 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KHLISTVIEW_H_
+#define _KHLISTVIEW_H_
+
+#include <qtimer.h>
+
+#include <klistview.h>
+#include <kdemacros.h>
+
+namespace KHotKeys
+{
+
+class KDE_EXPORT KHListView
+ : public KListView
+ {
+ Q_OBJECT
+ Q_PROPERTY( bool forceSelect READ forceSelect WRITE setForceSelect )
+ public:
+ KHListView( QWidget* parent_P, const char* name_P = NULL );
+ virtual void clear();
+ virtual void insertItem( QListViewItem* item_P );
+ virtual void clearSelection();
+ bool forceSelect() const;
+ void setForceSelect( bool force_P );
+ signals:
+ void current_changed( QListViewItem* item_P );
+ protected:
+ virtual void contentsDropEvent (QDropEvent*);
+ private slots:
+ void slot_selection_changed( QListViewItem* item_P );
+ void slot_selection_changed();
+ void slot_current_changed( QListViewItem* item_P );
+ void slot_insert_select();
+ private:
+ QListViewItem* saved_current_item;
+ bool in_clear;
+ bool ignore;
+ bool force_select;
+ QTimer insert_select_timer;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+inline
+void KHListView::setForceSelect( bool force_P )
+ {
+ force_select = force_P;
+ }
+
+inline
+bool KHListView::forceSelect() const
+ {
+ return force_select;
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/khotkeysglobal.cpp b/khotkeys/shared/khotkeysglobal.cpp
new file mode 100644
index 000000000..2b430fc8c
--- /dev/null
+++ b/khotkeys/shared/khotkeysglobal.cpp
@@ -0,0 +1,100 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _KHOTKEYSGLOBAL_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "khotkeysglobal.h"
+
+#include <assert.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <klibloader.h>
+
+#include "input.h"
+#include "windows.h"
+#include "triggers.h"
+#include "gestures.h"
+#include "voices.h"
+#include "soundrecorder.h"
+
+namespace KHotKeys
+{
+
+Kbd* keyboard_handler;
+Windows* windows_handler;
+static bool _khotkeys_active = false;
+
+void init_global_data( bool active_P, QObject* owner_P )
+ {
+ assert( keyboard_handler == NULL );
+ assert( windows_handler == NULL );
+ assert( gesture_handler == NULL );
+ static_cast< void >( new Kbd( active_P, owner_P ));
+ static_cast< void >( new Windows( active_P, owner_P ));
+ static_cast< void >( new Gesture( active_P, owner_P ));
+ static_cast< void >( new Voice( active_P, owner_P ));
+ khotkeys_set_active( false );
+ }
+
+void khotkeys_set_active( bool active_P )
+ {
+ _khotkeys_active = active_P;
+ }
+
+bool khotkeys_active()
+ {
+ return _khotkeys_active;
+ }
+
+// does the opposite of KStandardDirs::findResource() i.e. e.g.
+// "/opt/kde2/share/applnk/System/konsole.desktop" -> "System/konsole.desktop"
+QString get_menu_entry_from_path( const QString& path_P )
+ {
+ QStringList dirs = KGlobal::dirs()->resourceDirs( "apps" );
+ for( QStringList::ConstIterator it = dirs.begin();
+ it != dirs.end();
+ ++it )
+ if( path_P.find( *it ) == 0 )
+ {
+ QString ret = path_P;
+ ret.remove( 0, (*it).length());
+ if( ret[ 0 ] == '/' )
+ ret.remove( 0, 1 );
+ return ret;
+ }
+ return path_P;
+ }
+
+static int have_arts = -1;
+
+bool haveArts()
+ {
+ if( have_arts == -1 )
+ {
+ have_arts = 0;
+ KLibrary* arts = KLibLoader::self()->library( "khotkeys_arts" );
+ if( arts == NULL )
+ kdDebug( 1217 ) << "Couldn't load khotkeys_arts:" << KLibLoader::self()->lastErrorMessage() << endl;
+ if( arts != NULL && SoundRecorder::init( arts ))
+ have_arts = 1;
+ }
+ return have_arts != 0;
+ }
+
+void disableArts()
+ {
+ have_arts = 0;
+ }
+
+} // namespace KHotKeys
diff --git a/khotkeys/shared/khotkeysglobal.h b/khotkeys/shared/khotkeysglobal.h
new file mode 100644
index 000000000..873473e0f
--- /dev/null
+++ b/khotkeys/shared/khotkeysglobal.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _KHOTKEYSGLOBAL_H_
+#define _KHOTKEYSGLOBAL_H_
+
+#define KHOTKEYS_VERSION "2.1"
+#define KHOTKEYS_CONFIG_FILE "khotkeysrc"
+
+//#ifndef NDEBUG
+//#define KHOTKEYS_DEBUG
+//#endif
+
+#include <qstring.h>
+
+#include <klocale.h>
+
+class KConfig;
+class QObject;
+
+namespace KHotKeys
+{
+
+class Kbd;
+class Windows;
+class Action_data_group;
+
+extern Kbd* keyboard_handler;
+extern Windows* windows_handler;
+
+#define KHOTKEYS_DISABLE_COPY( cls ) private: cls( const cls& ); cls& operator=( const cls& )
+
+// CHECKME hmms :(
+KDE_EXPORT bool khotkeys_active();
+KDE_EXPORT void khotkeys_set_active( bool active_P );
+
+QString get_menu_entry_from_path( const QString& path_P );
+
+KDE_EXPORT void init_global_data( bool active_P, QObject* owner_P );
+
+const char* const MENU_EDITOR_ENTRIES_GROUP_NAME = I18N_NOOP( "Menu Editor entries" );
+
+KDE_EXPORT bool haveArts();
+KDE_EXPORT void disableArts();
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/settings.cpp b/khotkeys/shared/settings.cpp
new file mode 100644
index 000000000..829c8521a
--- /dev/null
+++ b/khotkeys/shared/settings.cpp
@@ -0,0 +1,265 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _SETTINGS_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "settings.h"
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kaccel.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+
+#include "triggers.h"
+#include "conditions.h"
+#include "action_data.h"
+
+namespace KHotKeys
+{
+
+// Settings
+
+Settings::Settings()
+ : actions( NULL ), gestures_exclude( NULL )
+ {
+ }
+
+bool Settings::read_settings( bool include_disabled_P )
+ {
+ KConfig cfg( KHOTKEYS_CONFIG_FILE, true );
+ return read_settings( cfg, include_disabled_P, ImportNone );
+ }
+
+bool Settings::import( KConfig& cfg_P, bool ask_P )
+ {
+ return read_settings( cfg_P, true, ask_P ? ImportAsk : ImportSilent );
+ }
+
+bool Settings::read_settings( KConfig& cfg_P, bool include_disabled_P, ImportType import_P )
+ {
+ if( actions == NULL )
+ actions = new Action_data_group( NULL, "should never see", "should never see",
+ NULL, Action_data_group::SYSTEM_ROOT, true );
+ if( cfg_P.groupList().count() == 0 ) // empty
+ return false;
+ cfg_P.setGroup( "Main" ); // main group
+ if( import_P == ImportNone ) // reading main cfg file
+ already_imported = cfg_P.readListEntry( "AlreadyImported" );
+ else
+ {
+ QString import_id = cfg_P.readEntry( "ImportId" );
+ if( !import_id.isEmpty())
+ {
+ if( already_imported.contains( import_id ))
+ {
+ if( import_P == ImportSilent
+ || KMessageBox::warningContinueCancel( NULL,
+ i18n( "This \"actions\" file has already been imported before. "
+ "Are you sure you want to import it again?" )) != KMessageBox::Continue )
+ return true; // import "successful"
+ }
+ else
+ already_imported.append( import_id );
+ }
+ else
+ {
+ if( import_P != ImportSilent
+ && KMessageBox::warningContinueCancel( NULL,
+ i18n( "This \"actions\" file has no ImportId field and therefore it cannot be determined "
+ "whether or not it has been imported already. Are you sure you want to import it?" ))
+ == KMessageBox::Cancel )
+ return true;
+ }
+ }
+ int version = cfg_P.readNumEntry( "Version", -1234576 );
+ switch( version )
+ {
+ case 1:
+ read_settings_v1( cfg_P );
+ break;
+ case 2:
+ read_settings_v2( cfg_P, include_disabled_P );
+ break;
+ default:
+ kdWarning( 1217 ) << "Unknown cfg. file version\n";
+ return false;
+ case -1234576: // no config file
+ if( import_P ) // if importing, this is an error
+ return false;
+ break;
+ }
+ if( import_P != ImportNone )
+ return true; // don't read global settings
+ cfg_P.setGroup( "Main" ); // main group
+ daemon_disabled = cfg_P.readBoolEntry( "Disabled", false );
+ cfg_P.setGroup( "Gestures" );
+ gestures_disabled_globally = cfg_P.readBoolEntry( "Disabled", true );
+ gesture_mouse_button = cfg_P.readNumEntry( "MouseButton", 2 );
+ gesture_mouse_button = KCLAMP( gesture_mouse_button, 2, 9 );
+ gesture_timeout = cfg_P.readNumEntry( "Timeout", 300 );
+ cfg_P.setGroup( "GesturesExclude" );
+ delete gestures_exclude;
+ gestures_exclude = new Windowdef_list( cfg_P );
+ cfg_P.setGroup( "Voice" );
+ voice_shortcut=KShortcut( cfg_P.readEntry("Shortcut" , "") );
+ return true;
+ }
+
+void Settings::write_settings()
+ {
+ KConfig cfg( KHOTKEYS_CONFIG_FILE, false );
+// CHECKME smazat stare sekce ?
+ QStringList groups = cfg.groupList();
+ for( QStringList::ConstIterator it = groups.begin();
+ it != groups.end();
+ ++it )
+ cfg.deleteGroup( *it );
+ cfg.setGroup( "Main" ); // main group
+ cfg.writeEntry( "Version", 2 ); // now it's version 2 cfg. file
+ cfg.writeEntry( "AlreadyImported", already_imported );
+ cfg.setGroup( "Data" );
+ int cnt = write_actions_recursively_v2( cfg, actions, true );
+ cfg.setGroup( "Main" );
+ cfg.writeEntry( "Autostart", cnt != 0 && !daemon_disabled );
+ cfg.writeEntry( "Disabled", daemon_disabled );
+ cfg.setGroup( "Gestures" );
+ cfg.writeEntry( "Disabled", gestures_disabled_globally );
+ cfg.writeEntry( "MouseButton", gesture_mouse_button );
+ cfg.writeEntry( "Timeout", gesture_timeout );
+ if( gestures_exclude != NULL )
+ {
+ cfg.setGroup( "GesturesExclude" );
+ gestures_exclude->cfg_write( cfg );
+ }
+ else
+ cfg.deleteGroup( "GesturesExclude" );
+ cfg.setGroup( "Voice" );
+ cfg.writeEntry("Shortcut" , voice_shortcut.toStringInternal() );
+
+ }
+
+
+// return value means the number of enabled actions written in the cfg file
+// i.e. 'Autostart' for value > 0 should be on
+int Settings::write_actions_recursively_v2( KConfig& cfg_P, Action_data_group* parent_P, bool enabled_P )
+ {
+ int enabled_cnt = 0;
+ QString save_cfg_group = cfg_P.group();
+ int cnt = 0;
+ for( Action_data_group::Iterator it = parent_P->first_child();
+ it;
+ ++it )
+ {
+ ++cnt;
+ if( enabled_P && (*it)->enabled( true ))
+ ++enabled_cnt;
+ cfg_P.setGroup( save_cfg_group + "_" + QString::number( cnt ));
+ ( *it )->cfg_write( cfg_P );
+ Action_data_group* grp = dynamic_cast< Action_data_group* >( *it );
+ if( grp != NULL )
+ enabled_cnt += write_actions_recursively_v2( cfg_P, grp, enabled_P && (*it)->enabled( true ));
+ }
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "DataCount", cnt );
+ return enabled_cnt;
+ }
+
+void Settings::read_settings_v2( KConfig& cfg_P, bool include_disabled_P )
+ {
+ cfg_P.setGroup( "Data" );
+ read_actions_recursively_v2( cfg_P, actions, include_disabled_P );
+ }
+
+void Settings::read_actions_recursively_v2( KConfig& cfg_P, Action_data_group* parent_P,
+ bool include_disabled_P )
+ {
+ QString save_cfg_group = cfg_P.group();
+ int cnt = cfg_P.readNumEntry( "DataCount" );
+ for( int i = 1;
+ i <= cnt;
+ ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + "_" + QString::number( i ));
+ if( include_disabled_P || Action_data_base::cfg_is_enabled( cfg_P ))
+ {
+ Action_data_base* new_action = Action_data_base::create_cfg_read( cfg_P, parent_P );
+ Action_data_group* grp = dynamic_cast< Action_data_group* >( new_action );
+ if( grp != NULL )
+ read_actions_recursively_v2( cfg_P, grp, include_disabled_P );
+ }
+ }
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+// backward compatibility
+void Settings::read_settings_v1( KConfig& cfg_P )
+ {
+ int sections = cfg_P.readNumEntry( "Num_Sections", 0 );
+ Action_data_group* menuentries = NULL;
+ for( Action_data_group::Iterator it( actions->first_child());
+ *it;
+ ++it )
+ {
+ Action_data_group* tmp = dynamic_cast< Action_data_group* >( *it );
+ if( tmp == NULL )
+ continue;
+ if( tmp->system_group() == Action_data_group::SYSTEM_MENUENTRIES )
+ {
+ menuentries = tmp;
+ break;
+ }
+ }
+ for( int sect = 1;
+ sect <= sections;
+ ++sect )
+ {
+ QString group = QString( "Section%1" ).arg( sect );
+ if( !cfg_P.hasGroup( group ))
+ continue;
+ cfg_P.setGroup( group );
+ QString name = cfg_P.readEntry( "Name" );
+ if( name.isNull() )
+ continue;
+ QString shortcut = cfg_P.readEntry( "Shortcut" );
+ if( shortcut.isNull() )
+ continue;
+ QString run = cfg_P.readEntry( "Run" );
+ if( run.isNull() )
+ continue;
+ bool menuentry = cfg_P.readBoolEntry( "MenuEntry", false );
+ // CHECKME tohle pridavani az pak je trosku HACK
+ if( menuentry )
+ {
+ if( menuentries == NULL )
+ {
+ menuentries = new Action_data_group( actions,
+ i18n( MENU_EDITOR_ENTRIES_GROUP_NAME ),
+ i18n( "These entries were created using Menu Editor." ), NULL,
+ Action_data_group::SYSTEM_MENUENTRIES, true );
+ menuentries->set_conditions( new Condition_list( "", menuentries ));
+ }
+ ( void ) new Menuentry_shortcut_action_data( menuentries, name, "",
+ KShortcut( shortcut ), run );
+ }
+ else
+ {
+ ( void ) new Command_url_shortcut_action_data( actions, name, "",
+ KShortcut( shortcut ), run );
+ }
+ }
+ }
+
+} // namespace KHotKeys
diff --git a/khotkeys/shared/settings.h b/khotkeys/shared/settings.h
new file mode 100644
index 000000000..cf05dcd31
--- /dev/null
+++ b/khotkeys/shared/settings.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _SETTINGS_H_
+#define _SETTINGS_H_
+
+#include "actions.h"
+#include <kshortcut.h>
+
+class KConfig;
+
+namespace KHotKeys
+{
+
+enum ImportType
+ {
+ ImportNone, // no import is done
+ ImportAsk, // if already imported before, ask (called from GUI)
+ ImportSilent // if already imported before, ignore (called from the update script)
+ };
+
+class KDE_EXPORT Settings
+ {
+ public:
+ Settings();
+ bool read_settings( bool include_disabled_P );
+ void write_settings();
+ bool import( KConfig& cfg_P, bool ask_P );
+ Action_data_group* actions;
+ bool gestures_disabled_globally;
+ int gesture_mouse_button;
+ int gesture_timeout;
+ bool daemon_disabled;
+ Windowdef_list* gestures_exclude;
+ KShortcut voice_shortcut;
+ protected:
+ bool read_settings( KConfig& cfg_P, bool include_disabled_P, ImportType import_P );
+ void read_settings_v1( KConfig& cfg_P );
+ void read_settings_v2( KConfig& cfg_P, bool include_disabled_P );
+ int write_actions_recursively_v2( KConfig& cfg_P, Action_data_group* parent_P, bool enabled_P );
+ void read_actions_recursively_v2( KConfig& cfg_P, Action_data_group* parent_P,
+ bool include_disabled_P );
+ private:
+ QStringList already_imported;
+ KHOTKEYS_DISABLE_COPY( Settings );
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/sound.cpp b/khotkeys/shared/sound.cpp
new file mode 100644
index 000000000..e8d4191eb
--- /dev/null
+++ b/khotkeys/shared/sound.cpp
@@ -0,0 +1,343 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "sound.h"
+#include <qfile.h>
+#include <qdatastream.h>
+#include <kdebug.h>
+
+
+
+
+Sound::Sound()
+{
+}
+
+
+Sound::~Sound()
+{
+}
+
+
+#define READ_FROM_STREAM(FORMAT,NAME) FORMAT NAME; stream >> NAME;
+#define MAGIC(CH) { \
+ stream >> magic; \
+ if( magic != ( (CH)[0] | (CH)[1]<<8 | (CH)[2]<< 16 | (CH)[3] << 24 ) ) \
+ { \
+ kdWarning() << k_funcinfo << "bad format " << magic << " != " << CH "\n";\
+ return;\
+ } }
+
+#define ABS(X) ( (X>0) ? X : -X )
+
+void Sound::load(const QString& filename)
+{
+ kdDebug() << k_funcinfo << filename << endl;
+ data=QMemArray<Q_INT32>();
+ QFile file(filename);
+ if(!file.open(IO_ReadOnly))
+ {
+ kdWarning() << k_funcinfo <<"unable to open file" << endl;
+ return;
+ }
+ QDataStream stream(&file);
+ stream.setByteOrder( QDataStream::LittleEndian );
+ Q_INT32 magic;
+
+ MAGIC("RIFF");
+ READ_FROM_STREAM(Q_UINT32,ChunkSize);
+ MAGIC("WAVE");
+ MAGIC("fmt ");
+ READ_FROM_STREAM(Q_UINT32,ChunkSize2);
+ READ_FROM_STREAM(Q_INT16,AudioFormat);
+ READ_FROM_STREAM(Q_UINT16,NumberOfChannels);
+ READ_FROM_STREAM(Q_UINT32,SampleRate);
+ _fs=SampleRate;
+ READ_FROM_STREAM(Q_UINT32,ByteRate);
+ READ_FROM_STREAM(Q_UINT16,BlockAlign);
+ READ_FROM_STREAM(Q_UINT16,BitsPerSample);
+ MAGIC("data");
+ READ_FROM_STREAM(QByteArray,SoundData);
+ NumberOfChannels=1; //Wav i play are broken
+
+ file.close();
+
+ uint BytePS=BitsPerSample/8;
+ uint NumberOfSamples = (SoundData.size())/(NumberOfChannels*BytePS);
+
+
+ data.resize(NumberOfSamples);
+
+// kdDebug() << k_funcinfo << NumberOfSamples << " samples" << endl;
+
+ max=0;
+ for(unsigned long int f=0;f<NumberOfSamples;f++)
+ {
+ Q_INT32 nb=0;
+ for(uint k=0;k<BytePS;k++)
+ {
+ nb |= (SoundData[f*BytePS+k]&0x000000FF) << (k*8);
+ }
+ if(nb & (1 << (BytePS*8 -1)) )
+ nb = nb-(1<<BytePS*8);
+ data[f]=nb;
+ if(ABS(nb)>max)
+ {
+ max=ABS(nb);
+ }
+ }
+
+/* static int q=0;
+ QString name="test" + QString::number(q++) + ".wav";
+ save(name);*/
+
+}
+
+#define SMAGIC(CH) { stream << ( Q_INT32) ( (CH)[0] | (CH)[1]<<8 | (CH)[2]<< 16 | (CH)[3] << 24 ) ; }
+
+void Sound::save(const QString& filename) const
+{
+ kdDebug( 1217 ) << k_funcinfo << filename << " - " << data.size() << endl;
+ QFile file(filename);
+ if(!file.open(IO_WriteOnly))
+ {
+ kdWarning() << k_funcinfo <<"unable to open file" << endl;
+ return;
+ }
+ QDataStream stream(&file);
+ stream.setByteOrder( QDataStream::LittleEndian );
+
+
+ QByteArray SoundData(data.size()*2);
+
+ for(unsigned long int f=0;f<data.size();f++)
+ {
+ Q_UINT16 val= (signed short int) ( (data.at(f) * ((double)(1<<13)/(signed)max) ) );
+ SoundData[ 2*f ]= val & 0x00FF;
+ SoundData[2*f+1]= (val & 0xFF00) >> 8;
+
+// kdDebug( 1217 ) << k_funcinfo << data.at(f) << " / " << max << " = " << val << " | " << SoundData[ 2*f ] << " "<< SoundData[ 2*f+1 ] << endl;
+ }
+
+ Q_UINT16 NumberOfChannels=2;
+ Q_UINT32 SampleRate=_fs;
+
+ SMAGIC("RIFF");
+ //READ_FROM_STREAM(Q_UINT32,ChunkSize);
+ stream << (Q_UINT32)(36+ SoundData.size());
+ SMAGIC("WAVE");
+ SMAGIC("fmt ");
+ //READ_FROM_STREAM(Q_UINT32,ChunkSize2);
+ stream << (Q_UINT32)(16);
+ //READ_FROM_STREAM(Q_INT16,AudioFormat);
+ stream << (Q_INT16)(1);
+ //READ_FROM_STREAM(Q_UINT16,NumberOfChannels);
+ stream << (Q_UINT16)(NumberOfChannels);
+ //READ_FROM_STREAM(Q_UINT32,SampleRate);
+ stream << (Q_UINT32)(SampleRate);
+ //READ_FROM_STREAM(Q_UINT32,ByteRate);
+ stream << (Q_UINT32)(NumberOfChannels*SampleRate*16/8);
+ //READ_FROM_STREAM(Q_UINT16,BlockAlign);
+ stream << (Q_UINT16)(16/8 *NumberOfChannels);
+ //READ_FROM_STREAM(Q_UINT16,BitsPerSample);
+ stream << (Q_UINT16)(16);
+ SMAGIC("data");
+ //READ_FROM_STREAM(QByteArray,SoundData);
+ stream << SoundData;
+
+ file.close();
+
+}
+
+
+
+
+#if 0
+void Sound::load(const QString& filename)
+{
+ cout << "saout \n";
+ data=QMemArray<long unsigned int>();
+ static const int BUFFER_LEN = 4096;
+
+ //code from libtunepimp
+ //(wav_trm.cpp)
+
+ FILE *source;
+ unsigned char buffer[100], *copyBuffer;
+ unsigned int bytes;
+ unsigned long ulRIFF;
+ unsigned long ulLength;
+ unsigned long ulWAVE;
+ unsigned long ulType;
+ unsigned long ulCount;
+ unsigned long ulLimit;
+ bool haveWaveHeader = false;
+ unsigned long waveSize = 0;
+ WAVEFORMAT waveFormat;
+ int toRead;
+ mb_int64_t fileLen = 0;
+
+ source = fopen(filename.ascii(), "rb");
+ if (source == NULL)
+ {
+// errorString = string("File not found");
+// fclose(source);
+ cout << "File not found \n";
+ return;
+ }
+
+ fseek(source, 0, SEEK_END);
+ fileLen = ftell(source);
+ fseek(source, 0, SEEK_SET);
+
+ if (fread(buffer, 1, 12, source) != 12)
+ {
+// errorString = string("File is too short");
+ cout << "File is to short \n";
+ fclose(source);
+ return ;
+ }
+
+ ulRIFF = (unsigned long)(((unsigned long *)buffer)[0]);
+ ulLength = (unsigned long)(((unsigned long *)buffer)[1]);
+ ulWAVE = (unsigned long)(((unsigned long *)buffer)[2]);
+
+ if(ulRIFF != MAKEFOURCC('R', 'I', 'F', 'F') ||
+ ulWAVE != MAKEFOURCC('W', 'A', 'V', 'E'))
+ {
+// errorString = strdup("File is not in WAVE format");
+ cout << "File is not WAVE \n";
+ fclose(source);
+ return ;
+ }
+
+ // Run through the bytes looking for the tags
+ ulCount = 0;
+ ulLimit = ulLength - 4;
+ while (ulCount < ulLimit && waveSize == 0)
+ {
+ if (fread(buffer, 1, 8, source) != 8)
+ {
+// errorString = strdup("File is too short");
+ cout << "File is to short \n";
+ fclose(source);
+ return;
+ }
+
+ ulType = (unsigned long)(((unsigned long *)buffer)[0]);
+ ulLength = (unsigned long)(((unsigned long *)buffer)[1]);
+ switch (ulType)
+ {
+ // format
+ case MAKEFOURCC('f', 'm', 't', ' '):
+ if (ulLength < sizeof(WAVEFORMAT))
+ {
+// errorString = strdup("File is too short");
+ cout << "File is to short \n";
+ fclose(source);
+ return ;
+ }
+
+ if (fread(&waveFormat, 1, ulLength, source) != ulLength)
+ {
+// errorString = strdup("File is too short");
+ cout << "File is to short \n";
+ fclose(source);
+ return ;
+ }
+
+ if (waveFormat.wFormatTag != WAVE_FORMAT_PCM)
+ {
+// errorString = strdup("Unsupported WAV format");
+ cout << "Unsupported WAVE \n";
+ fclose(source);
+ return ;
+ }
+ haveWaveHeader = true;
+
+ ulCount += ulLength;
+ break;
+
+ // data
+ case MAKEFOURCC('d', 'a', 't', 'a'):
+ waveSize = ulLength;
+ break;
+
+ default:
+ fseek(source, ulLength, SEEK_CUR);
+ break;
+
+ }
+ }
+
+
+ if (!haveWaveHeader)
+ {
+// errorString = strdup("Could not find WAV header");
+ cout << "Header nbot found \n";
+ fclose(source);
+ return ;
+ }
+
+ fileLen -= (mb_int64_t)ftell(source);
+ fileLen /= waveFormat.nChannels;
+ fileLen /= (waveFormat.nBlockAlign / waveFormat.nChannels);
+
+ fileLen /= waveFormat.nSamplesPerSec;
+
+ //on ne lit qu'un channel
+ //waveSize=fileLen;
+ data.resize(waveSize);
+ unsigned long pos=0;
+
+ cout << "Weeee "<< waveSize <<"\n";
+
+ copyBuffer = (unsigned char*)malloc(BUFFER_LEN);
+ if (copyBuffer == NULL)
+ {
+// errorString = strdup("Cannot allocate buffer space.");
+ return ;
+ }
+
+ for(;;)
+ {
+ toRead = min(waveSize, (unsigned long)BUFFER_LEN);
+ if (toRead <= 0)
+ break;
+
+ bytes = fread(copyBuffer, 1, toRead, source);
+ if (bytes <= 0)
+ break;
+
+ for(uint f=0;f<bytes;f+=4)
+ {
+ data[pos]=(((unsigned long*)copyBuffer)[f/4]);
+ pos++;
+ }
+
+ waveSize -= toRead;
+ }
+ free(copyBuffer);
+ fclose(source);
+
+ return ;
+}
+
+#endif
diff --git a/khotkeys/shared/sound.h b/khotkeys/shared/sound.h
new file mode 100644
index 000000000..1a38f182f
--- /dev/null
+++ b/khotkeys/shared/sound.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef SOUND_H
+#define SOUND_H
+
+#include <qmemarray.h>
+#include <qstring.h>
+#include <kdemacros.h>
+
+/**
+@author Olivier Goffart
+*/
+class KDE_EXPORT Sound{
+public:
+ Sound();
+ ~Sound();
+
+ void load(const QString &filename);
+ void save(const QString &filename) const;
+
+ unsigned int size() const
+ {
+ return data.size();
+ }
+
+ inline float at(int pos) const
+ {
+ return (float)(data.at(pos))/max;
+ }
+
+ inline uint fs() const
+ {
+ return _fs;
+ }
+
+ QMemArray<Q_INT32> data;
+ Q_UINT32 max;
+ uint _fs;
+};
+
+#endif
diff --git a/khotkeys/shared/soundrecorder.cpp b/khotkeys/shared/soundrecorder.cpp
new file mode 100644
index 000000000..fc2031113
--- /dev/null
+++ b/khotkeys/shared/soundrecorder.cpp
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "soundrecorder.h"
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <qtimer.h>
+#include <klibloader.h>
+
+#include "khotkeysglobal.h"
+
+namespace KHotKeys
+{
+
+SoundRecorder::create_ptr SoundRecorder::create_fun = NULL;
+
+bool SoundRecorder::init( KLibrary* lib )
+{
+#ifdef HAVE_ARTS
+ if( create_fun == NULL && lib != NULL )
+ create_fun = (create_ptr) lib->symbol( "khotkeys_soundrecorder_create" );
+#endif
+// kdDebug( 1217 ) << "soundrecorder:" << create_fun << ":" << lib << endl;
+ return create_fun != NULL;
+}
+
+SoundRecorder* SoundRecorder::create( QObject* parent, const char* name )
+{
+#ifdef HAVE_ARTS
+ if( create_fun != NULL )
+ return create_fun( parent, name );
+#endif
+ return new SoundRecorder( parent, name );
+}
+
+SoundRecorder::SoundRecorder(QObject *parent, const char *name) : QObject(parent, name) {}
+
+SoundRecorder::~SoundRecorder()
+{
+}
+
+void SoundRecorder::start()
+{
+}
+
+void SoundRecorder::stop()
+{
+}
+
+void SoundRecorder::abort()
+{
+}
+
+
+Sound SoundRecorder::sound()
+{
+ Sound s;
+ return s;
+}
+
+}
+
+#include "soundrecorder.moc"
diff --git a/khotkeys/shared/soundrecorder.h b/khotkeys/shared/soundrecorder.h
new file mode 100644
index 000000000..d9539c4c5
--- /dev/null
+++ b/khotkeys/shared/soundrecorder.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef RECORDER_H
+#define RECORDER_H
+
+#include <qobject.h>
+#include "sound.h"
+#include <kdemacros.h>
+
+class KLibrary;
+
+namespace KHotKeys
+{
+
+
+
+/**
+@author Olivier Goffart
+*/
+class KDE_EXPORT SoundRecorder : public QObject
+{
+Q_OBJECT
+public:
+ static SoundRecorder* create( QObject* parent = 0, const char* name = 0 );
+ virtual ~SoundRecorder();
+
+ virtual void start();
+ virtual void stop();
+ virtual void abort();
+ virtual Sound sound();
+
+ static bool init( KLibrary* );
+signals:
+ void recorded(const Sound&);
+
+protected:
+ SoundRecorder(QObject *parent = 0, const char *name = 0);
+ typedef SoundRecorder* (*create_ptr)( QObject*, const char* );
+private:
+ static create_ptr create_fun;
+};
+
+}
+
+#endif
diff --git a/khotkeys/shared/triggers.cpp b/khotkeys/shared/triggers.cpp
new file mode 100644
index 000000000..1febedfa9
--- /dev/null
+++ b/khotkeys/shared/triggers.cpp
@@ -0,0 +1,435 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _TRIGGERS_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "triggers.h"
+
+#include <kglobalaccel.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kwinmodule.h>
+#include <klocale.h>
+#include <netwm_def.h>
+#include <kaccel.h>
+
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+
+#include "actions.h"
+#include "action_data.h"
+#include "input.h"
+#include "gestures.h"
+#include "windows.h"
+#include "voices.h"
+
+namespace KHotKeys
+{
+
+// Trigger
+
+void Trigger::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Type", "ERROR" );
+ }
+
+Trigger* Trigger::create_cfg_read( KConfig& cfg_P, Action_data* data_P )
+ {
+ QString type = cfg_P.readEntry( "Type" );
+ if( type == "SHORTCUT" || type == "SINGLE_SHORTCUT" )
+ return new Shortcut_trigger( cfg_P, data_P );
+ if( type == "WINDOW" )
+ return new Window_trigger( cfg_P, data_P );
+ if( type == "GESTURE" )
+ return new Gesture_trigger(cfg_P, data_P );
+ if( type == "VOICE" )
+ return new Voice_trigger (cfg_P, data_P );
+
+ kdWarning( 1217 ) << "Unknown Trigger type read from cfg file\n";
+ return NULL;
+ }
+
+// Trigger_list
+
+Trigger_list::Trigger_list( KConfig& cfg_P, Action_data* data_P )
+ : QPtrList< Trigger >()
+ {
+ setAutoDelete( true );
+ _comment = cfg_P.readEntry( "Comment" );
+ QString save_cfg_group = cfg_P.group();
+ int cnt = cfg_P.readNumEntry( "TriggersCount", 0 );
+ for( int i = 0;
+ i < cnt;
+ ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ Trigger* trigger = Trigger::create_cfg_read( cfg_P, data_P );
+ if( trigger )
+ append( trigger );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+void Trigger_list::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Comment", comment());
+ QString save_cfg_group = cfg_P.group();
+ int i = 0;
+ for( Iterator it( *this );
+ it;
+ ++it, ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ it.current()->cfg_write( cfg_P );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "TriggersCount", i );
+ }
+
+Trigger_list* Trigger_list::copy( Action_data* data_P ) const
+ {
+ Trigger_list* ret = new Trigger_list( comment());
+ for( Iterator it( *this );
+ it;
+ ++it )
+ ret->append( it.current()->copy( data_P ));
+ return ret;
+ }
+
+void Trigger_list::activate( bool activate_P )
+ {
+ for( Iterator it( *this );
+ it;
+ ++it )
+ ( *it )->activate( activate_P );
+ }
+
+// Shortcut_trigger
+
+Shortcut_trigger::Shortcut_trigger( Action_data* data_P, const KShortcut& shortcut_P )
+ : Trigger( data_P ), _shortcut( shortcut_P )
+ {
+ keyboard_handler->insert_item( shortcut(), this );
+ }
+
+Shortcut_trigger::Shortcut_trigger( KConfig& cfg_P, Action_data* data_P )
+ : Trigger( cfg_P, data_P ), _shortcut( cfg_P.readEntry( "Key", 0 ))
+ {
+ keyboard_handler->insert_item( shortcut(), this );
+ }
+
+Shortcut_trigger::~Shortcut_trigger()
+ {
+ keyboard_handler->remove_item( shortcut(), this );
+ }
+
+void Shortcut_trigger::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Key", _shortcut.toStringInternal());
+ cfg_P.writeEntry( "Type", "SHORTCUT" ); // overwrites value set in base::cfg_write()
+ }
+
+Shortcut_trigger* Shortcut_trigger::copy( Action_data* data_P ) const
+ {
+ kdDebug( 1217 ) << "Shortcut_trigger::copy()" << endl;
+ return new Shortcut_trigger( data_P ? data_P : data, shortcut());
+ }
+
+const QString Shortcut_trigger::description() const
+ {
+ // CHECKME vice mods
+ return i18n( "Shortcut trigger: " ) + _shortcut.toString();
+ // CHECKME i18n pro toString() ?
+ }
+
+bool Shortcut_trigger::handle_key( const KShortcut& shortcut_P )
+ {
+ if( shortcut() == shortcut_P )
+ {
+ windows_handler->set_action_window( 0 ); // use active window
+ data->execute();
+ return true;
+ }
+ return false;
+ }
+
+void Shortcut_trigger::activate( bool activate_P )
+ {
+ if( activate_P && khotkeys_active())
+ keyboard_handler->activate_receiver( this );
+ else
+ keyboard_handler->deactivate_receiver( this );
+ }
+
+// Window_trigger
+
+Window_trigger::Window_trigger( KConfig& cfg_P, Action_data* data_P )
+ : Trigger( cfg_P, data_P ), active( false )
+ {
+// kdDebug( 1217 ) << "Window_trigger" << endl;
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Windows" );
+ _windows = new Windowdef_list( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ window_actions = cfg_P.readNumEntry( "WindowActions" );
+ init();
+ }
+
+Window_trigger::~Window_trigger()
+ {
+// kdDebug( 1217 ) << "~Window_trigger :" << this << endl;
+ disconnect( windows_handler, NULL, this, NULL );
+ delete _windows;
+ }
+
+void Window_trigger::init()
+ {
+ kdDebug( 1217 ) << "Window_trigger::init()" << endl;
+ connect( windows_handler, SIGNAL( window_added( WId )), this, SLOT( window_added( WId )));
+ connect( windows_handler, SIGNAL( window_removed( WId )), this, SLOT( window_removed( WId )));
+ if( window_actions & ( WINDOW_ACTIVATES | WINDOW_DEACTIVATES /*| WINDOW_DISAPPEARS*/ ))
+ connect( windows_handler, SIGNAL( active_window_changed( WId )),
+ this, SLOT( active_window_changed( WId )));
+ connect( windows_handler, SIGNAL( window_changed( WId, unsigned int )),
+ this, SLOT( window_changed( WId, unsigned int )));
+ }
+
+void Window_trigger::activate( bool activate_P )
+ {
+ active = activate_P && khotkeys_active();
+ }
+
+void Window_trigger::window_added( WId window_P )
+ {
+ bool matches = windows()->match( Window_data( window_P ));
+ existing_windows[ window_P ] = matches;
+ kdDebug( 1217 ) << "Window_trigger::w_added() : " << matches << endl;
+ if( active && matches && ( window_actions & WINDOW_APPEARS ))
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+ }
+
+void Window_trigger::window_removed( WId window_P )
+ {
+ if( existing_windows.contains( window_P ))
+ {
+ bool matches = existing_windows[ window_P ];
+ kdDebug( 1217 ) << "Window_trigger::w_removed() : " << matches << endl;
+ if( active && matches && ( window_actions & WINDOW_DISAPPEARS ))
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+ existing_windows.remove( window_P );
+ // CHECKME jenze co kdyz se window_removed zavola pred active_window_changed ?
+ }
+ else
+ kdDebug( 1217 ) << "Window_trigger::w_removed()" << endl;
+ }
+
+void Window_trigger::active_window_changed( WId window_P )
+ {
+ bool was_match = false;
+ if( existing_windows.contains( last_active_window ))
+ was_match = existing_windows[ last_active_window ];
+ if( active && was_match && ( window_actions & WINDOW_DEACTIVATES ))
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+/* bool matches = windows()->match( Window_data( window_P ));
+ existing_windows[ window_P ] = matches;*/
+ bool matches = existing_windows.contains( window_P )
+ ? existing_windows[ window_P ] : false;
+ if( active && matches && ( window_actions & WINDOW_ACTIVATES ))
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+ kdDebug( 1217 ) << "Window_trigger::a_w_changed() : " << was_match << "|" << matches << endl;
+ last_active_window = window_P;
+ }
+
+void Window_trigger::window_changed( WId window_P, unsigned int dirty_P )
+ { // CHECKME snad nebude mit vliv, kdyz budu kaslat na properties_P a zkratka
+ // kontrolovat kazdou zmenu
+ // CHECKME kdyz se zmeni okno z match na non-match, asi to nebrat jako DISAPPEAR
+ if( ! ( dirty_P & ( NET::WMName | NET::WMWindowType )))
+ return;
+ kdDebug( 1217 ) << "Window_trigger::w_changed()" << endl;
+ bool was_match = false;
+ if( existing_windows.contains( window_P ))
+ was_match = existing_windows[ window_P ];
+ bool matches = windows()->match( Window_data( window_P ));
+ existing_windows[ window_P ] = matches;
+ if( active && matches && !was_match )
+ if( window_actions & WINDOW_APPEARS )
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+ else if( window_actions & WINDOW_ACTIVATES && window_P == windows_handler->active_window())
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+ kdDebug( 1217 ) << "Window_trigger::w_changed() : " << was_match << "|" << matches << endl;
+ }
+
+void Window_trigger::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ QString save_cfg_group = cfg_P.group();
+ cfg_P.setGroup( save_cfg_group + "Windows" );
+ windows()->cfg_write( cfg_P );
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "WindowActions", window_actions );
+ cfg_P.writeEntry( "Type", "WINDOW" ); // overwrites value set in base::cfg_write()
+ }
+
+#ifndef COVARIANT_RETURN_BROKEN // stupid gcc, it doesn't even warn it can't do this
+Window_trigger* Window_trigger::copy( Action_data* data_P ) const
+#else
+Trigger* Window_trigger::copy( Action_data* data_P ) const
+#endif
+ {
+ Window_trigger* ret = new Window_trigger( data_P ? data_P : data, windows()->copy(),
+ window_actions );
+ ret->existing_windows = existing_windows; // CHECKME je tohle vazne treba ?
+ return ret;
+ }
+
+const QString Window_trigger::description() const
+ {
+ return i18n( "Window trigger: " ) + windows()->comment();
+ }
+
+// Gesture_trigger
+
+Gesture_trigger::Gesture_trigger( Action_data* data_P, const QString &gesturecode_P )
+ : Trigger( data_P ), _gesturecode( gesturecode_P )
+ {
+ }
+
+Gesture_trigger::Gesture_trigger( KConfig& cfg_P, Action_data* data_P )
+ : Trigger( cfg_P, data_P )
+ {
+ _gesturecode = cfg_P.readEntry( "Gesture" );
+ }
+
+Gesture_trigger::~Gesture_trigger()
+ {
+ gesture_handler->unregister_handler( this, SLOT( handle_gesture( const QString&, WId )));
+ }
+
+void Gesture_trigger::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Gesture", gesturecode());
+ cfg_P.writeEntry( "Type", "GESTURE" ); // overwrites value set in base::cfg_write()
+ }
+
+Trigger* Gesture_trigger::copy( Action_data* data_P ) const
+ {
+ kdDebug( 1217 ) << "Gesture_trigger::copy()" << endl;
+ return new Gesture_trigger( data_P ? data_P : data, gesturecode());
+ }
+
+const QString Gesture_trigger::description() const
+ {
+ return i18n( "Gesture trigger: " ) + gesturecode();
+ }
+
+void Gesture_trigger::handle_gesture( const QString &gesture_P, WId window_P )
+ {
+ if( gesturecode() == gesture_P )
+ {
+ windows_handler->set_action_window( window_P );
+ data->execute();
+ }
+ }
+
+void Gesture_trigger::activate( bool activate_P )
+ {
+ if( activate_P )
+ gesture_handler->register_handler( this, SLOT( handle_gesture( const QString&, WId )));
+ else
+ gesture_handler->unregister_handler( this, SLOT( handle_gesture( const QString&, WId )));
+ }
+
+
+// Voice_trigger
+
+ Voice_trigger::Voice_trigger( Action_data* data_P, const QString &Voicecode_P, const VoiceSignature& signature1_P, const VoiceSignature& signature2_P )
+ : Trigger( data_P ), _voicecode( Voicecode_P )
+ {
+ _voicesignature[0]=signature1_P;
+ _voicesignature[1]=signature2_P;
+ }
+
+Voice_trigger::Voice_trigger( KConfig& cfg_P, Action_data* data_P )
+ : Trigger( cfg_P, data_P )
+ {
+ _voicecode = cfg_P.readEntry( "Name" );
+ _voicesignature[0].read( &cfg_P , "Signature1" );
+ _voicesignature[1].read( &cfg_P , "Signature2" );
+ }
+
+Voice_trigger::~Voice_trigger()
+ {
+ voice_handler->unregister_handler( this );
+ }
+
+void Voice_trigger::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Name", voicecode());
+ cfg_P.writeEntry( "Type", "VOICE" ); // overwrites value set in base::cfg_write()
+ _voicesignature[0].write( &cfg_P , "Signature1" );
+ _voicesignature[1].write( &cfg_P , "Signature2" );
+ }
+
+Trigger* Voice_trigger::copy( Action_data* data_P ) const
+ {
+ kdDebug( 1217 ) << "Voice_trigger::copy()" << endl;
+ return new Voice_trigger( data_P ? data_P : data, voicecode(), voicesignature(1) , voicesignature(2) );
+ }
+
+const QString Voice_trigger::description() const
+ {
+ return i18n( "Voice trigger: " ) + voicecode();
+ }
+
+void Voice_trigger::handle_Voice( )
+ {
+ windows_handler->set_action_window( 0 ); // use active window
+ data->execute();
+
+ }
+
+void Voice_trigger::activate( bool activate_P )
+ {
+ if( activate_P && khotkeys_active())
+ voice_handler->register_handler( this );
+ else
+ voice_handler->unregister_handler( this );
+ }
+
+
+} // namespace KHotKeys
+
+#include "triggers.moc"
diff --git a/khotkeys/shared/triggers.h b/khotkeys/shared/triggers.h
new file mode 100644
index 000000000..2f921beff
--- /dev/null
+++ b/khotkeys/shared/triggers.h
@@ -0,0 +1,260 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _TRIGGERS_H_
+#define _TRIGGERS_H_
+
+#include <qptrlist.h>
+#include <qtimer.h>
+#include <qmap.h>
+#include <kdemacros.h>
+
+#include "khotkeysglobal.h"
+#include "voicesignature.h"
+
+#include "input.h"
+
+class KConfig;
+
+namespace KHotKeys
+{
+
+class Windowdef_list;
+class Action_data;
+
+class KDE_EXPORT Trigger
+ {
+ public:
+ Trigger( Action_data* data_P );
+ Trigger( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Trigger();
+ virtual void cfg_write( KConfig& cfg_P ) const = 0;
+ virtual Trigger* copy( Action_data* data_P ) const = 0;
+ virtual const QString description() const = 0;
+ static Trigger* create_cfg_read( KConfig& cfg_P, Action_data* data_P );
+ virtual void activate( bool activate_P ) = 0;
+ protected:
+ Action_data* const data;
+ KHOTKEYS_DISABLE_COPY( Trigger );
+ };
+
+class KDE_EXPORT Trigger_list
+ : public QPtrList< Trigger >
+ {
+ public:
+ Trigger_list( const QString& comment_P ); // CHECKME nebo i data ?
+ Trigger_list( KConfig& cfg_P, Action_data* data_P );
+ void activate( bool activate_P );
+ void cfg_write( KConfig& cfg_P ) const;
+ typedef QPtrListIterator< Trigger > Iterator;
+ const QString& comment() const;
+ Trigger_list* copy( Action_data* data_P ) const;
+ private:
+ QString _comment;
+ KHOTKEYS_DISABLE_COPY( Trigger_list );
+ };
+
+class KDE_EXPORT Shortcut_trigger
+ : public Trigger, public Kbd_receiver
+ {
+ typedef Trigger base;
+ public:
+ Shortcut_trigger( Action_data* data_P, const KShortcut& shortcut_P );
+ Shortcut_trigger( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Shortcut_trigger();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual Shortcut_trigger* copy( Action_data* data_P ) const;
+ virtual const QString description() const;
+ const KShortcut& shortcut() const;
+ virtual bool handle_key( const KShortcut& shortcut_P );
+ virtual void activate( bool activate_P );
+ private:
+ KShortcut _shortcut;
+ };
+
+class KDE_EXPORT Window_trigger
+ : public QObject, public Trigger
+ {
+ Q_OBJECT
+ typedef Trigger base;
+ public:
+ enum window_action_t
+ {
+ WINDOW_APPEARS = ( 1 << 0 ),
+ WINDOW_DISAPPEARS = ( 1 << 1 ),
+ WINDOW_ACTIVATES = ( 1 << 2 ),
+ WINDOW_DEACTIVATES = ( 1 << 3 )
+ };
+ Window_trigger( Action_data* data_P, Windowdef_list* windows_P, int window_actions_P );
+ Window_trigger( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Window_trigger();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+#ifndef COVARIANT_RETURN_BROKEN // stupid gcc, it doesn't even warn it can't do this
+ virtual Window_trigger* copy( Action_data* data_P ) const;
+#else
+ virtual Trigger* copy( Action_data* data_P ) const;
+#endif
+ virtual const QString description() const;
+ const Windowdef_list* windows() const;
+ bool triggers_on( window_action_t w_action_P ) const;
+ virtual void activate( bool activate_P );
+ protected: // CHECKME neco private ?
+ Windowdef_list* _windows;
+ int window_actions;
+ void init();
+ typedef QMap< WId, bool > Windows_map;
+ Windows_map existing_windows;
+ WId last_active_window;
+ protected slots:
+ void window_added( WId window_P );
+ void window_removed( WId window_P );
+ void active_window_changed( WId window_P );
+ void window_changed( WId window_P, unsigned int dirty_P );
+ protected:
+ bool active;
+ };
+
+class KDE_EXPORT Gesture_trigger
+ : public QObject, public Trigger
+ {
+ Q_OBJECT
+ typedef Trigger base;
+ public:
+ Gesture_trigger( Action_data* data_P, const QString& gesture_P );
+ Gesture_trigger( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Gesture_trigger();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual Trigger* copy( Action_data* data_P ) const;
+ virtual const QString description() const;
+ const QString& gesturecode() const;
+ virtual void activate( bool activate_P );
+ protected slots:
+ void handle_gesture( const QString& gesture_P, WId window_P );
+ private:
+ QString _gesturecode;
+ };
+
+
+class KDE_EXPORT Voice_trigger
+ : public QObject, public Trigger
+ {
+ Q_OBJECT
+ typedef Trigger base;
+ public:
+ Voice_trigger( Action_data* data_P, const QString& Voice_P, const VoiceSignature & signature1_P, const VoiceSignature & signature2_P );
+ Voice_trigger( KConfig& cfg_P, Action_data* data_P );
+ virtual ~Voice_trigger();
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ virtual Trigger* copy( Action_data* data_P ) const;
+ virtual const QString description() const;
+ const QString& voicecode() const;
+ virtual void activate( bool activate_P );
+ VoiceSignature voicesignature( int ech ) const;
+ public slots:
+ void handle_Voice( );
+ private:
+ QString _voicecode;
+ VoiceSignature _voicesignature[2];
+ };
+
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Trigger
+
+inline
+Trigger::Trigger( Action_data* data_P )
+ : data( data_P )
+ {
+ }
+
+inline
+Trigger::Trigger( KConfig&, Action_data* data_P )
+ : data( data_P )
+ {
+ }
+
+inline
+Trigger::~Trigger()
+ {
+ }
+
+// Trigger_list
+
+inline
+Trigger_list::Trigger_list( const QString& comment_P )
+ : QPtrList< Trigger >(), _comment( comment_P )
+ {
+ setAutoDelete( true );
+ }
+
+inline
+const QString& Trigger_list::comment() const
+ {
+ return _comment;
+ }
+
+// Shortcut_trigger
+
+inline
+const KShortcut& Shortcut_trigger::shortcut() const
+ {
+ return _shortcut;
+ }
+
+// Window_trigger
+
+inline
+Window_trigger::Window_trigger( Action_data* data_P, Windowdef_list* windows_P,
+ int window_actions_P )
+ : Trigger( data_P ), _windows( windows_P ), window_actions( window_actions_P ),
+ last_active_window( None ), active( false )
+ {
+ init();
+ }
+
+inline
+const Windowdef_list* Window_trigger::windows() const
+ {
+ return _windows;
+ }
+
+inline
+bool Window_trigger::triggers_on( window_action_t w_action_P ) const
+ {
+ return window_actions & w_action_P;
+ }
+
+// Gesture_trigger
+
+inline
+const QString& Gesture_trigger::gesturecode() const
+ {
+ return _gesturecode;
+ }
+
+// Voice_trigger
+inline
+const QString& Voice_trigger::voicecode() const
+ {
+ return _voicecode;
+ }
+
+inline
+VoiceSignature Voice_trigger::voicesignature(int ech) const
+ {
+ return _voicesignature[ech-1];
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/voices.cpp b/khotkeys/shared/voices.cpp
new file mode 100644
index 000000000..e0dc95613
--- /dev/null
+++ b/khotkeys/shared/voices.cpp
@@ -0,0 +1,303 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "voices.h"
+#include "voicesignature.h"
+#include "triggers.h"
+#include "soundrecorder.h"
+
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kxerrorhandler.h>
+#include <kkeynative.h>
+#include <qtimer.h>
+#include <kglobalaccel.h>
+
+
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+
+namespace KHotKeys
+{
+
+Voice* voice_handler;
+
+Voice::Voice( bool enabled_P, QObject* parent_P )
+ : QObject( parent_P) ,_enabled( enabled_P ), _recording( false ), _recorder(0)
+ {
+ assert( voice_handler == NULL );
+ voice_handler = this;
+
+ _kga=0L;
+ _timer=0L;
+
+ kdDebug(1217) << k_funcinfo << endl;
+
+ }
+
+Voice::~Voice()
+ {
+ kdDebug(1217) << k_funcinfo << endl;
+ enable( false );
+ voice_handler = NULL;
+ }
+
+
+void Voice::enable( bool enabled_P )
+ {
+#ifndef HAVE_ARTS
+ enabled_P = false; // never enabled when there's no support
+#endif
+ if( _enabled == enabled_P )
+ return;
+ _enabled = enabled_P;
+ if( _enabled ) // activate the shortcut
+ set_shortcut( _shortcut );
+ else
+ {
+ delete _kga;
+ _kga = NULL;
+ }
+ }
+
+void Voice::register_handler( Voice_trigger *trigger_P )
+ {
+ if( !_references.contains( trigger_P ))
+ _references.append(trigger_P);
+ }
+
+void Voice::unregister_handler( Voice_trigger *trigger_P )
+ {
+ _references.remove(trigger_P);
+ }
+
+
+void Voice::record_start()
+{
+ kdDebug(1217) << k_funcinfo << endl;
+ if(!_recorder)
+ {
+ _recorder= SoundRecorder::create(this);
+ connect(_recorder, SIGNAL(recorded(const Sound& )), this, SLOT(slot_sound_recorded(const Sound& )));
+ }
+
+ _recorder->start();
+ _recording=true;
+}
+
+void Voice::record_stop()
+{
+ if(!_recording)
+ return;
+
+ kdDebug(1217) << k_funcinfo << endl;
+ delete _timer;
+ _timer=0L;
+ _recording=false;
+ if(_recorder)
+ _recorder->stop();
+}
+
+
+void Voice::slot_sound_recorded(const Sound &sound_P)
+{
+ VoiceSignature signature(sound_P);
+
+ Voice_trigger *trig=0L;
+ Voice_trigger *sec_trig=0L;
+ double minimum=800000;
+ double second_minimum=80000;
+ int got_count=0;
+ QValueList<Voice_trigger*>::Iterator it;
+ for ( it = _references.begin(); it != _references.end(); ++it )
+ {
+ for(int ech=1; ech<=2 ; ech++)
+ {
+ Voice_trigger *t=*it;
+
+ double diff=VoiceSignature::diff(signature, t->voicesignature(ech));
+ if(minimum>=diff)
+ {
+ second_minimum=minimum;
+ minimum=diff;
+ sec_trig=trig;
+ trig=t;
+ }
+ else if(second_minimum>=diff)
+ {
+ second_minimum=diff;
+ sec_trig=t;
+ }
+ if( diff < REJECT_FACTOR_DIFF )
+ got_count++;
+ kdDebug(1217) << k_funcinfo << ( (diff < REJECT_FACTOR_DIFF) ? "+++" : "---" ) <<t->voicecode() << ech << " : " << diff << endl;
+ }
+ }
+// double ecart_relatif=(second_minimum-minimum)/minimum;
+
+// kdDebug(1217) << k_funcinfo << ecart_relatif << endl;
+
+ if(trig)
+ kdDebug(1217) << k_funcinfo << "**** " << trig->voicecode() << " : " << minimum << endl;
+
+
+// if(trig && ecart_relatif > REJECT_FACTOR_ECART_REL)
+// if(trig && got_count==1)
+ bool selected=trig && (got_count==1 || ( minimum < 1.5*REJECT_FACTOR_DIFF && trig==sec_trig ) );
+
+ if(selected)
+ {
+ trig->handle_Voice();
+ }
+
+}
+
+
+/*bool Voice::x11Event( XEvent* pEvent )
+{
+ if( pEvent->type != XKeyPress && pEvent->type != XKeyRelease )
+ return false;
+
+ KKeyNative keyNative( pEvent );
+
+ //kdDebug(1217) << k_funcinfo << keyNative.key().toString() << endl;
+
+ if(_shortcut.contains(keyNative))
+ {
+ if(pEvent->type == XKeyPress && !_recording )
+ {
+ record_start();
+ return true;
+ }
+ if(pEvent->type == XKeyRelease && _recording )
+ {
+ record_stop();
+ return true;
+ }
+ }
+ return false;
+}
+
+
+*/
+
+
+void Voice::set_shortcut( const KShortcut &shortcut)
+{
+ _shortcut = shortcut;
+ if( !_enabled )
+ return;
+ if(!_kga)
+ _kga = new KGlobalAccel( this );
+ _kga->remove("voice");
+
+ _kga->insert( "voice", i18n("Voice"), QString::null, shortcut, 0, this, SLOT(slot_key_pressed())) ;
+ _kga->updateConnections();
+}
+
+void Voice::slot_key_pressed()
+{
+ if( !haveArts())
+ return;
+ if( _recording )
+ record_stop();
+ else
+ {
+ record_start();
+ if(!_timer)
+ {
+ _timer=new QTimer(this);
+ connect(_timer, SIGNAL(timeout()) , this, SLOT(slot_timeout()));
+ }
+
+ _timer->start(1000*20,true);
+ }
+}
+
+
+void Voice::slot_timeout()
+{
+ if(_recording && _recorder)
+ {
+ _recorder->abort();
+ _recording=false;
+ }
+ _timer->deleteLater();
+ _timer=0L;
+}
+
+
+QString Voice::isNewSoundFarEnough(const VoiceSignature& signature, const QString &currentTrigger)
+{
+ Voice_trigger *trig=0L;
+ Voice_trigger *sec_trig=0L;
+ double minimum=800000;
+ double second_minimum=80000;
+ int got_count=0;
+ QValueList<Voice_trigger*>::Iterator it;
+ for ( it = _references.begin(); it != _references.end(); ++it )
+ {
+ Voice_trigger *t=*it;
+ if(t->voicecode()==currentTrigger)
+ continue;
+
+ for(int ech=1; ech<=2 ; ech++)
+ {
+ double diff=VoiceSignature::diff(signature, t->voicesignature(ech));
+ if(minimum>=diff)
+ {
+ second_minimum=minimum;
+ minimum=diff;
+ sec_trig=trig;
+ trig=t;
+ }
+ else if(second_minimum>=diff)
+ {
+ second_minimum=diff;
+ sec_trig=t;
+ }
+ if( diff < REJECT_FACTOR_DIFF )
+ got_count++;
+ kdDebug(1217) << k_funcinfo << ( (diff < REJECT_FACTOR_DIFF) ? "+++" : "---" ) <<t->voicecode() << ech << " : " << diff << endl;
+ }
+ }
+
+ if(trig)
+ kdDebug(1217) << k_funcinfo << "**** " << trig->voicecode() << " : " << minimum << endl;
+
+ bool selected=trig && ((got_count==1 && minimum < REJECT_FACTOR_DIFF*0.7 ) || ( minimum < REJECT_FACTOR_DIFF && trig==sec_trig ) );
+ return selected ? trig->voicecode() : QString::null;
+}
+
+bool Voice::doesVoiceCodeExists(const QString &vc)
+{
+ QValueList<Voice_trigger*>::Iterator it;
+ for ( it = _references.begin(); it != _references.end(); ++it )
+ {
+ Voice_trigger *t=*it;
+ if(t->voicecode()==vc)
+ return true;
+ }
+ return false;
+}
+
+} // namespace KHotKeys
+
+#include "voices.moc"
diff --git a/khotkeys/shared/voices.h b/khotkeys/shared/voices.h
new file mode 100644
index 000000000..b0193e7c2
--- /dev/null
+++ b/khotkeys/shared/voices.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2005 Olivier Goffart <ogoffart @ kde.org>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef VOICES_H_
+#define VOICES_H_
+
+#include <qwidget.h>
+#include <kshortcut.h>
+
+class Sound;
+class QTimer;
+class KGlobalAccel;
+
+namespace KHotKeys
+{
+
+class Voice;
+class SoundRecorder;
+
+class Voice_trigger;
+class VoiceSignature;
+
+
+class KDE_EXPORT Voice : public QObject
+ {
+ Q_OBJECT
+ public:
+ Voice( bool enabled_P, QObject* parent_P );
+ virtual ~Voice();
+ void enable( bool enable_P );
+
+ void register_handler( Voice_trigger* );
+ void unregister_handler( Voice_trigger* );
+// bool x11Event( XEvent* e );
+
+ void set_shortcut( const KShortcut &k);
+
+ /**
+ * return QString::null is a new signature is far enough from others signature
+ * otherwise, return the stringn which match.
+ */
+ QString isNewSoundFarEnough(const VoiceSignature& s, const QString& currentTrigger);
+
+ bool doesVoiceCodeExists(const QString &s);
+
+ public slots:
+ void record_start();
+ void record_stop();
+
+ private slots:
+ void slot_sound_recorded( const Sound & );
+ void slot_key_pressed();
+ void slot_timeout();
+
+ signals:
+ void handle_voice( const QString &voice );
+ private:
+
+ bool _enabled;
+ bool _recording;
+
+ QValueList<Voice_trigger *> _references;
+ SoundRecorder *_recorder;
+
+ KShortcut _shortcut;
+ KGlobalAccel *_kga;
+
+ QTimer *_timer;
+ };
+
+
+KDE_EXPORT extern Voice* voice_handler;
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/shared/voicesignature.cpp b/khotkeys/shared/voicesignature.cpp
new file mode 100644
index 000000000..c77c278b3
--- /dev/null
+++ b/khotkeys/shared/voicesignature.cpp
@@ -0,0 +1,422 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#include "voicesignature.h"
+#include "sound.h"
+#include <kconfig.h>
+
+#include <math.h>
+#ifdef PI
+#undef PI
+#endif
+#define PI (2.0 * asin(1.0))
+
+
+#include <kdebug.h>
+#include <qdatetime.h>
+
+#undef Complex
+
+namespace KHotKeys
+{
+
+
+inline static float ABS(float X)
+{
+ return (X>0) ? X : -X ;
+}
+inline static int MAX(int X , int Y)
+{
+ return (X>Y) ? X : Y ;
+}
+inline static int MIN(int X , int Y)
+{
+ return (X<Y) ? X : Y ;
+}
+
+
+
+
+
+
+class Complex
+{
+ public:
+ Complex () {}
+ Complex (double re): _re(re), _im(0.0) {}
+ Complex (double re, double im): _re(re), _im(im) {}
+ double Re () const { return _re; }
+ double Im () const { return _im; }
+ void operator += (const Complex& c)
+ {
+ _re += c._re;
+ _im += c._im;
+ }
+ void operator -= (const Complex& c)
+ {
+ _re -= c._re;
+ _im -= c._im;
+ }
+ void operator *= (const Complex& c)
+ {
+ double reT = c._re * _re - c._im * _im;
+ _im = c._re * _im + c._im * _re;
+ _re = reT;
+ }
+ Complex operator- ()
+ {
+ return Complex (-_re, -_im);
+ }
+ Complex operator- (const Complex& c) const
+ {
+ return Complex (_re - c._re, _im - c._im);
+ }
+ Complex operator+ (const Complex& c) const
+ {
+ return Complex (_re + c._re, _im + c._im);
+ }
+ Complex operator* (const Complex& c) const
+ {
+ return Complex (_re * c._re - _im * c._im , _im * c._re + _re * c._im);
+ }
+ double Mod () const { return sqrt (_re * _re + _im * _im); }
+
+ static Complex fromExp(double mod, double arg) { return Complex(mod*cos(arg) , mod*sin(arg)); }
+ private:
+ double _re;
+ double _im;
+};
+
+static inline double hamming(uint n, uint size)
+{
+ return HAMMING ? 0.54-0.46*cos( 2*PI*n /(size-1) ) : 1;
+}
+
+
+static QMemArray<double> fft(const Sound& sound, unsigned int start, unsigned int stop)
+{
+ if(start>=stop || sound.size() == 0)
+ return QMemArray<double>();
+
+ //We need a sample with a size of a power of two
+ uint size=stop-start;
+ unsigned short log2size=0;
+ while( (1<<log2size) < size )
+ log2size++;
+
+ int diff=(1<<log2size) - size;
+ if(diff > size/4 || 1<<log2size > sound.size() )
+ {
+ log2size--;
+ diff=(1<<log2size) - size;
+ }
+ size=1<<log2size;
+ int start2=start-diff/2;
+ int stop2=start2+ size;
+ if(start2<0)
+ {
+ stop2-=start2;
+ start2=0;
+ }
+ if(stop2>sound.size())
+ {
+ start2-= stop2 - sound.size();
+ stop2=sound.size();
+ if(start2<0)
+ {
+ stop2-=start2;
+ start2=0;
+ }
+ }
+
+ //Generate an array to work in
+ QMemArray<Complex> samples(size);
+
+ //Fill it with samples in the "reversed carry" order
+ int rev_carry = 0;
+ for (uint f = 0; f < size - 1; f++)
+ {
+ samples[f]=sound.at(start2+rev_carry)* hamming(rev_carry, size);
+// KDEBUG(rev_carry);
+ int mask = size>>1; // N / 2
+ // add 1 backwards
+ while (rev_carry >= mask)
+ {
+ rev_carry -= mask; // turn off this bit
+ mask >>= 1;
+ }
+ rev_carry += mask;
+ }
+ samples[size-1]=sound.at(start2+size-1)*hamming(size-1, size);
+
+ //FFT
+ for(uint level=0; level < log2size; level++)
+ {
+ for( int k=0; k< (size>>1) ; k++)
+ {
+ uint indice1 = (k << (level+1) ) % (size-1); // (k*2*2^l)%(N-1)
+ uint indice2 = indice1 + (1<<level); // (k*2*2^l)%(N-1) + 2^l
+
+ uint coefW = ( k << (level+1) ) / (size-1); // (k*2*2^l) div (N-1)
+ double Wexpn=-2 * PI * coefW / (2 << level); // -2 pi n / 2^(l+1)
+ Complex W=Complex::fromExp(1, Wexpn) ;
+
+
+ //OPERATION BUTTERFLY
+ Complex a=samples[indice1];
+ Complex b=samples[indice2];
+ samples[indice1]=a+W*b;
+ samples[indice2]=a-W*b;
+
+// kdDebug() << k_funcinfo << "PAPILLON s_" << indice1 << " s_" << indice2 << " W_" << (2<<level) << "^" << coefW << endl;
+ }
+ }
+
+ QMemArray<double> result(size);
+ for(uint f=0;f<size;f++)
+ {
+ result[f]=samples[f].Mod() / size;
+
+ }
+ return result;
+}
+
+
+
+
+QMemArray<double> VoiceSignature::fft(const Sound& sound, unsigned int start, unsigned int stop)
+{
+ return KHotKeys::fft(sound, start, stop);
+ /*QMemArray<double> result(8000);
+ for(int f=0; f<8000;f++)
+ {
+ Complex c(0);
+
+ for(uint x=start; x<stop; x++)
+ {
+ Complex s(sound.at(x));
+ double angle=-2*PI*f*x/8000;
+ s*= Complex( cos(angle) , sin(angle) );
+ c+=s;
+ }
+ result[f]= c.Mod()/(stop-start) ;
+ }
+ return result;*/
+}
+
+bool VoiceSignature::window(const Sound& sound, unsigned int *_start, unsigned int *_stop)
+{
+ bool isNoise=false;
+ unsigned int length=sound.size();
+ uint unit=WINDOW_UNIT;
+ if(length < unit )
+ return false;
+
+ //Fen�trage
+ unsigned int start=0 , stop=0;
+ double moy=0;
+ for(uint x=0;x<unit;x++)
+ {
+ moy+=ABS(sound.at(x));
+ }
+
+ if(moy>WINDOW_MINIMUM*unit)
+ isNoise=true;
+
+ for(uint x=unit; x<length; x++)
+ {
+ if(moy<WINDOW_MINIMUM*unit)
+ {
+ if(stop==0)
+ start=x-unit/2;
+ }
+ else
+ stop=x-unit/2;
+ moy+=ABS(sound.at(x));
+ moy-=ABS(sound.at(x-unit));
+
+ }
+
+ if(moy>WINDOW_MINIMUM*unit && isNoise)
+ return false;
+
+ stop=MIN(length,stop+WINDOW_MINIMUM_ECART);
+ start=MAX(0 ,start-WINDOW_MINIMUM_ECART);
+
+ if(_start)
+ *_start=start;
+ if(_stop)
+ *_stop=stop;
+ return start<stop;
+}
+
+//finally doesn't give better results
+/*#define HZ_TO_MEL(F) (1127*log(1+(F)/700.0))
+#define MEL_TO_HZ(M) ( ( exp((M)/1127.0) -1) *700 )*/
+#define HZ_TO_MEL(F) (F)
+#define MEL_TO_HZ(F) (F)
+
+
+VoiceSignature::VoiceSignature(const Sound& sound)
+{
+ static uint temp_wind=0, temp_fft=0, temp_moy=0;
+ QTime t;
+ t.start();
+
+ unsigned int start , stop;
+ if(!window(sound,&start,&stop))
+ {
+ kdWarning( 1217 ) << k_funcinfo << "No voice found in the sound" << endl ;
+ return;
+ }
+
+ temp_wind+=t.restart();
+
+ uint length=stop-start;
+
+ for(int wind=0; wind<WINDOW_NUMBER; wind++)
+ {
+ unsigned int w_start=MAX(start, start+ (int)((wind - WINDOW_SUPER)*length/WINDOW_NUMBER));
+ unsigned int w_stop =MIN(stop , start+ (int)((wind+1.0+WINDOW_SUPER)*length/WINDOW_NUMBER));
+
+
+ QMemArray<double> fourrier=fft(sound, w_start,w_stop);
+
+ temp_fft+=t.restart();
+
+ //MEL conversion
+ double mel_start=HZ_TO_MEL(FFT_RANGE_INF);
+ uint mel_stop=HZ_TO_MEL(FFT_RANGE_SUP);
+
+ for(int four=0; four<FOUR_NUMBER; four++)
+ {
+ unsigned int wf_start=mel_start + four*(mel_stop-mel_start)/FOUR_NUMBER;
+ unsigned int wf_stop=mel_start + (four+1)*(mel_stop-mel_start)/FOUR_NUMBER;
+
+ unsigned int f_start=MEL_TO_HZ( wf_start )*fourrier.size()/sound.fs();
+ unsigned int f_stop=MEL_TO_HZ( wf_stop )*fourrier.size()/sound.fs();
+ unsigned int f_size=f_stop-f_start;
+
+ double nb=0;
+ for(uint f=f_start; f<f_stop; f++)
+ {
+ int freq=f*fourrier.size()/sound.fs();
+ nb+=fourrier[f]*FFT_PONDERATION(freq);
+ }
+ nb/=(f_size);
+ data[wind][four]=nb;
+ }
+
+ temp_moy+=t.restart();
+
+ }
+
+// kdDebug( 1217 ) << k_funcinfo << "wind: "<< temp_wind << " - fft: " << temp_fft << " - moy: " << temp_moy << endl;
+}
+
+
+
+VoiceSignature::~VoiceSignature()
+{
+}
+
+
+
+float VoiceSignature::diff(const VoiceSignature &s1, const VoiceSignature &s2)
+{
+ if(s1.isNull() || s2.isNull())
+ return 1000000;
+#if 0
+ double result=0;
+ for(int x=0;x<WINDOW_NUMBER;x++)
+ for(int y=0;y<FOUR_NUMBER;y++)
+ {
+ double d1=s1.data[x][y]-s2.data[x][y];
+ result+= d1*d1;//*pond[x][y];
+ }
+ return result;
+#endif
+
+ //DTW
+ // http://tcts.fpms.ac.be/cours/1005-08/speech/projects/2001/delfabro_henry_poitoux/
+
+ const int I=WINDOW_NUMBER;
+ const int J=WINDOW_NUMBER;
+ double g[I+1][J+1];
+ for(int f=1;f<=J;f++)
+ g[0][f]=10000000;
+ for(int f=1;f<=I;f++)
+ g[f][0]=10000000;
+ g[0][0]=0;
+ for(int i=1;i<=I;i++)
+ for(int j=1;j<=J;j++)
+ {
+ double d=0;
+ for(int f=0;f<FOUR_NUMBER;f++)
+ {
+ double d1=s1.data[i-1][f]-s2.data[j-1][f];
+ d+= d1*d1;//*pond[x][y];
+ }
+ d=sqrt(d);
+ g[i][j]=QMIN(QMIN( g[i-1][j]+d, g[i][j-1]+d ) , g[i-1][j-1]+d+d );
+ }
+
+ return g[I][J]/(I+J);
+}
+
+
+
+
+
+int VoiceSignature::size1()
+{
+ return WINDOW_NUMBER;
+}
+
+int VoiceSignature::size2()
+{
+ return FOUR_NUMBER;
+}
+
+QMap<int, QMap<int, double> > VoiceSignature::pond;
+
+
+
+void VoiceSignature::write(KConfigBase *cfg, const QString &key) const
+{
+ QStringList sl;
+ for(int x=0;x<WINDOW_NUMBER;x++)
+ for(int y=0;y<FOUR_NUMBER;y++)
+ {
+ sl.append( QString::number(data[x][y]) );
+ }
+ cfg->writeEntry(key,sl);
+}
+
+void VoiceSignature::read(KConfigBase *cfg, const QString &key)
+{
+ QStringList sl=cfg->readListEntry(key);
+ for(int x=0;x<WINDOW_NUMBER;x++)
+ for(int y=0;y<FOUR_NUMBER;y++)
+ {
+ data[x][y]= sl[x*FOUR_NUMBER+y].toDouble();
+ }
+}
+
+}
diff --git a/khotkeys/shared/voicesignature.h b/khotkeys/shared/voicesignature.h
new file mode 100644
index 000000000..b4857efd2
--- /dev/null
+++ b/khotkeys/shared/voicesignature.h
@@ -0,0 +1,101 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Olivier Goffart *
+ * *
+ * 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 2 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 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef SIGNATURE_H
+#define SIGNATURE_H
+
+
+#include <qmemarray.h>
+#include <qmap.h>
+#include <kdemacros.h>
+
+class Sound;
+class KConfigBase;
+
+
+#define WINDOW_MINIMUM 0.10
+#define WINDOW_MINIMUM_ECART 200
+#define WINDOW_NUMBER 7
+#define WINDOW_SUPER 0.43
+#define WINDOW_UNIT sound.fs()/4
+#define FOUR_NUMBER 7
+#define FOUR_SUPER 0
+
+
+#define FFT_RANGE_INF 370
+#define FFT_RANGE_SUP 2000
+// #define FFT_PONDERATION(f) ((double)log(1+(f))/log(10))
+#define FFT_PONDERATION(f) 1
+
+
+// theses settings are better in a 8000Hz fs
+/*#define FFT_RANGE_INF 300
+#define FFT_RANGE_SUP 1500*/
+
+
+//#define REJECT_FACTOR_ECART_REL 0.5
+#define REJECT_FACTOR_DIFF 0.0018
+
+
+
+#define HAMMING false
+
+
+
+
+namespace KHotKeys
+{
+
+
+/**
+@author Olivier Goffart
+*/
+class KDE_EXPORT VoiceSignature{
+public:
+ explicit VoiceSignature(const Sound& s);
+
+ VoiceSignature(){}
+ ~VoiceSignature();
+
+ QMap<int, QMap<int, double> > data;
+
+ static QMap<int, QMap<int, double> > pond;
+
+ static float diff(const VoiceSignature &s1, const VoiceSignature &s2);
+
+
+ static int size1();
+ static int size2();
+
+
+ static QMemArray<double> fft(const Sound& sound, unsigned int start, unsigned int stop);
+ static bool window(const Sound& sound, unsigned int *start, unsigned int *stop);
+
+ void write(KConfigBase *cfg, const QString &key) const;
+ void read(KConfigBase *cfg, const QString &key);
+
+ inline bool isNull() const
+ {
+ return data.isEmpty();
+ }
+};
+
+}
+
+#endif
diff --git a/khotkeys/shared/windows.cpp b/khotkeys/shared/windows.cpp
new file mode 100644
index 000000000..d269ef2fe
--- /dev/null
+++ b/khotkeys/shared/windows.cpp
@@ -0,0 +1,376 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _WINDOWS_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "windows.h"
+
+#include <assert.h>
+#include <qregexp.h>
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kwinmodule.h>
+#include <kwin.h>
+#include <klocale.h>
+
+#include "khotkeysglobal.h"
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+extern Atom qt_window_role;
+
+namespace KHotKeys
+{
+
+// Windows
+
+Windows::Windows( bool enable_signal_P, QObject* parent_P )
+ : QObject( parent_P ), signals_enabled( enable_signal_P ),
+ kwin_module( new KWinModule( this )), _action_window( 0 )
+ {
+ assert( windows_handler == NULL );
+ windows_handler = this;
+ if( signals_enabled )
+ {
+ connect( kwin_module, SIGNAL( windowAdded( WId )), SLOT( window_added_slot( WId )));
+ connect( kwin_module, SIGNAL( windowRemoved( WId )), SLOT( window_removed_slot( WId )));
+ connect( kwin_module, SIGNAL( activeWindowChanged( WId )),
+ SLOT( active_window_changed_slot( WId )));
+ }
+ }
+
+Windows::~Windows()
+ {
+ windows_handler = NULL;
+ }
+
+void Windows::window_added_slot( WId window_P )
+ {
+ if( signals_enabled )
+ emit window_added( window_P );
+ // CHECKME tyhle i dalsi by asi mely jit nastavit, jestli aktivuji vsechny, nebo jen jeden
+ // pripojeny slot ( stejne jako u Kdb, kde by to take melo jit nastavit )
+ }
+
+void Windows::window_removed_slot( WId window_P )
+ {
+ if( signals_enabled )
+ emit window_removed( window_P );
+ if( window_P == _action_window )
+ _action_window = 0;
+ }
+
+void Windows::active_window_changed_slot( WId window_P )
+ {
+ if( signals_enabled )
+ emit active_window_changed( window_P );
+ }
+
+void Windows::window_changed_slot( WId window_P )
+ {
+ if( signals_enabled )
+ emit window_changed( window_P );
+ }
+
+void Windows::window_changed_slot( WId window_P, unsigned int flags_P )
+ {
+ if( signals_enabled )
+ emit window_changed( window_P, flags_P );
+ }
+
+QString Windows::get_window_role( WId id_P )
+ {
+ // TODO this is probably just a hack
+ return KWin::readNameProperty( id_P, qt_window_role );
+ }
+
+QString Windows::get_window_class( WId id_P )
+ {
+ XClassHint hints_ret;
+ if( XGetClassHint( qt_xdisplay(), id_P, &hints_ret ) == 0 ) // 0 means error
+ return "";
+ QString ret( hints_ret.res_name );
+ ret += ' ';
+ ret += hints_ret.res_class;
+ XFree( hints_ret.res_name );
+ XFree( hints_ret.res_class );
+ return ret;
+ }
+
+WId Windows::active_window()
+ {
+ return kwin_module->activeWindow();
+ }
+
+WId Windows::action_window()
+ {
+ return _action_window;
+ }
+
+void Windows::set_action_window( WId window_P )
+ {
+ _action_window = window_P;
+ }
+
+WId Windows::find_window( const Windowdef_list* window_P )
+ {
+ for( QValueList< WId >::ConstIterator it = kwin_module->windows().begin();
+ it != kwin_module->windows().end();
+ ++it )
+ {
+ Window_data tmp( *it );
+ if( window_P->match( tmp ))
+ return *it;
+ }
+ return None;
+ }
+
+WId Windows::window_at_position( int x, int y )
+ {
+ Window child, dummy;
+ Window parent = qt_xrootwin();
+ Atom wm_state = XInternAtom( qt_xdisplay(), "WM_STATE", False );
+ for( int i = 0;
+ i < 10;
+ ++i )
+ {
+ int destx, desty;
+ // find child at that position
+ if( !XTranslateCoordinates( qt_xdisplay(), parent, parent, x, y, &destx, &desty, &child )
+ || child == None )
+ return 0;
+ // and now transform coordinates to the child
+ if( !XTranslateCoordinates( qt_xdisplay(), parent, child, x, y, &destx, &desty, &dummy ))
+ return 0;
+ x = destx;
+ y = desty;
+ Atom type;
+ int format;
+ unsigned long nitems, after;
+ unsigned char* prop;
+ if( XGetWindowProperty( qt_xdisplay(), child, wm_state, 0, 0, False, AnyPropertyType,
+ &type, &format, &nitems, &after, &prop ) == Success )
+ {
+ if( prop != NULL )
+ XFree( prop );
+ if( type != None )
+ return child;
+ }
+ parent = child;
+ }
+ return 0;
+
+ }
+
+void Windows::activate_window( WId id_P )
+ {
+ KWin::forceActiveWindow( id_P );
+ }
+
+// Window_data
+
+Window_data::Window_data( WId id_P )
+ : type( NET::Unknown )
+ {
+ KWin::WindowInfo kwin_info = KWin::windowInfo( id_P, NET::WMName | NET::WMWindowType ); // TODO optimize
+ if( kwin_info.valid())
+ {
+ title = kwin_info.name();
+ role = windows_handler->get_window_role( id_P );
+ wclass = windows_handler->get_window_class( id_P );
+ type = kwin_info.windowType( SUPPORTED_WINDOW_TYPES_MASK );
+ if( type == NET::Override ) // HACK consider non-NETWM fullscreens to be normal too
+ type = NET::Normal;
+ if( type == NET::Unknown )
+ type = NET::Normal;
+ }
+ }
+
+// Windowdef
+
+void Windowdef::cfg_write( KConfig& cfg_P ) const
+ {
+ cfg_P.writeEntry( "Type", "ERROR" );
+ cfg_P.writeEntry( "Comment", comment());
+ }
+
+Windowdef::Windowdef( KConfig& cfg_P )
+ {
+ _comment = cfg_P.readEntry( "Comment" );
+ }
+
+Windowdef* Windowdef::create_cfg_read( KConfig& cfg_P )
+ {
+ QString type = cfg_P.readEntry( "Type" );
+ if( type == "SIMPLE" )
+ return new Windowdef_simple( cfg_P );
+ kdWarning( 1217 ) << "Unknown Windowdef type read from cfg file\n";
+ return NULL;
+ }
+
+// Windowdef_list
+
+Windowdef_list::Windowdef_list( KConfig& cfg_P )
+ : QPtrList< Windowdef >()
+ {
+ setAutoDelete( true );
+ QString save_cfg_group = cfg_P.group();
+ _comment = cfg_P.readEntry( "Comment" );
+ int cnt = cfg_P.readNumEntry( "WindowsCount", 0 );
+ for( int i = 0;
+ i < cnt;
+ ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ Windowdef* window = Windowdef::create_cfg_read( cfg_P );
+ if( window )
+ append( window );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ }
+
+void Windowdef_list::cfg_write( KConfig& cfg_P ) const
+ {
+ QString save_cfg_group = cfg_P.group();
+ int i = 0;
+ for( Iterator it( *this );
+ it;
+ ++it, ++i )
+ {
+ cfg_P.setGroup( save_cfg_group + QString::number( i ));
+ it.current()->cfg_write( cfg_P );
+ }
+ cfg_P.setGroup( save_cfg_group );
+ cfg_P.writeEntry( "WindowsCount", i );
+ cfg_P.writeEntry( "Comment", comment());
+ }
+
+Windowdef_list* Windowdef_list::copy() const
+ {
+ Windowdef_list* ret = new Windowdef_list( comment());
+ for( Iterator it( *this );
+ it;
+ ++it )
+ ret->append( it.current()->copy());
+ return ret;
+ }
+
+
+bool Windowdef_list::match( const Window_data& window_P ) const
+ {
+ if( count() == 0 ) // CHECKME no windows to match => ok
+ return true;
+ for( Iterator it( *this );
+ it;
+ ++it )
+ if( it.current()->match( window_P ))
+ return true;
+ return false;
+ }
+
+// Windowdef_simple
+
+Windowdef_simple::Windowdef_simple( const QString& comment_P, const QString& title_P,
+ substr_type_t title_type_P, const QString& wclass_P, substr_type_t wclass_type_P,
+ const QString& role_P, substr_type_t role_type_P, int window_types_P )
+ : Windowdef( comment_P ), _title( title_P ), title_type( title_type_P ),
+ _wclass( wclass_P ), wclass_type( wclass_type_P ), _role( role_P ),
+ role_type( role_type_P ), _window_types( window_types_P )
+ {
+ }
+
+Windowdef_simple::Windowdef_simple( KConfig& cfg_P )
+ : Windowdef( cfg_P )
+ {
+ _title = cfg_P.readEntry( "Title" );
+ title_type = static_cast< substr_type_t >( cfg_P.readNumEntry( "TitleType" ));
+ _wclass = cfg_P.readEntry( "Class" );
+ wclass_type = static_cast< substr_type_t >( cfg_P.readNumEntry( "ClassType" ));
+ _role = cfg_P.readEntry( "Role" );
+ role_type = static_cast< substr_type_t >( cfg_P.readNumEntry( "RoleType" ));
+ _window_types = cfg_P.readNumEntry( "WindowTypes" );
+ }
+
+void Windowdef_simple::cfg_write( KConfig& cfg_P ) const
+ {
+ base::cfg_write( cfg_P );
+ cfg_P.writeEntry( "Title", title());
+ cfg_P.writeEntry( "TitleType", title_type );
+ cfg_P.writeEntry( "Class", wclass());
+ cfg_P.writeEntry( "ClassType", wclass_type );
+ cfg_P.writeEntry( "Role", role());
+ cfg_P.writeEntry( "RoleType", role_type );
+ cfg_P.writeEntry( "WindowTypes", window_types());
+ cfg_P.writeEntry( "Type", "SIMPLE" ); // overwrites value set in base::cfg_write()
+ }
+
+bool Windowdef_simple::match( const Window_data& window_P )
+ {
+ if( !type_match( window_P.type ))
+ return false;
+ if( !is_substr_match( window_P.title, title(), title_type ))
+ return false;
+ if( !is_substr_match( window_P.wclass, wclass(), wclass_type ))
+ return false;
+ if( !is_substr_match( window_P.role, role(), role_type ))
+ return false;
+ kdDebug( 1217 ) << "window match:" << window_P.title << ":OK" << endl;
+ return true;
+ }
+
+bool Windowdef_simple::is_substr_match( const QString& str1_P, const QString& str2_P,
+ substr_type_t type_P )
+ {
+ switch( type_P )
+ {
+ case NOT_IMPORTANT :
+ return true;
+ case CONTAINS :
+ return str1_P.contains( str2_P ) > 0;
+ case IS :
+ return str1_P == str2_P;
+ case REGEXP :
+ {
+ QRegExp rg( str2_P );
+ return rg.search( str1_P ) >= 0;
+ }
+ case CONTAINS_NOT :
+ return str1_P.contains( str2_P ) == 0;
+ case IS_NOT :
+ return str1_P != str2_P;
+ case REGEXP_NOT :
+ {
+ QRegExp rg( str2_P );
+ return rg.search( str1_P ) < 0;
+ }
+ }
+ return false;
+ }
+
+Windowdef* Windowdef_simple::copy() const
+ {
+ return new Windowdef_simple( comment(), title(), title_match_type(), wclass(),
+ wclass_match_type(), role(), role_match_type(), window_types());
+ }
+
+const QString Windowdef_simple::description() const
+ {
+ return i18n( "Window simple: " ) + comment();
+ }
+
+} // namespace KHotKeys
+
+#include "windows.moc"
diff --git a/khotkeys/shared/windows.h b/khotkeys/shared/windows.h
new file mode 100644
index 000000000..f048ce6b9
--- /dev/null
+++ b/khotkeys/shared/windows.h
@@ -0,0 +1,264 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 1999-2001 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _WINDOWS_H_
+#define _WINDOWS_H_
+
+#include <sys/types.h>
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include <netwm_def.h>
+
+#include "khotkeysglobal.h"
+
+class KConfig;
+class KWinModule;
+
+namespace KHotKeys
+{
+
+const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask
+ | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask
+ | NET::UtilityMask | NET::SplashMask;
+
+class Windowdef_list;
+/*class Action_data_base;*/
+
+class KDE_EXPORT Windows
+ : public QObject
+ {
+ Q_OBJECT
+ public:
+ Windows( bool enable_signals_P, QObject* parent_P );
+ virtual ~Windows();
+ QString get_window_class( WId id_P );
+ QString get_window_role( WId id_P );
+ WId active_window();
+ void set_action_window( WId window );
+ WId action_window();
+ WId find_window( const Windowdef_list* window_P );
+ static WId window_at_position( int x, int y );
+ static void activate_window( WId id_P );
+ signals:
+ void window_added( WId window_P );
+ void window_removed( WId window_P );
+ void active_window_changed( WId window_P );
+ void window_changed( WId window_P );
+ void window_changed( WId window_P, unsigned int flags_P );
+ protected slots:
+ void window_added_slot( WId window_P );
+ void window_removed_slot( WId window_P );
+ void active_window_changed_slot( WId window_P );
+ void window_changed_slot( WId window_P );
+ void window_changed_slot( WId window_P, unsigned int flags_P );
+ private:
+ bool signals_enabled;
+ KWinModule* kwin_module;
+ WId _action_window;
+ };
+
+struct KDE_EXPORT Window_data
+ {
+ Window_data( WId id_P );
+ QString title; // _NET_WM_NAME or WM_NAME
+ QString role; // WM_WINDOW_ROLE
+ QString wclass; // WM_CLASS
+ NET::WindowType type;
+ };
+
+class KDE_EXPORT Windowdef
+ {
+ public:
+ Windowdef( const QString& comment_P );
+ Windowdef( KConfig& cfg_P );
+ virtual ~Windowdef();
+ const QString& comment() const;
+ virtual bool match( const Window_data& window_P ) = 0;
+ static Windowdef* create_cfg_read( KConfig& cfg_P/*, Action_data_base* data_P*/ );
+ virtual void cfg_write( KConfig& cfg_P ) const = 0;
+ virtual Windowdef* copy( /*Action_data_base* data_P*/ ) const = 0;
+ virtual const QString description() const = 0;
+ private:
+ QString _comment;
+ KHOTKEYS_DISABLE_COPY( Windowdef ); // CHECKME asi pak udelat i pro vsechny potomky, at se nezapomene
+ };
+
+class KDE_EXPORT Windowdef_list
+ : public QPtrList< Windowdef >
+ {
+ public:
+ Windowdef_list( const QString& comment_P );
+ Windowdef_list( KConfig& cfg_P/*, Action_data_base* data_P*/ );
+ void cfg_write( KConfig& cfg_P ) const;
+ bool match( const Window_data& window_P ) const;
+ Windowdef_list* copy( /*Action_data_base* data_P*/ ) const;
+ typedef QPtrListIterator< Windowdef > Iterator;
+ const QString& comment() const;
+ private:
+ QString _comment;
+ KHOTKEYS_DISABLE_COPY( Windowdef_list );
+ };
+
+class KDE_EXPORT Windowdef_simple
+ : public Windowdef
+ {
+ typedef Windowdef base;
+ public:
+ enum substr_type_t
+ {
+ NOT_IMPORTANT,
+ CONTAINS,
+ IS,
+ REGEXP,
+ CONTAINS_NOT,
+ IS_NOT,
+ REGEXP_NOT
+ };
+ enum window_type_t
+ {
+ WINDOW_TYPE_NORMAL = ( 1 << NET::Normal ),
+ WINDOW_TYPE_DESKTOP = ( 1 << NET::Desktop ),
+ WINDOW_TYPE_DOCK = ( 1 << NET::Dock ),
+// WINDOW_TYPE_TOOL = ( 1 << NET::Tool ),
+// WINDOW_TYPE_MENU = ( 1 << NET::Menu ),
+ WINDOW_TYPE_DIALOG = ( 1 << NET::Dialog )
+ };
+ Windowdef_simple( const QString& comment_P, const QString& title_P,
+ substr_type_t title_type_P, const QString& wclass_P, substr_type_t wclass_type_P,
+ const QString& role_P, substr_type_t role_type_P, int window_types_P );
+ Windowdef_simple( KConfig& cfg_P );
+ virtual bool match( const Window_data& window_P );
+ virtual void cfg_write( KConfig& cfg_P ) const;
+ const QString& title() const;
+ substr_type_t title_match_type() const;
+ const QString& wclass() const;
+ substr_type_t wclass_match_type() const;
+ const QString& role() const;
+ substr_type_t role_match_type() const;
+ int window_types() const;
+ bool type_match( window_type_t type_P ) const;
+ bool type_match( NET::WindowType type_P ) const;
+ virtual Windowdef* copy( /*Action_data_base* data_P*/ ) const;
+ virtual const QString description() const;
+ protected:
+ bool is_substr_match( const QString& str1_P, const QString& str2_P,
+ substr_type_t type_P );
+ private:
+ QString _title;
+ substr_type_t title_type;
+ QString _wclass;
+ substr_type_t wclass_type;
+ QString _role;
+ substr_type_t role_type;
+ int _window_types;
+ };
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+// Windowdef
+
+inline
+Windowdef::Windowdef( const QString& comment_P )
+ : _comment( comment_P )
+ {
+ }
+
+inline
+const QString& Windowdef::comment() const
+ {
+ return _comment;
+ }
+
+inline
+Windowdef::~Windowdef()
+ {
+ }
+
+// Windowdef_list
+
+inline
+Windowdef_list::Windowdef_list( const QString& comment_P )
+ : QPtrList< Windowdef >(), _comment( comment_P )
+ {
+ setAutoDelete( true );
+ }
+
+inline
+const QString& Windowdef_list::comment() const
+ {
+ return _comment;
+ }
+
+// Windowdef_simple
+
+inline
+const QString& Windowdef_simple::title() const
+ {
+ return _title;
+ }
+
+inline
+Windowdef_simple::substr_type_t Windowdef_simple::title_match_type() const
+ {
+ return title_type;
+ }
+
+inline
+const QString& Windowdef_simple::wclass() const
+ {
+ return _wclass;
+ }
+
+inline
+Windowdef_simple::substr_type_t Windowdef_simple::wclass_match_type() const
+ {
+ return wclass_type;
+ }
+
+inline
+const QString& Windowdef_simple::role() const
+ {
+ return _role;
+ }
+
+inline
+Windowdef_simple::substr_type_t Windowdef_simple::role_match_type() const
+ {
+ return role_type;
+ }
+
+inline
+int Windowdef_simple::window_types() const
+ {
+ return _window_types;
+ }
+
+inline
+bool Windowdef_simple::type_match( window_type_t type_P ) const
+ {
+ return window_types() & type_P;
+ }
+
+inline
+bool Windowdef_simple::type_match( NET::WindowType type_P ) const
+ {
+ return ( window_types() & ( 1 << type_P ))
+ || ( type_P == NET::Unknown && ( window_types() & WINDOW_TYPE_NORMAL ));
+ // CHECKME HACK haaaack !
+ }
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/update/Makefile.am b/khotkeys/update/Makefile.am
new file mode 100644
index 000000000..ae28dde38
--- /dev/null
+++ b/khotkeys/update/Makefile.am
@@ -0,0 +1,11 @@
+kconf_PROGRAMS = khotkeys_update
+kconfdir = $(libdir)/kconf_update_bin
+
+khotkeys_update_SOURCES = update.cpp
+
+khotkeys_update_LDADD = ../shared/libkhotkeys_shared.la $(LIB_KDECORE) $(KDE_RPATH)
+khotkeys_update_LDFLAGS = $(all_libraries)
+
+INCLUDES = -I$(srcdir)/../shared $(all_includes)
+
+METASOURCES = AUTO
diff --git a/khotkeys/update/update.cpp b/khotkeys/update/update.cpp
new file mode 100644
index 000000000..ac96a9709
--- /dev/null
+++ b/khotkeys/update/update.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _UPDATE_CPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kstandarddirs.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <dcopclient.h>
+
+#include <settings.h>
+
+using namespace KHotKeys;
+
+static const KCmdLineOptions options[] =
+ {
+ // no need for I18N_NOOP(), this is not supposed to be used directly
+ { "id <id>", "Id of the script to add to khotkeysrc.", 0 },
+ KCmdLineLastOption
+ };
+
+int main( int argc, char* argv[] )
+ {
+ KCmdLineArgs::init( argc, argv, "khotkeys_update", "KHotKeys Update",
+ "KHotKeys update utility", "1.0" );
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app( false, true ); // X11 connection is necessary for KKey* stuff :-/
+ KCmdLineArgs* args = KCmdLineArgs::parsedArgs();
+ QCString id = args->getOption( "id" );
+ QString file = locate( "data", "khotkeys/" + id + ".khotkeys" );
+ if( file.isEmpty())
+ {
+ kdWarning() << "File " << id << " not found!" << endl;
+ return 1;
+ }
+ init_global_data( false, &app );
+ Settings settings;
+ settings.read_settings( true );
+ KConfig cfg( file, true );
+ if( !settings.import( cfg, false ))
+ {
+ kdWarning() << "Import of " << id << " failed!" << endl;
+ return 2;
+ }
+ settings.write_settings();
+ QByteArray data;
+ kapp->dcopClient()->send( "khotkeys*", "khotkeys", "reread_configuration()", data );
+ return 0;
+ }
diff --git a/khotkeys/wrk/cpp_template b/khotkeys/wrk/cpp_template
new file mode 100644
index 000000000..89f756af6
--- /dev/null
+++ b/khotkeys/wrk/cpp_template
@@ -0,0 +1,20 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#define _|FILENAME|_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace KHotKeys
+{
+
+} // namespace KHotKeys
diff --git a/khotkeys/wrk/header_template b/khotkeys/wrk/header_template
new file mode 100644
index 000000000..93155ce66
--- /dev/null
+++ b/khotkeys/wrk/header_template
@@ -0,0 +1,23 @@
+/****************************************************************************
+
+ KHotKeys
+
+ Copyright (C) 2003 Lubos Lunak <[email protected]>
+
+ Distributed under the terms of the GNU General Public License version 2.
+
+****************************************************************************/
+
+#ifndef _|FILENAME|_
+#define _|FILENAME|_
+
+namespace KHotKeys
+{
+
+//***************************************************************************
+// Inline
+//***************************************************************************
+
+} // namespace KHotKeys
+
+#endif
diff --git a/khotkeys/wrk/new b/khotkeys/wrk/new
new file mode 100755
index 000000000..a868fc1cd
--- /dev/null
+++ b/khotkeys/wrk/new
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+if test $# -lt 2; then
+ exit
+fi
+
+template=$1
+shift
+while test $# -ge 1; do
+ dest=$1
+ dest_writable=`echo $dest | tr .[:lower:] _[:upper:] `
+ cat $template | sed "s/|FILENAME|/$dest_writable/" > "$dest"
+ shift
+done