Modifier detection works
This commit is contained in:
parent
82b8fa9943
commit
99856440aa
4
Makefile
4
Makefile
|
@ -8,7 +8,7 @@ BINDIR = bin
|
|||
|
||||
# for most cases the following two are the only you'll need to change
|
||||
# add your source files here
|
||||
SRC = main.vala neo-window.vala key-overlay.vala tray.vala config-manager.vala keybinding-manager.vala keysend.c
|
||||
SRC = main.vala neo-window.vala key-overlay.vala tray.vala config-manager.vala keybinding-manager.vala keysend.c checkModifier.c
|
||||
|
||||
# add your used packges here
|
||||
PKGS = --pkg x11 --pkg keysym --pkg gtk+-2.0 --pkg gee-1.0 --pkg gdk-x11-2.0 --pkg posix
|
||||
|
@ -16,7 +16,7 @@ PKGS = --pkg x11 --pkg keysym --pkg gtk+-2.0 --pkg gee-1.0 --pkg gdk-x11-2.0 --p
|
|||
|
||||
CC_INCLUDES =
|
||||
# vala compiler
|
||||
VALAC = valac
|
||||
VALAC = valac --thread
|
||||
#VAPIDIR = --vapidir=vapi/
|
||||
VAPIDIR = --vapi=vapi/keysym.vapi
|
||||
|
||||
|
|
9
README
9
README
|
@ -3,7 +3,10 @@
|
|||
|
||||
Errors:
|
||||
|
||||
Not all keysyms found. make returns i.e.
|
||||
[..]/key-overlay.c:1744: error: ‘XK_logicalor’ undeclared (first use in this function)
|
||||
- Not all keysyms found. make returns i.e.
|
||||
[..]/key-overlay.c:1744: error: ‘XK_logicalor’ undeclared (first use in this function)
|
||||
|
||||
Solution: define all groups in /etc/include/X11/keysym.def. I.e. add “#define XK_TECHNICAL“.
|
||||
Solution: define all groups in /etc/include/X11/keysym.def. I.e. add “#define XK_TECHNICAL“.
|
||||
|
||||
|
||||
- Alt-Key did not work.
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/*
|
||||
Code ideas from
|
||||
http://stackoverflow.com/questions/2968336/qt-password-field
|
||||
*/
|
||||
#ifdef Q_OS_WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/XKBlib.h>
|
||||
#include <X11/keysym.h>
|
||||
#endif
|
||||
|
||||
char keymap[32];
|
||||
bool keyPressed(int keycode, char* keymap){
|
||||
return ( keymap[keycode/8] & (1 << keycode%8) ) > 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Input: Display, Array of keycodes, length of both arrays
|
||||
Output: Array of ints. (no bools because sizeof(bool,vala) != sizeof(bool, stdbool.h)
|
||||
*/
|
||||
void checkModifier(Display* display, int* keycodes, int nkeycodes, int* pressed){
|
||||
XQueryKeymap(display, keymap);
|
||||
int i;
|
||||
for (i=0; i<nkeycodes; i++) {
|
||||
pressed[i] = keyPressed(keycodes[i], keymap)?1:0;
|
||||
//printf("%i Pressed? %i\n", keycodes[i], (pressed[i]) );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool checkCapsLock(Display* d) {
|
||||
// platform dependent method of determining if CAPS LOCK is on
|
||||
/*#ifdef Q_OS_WIN32 // MS Windows version
|
||||
return GetKeyState(VK_CAPITAL) == 1;
|
||||
#else // X11 version (Linux/Unix/Mac OS X/etc...)*/
|
||||
//Display* d = XOpenDisplay((char*)0);
|
||||
bool caps_state = false;
|
||||
if (d) {
|
||||
unsigned n;
|
||||
XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
|
||||
//printf("Indicator State: %u\n",n);
|
||||
caps_state = (n & 0x01) == 1;
|
||||
}
|
||||
return caps_state;
|
||||
//#endif
|
||||
}
|
||||
|
||||
|
168
key-overlay.vala
168
key-overlay.vala
|
@ -42,63 +42,63 @@ namespace NeoLayoutViewer{
|
|||
|
||||
keysyms.set(8, new ArrayBox({}));
|
||||
keysyms.set(9, new ArrayBox({ XK_Escape, 0, XK_Escape}));
|
||||
keysyms.set(10, new ArrayBox({ XK_1, XK_degree, XK_1, XK_degree, XK_onesuperior, XK_onesubscript, XK_ordfeminine, 0, XK_notsign}));
|
||||
keysyms.set(11, new ArrayBox({ XK_2, XK_section, XK_2, XK_section, XK_twosuperior, XK_twosubscript, XK_masculine, 0, XK_logicalor}));
|
||||
keysyms.set(12, new ArrayBox({ XK_3, (uint)X.string_to_keysym("U2113"), XK_3, (uint)X.string_to_keysym("U2113"), XK_threesuperior, XK_threesubscript, XK_numerosign, 0, XK_logicaland}));
|
||||
keysyms.set(13, new ArrayBox({ XK_4, XK_guillemotright, XK_4, XK_guillemotright, (uint)X.string_to_keysym("U203A"), XK_dagger, XK_Prior, XK_Prior, (uint)X.string_to_keysym("U22A5")}));
|
||||
keysyms.set(14, new ArrayBox({ XK_5, XK_guillemotleft, XK_5, XK_guillemotleft, (uint)X.string_to_keysym("U2039"), XK_femalesymbol, XK_periodcentered, 0, (uint)X.string_to_keysym("U2221")}));
|
||||
keysyms.set(15, new ArrayBox({ XK_6, XK_EuroSign, XK_6, XK_EuroSign, XK_cent, XK_malesymbol, XK_sterling, 0, (uint)X.string_to_keysym("U2225")}));
|
||||
keysyms.set(16, new ArrayBox({ XK_7, XK_dollar, XK_7, XK_dollar, XK_yen, XK_Greek_kappa, XK_currency, 0, XK_rightarrow}));
|
||||
keysyms.set(17, new ArrayBox({ XK_8, XK_doublelowquotemark, XK_8, XK_doublelowquotemark, XK_singlelowquotemark, XK_leftanglebracket, 0, 0, (uint)X.string_to_keysym("U221E")}));
|
||||
keysyms.set(18, new ArrayBox({ XK_9, XK_leftdoublequotemark, XK_9, XK_leftdoublequotemark, XK_leftsinglequotemark, XK_rightanglebracket, XK_slash, 0, XK_containsas}));
|
||||
keysyms.set(19, new ArrayBox({ XK_0, XK_rightdoublequotemark, XK_0, XK_rightdoublequotemark, XK_rightsinglequotemark, XK_zerosubscript, XK_asterisk, 0, XK_emptyset}));
|
||||
keysyms.set(20, new ArrayBox({ XK_minus, XK_emdash, XK_minus, XK_emdash, 0, (uint)X.string_to_keysym("U2011"), XK_minus, 0, XK_hyphen}));
|
||||
keysyms.set(21, new ArrayBox({ XK_dead_grave, 0, XK_dead_grave, 0, XK_dead_diaeresis, XK_dead_abovereversedcomma}));
|
||||
keysyms.set(22, new ArrayBox({ XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace}));
|
||||
keysyms.set(23, new ArrayBox({ XK_Tab, XK_ISO_Left_Tab, XK_Tab, XK_ISO_Left_Tab, XK_Multi_key}));
|
||||
keysyms.set(24, new ArrayBox({ XK_x, XK_X, XK_x, XK_X, XK_ellipsis, XK_Greek_xi, (uint)X.string_to_keysym("U22EE"), 0, XK_Greek_XI}));
|
||||
keysyms.set(25, new ArrayBox({ XK_v, XK_V, XK_v, XK_V, XK_underscore, 0, XK_BackSpace, XK_BackSpace, (uint)X.string_to_keysym("U2259")}));
|
||||
keysyms.set(26, new ArrayBox({ XK_l, XK_L, XK_l, XK_L, XK_bracketleft, XK_Greek_lamda, XK_Up, XK_Up, XK_Greek_LAMDA}));
|
||||
keysyms.set(27, new ArrayBox({ XK_c, XK_C, XK_c, XK_C, XK_bracketright, XK_Greek_chi, XK_Delete, XK_Delete, (uint)X.string_to_keysym("U2102")}));
|
||||
keysyms.set(28, new ArrayBox({ XK_w, XK_W, XK_w, XK_W, XK_asciicircum, XK_Greek_omega, XK_Insert, XK_Insert, XK_Greek_OMEGA}));
|
||||
keysyms.set(29, new ArrayBox({ XK_k, XK_K, XK_k, XK_K, XK_exclam, (uint)X.string_to_keysym("U03F0"), XK_exclamdown, 0, XK_radical}));
|
||||
keysyms.set(30, new ArrayBox({ XK_h, XK_H, XK_h, XK_H, XK_less, XK_Greek_psi, XK_7, 0, XK_Greek_PSI}));
|
||||
keysyms.set(31, new ArrayBox({ XK_g, XK_G, XK_g, XK_G, XK_greater, XK_Greek_gamma, XK_8, 0, XK_Greek_GAMMA}));
|
||||
keysyms.set(32, new ArrayBox({ XK_f, XK_F, XK_f, XK_F, XK_equal, XK_Greek_phi, XK_9, 0, XK_Greek_PHI}));
|
||||
keysyms.set(33, new ArrayBox({ XK_q, XK_Q, XK_q, XK_Q, XK_ampersand, (uint)X.string_to_keysym("U03D5"), XK_plus, 0, (uint)X.string_to_keysym("U211A")}));
|
||||
keysyms.set(34, new ArrayBox({ XK_ssharp, (uint)X.string_to_keysym("U1E9E"), XK_ssharp, (uint)X.string_to_keysym("U1E9E"), (uint)X.string_to_keysym("U017F"), XK_Greek_finalsmallsigma, 0, 0, XK_jot}));
|
||||
keysyms.set(35, new ArrayBox({ XK_dead_acute, XK_dead_cedilla, XK_dead_acute, XK_dead_cedilla, XK_dead_stroke, XK_dead_abovecomma, XK_dead_doubleacute, 0, XK_dead_abovedot}));
|
||||
keysyms.set(10, new ArrayBox({ XK_1, XK_degree, XK_onesuperior, XK_onesubscript, XK_ordfeminine, 0, XK_notsign}));
|
||||
keysyms.set(11, new ArrayBox({ XK_2, XK_section, XK_twosuperior, XK_twosubscript, XK_masculine, 0, XK_logicalor}));
|
||||
keysyms.set(12, new ArrayBox({ XK_3, (uint)X.string_to_keysym("U2113"), XK_threesuperior, XK_threesubscript, XK_numerosign, 0, XK_logicaland}));
|
||||
keysyms.set(13, new ArrayBox({ XK_4, XK_guillemotright, (uint)X.string_to_keysym("U203A"), XK_dagger, XK_Prior, XK_Prior, (uint)X.string_to_keysym("U22A5")}));
|
||||
keysyms.set(14, new ArrayBox({ XK_5, XK_guillemotleft, (uint)X.string_to_keysym("U2039"), XK_femalesymbol, XK_periodcentered, 0, (uint)X.string_to_keysym("U2221")}));
|
||||
keysyms.set(15, new ArrayBox({ XK_6, XK_EuroSign, XK_cent, XK_malesymbol, XK_sterling, 0, (uint)X.string_to_keysym("U2225")}));
|
||||
keysyms.set(16, new ArrayBox({ XK_7, XK_dollar, XK_yen, XK_Greek_kappa, XK_currency, 0, XK_rightarrow}));
|
||||
keysyms.set(17, new ArrayBox({ XK_8, XK_doublelowquotemark, XK_singlelowquotemark, XK_leftanglebracket, 0, 0, (uint)X.string_to_keysym("U221E")}));
|
||||
keysyms.set(18, new ArrayBox({ XK_9, XK_leftdoublequotemark, XK_leftsinglequotemark, XK_rightanglebracket, XK_slash, 0, XK_containsas}));
|
||||
keysyms.set(19, new ArrayBox({ XK_0, XK_rightdoublequotemark, XK_rightsinglequotemark, XK_zerosubscript, XK_asterisk, 0, XK_emptyset}));
|
||||
keysyms.set(20, new ArrayBox({ XK_minus, XK_emdash, 0, (uint)X.string_to_keysym("U2011"), XK_minus, 0, XK_hyphen}));
|
||||
keysyms.set(21, new ArrayBox({ XK_dead_grave, 0, XK_dead_diaeresis, XK_dead_abovereversedcomma}));
|
||||
keysyms.set(22, new ArrayBox({ XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace}));
|
||||
keysyms.set(23, new ArrayBox({ XK_Tab, XK_ISO_Left_Tab, XK_Multi_key}));
|
||||
keysyms.set(24, new ArrayBox({ XK_x, XK_X, XK_ellipsis, XK_Greek_xi, (uint)X.string_to_keysym("U22EE"), 0, XK_Greek_XI}));
|
||||
keysyms.set(25, new ArrayBox({ XK_v, XK_V, XK_underscore, 0, XK_BackSpace, XK_BackSpace, (uint)X.string_to_keysym("U2259")}));
|
||||
keysyms.set(26, new ArrayBox({ XK_l, XK_L, XK_bracketleft, XK_Greek_lamda, XK_Up, XK_Up, XK_Greek_LAMDA}));
|
||||
keysyms.set(27, new ArrayBox({ XK_c, XK_C, XK_bracketright, XK_Greek_chi, XK_Delete, XK_Delete, (uint)X.string_to_keysym("U2102")}));
|
||||
keysyms.set(28, new ArrayBox({ XK_w, XK_W, XK_asciicircum, XK_Greek_omega, XK_Insert, XK_Insert, XK_Greek_OMEGA}));
|
||||
keysyms.set(29, new ArrayBox({ XK_k, XK_K, XK_exclam, (uint)X.string_to_keysym("U03F0"), XK_exclamdown, 0, XK_radical}));
|
||||
keysyms.set(30, new ArrayBox({ XK_h, XK_H, XK_less, XK_Greek_psi, XK_7, 0, XK_Greek_PSI}));
|
||||
keysyms.set(31, new ArrayBox({ XK_g, XK_G, XK_greater, XK_Greek_gamma, XK_8, 0, XK_Greek_GAMMA}));
|
||||
keysyms.set(32, new ArrayBox({ XK_f, XK_F, XK_equal, XK_Greek_phi, XK_9, 0, XK_Greek_PHI}));
|
||||
keysyms.set(33, new ArrayBox({ XK_q, XK_Q, XK_ampersand, (uint)X.string_to_keysym("U03D5"), XK_plus, 0, (uint)X.string_to_keysym("U211A")}));
|
||||
keysyms.set(34, new ArrayBox({ XK_ssharp, (uint)X.string_to_keysym("U1E9E"), (uint)X.string_to_keysym("U017F"), XK_Greek_finalsmallsigma, 0, 0, XK_jot}));
|
||||
keysyms.set(35, new ArrayBox({ XK_dead_acute, XK_dead_cedilla, XK_dead_stroke, XK_dead_abovecomma, XK_dead_doubleacute, 0, XK_dead_abovedot}));
|
||||
keysyms.set(36, new ArrayBox({ XK_Return, 0, XK_Return}));
|
||||
keysyms.set(37, new ArrayBox({ XK_Control_L, 0, XK_Control_L}));
|
||||
keysyms.set(38, new ArrayBox({ XK_u, XK_U, XK_u, XK_U, XK_backslash, 0, XK_Home, XK_Home, (uint)X.string_to_keysym("U222E")}));
|
||||
keysyms.set(39, new ArrayBox({ XK_i, XK_I, XK_i, XK_I, XK_slash, XK_Greek_iota, XK_Left, XK_Left, XK_integral}));
|
||||
keysyms.set(40, new ArrayBox({ XK_a, XK_A, XK_a, XK_A, XK_braceleft, XK_Greek_alpha, XK_Down, XK_Down, (uint)X.string_to_keysym("U2200")}));
|
||||
keysyms.set(41, new ArrayBox({ XK_e, XK_E, XK_e, XK_E, XK_braceright, XK_Greek_epsilon, XK_Right, XK_Right, (uint)X.string_to_keysym("U2203")}));
|
||||
keysyms.set(42, new ArrayBox({ XK_o, XK_O, XK_o, XK_O, XK_asterisk, XK_Greek_omicron, XK_End, XK_End, XK_elementof}));
|
||||
keysyms.set(43, new ArrayBox({ XK_s, XK_S, XK_s, XK_S, XK_question, XK_Greek_sigma, XK_questiondown, 0, XK_Greek_SIGMA}));
|
||||
keysyms.set(44, new ArrayBox({ XK_n, XK_N, XK_n, XK_N, XK_parenleft, XK_Greek_nu, XK_4, 0, (uint)X.string_to_keysym("U2115")}));
|
||||
keysyms.set(45, new ArrayBox({ XK_r, XK_R, XK_r, XK_R, XK_parenright, (uint)X.string_to_keysym("U03F1"), XK_5, 0, (uint)X.string_to_keysym("U211D")}));
|
||||
keysyms.set(46, new ArrayBox({ XK_t, XK_T, XK_t, XK_T, XK_minus, XK_Greek_tau, XK_6, 0, XK_partialderivative}));
|
||||
keysyms.set(47, new ArrayBox({ XK_d, XK_D, XK_d, XK_D, XK_colon, XK_Greek_delta, XK_comma, 0, XK_Greek_DELTA}));
|
||||
keysyms.set(48, new ArrayBox({ XK_y, XK_Y, XK_y, XK_Y, XK_at, XK_Greek_upsilon, XK_period, 0, XK_nabla}));
|
||||
keysyms.set(49, new ArrayBox({ XK_dead_circumflex, XK_dead_tilde, XK_dead_circumflex, XK_dead_tilde, XK_dead_abovering, XK_dead_breve, XK_dead_caron, 0, XK_dead_macron}));
|
||||
keysyms.set(38, new ArrayBox({ XK_u, XK_U, XK_backslash, 0, XK_Home, XK_Home, (uint)X.string_to_keysym("U222E")}));
|
||||
keysyms.set(39, new ArrayBox({ XK_i, XK_I, XK_slash, XK_Greek_iota, XK_Left, XK_Left, XK_integral}));
|
||||
keysyms.set(40, new ArrayBox({ XK_a, XK_A, XK_braceleft, XK_Greek_alpha, XK_Down, XK_Down, (uint)X.string_to_keysym("U2200")}));
|
||||
keysyms.set(41, new ArrayBox({ XK_e, XK_E, XK_braceright, XK_Greek_epsilon, XK_Right, XK_Right, (uint)X.string_to_keysym("U2203")}));
|
||||
keysyms.set(42, new ArrayBox({ XK_o, XK_O, XK_asterisk, XK_Greek_omicron, XK_End, XK_End, XK_elementof}));
|
||||
keysyms.set(43, new ArrayBox({ XK_s, XK_S, XK_question, XK_Greek_sigma, XK_questiondown, 0, XK_Greek_SIGMA}));
|
||||
keysyms.set(44, new ArrayBox({ XK_n, XK_N, XK_parenleft, XK_Greek_nu, XK_4, 0, (uint)X.string_to_keysym("U2115")}));
|
||||
keysyms.set(45, new ArrayBox({ XK_r, XK_R, XK_parenright, (uint)X.string_to_keysym("U03F1"), XK_5, 0, (uint)X.string_to_keysym("U211D")}));
|
||||
keysyms.set(46, new ArrayBox({ XK_t, XK_T, XK_minus, XK_Greek_tau, XK_6, 0, XK_partialderivative}));
|
||||
keysyms.set(47, new ArrayBox({ XK_d, XK_D, XK_colon, XK_Greek_delta, XK_comma, 0, XK_Greek_DELTA}));
|
||||
keysyms.set(48, new ArrayBox({ XK_y, XK_Y, XK_at, XK_Greek_upsilon, XK_period, 0, XK_nabla}));
|
||||
keysyms.set(49, new ArrayBox({ XK_dead_circumflex, XK_dead_tilde, XK_dead_abovering, XK_dead_breve, XK_dead_caron, 0, XK_dead_macron}));
|
||||
keysyms.set(50, new ArrayBox({ XK_Shift_L, 0, XK_Shift_L}));
|
||||
keysyms.set(51, new ArrayBox({ XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_Caps_Lock, XK_Caps_Lock}));
|
||||
keysyms.set(52, new ArrayBox({ XK_udiaeresis, XK_Udiaeresis, XK_udiaeresis, XK_Udiaeresis, XK_numbersign, 0, XK_Escape, XK_Escape, (uint)X.string_to_keysym("U211C")}));
|
||||
keysyms.set(53, new ArrayBox({ XK_odiaeresis, XK_Odiaeresis, XK_odiaeresis, XK_Odiaeresis, XK_dollar, 0, XK_Tab, XK_Tab, (uint)X.string_to_keysym("U2111")}));
|
||||
keysyms.set(54, new ArrayBox({ XK_adiaeresis, XK_Adiaeresis, XK_adiaeresis, XK_Adiaeresis, XK_bar, XK_Greek_eta, XK_Next, XK_Next, (uint)X.string_to_keysym("U2135")}));
|
||||
keysyms.set(55, new ArrayBox({ XK_p, XK_P, XK_p, XK_P, XK_asciitilde, XK_Greek_pi, XK_Return, XK_Return, XK_Greek_PI}));
|
||||
keysyms.set(56, new ArrayBox({ XK_z, XK_Z, XK_z, XK_Z, XK_grave, XK_Greek_zeta, 0, 0, (uint)X.string_to_keysym("U2124")}));
|
||||
keysyms.set(57, new ArrayBox({ XK_b, XK_B, XK_b, XK_B, XK_plus, XK_Greek_beta, XK_colon, 0, (uint)X.string_to_keysym("U21D0")}));
|
||||
keysyms.set(58, new ArrayBox({ XK_m, XK_M, XK_m, XK_M, XK_percent, XK_Greek_mu, XK_1, 0, XK_ifonlyif}));
|
||||
keysyms.set(59, new ArrayBox({ XK_comma, XK_endash, XK_comma, XK_endash, XK_quotedbl, XK_Greek_rho, XK_2, 0, (uint)X.string_to_keysym("U21D2")}));
|
||||
keysyms.set(60, new ArrayBox({ XK_period, XK_enfilledcircbullet, XK_period, XK_enfilledcircbullet, XK_apostrophe, (uint)X.string_to_keysym("U03D1"), XK_3, 0, XK_Greek_THETA}));
|
||||
keysyms.set(61, new ArrayBox({ XK_j, XK_J, XK_j, XK_J, XK_semicolon, XK_Greek_theta, XK_semicolon, 0, XK_variation}));
|
||||
keysyms.set(51, new ArrayBox({ XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_Caps_Lock, XK_Caps_Lock}));
|
||||
keysyms.set(52, new ArrayBox({ XK_udiaeresis, XK_Udiaeresis, XK_numbersign, 0, XK_Escape, XK_Escape, (uint)X.string_to_keysym("U211C")}));
|
||||
keysyms.set(53, new ArrayBox({ XK_odiaeresis, XK_Odiaeresis, XK_dollar, 0, XK_Tab, XK_Tab, (uint)X.string_to_keysym("U2111")}));
|
||||
keysyms.set(54, new ArrayBox({ XK_adiaeresis, XK_Adiaeresis, XK_bar, XK_Greek_eta, XK_Next, XK_Next, (uint)X.string_to_keysym("U2135")}));
|
||||
keysyms.set(55, new ArrayBox({ XK_p, XK_P, XK_asciitilde, XK_Greek_pi, XK_Return, XK_Return, XK_Greek_PI}));
|
||||
keysyms.set(56, new ArrayBox({ XK_z, XK_Z, XK_grave, XK_Greek_zeta, 0, 0, (uint)X.string_to_keysym("U2124")}));
|
||||
keysyms.set(57, new ArrayBox({ XK_b, XK_B, XK_plus, XK_Greek_beta, XK_colon, 0, (uint)X.string_to_keysym("U21D0")}));
|
||||
keysyms.set(58, new ArrayBox({ XK_m, XK_M, XK_percent, XK_Greek_mu, XK_1, 0, XK_ifonlyif}));
|
||||
keysyms.set(59, new ArrayBox({ XK_comma, XK_endash, XK_quotedbl, XK_Greek_rho, XK_2, 0, (uint)X.string_to_keysym("U21D2")}));
|
||||
keysyms.set(60, new ArrayBox({ XK_period, XK_enfilledcircbullet, XK_apostrophe, (uint)X.string_to_keysym("U03D1"), XK_3, 0, XK_Greek_THETA}));
|
||||
keysyms.set(61, new ArrayBox({ XK_j, XK_J, XK_semicolon, XK_Greek_theta, XK_semicolon, 0, XK_variation}));
|
||||
keysyms.set(62, new ArrayBox({ XK_Shift_R, 0, XK_Shift_R}));
|
||||
keysyms.set(63, new ArrayBox({ XK_KP_Multiply, XK_KP_Multiply, XK_KP_Multiply, XK_KP_Multiply, (uint)X.string_to_keysym("U22C5"), XK_multiply, (uint)X.string_to_keysym("U2299"), 0, (uint)X.string_to_keysym("U2297")}));
|
||||
keysyms.set(63, new ArrayBox({ XK_KP_Multiply, XK_KP_Multiply, (uint)X.string_to_keysym("U22C5"), XK_multiply, (uint)X.string_to_keysym("U2299"), 0, (uint)X.string_to_keysym("U2297")}));
|
||||
keysyms.set(64, new ArrayBox({ XK_Alt_L, XK_Meta_L, XK_Alt_L, XK_Meta_L}));
|
||||
keysyms.set(65, new ArrayBox({ XK_space, XK_space, XK_space, XK_space, XK_space, XK_nobreakspace, XK_0, 0, (uint)X.string_to_keysym("U202F")}));
|
||||
keysyms.set(66, new ArrayBox({ XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_Caps_Lock, XK_Caps_Lock}));
|
||||
keysyms.set(65, new ArrayBox({ XK_space, XK_space, XK_space, XK_nobreakspace, XK_0, 0, (uint)X.string_to_keysym("U202F")}));
|
||||
keysyms.set(66, new ArrayBox({ XK_ISO_Level3_Shift, XK_ISO_Level3_Shift, XK_Caps_Lock, XK_Caps_Lock}));
|
||||
keysyms.set(67, new ArrayBox({ XK_F1, 0/* XK_XF86_Switch_VT_1 */, XK_F1, 0/* XK_XF86_Switch_VT_1 */}));
|
||||
keysyms.set(68, new ArrayBox({ XK_F2, 0/* XK_XF86_Switch_VT_2 */, XK_F2, 0/* XK_XF86_Switch_VT_2 */}));
|
||||
keysyms.set(69, new ArrayBox({ XK_F3, 0/* XK_XF86_Switch_VT_3 */, XK_F3, 0/* XK_XF86_Switch_VT_3 */}));
|
||||
|
@ -109,21 +109,21 @@ namespace NeoLayoutViewer{
|
|||
keysyms.set(74, new ArrayBox({ XK_F8, 0/* XK_XF86_Switch_VT_8 */, XK_F8, 0/* XK_XF86_Switch_VT_8 */}));
|
||||
keysyms.set(75, new ArrayBox({ XK_F9, 0/* XK_XF86_Switch_VT_9 */, XK_F9, 0/* XK_XF86_Switch_VT_9 */}));
|
||||
keysyms.set(76, new ArrayBox({ XK_F10, 0/* XK_XF86_Switch_VT_10 */, XK_F10, 0/* XK_XF86_Switch_VT_10 */}));
|
||||
keysyms.set(77, new ArrayBox({ XK_Tab, XK_ISO_Left_Tab, XK_Tab, XK_ISO_Left_Tab, XK_equal, XK_approxeq, XK_notequal, 0, XK_identical}));
|
||||
keysyms.set(77, new ArrayBox({ XK_Tab, XK_ISO_Left_Tab, XK_equal, XK_approxeq, XK_notequal, 0, XK_identical}));
|
||||
keysyms.set(78, new ArrayBox({ XK_Scroll_Lock, 0, XK_Scroll_Lock}));
|
||||
keysyms.set(79, new ArrayBox({ XK_KP_7, (uint)X.string_to_keysym("U2714"), XK_KP_7, (uint)X.string_to_keysym("U2714"), (uint)X.string_to_keysym("U2195"), (uint)X.string_to_keysym("U226A"), XK_KP_Home, XK_KP_Home, XK_upstile}));
|
||||
keysyms.set(80, new ArrayBox({ XK_KP_8, (uint)X.string_to_keysym("U2718"), XK_KP_8, (uint)X.string_to_keysym("U2718"), XK_uparrow, XK_intersection, XK_KP_Up, XK_KP_Up, (uint)X.string_to_keysym("U22C2")}));
|
||||
keysyms.set(81, new ArrayBox({ XK_KP_9, XK_KP_9, XK_KP_9, XK_KP_9, (uint)X.string_to_keysym("U20D7"), (uint)X.string_to_keysym("U226B"), XK_KP_Prior, XK_KP_Prior, (uint)X.string_to_keysym("U2309")}));
|
||||
keysyms.set(82, new ArrayBox({ XK_KP_Subtract, XK_KP_Subtract, XK_KP_Subtract, XK_KP_Subtract, (uint)X.string_to_keysym("U2212"), (uint)X.string_to_keysym("U2216"), (uint)X.string_to_keysym("U2296"), 0, (uint)X.string_to_keysym("U2238")}));
|
||||
keysyms.set(83, new ArrayBox({ XK_KP_4, XK_club, XK_KP_4, XK_club, XK_leftarrow, XK_includedin, XK_KP_Left, XK_KP_Left, (uint)X.string_to_keysym("U2286")}));
|
||||
keysyms.set(84, new ArrayBox({ XK_KP_5, XK_EuroSign, XK_KP_5, XK_EuroSign, XK_brokenbar, (uint)X.string_to_keysym("U22B6"), XK_KP_Begin, XK_KP_Begin, (uint)X.string_to_keysym("U22B7")}));
|
||||
keysyms.set(85, new ArrayBox({ XK_KP_6, XK_KP_6, XK_KP_6, XK_KP_6, XK_rightarrow, XK_includes, XK_KP_Right, XK_KP_Right, (uint)X.string_to_keysym("U2287")}));
|
||||
keysyms.set(86, new ArrayBox({ XK_KP_Add, XK_KP_Add, XK_KP_Add, XK_KP_Add, XK_plusminus, (uint)X.string_to_keysym("U2213"), (uint)X.string_to_keysym("U2295"), 0, (uint)X.string_to_keysym("U2214")}));
|
||||
keysyms.set(87, new ArrayBox({ XK_KP_1, XK_diamond, XK_KP_1, XK_diamond, (uint)X.string_to_keysym("U2194"), XK_lessthanequal, XK_KP_End, XK_KP_End, XK_downstile}));
|
||||
keysyms.set(88, new ArrayBox({ XK_KP_2, XK_heart, XK_KP_2, XK_heart, XK_downarrow, XK_union, XK_KP_Down, XK_KP_Down, (uint)X.string_to_keysym("U22C3")}));
|
||||
keysyms.set(89, new ArrayBox({ XK_KP_3, (uint)X.string_to_keysym("U2660"), XK_KP_3, (uint)X.string_to_keysym("U2660"), (uint)X.string_to_keysym("U21CC"), XK_greaterthanequal, XK_KP_Next, XK_KP_Next, (uint)X.string_to_keysym("U230B")}));
|
||||
keysyms.set(90, new ArrayBox({ XK_KP_0, (uint)X.string_to_keysym("U2423"), XK_KP_0, (uint)X.string_to_keysym("U2423"), XK_percent, (uint)X.string_to_keysym("U2030"), XK_KP_Insert, XK_KP_Insert, (uint)X.string_to_keysym("U25A1")}));
|
||||
keysyms.set(91, new ArrayBox({ XK_KP_Decimal, XK_comma, XK_KP_Decimal, XK_comma, XK_period, XK_apostrophe, XK_KP_Delete, XK_KP_Delete, XK_quotedbl}));
|
||||
keysyms.set(79, new ArrayBox({ XK_KP_7, (uint)X.string_to_keysym("U2714"), (uint)X.string_to_keysym("U2195"), (uint)X.string_to_keysym("U226A"), XK_KP_Home, XK_KP_Home, XK_upstile}));
|
||||
keysyms.set(80, new ArrayBox({ XK_KP_8, (uint)X.string_to_keysym("U2718"), XK_uparrow, XK_intersection, XK_KP_Up, XK_KP_Up, (uint)X.string_to_keysym("U22C2")}));
|
||||
keysyms.set(81, new ArrayBox({ XK_KP_9, XK_KP_9, (uint)X.string_to_keysym("U20D7"), (uint)X.string_to_keysym("U226B"), XK_KP_Prior, XK_KP_Prior, (uint)X.string_to_keysym("U2309")}));
|
||||
keysyms.set(82, new ArrayBox({ XK_KP_Subtract, XK_KP_Subtract, (uint)X.string_to_keysym("U2212"), (uint)X.string_to_keysym("U2216"), (uint)X.string_to_keysym("U2296"), 0, (uint)X.string_to_keysym("U2238")}));
|
||||
keysyms.set(83, new ArrayBox({ XK_KP_4, XK_club, XK_leftarrow, XK_includedin, XK_KP_Left, XK_KP_Left, (uint)X.string_to_keysym("U2286")}));
|
||||
keysyms.set(84, new ArrayBox({ XK_KP_5, XK_EuroSign, XK_brokenbar, (uint)X.string_to_keysym("U22B6"), XK_KP_Begin, XK_KP_Begin, (uint)X.string_to_keysym("U22B7")}));
|
||||
keysyms.set(85, new ArrayBox({ XK_KP_6, XK_KP_6, XK_rightarrow, XK_includes, XK_KP_Right, XK_KP_Right, (uint)X.string_to_keysym("U2287")}));
|
||||
keysyms.set(86, new ArrayBox({ XK_KP_Add, XK_KP_Add, XK_plusminus, (uint)X.string_to_keysym("U2213"), (uint)X.string_to_keysym("U2295"), 0, (uint)X.string_to_keysym("U2214")}));
|
||||
keysyms.set(87, new ArrayBox({ XK_KP_1, XK_diamond, (uint)X.string_to_keysym("U2194"), XK_lessthanequal, XK_KP_End, XK_KP_End, XK_downstile}));
|
||||
keysyms.set(88, new ArrayBox({ XK_KP_2, XK_heart, XK_downarrow, XK_union, XK_KP_Down, XK_KP_Down, (uint)X.string_to_keysym("U22C3")}));
|
||||
keysyms.set(89, new ArrayBox({ XK_KP_3, (uint)X.string_to_keysym("U2660"), (uint)X.string_to_keysym("U21CC"), XK_greaterthanequal, XK_KP_Next, XK_KP_Next, (uint)X.string_to_keysym("U230B")}));
|
||||
keysyms.set(90, new ArrayBox({ XK_KP_0, (uint)X.string_to_keysym("U2423"), XK_percent, (uint)X.string_to_keysym("U2030"), XK_KP_Insert, XK_KP_Insert, (uint)X.string_to_keysym("U25A1")}));
|
||||
keysyms.set(91, new ArrayBox({ XK_KP_Decimal, XK_comma, XK_period, XK_KP_Delete, XK_apostrophe, XK_quotedbl}));
|
||||
keysyms.set(92, new ArrayBox({ XK_ISO_Level3_Shift, 0, XK_ISO_Level3_Shift}));
|
||||
keysyms.set(93, new ArrayBox({ XK_Zenkaku_Hankaku, 0, XK_Zenkaku_Hankaku}));
|
||||
keysyms.set(94, new ArrayBox({ XK_ISO_Level5_Shift, 0, XK_ISO_Level5_Shift}));
|
||||
|
@ -136,9 +136,9 @@ namespace NeoLayoutViewer{
|
|||
keysyms.set(101, new ArrayBox({ XK_Hiragana_Katakana, 0, XK_Hiragana_Katakana}));
|
||||
keysyms.set(102, new ArrayBox({ XK_Muhenkan, 0, XK_Muhenkan}));
|
||||
keysyms.set(103, new ArrayBox({}));
|
||||
keysyms.set(104, new ArrayBox({ XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter}));
|
||||
keysyms.set(104, new ArrayBox({ XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter, XK_KP_Enter}));
|
||||
keysyms.set(105, new ArrayBox({ XK_Control_R, 0, XK_Control_R}));
|
||||
keysyms.set(106, new ArrayBox({ XK_KP_Divide, XK_KP_Divide, XK_KP_Divide, XK_KP_Divide, XK_division, (uint)X.string_to_keysym("U2223"), (uint)X.string_to_keysym("U2300"), 0, (uint)X.string_to_keysym("U2044")}));
|
||||
keysyms.set(106, new ArrayBox({ XK_KP_Divide, XK_KP_Divide, XK_division, (uint)X.string_to_keysym("U2223"), (uint)X.string_to_keysym("U2300"), 0, (uint)X.string_to_keysym("U2044")}));
|
||||
keysyms.set(107, new ArrayBox({ XK_Print, XK_Sys_Req, XK_Print, XK_Sys_Req}));
|
||||
keysyms.set(108, new ArrayBox({ XK_ISO_Level5_Shift, 0, XK_ISO_Level5_Shift}));
|
||||
keysyms.set(109, new ArrayBox({ XK_Linefeed, 0, XK_Linefeed}));
|
||||
|
@ -555,7 +555,6 @@ namespace NeoLayoutViewer{
|
|||
private NeoWindow winMain;
|
||||
private int width;
|
||||
private int height;
|
||||
private string cmd;
|
||||
|
||||
/*
|
||||
Die Reihenfolge der Zeichen in keysyms passt nicht
|
||||
|
@ -589,10 +588,11 @@ namespace NeoLayoutViewer{
|
|||
|
||||
this.button_press_event.connect ((event) => {
|
||||
uint ks = this.keysym[this.layer_permutation[winMain.ebene]-1];
|
||||
int modi = winMain.active_modifier[4]*winMain.MODIFIER_MASK[4]
|
||||
+ winMain.active_modifier[5]*winMain.MODIFIER_MASK[5];
|
||||
int modi = winMain.getActiveModifierMask({4,5});
|
||||
if( ks < 1 ) return false;
|
||||
|
||||
//GLib.stdout.printf(@"Capslock active: $( checkCapsLock() )\n");
|
||||
|
||||
keysend(ks,modi);
|
||||
return false;
|
||||
});
|
||||
|
@ -603,12 +603,12 @@ namespace NeoLayoutViewer{
|
|||
this.modifier_index = modifier_index;
|
||||
|
||||
this.button_press_event.connect ((event) => {
|
||||
if( winMain.active_modifier[this.modifier_index] == 0){
|
||||
winMain.active_modifier[this.modifier_index] = 1;
|
||||
winMain.status.set_label(@"Activate Modifier $(this.modifier_index)");
|
||||
if( winMain.active_modifier_by_mouse[this.modifier_index] == 0){
|
||||
winMain.change_active_modifier( this.modifier_index, false, 1 );
|
||||
winMain.status.set_label(@"Activate\nModifier $(this.modifier_index)");
|
||||
}else{
|
||||
winMain.active_modifier[this.modifier_index] = 0;
|
||||
winMain.status.set_label(@"Deactivate Modifier $(this.modifier_index)");
|
||||
winMain.change_active_modifier( this.modifier_index, false, 0 );
|
||||
winMain.status.set_label(@"Deactivate\nModifier $(this.modifier_index)");
|
||||
}
|
||||
winMain.redraw();
|
||||
|
||||
|
@ -621,17 +621,17 @@ namespace NeoLayoutViewer{
|
|||
this.modifier_index = modifier_index;
|
||||
|
||||
this.button_press_event.connect ((event) => {
|
||||
if( winMain.active_modifier[this.modifier_index] == 0){
|
||||
winMain.active_modifier[this.modifier_index] = 1;
|
||||
if( winMain.active_modifier_by_mouse[this.modifier_index] == 0){
|
||||
//deactivate modifier, which select other charakters
|
||||
//winMain.active_modifier[0] = 0;//egal
|
||||
winMain.active_modifier[1] = 0;
|
||||
winMain.active_modifier[2] = 0;
|
||||
winMain.active_modifier[3] = 0;
|
||||
winMain.status.set_label(@"Activate Modifier $(this.modifier_index)");
|
||||
winMain.change_active_modifier( 1, false, 0 );
|
||||
winMain.change_active_modifier( 2, false, 0 );
|
||||
winMain.change_active_modifier( 3, false, 0 );
|
||||
winMain.change_active_modifier( this.modifier_index, false, 1 );
|
||||
winMain.status.set_label(@"Activate\n Modifier $(this.modifier_index)");
|
||||
}else{
|
||||
winMain.active_modifier[this.modifier_index] = 0;
|
||||
winMain.status.set_label(@"Deactivate Modifier $(this.modifier_index)");
|
||||
winMain.change_active_modifier( this.modifier_index, false, 0 );
|
||||
winMain.status.set_label(@"Deactivate\n Modifier $(this.modifier_index)");
|
||||
}
|
||||
winMain.redraw();
|
||||
return false;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
using X;
|
||||
|
||||
namespace NeoLayoutViewer{
|
||||
/**
|
||||
* Modification of http://www.linux-nantes.org/~fmonnier/ocaml/Xlib/doc/Xlib.html by
|
||||
|
@ -6,11 +8,15 @@ namespace NeoLayoutViewer{
|
|||
public class KeybindingManager : GLib.Object
|
||||
{
|
||||
private NeoWindow neo_win;
|
||||
private unowned Gdk.Window rootwin;
|
||||
private unowned X.Display* display = null;
|
||||
private unowned X.ID xid;
|
||||
/**
|
||||
* list of binded keybindings
|
||||
*/
|
||||
private Gee.List<Keybinding> bindings = new Gee.ArrayList<Keybinding>();
|
||||
private Gee.List<ModifierKeybinding> modifier_bindings = new Gee.ArrayList<ModifierKeybinding>();
|
||||
private Gee.List<ModifierKeybinding> modifier_timeout_store = new Gee.ArrayList<ModifierKeybinding>();
|
||||
/**
|
||||
* locked modifiers used to grab all keys whatever lock key
|
||||
* is pressed.
|
||||
|
@ -26,6 +32,9 @@ namespace NeoLayoutViewer{
|
|||
Gdk.ModifierType.MOD2_MASK|Gdk.ModifierType.LOCK_MASK|Gdk.ModifierType.MOD5_MASK
|
||||
};
|
||||
|
||||
private int modifier_keycodes[10];
|
||||
//private bool modifier_pressed[10];//bad, because sizeof(bool,vala)!=sizeof(bool,c (stdbool.h))
|
||||
private int modifier_pressed[10];
|
||||
|
||||
/**
|
||||
* Helper class to store keybinding
|
||||
|
@ -81,21 +90,36 @@ namespace NeoLayoutViewer{
|
|||
{
|
||||
this.neo_win = neo_win;
|
||||
// init filter to retrieve X.Events
|
||||
Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
rootwin = Gdk.get_default_root_window();
|
||||
if(rootwin != null) {
|
||||
rootwin.add_filter(event_filter);
|
||||
display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
|
||||
modifier_keycodes[0] = display->keysym_to_keycode(XK_Shift_L);
|
||||
modifier_keycodes[1] = display->keysym_to_keycode(XK_Shift_R);
|
||||
//modifier_keycodes[2] = keysym_to_keycode(XK_ISO_Level3_Shift);/* not both keys detectable on this way */
|
||||
modifier_keycodes[2] = 66; //Mod3L can differ?!
|
||||
modifier_keycodes[3] = 51; //Mod3R
|
||||
modifier_keycodes[4] = 94; //Mod4L
|
||||
modifier_keycodes[5] = 108;//Mod4R
|
||||
modifier_keycodes[6] = display->keysym_to_keycode(XK_Control_L);
|
||||
modifier_keycodes[7] = display->keysym_to_keycode(XK_Control_R);
|
||||
modifier_keycodes[8] = display->keysym_to_keycode(XK_Alt_L);
|
||||
modifier_keycodes[9] = display->keysym_to_keycode(XK_Alt_R);
|
||||
|
||||
//some tests
|
||||
/*
|
||||
X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ModifierKeymap modmap = display->get_modifier_mapping ();
|
||||
debug("Max mod: %i\n".printf(modmap.max_keypermod));
|
||||
for(int i=0; i<modmap.max_keypermod;i++){
|
||||
debug(modmap.modifiermap[i].to_string()+"\n");
|
||||
}*/
|
||||
|
||||
Timeout.add (100, modifier_timer);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//some tests
|
||||
/*
|
||||
X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ModifierKeymap modmap = display.get_modifier_mapping ();
|
||||
debug("Max mod: %i\n".printf(modmap.max_keypermod));
|
||||
for(int i=0; i<modmap.max_keypermod;i++){
|
||||
debug(modmap.modifiermap[i].to_string()+"\n");
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -113,10 +137,10 @@ namespace NeoLayoutViewer{
|
|||
Gdk.ModifierType modifiers;
|
||||
Gtk.accelerator_parse(accelerator, out keysym, out modifiers);
|
||||
|
||||
Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
int keycode = display.keysym_to_keycode(keysym);
|
||||
//Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
//unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
//X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
int keycode = display->keysym_to_keycode(keysym);
|
||||
|
||||
if(keycode != 0) {
|
||||
// trap XErrors to avoid closing of application
|
||||
|
@ -126,7 +150,7 @@ namespace NeoLayoutViewer{
|
|||
// grab key finally
|
||||
// also grab all keys which are combined with a lock key such NumLock
|
||||
foreach(uint lock_modifier in lock_modifiers) {
|
||||
display.grab_key(keycode, modifiers|lock_modifier, xid, false, X.GrabMode.Async, X.GrabMode.Async);
|
||||
display->grab_key(keycode, modifiers|lock_modifier, xid, true, X.GrabMode.Async, X.GrabMode.Async);
|
||||
}
|
||||
|
||||
// wait until all X request have been processed
|
||||
|
@ -149,10 +173,10 @@ namespace NeoLayoutViewer{
|
|||
Gdk.ModifierType modifiers;
|
||||
Gtk.accelerator_parse(accelerator, out keysym, out modifiers);*/
|
||||
|
||||
Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
//int keycode = display.keysym_to_keycode(keysym);
|
||||
//Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
//unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
//X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
//int keycode = display->keysym_to_keycode(keysym);
|
||||
|
||||
if(keycode != 0) {
|
||||
// trap XErrors to avoid closing of application
|
||||
|
@ -160,7 +184,7 @@ namespace NeoLayoutViewer{
|
|||
Gdk.error_trap_push();
|
||||
|
||||
// grab key finally
|
||||
display.grab_key(keycode, 0, xid, false, X.GrabMode.Async, X.GrabMode.Async);
|
||||
display->grab_key(keycode, 0, xid, true, X.GrabMode.Async, X.GrabMode.Async);
|
||||
|
||||
// wait until all X request have been processed
|
||||
Gdk.flush();
|
||||
|
@ -184,16 +208,16 @@ namespace NeoLayoutViewer{
|
|||
{
|
||||
//debug("Unbinding key " + accelerator);
|
||||
|
||||
Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
//Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
//unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
//X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
|
||||
// unbind all keys with given accelerator
|
||||
Gee.List<Keybinding> remove_bindings = new Gee.ArrayList<Keybinding>();
|
||||
foreach(Keybinding binding in bindings) {
|
||||
if(str_equal(accelerator, binding.accelerator)) {
|
||||
foreach(uint lock_modifier in lock_modifiers) {
|
||||
display.ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
display->ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
}
|
||||
remove_bindings.add(binding);
|
||||
}
|
||||
|
@ -207,15 +231,15 @@ namespace NeoLayoutViewer{
|
|||
{
|
||||
//debug("Unbinding key\n ");
|
||||
|
||||
Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
//Gdk.Window rootwin = Gdk.get_default_root_window();
|
||||
//unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
//X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
|
||||
// unbind all keys with given accelerator
|
||||
Gee.List<ModifierKeybinding> remove_bindings = new Gee.ArrayList<ModifierKeybinding>();
|
||||
foreach(ModifierKeybinding binding in modifier_bindings) {
|
||||
if(keycode == binding.keycode) {
|
||||
display.ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
display->ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
remove_bindings.add(binding);
|
||||
}
|
||||
}
|
||||
|
@ -252,11 +276,11 @@ namespace NeoLayoutViewer{
|
|||
foreach(ModifierKeybinding binding in modifier_bindings) {
|
||||
if(xevent->xkey.keycode == binding.keycode) {
|
||||
//neo_win.external_key_press(binding.ebene,(int)event_mods);
|
||||
neo_win.active_modifier[binding.ebene] = 1;
|
||||
neo_win.active_modifier_by_keyboard[binding.ebene] = 1;
|
||||
neo_win.redraw();
|
||||
// call all handlers with pressed key and modifiers
|
||||
binding.handler(gdk_event);
|
||||
//send_event_again(Gdk.get_default_root_window(), binding, *xevent);
|
||||
send_event_again(Gdk.get_default_root_window(), xevent, binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -267,11 +291,11 @@ namespace NeoLayoutViewer{
|
|||
foreach(ModifierKeybinding binding in modifier_bindings) {
|
||||
if(xevent->xkey.keycode == binding.keycode) {
|
||||
//neo_win.external_key_release(0,(int)event_mods);
|
||||
neo_win.active_modifier[binding.ebene] = 0;
|
||||
neo_win.active_modifier_by_keyboard[binding.ebene] = 0;
|
||||
neo_win.redraw();
|
||||
// call all handlers with pressed key and modifiers
|
||||
binding.handler(gdk_event);
|
||||
//send_event_again(Gdk.get_default_root_window(), binding, *xevent);
|
||||
send_event_again(Gdk.get_default_root_window(), xevent, binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -279,32 +303,74 @@ namespace NeoLayoutViewer{
|
|||
|
||||
debug("Filter %u\n".printf(xevent.xkey.keycode));
|
||||
|
||||
send_event_again(Gdk.get_default_root_window(), *xevent);
|
||||
//send_event_again(Gdk.get_default_root_window(), *xevent, binding);
|
||||
|
||||
return filter_return;
|
||||
}
|
||||
|
||||
|
||||
private void send_event_again(Gdk.Window rootwin, X.Event xevent){
|
||||
private void send_event_again(Gdk.Window rootwin, X.Event* xevent, ModifierKeybinding binding){
|
||||
|
||||
if(rootwin != null) {
|
||||
unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
foreach(ModifierKeybinding binding in modifier_bindings){
|
||||
display.ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
}
|
||||
//X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
|
||||
//rootwin.remove_filter(event_filter);
|
||||
debug("Send Event again %u\n".printf(xevent.xkey.state));
|
||||
display.send_event(xevent.xkey.window,true,xevent.xkey.state,ref xevent);
|
||||
//rootwin.add_filter(event_filter);
|
||||
display->ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
//modifier_timeout_store.add(binding);
|
||||
//putBack(display, xevent);
|
||||
//display->grab_key(binding.keycode, 0, xid, false, X.GrabMode.Async, X.GrabMode.Async);
|
||||
|
||||
foreach(ModifierKeybinding binding in modifier_bindings){
|
||||
// display.grab_key(binding.keycode, 0, xid, false, X.GrabMode.Async, X.GrabMode.Async);
|
||||
}
|
||||
/*
|
||||
if(rootwin != null) {
|
||||
unowned X.Display display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
X.ID xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
foreach(ModifierKeybinding binding in modifier_bindings){
|
||||
display->ungrab_key(binding.keycode, binding.modifiers, xid);
|
||||
}
|
||||
|
||||
//rootwin.remove_filter(event_filter);
|
||||
debug("Send Event again %u\n".printf(xevent.xkey.state));
|
||||
display->send_event(xevent.xkey.window,true,xevent.xkey.state,ref xevent);
|
||||
//rootwin.add_filter(event_filter);
|
||||
|
||||
foreach(ModifierKeybinding binding in modifier_bindings){
|
||||
// display->grab_key(binding.keycode, 0, xid, false, X.GrabMode.Async, X.GrabMode.Async);
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
private bool modifier_timer(){
|
||||
if(rootwin == null) {
|
||||
debug("Root window changed.");
|
||||
rootwin = Gdk.get_default_root_window();
|
||||
//rootwin.add_filter(event_filter);
|
||||
display = Gdk.x11_drawable_get_xdisplay(rootwin);
|
||||
xid = Gdk.x11_drawable_get_xid(rootwin);
|
||||
}
|
||||
|
||||
//debug("check Modifier");
|
||||
checkModifier(display,&modifier_keycodes[0], modifier_keycodes.length, &modifier_pressed[0]);
|
||||
|
||||
// Convert modifier keys to modifier/layer
|
||||
neo_win.change_active_modifier( 1, true, (int) ( ( modifier_pressed[0] | modifier_pressed[1] )
|
||||
!= (checkCapsLock(display)?1:0) ) );
|
||||
neo_win.change_active_modifier( 2, true, (int) ( modifier_pressed[2] | modifier_pressed[3] ) );
|
||||
neo_win.change_active_modifier( 3, true, (int) ( modifier_pressed[4] | modifier_pressed[5] ) );
|
||||
neo_win.change_active_modifier( 4, true, (int) ( modifier_pressed[6] | modifier_pressed[7] ) );
|
||||
neo_win.change_active_modifier( 5, true, (int) ( modifier_pressed[8] | modifier_pressed[9] ) );
|
||||
|
||||
// stdout.printf(@"Mods: $(neo_win.active_modifier[1]), $(neo_win.active_modifier[2]), $(neo_win.active_modifier[3])\n" );
|
||||
neo_win.redraw();
|
||||
|
||||
if(true) return true;
|
||||
/*
|
||||
foreach(ModifierKeybinding binding in modifier_timeout_store) {
|
||||
display->grab_key(binding.keycode, 0, xid, true, X.GrabMode.Async, X.GrabMode.Async);
|
||||
debug("Timer");
|
||||
}
|
||||
modifier_timeout_store.clear();
|
||||
|
||||
return true;
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
12
main.vala
12
main.vala
|
@ -1,3 +1,5 @@
|
|||
using X;
|
||||
|
||||
namespace NeoLayoutViewer{
|
||||
|
||||
public static int main (string[] args) {
|
||||
|
@ -15,12 +17,15 @@ namespace NeoLayoutViewer{
|
|||
var neo_win = new NeoWindow (sebene, configm.getConfig());
|
||||
var neo_tray = new AppStatusIcon(neo_win);
|
||||
var manager = new KeybindingManager(neo_win);
|
||||
|
||||
/*
|
||||
manager.bind2(50, "ShiftL",1, ()=>{});
|
||||
manager.bind2(62, "ShiftR",1, ()=>{});
|
||||
manager.bind2(66, "Mod3L",2, ()=>{});
|
||||
manager.bind2(51, "Mod3R",2, ()=>{});
|
||||
manager.bind2(94, "Mod4",3, ()=>{});
|
||||
manager.bind2(108, "Mod4",3, ()=>{});
|
||||
*/
|
||||
manager.bind(configm.getConfig().get("show_shortcut"), ()=>{neo_win.toggle();});
|
||||
manager.bind(configm.getConfig().get("move_shortcut"), ()=>{neo_win.numkeypad_move(0);});
|
||||
|
||||
|
@ -30,14 +35,14 @@ namespace NeoLayoutViewer{
|
|||
//move window (Fehlerquelle: config von configm, nicht neo_win. Derzeit gleiches Objekt.)
|
||||
|
||||
Gtk.main ();
|
||||
|
||||
/*
|
||||
manager.unbind2(50);
|
||||
manager.unbind2(62);
|
||||
manager.unbind2(66);
|
||||
manager.unbind2(51);
|
||||
manager.unbind2(94);
|
||||
manager.unbind2(108);
|
||||
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -48,4 +53,5 @@ namespace NeoLayoutViewer{
|
|||
/* Extern C routines */
|
||||
extern int keysend(uint keysym, int modifiers);
|
||||
//extern int keysend2(uint keysym, uint modsym1, uint modsym2);
|
||||
|
||||
extern bool checkCapsLock(X.Display* d);
|
||||
extern void checkModifier(X.Display* d, int* keycodes, int nkeycodes, int* pressed );
|
||||
|
|
|
@ -13,7 +13,8 @@ namespace NeoLayoutViewer{
|
|||
public Gee.HashMap<string, string> config;
|
||||
|
||||
public int ebene;
|
||||
public int[] active_modifier;
|
||||
public int[] active_modifier_by_keyboard;
|
||||
public int[] active_modifier_by_mouse;
|
||||
public int numblock_width;
|
||||
//private Button button;
|
||||
private bool minimized;
|
||||
|
@ -55,6 +56,17 @@ namespace NeoLayoutViewer{
|
|||
{0,1,0,3,1,3},
|
||||
{0,1,2,0,4,2} };
|
||||
|
||||
/*
|
||||
Modifier können per Tastatur und Maus aktiviert werden. Diese Abbildung entscheidet,
|
||||
*/
|
||||
private short[,,,] MODIFIER_KEYBOARD_MOUSE_MAP = {
|
||||
// k = f(k,m,K,M,) and m = f(m,k,M,K)
|
||||
{ { {0, 0} , {1, 0} } , // 0000, 0001; 0010, 0011;
|
||||
{ {0, 0} , {1, 1} } }, // 0100, 0101; 0110, 0111(=swap);
|
||||
{ { {0, 0} , {1, 0} } , //1000, 1001; 1010, 1011(=swap);
|
||||
{ {0, 0} , {1, 1} } }//1100, 1101; 1110, 1111; //k=m=1 should be impossible
|
||||
};
|
||||
|
||||
public NeoWindow (string sebene, Gee.HashMap<string, string> config) {
|
||||
this.config = config;
|
||||
this.minimized = true;
|
||||
|
@ -80,7 +92,8 @@ namespace NeoLayoutViewer{
|
|||
Gdk.ModifierType.CONTROL_MASK,
|
||||
Gdk.ModifierType.MOD1_MASK // Alt-Mask do not work :-(
|
||||
};
|
||||
this.active_modifier = {0,0,0,0,0,0};
|
||||
this.active_modifier_by_keyboard = {0,0,0,0,0,0};
|
||||
this.active_modifier_by_mouse = {0,0,0,0,0,0};
|
||||
|
||||
this.position_num = int.max(int.min(int.parse(config.get("position")),9),1);
|
||||
//Anlegen des Arrays, welches den Positionsdurchlauf beschreibt.
|
||||
|
@ -113,7 +126,11 @@ namespace NeoLayoutViewer{
|
|||
fixed.put( new KeyOverlay(this) , 0, 0);
|
||||
|
||||
this.status = new Label("");
|
||||
fixed.put( status, 2, 2 );
|
||||
int width;
|
||||
int height;
|
||||
this.get_size2(out width, out height);
|
||||
//bad position, if numblock not shown...
|
||||
fixed.put( status, (int) ( (0.65)*width), (int) (0.40*height) );
|
||||
|
||||
//Fenstereigenschaften setzen
|
||||
this.key_press_event.connect (on_key_pressed);
|
||||
|
@ -147,6 +164,7 @@ namespace NeoLayoutViewer{
|
|||
|
||||
//Nicht selektierbar (für virtuelle Tastatur)
|
||||
this.set_accept_focus( (config.get("window_selectable")!="0") );
|
||||
|
||||
}
|
||||
|
||||
public override void show_all(){
|
||||
|
@ -327,6 +345,59 @@ namespace NeoLayoutViewer{
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
Use the for values
|
||||
- “modifier was pressed”
|
||||
- “modifier is pressed”
|
||||
- “modifier was seleted by mouseclick” and
|
||||
- “modifier is seleted by mouseclick”
|
||||
as array indizes to eval an new state.
|
||||
*/
|
||||
public void change_active_modifier(int mod_index, bool keyboard, int new_mod_state){
|
||||
int old_mod_state;
|
||||
if( keyboard ){
|
||||
//Keypress or Release of shift etc.
|
||||
old_mod_state = this.active_modifier_by_keyboard[mod_index];
|
||||
this.active_modifier_by_keyboard[mod_index] = MODIFIER_KEYBOARD_MOUSE_MAP[
|
||||
old_mod_state,
|
||||
this.active_modifier_by_mouse[mod_index],
|
||||
new_mod_state,
|
||||
this.active_modifier_by_mouse[mod_index]
|
||||
];
|
||||
this.active_modifier_by_mouse[mod_index] = MODIFIER_KEYBOARD_MOUSE_MAP[
|
||||
this.active_modifier_by_mouse[mod_index],
|
||||
old_mod_state,
|
||||
this.active_modifier_by_mouse[mod_index],
|
||||
new_mod_state
|
||||
];
|
||||
}else{
|
||||
//Mouseclick on shift button etc.
|
||||
old_mod_state = this.active_modifier_by_mouse[mod_index];
|
||||
this.active_modifier_by_mouse[mod_index] = MODIFIER_KEYBOARD_MOUSE_MAP[
|
||||
old_mod_state,
|
||||
this.active_modifier_by_keyboard[mod_index],
|
||||
new_mod_state,
|
||||
this.active_modifier_by_keyboard[mod_index]
|
||||
];
|
||||
this.active_modifier_by_keyboard[mod_index] = MODIFIER_KEYBOARD_MOUSE_MAP[
|
||||
this.active_modifier_by_keyboard[mod_index],
|
||||
old_mod_state,
|
||||
this.active_modifier_by_keyboard[mod_index],
|
||||
new_mod_state
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int getActiveModifierMask(int[] modifier){
|
||||
int modMask = 0;
|
||||
foreach( int i in modifier ){
|
||||
modMask += ( this.active_modifier_by_keyboard[i] | this.active_modifier_by_mouse[i] )
|
||||
* this.MODIFIER_MASK[i];
|
||||
}
|
||||
return modMask;
|
||||
}
|
||||
|
||||
private void check_modifier(int iet1){
|
||||
|
||||
if(iet1 != this.ebene){
|
||||
|
@ -336,13 +407,15 @@ namespace NeoLayoutViewer{
|
|||
}
|
||||
|
||||
public void redraw(){
|
||||
var tebene = this.ebene;
|
||||
this.ebene = this.MODIFIER_MAP2[
|
||||
this.active_modifier[1], //shift
|
||||
this.active_modifier[2], //neo-mod3
|
||||
this.active_modifier[3] //neo-mod4
|
||||
this.active_modifier_by_keyboard[1] | this.active_modifier_by_mouse[1], //shift
|
||||
this.active_modifier_by_keyboard[2] | this.active_modifier_by_mouse[2], //neo-mod3
|
||||
this.active_modifier_by_keyboard[3] | this.active_modifier_by_mouse[3] //neo-mod4
|
||||
] + 1;
|
||||
|
||||
render_page();
|
||||
if( tebene != this.ebene)
|
||||
render_page();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* keysym.vapi generated by valac 0.13.1, do not modify. */
|
||||
/* keysym.vapi generated by valac 0.13.1.121-026b, do not modify. */
|
||||
|
||||
[CCode (cprefix = "NeoLayoutViewer", lower_case_cprefix = "neo_layout_viewer_")]
|
||||
namespace NeoLayoutViewer {
|
||||
|
@ -33,14 +33,17 @@ namespace NeoLayoutViewer {
|
|||
public class NeoWindow : Gtk.Window {
|
||||
public int[] MODIFIER_MASK;
|
||||
public int[] NEO_MODIFIER_MASK;
|
||||
public int[] active_modifier;
|
||||
public int[] active_modifier_by_keyboard;
|
||||
public int[] active_modifier_by_mouse;
|
||||
public Gee.HashMap<string,string> config;
|
||||
public int ebene;
|
||||
public int numblock_width;
|
||||
public Gtk.Label status;
|
||||
public NeoWindow (string sebene, Gee.HashMap<string,string> config);
|
||||
public void change_active_modifier (int mod_index, bool keyboard, int new_mod_state);
|
||||
public void external_key_press (int iet1, int modifier_mask);
|
||||
public void external_key_release (int iet1, int modifier_mask);
|
||||
public int getActiveModifierMask (int[] modifier);
|
||||
public Gdk.Pixbuf getIcon ();
|
||||
public void get_size2 (out int width, out int height);
|
||||
public override void hide_all ();
|
||||
|
|
Loading…
Reference in New Issue