Modifier detection works

This commit is contained in:
Olaf Schulz 2011-10-16 19:09:33 +02:00
parent 82b8fa9943
commit 99856440aa
8 changed files with 360 additions and 151 deletions

View File

@ -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
View File

@ -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.

58
checkModifier.c Normal file
View File

@ -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
}

View File

@ -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;

View File

@ -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;
*/
}
}
}

View File

@ -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 );

View File

@ -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();
}

View File

@ -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 ();