/* Known Problems: - Tab, Shift+Tab, Shift+Space, Numblock not implemented - Some special characters, i.e ℂ, not implemented, because the unicode numbers not defined in keysymdef.h (and left in the vapi file, too). */ using Gtk; using Gdk; using X; using Posix;//system-call namespace NeoLayoutViewer { public class ArrayBox { public uint[] val; public ArrayBox(uint[] val){ this.val = val; } } public class KeyOverlay : Box { public Gee.HashMap keyBoxes; public Gee.HashMap keysyms; private NeoWindow winMain; public KeyOverlay(NeoWindow winMain) { this.set_orientation(Gtk.Orientation.VERTICAL); this.set_homogeneous(false); this.set_spacing(0); this.winMain = winMain; this.keysyms = generateKeysyms(); this.keyBoxes = new Gee.HashMap(); generateKeyevents(); this.show(); } public Gee.HashMap generateKeysyms(){ keysyms = new Gee.HashMap(); /* Define keyboard layout. this object maps the keycodes to the list of keycodes of each keyboard layer. */ keysyms.set(8, new ArrayBox({})); keysyms.set( 9, new ArrayBox({ XK_Escape, XK_Escape, XK_Escape, XK_Escape, XK_Escape })); keysyms.set( 10, new ArrayBox({ XK_1, XK_degree, XK_onesuperior, XK_onesubscript, XK_ordfeminine, XK_notsign, 0 /*NoSymbol*/ })); keysyms.set( 11, new ArrayBox({ XK_2, XK_section, XK_twosuperior, XK_twosubscript, XK_masculine, XK_logicalor, 0 /*NoSymbol*/ })); keysyms.set( 12, new ArrayBox({ XK_3, (uint)X.string_to_keysym("U2113"), XK_threesuperior, XK_threesubscript, XK_numerosign, XK_logicaland, 0 /*NoSymbol*/ })); keysyms.set( 13, new ArrayBox({ XK_4, XK_guillemotright, (uint)X.string_to_keysym("U203A"), XK_femalesymbol, 0 /*NoSymbol*/, (uint)X.string_to_keysym("U22A5"), 0 /*NoSymbol*/ })); keysyms.set( 14, new ArrayBox({ XK_5, XK_guillemotleft, (uint)X.string_to_keysym("U2039"), XK_malesymbol, XK_periodcentered, (uint)X.string_to_keysym("U2221"), 0 /*NoSymbol*/ })); keysyms.set( 15, new ArrayBox({ XK_6, XK_dollar, XK_cent, (uint)X.string_to_keysym("U26A5"), XK_sterling, (uint)X.string_to_keysym("U2225"), 0 /*NoSymbol*/ })); keysyms.set( 16, new ArrayBox({ XK_7, XK_EuroSign, XK_yen, (uint)X.string_to_keysym("U03F0"), XK_currency, XK_rightarrow, 0 /*NoSymbol*/ })); keysyms.set( 17, new ArrayBox({ XK_8, XK_doublelowquotemark, XK_singlelowquotemark, (uint)X.string_to_keysym("U27E8"), XK_Tab, (uint)X.string_to_keysym("U221E"), 0 /*NoSymbol*/ })); keysyms.set( 18, new ArrayBox({ XK_9, XK_leftdoublequotemark, XK_leftsinglequotemark, (uint)X.string_to_keysym("U27E9"), XK_KP_Divide, XK_variation, 0 /*NoSymbol*/ })); keysyms.set( 19, new ArrayBox({ XK_0, XK_rightdoublequotemark, XK_rightsinglequotemark, XK_zerosubscript, XK_KP_Multiply, XK_emptyset, 0 /*NoSymbol*/ })); keysyms.set( 20, new ArrayBox({ XK_minus, XK_emdash, 0 /*NoSymbol*/, (uint)X.string_to_keysym("U2011"), XK_KP_Subtract, XK_hyphen, 0 /*NoSymbol*/ })); keysyms.set( 21, new ArrayBox({ XK_dead_grave, XK_dead_cedilla, XK_dead_abovering, XK_dead_abovereversedcomma, XK_dead_diaeresis, XK_dead_macron, 0 /*NoSymbol*/ })); keysyms.set( 22, new ArrayBox({ XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace, XK_BackSpace })); keysyms.set( 23, new ArrayBox({ XK_Tab, XK_ISO_Left_Tab, XK_Multi_key, XK_ISO_Level5_Lock, 0 /*NoSymbol*/, 0 /*NoSymbol*/, XK_ISO_Level5_Lock })); keysyms.set( 24, new ArrayBox({ XK_x, XK_X, XK_ellipsis, XK_Greek_xi, XK_Prior, XK_Greek_XI, 0 /*NoSymbol*/ })); keysyms.set( 25, new ArrayBox({ XK_v, XK_V, XK_underscore, 0 /*NoSymbol*/, XK_BackSpace, XK_radical, 0 /*NoSymbol*/ })); keysyms.set( 26, new ArrayBox({ XK_l, XK_L, XK_bracketleft, XK_Greek_lamda, XK_Up, XK_Greek_LAMDA, 0 /*NoSymbol*/ })); keysyms.set( 27, new ArrayBox({ XK_c, XK_C, XK_bracketright, XK_Greek_chi, XK_Delete, (uint)X.string_to_keysym("U2102"), 0 /*NoSymbol*/ })); keysyms.set( 28, new ArrayBox({ XK_w, XK_W, XK_asciicircum, XK_Greek_omega, XK_Next, XK_Greek_OMEGA, 0 /*NoSymbol*/ })); keysyms.set( 29, new ArrayBox({ XK_k, XK_K, XK_exclam, XK_Greek_kappa, XK_exclamdown, XK_multiply, 0 /*NoSymbol*/ })); keysyms.set( 30, new ArrayBox({ XK_h, XK_H, XK_less, XK_Greek_psi, XK_KP_7, XK_Greek_PSI, 0 /*NoSymbol*/ })); keysyms.set( 31, new ArrayBox({ XK_g, XK_G, XK_greater, XK_Greek_gamma, XK_KP_8, XK_Greek_GAMMA, 0 /*NoSymbol*/ })); keysyms.set( 32, new ArrayBox({ XK_f, XK_F, XK_equal, XK_Greek_phi, XK_KP_9, XK_Greek_PHI, 0 /*NoSymbol*/ })); keysyms.set( 33, new ArrayBox({ XK_q, XK_Q, XK_ampersand, (uint)X.string_to_keysym("U03D5"), XK_KP_Add, (uint)X.string_to_keysym("U211A"), 0 /*NoSymbol*/ })); keysyms.set( 34, new ArrayBox({ XK_ssharp, (uint)X.string_to_keysym("U1E9E"), (uint)X.string_to_keysym("U017F"), XK_Greek_finalsmallsigma, (uint)X.string_to_keysym("U2212"), XK_jot, 0 /*NoSymbol*/ })); keysyms.set( 35, new ArrayBox({ XK_dead_acute, XK_dead_tilde, XK_dead_stroke, XK_dead_abovecomma, XK_dead_doubleacute, XK_dead_breve, 0 /*NoSymbol*/ })); keysyms.set( 36, new ArrayBox({ XK_Return, XK_Return, XK_Return, XK_Return, XK_Return })); keysyms.set( 37, new ArrayBox({ XK_Control_L, XK_Control_L, XK_Control_L, XK_Control_L, XK_Control_L })); keysyms.set( 38, new ArrayBox({ XK_u, XK_U, XK_backslash, 0 /*NoSymbol*/, XK_Home, XK_includedin, 0 /*NoSymbol*/ })); keysyms.set( 39, new ArrayBox({ XK_i, XK_I, XK_slash, XK_Greek_iota, XK_Left, XK_integral, 0 /*NoSymbol*/ })); keysyms.set( 40, new ArrayBox({ XK_a, XK_A, XK_braceleft, XK_Greek_alpha, XK_Down, (uint)X.string_to_keysym("U2200"), 0 /*NoSymbol*/ })); keysyms.set( 41, new ArrayBox({ XK_e, XK_E, XK_braceright, XK_Greek_epsilon, XK_Right, (uint)X.string_to_keysym("U2203"), 0 /*NoSymbol*/ })); keysyms.set( 42, new ArrayBox({ XK_o, XK_O, XK_asterisk, XK_Greek_omicron, XK_End, XK_elementof, 0 /*NoSymbol*/ })); keysyms.set( 43, new ArrayBox({ XK_s, XK_S, XK_question, XK_Greek_sigma, XK_questiondown, XK_Greek_SIGMA, 0 /*NoSymbol*/ })); keysyms.set( 44, new ArrayBox({ XK_n, XK_N, XK_parenleft, XK_Greek_nu, XK_KP_4, (uint)X.string_to_keysym("U2115"), 0 /*NoSymbol*/ })); keysyms.set( 45, new ArrayBox({ XK_r, XK_R, XK_parenright, XK_Greek_rho, XK_KP_5, (uint)X.string_to_keysym("U211D"), 0 /*NoSymbol*/ })); keysyms.set( 46, new ArrayBox({ XK_t, XK_T, XK_minus, XK_Greek_tau, XK_KP_6, XK_partialderivative, 0 /*NoSymbol*/ })); keysyms.set( 47, new ArrayBox({ XK_d, XK_D, XK_colon, XK_Greek_delta, XK_KP_Separator, XK_Greek_DELTA, 0 /*NoSymbol*/ })); keysyms.set( 48, new ArrayBox({ XK_y, XK_Y, XK_at, XK_Greek_upsilon, XK_period, XK_nabla, 0 /*NoSymbol*/ })); keysyms.set( 49, new ArrayBox({ XK_dead_circumflex, XK_dead_caron, (uint)X.string_to_keysym("U21BB"), (uint)X.string_to_keysym("U02DE"), XK_dead_abovedot, XK_dead_belowdot, 0 /*NoSymbol*/ })); keysyms.set( 50, new ArrayBox({ XK_Shift_L, XK_Caps_Lock })); keysyms.set( 51, new ArrayBox({ XK_ISO_Level3_Shift })); keysyms.set( 52, new ArrayBox({ XK_udiaeresis, XK_Udiaeresis, XK_numbersign, 0 /*NoSymbol*/, XK_Escape, XK_union, 0 /*NoSymbol*/ })); keysyms.set( 53, new ArrayBox({ XK_odiaeresis, XK_Odiaeresis, XK_dollar, (uint)X.string_to_keysym("U03F5"), XK_Tab, XK_intersection, 0 /*NoSymbol*/ })); keysyms.set( 54, new ArrayBox({ XK_adiaeresis, XK_Adiaeresis, XK_bar, XK_Greek_eta, XK_Insert, (uint)X.string_to_keysym("U2135"), 0 /*NoSymbol*/ })); keysyms.set( 55, new ArrayBox({ XK_p, XK_P, XK_asciitilde, XK_Greek_pi, XK_Return, XK_Greek_PI, 0 /*NoSymbol*/ })); keysyms.set( 56, new ArrayBox({ XK_z, XK_Z, XK_grave, XK_Greek_zeta, XK_Undo, (uint)X.string_to_keysym("U2124"), 0 /*NoSymbol*/ })); keysyms.set( 57, new ArrayBox({ XK_b, XK_B, XK_plus, XK_Greek_beta, XK_colon, (uint)X.string_to_keysym("U21D0"), 0 /*NoSymbol*/ })); keysyms.set( 58, new ArrayBox({ XK_m, XK_M, XK_percent, XK_Greek_mu, XK_KP_1, XK_ifonlyif, 0 /*NoSymbol*/ })); keysyms.set( 59, new ArrayBox({ XK_comma, XK_endash, XK_quotedbl, (uint)X.string_to_keysym("U03F1"), XK_KP_2, (uint)X.string_to_keysym("U21D2"), 0 /*NoSymbol*/ })); keysyms.set( 60, new ArrayBox({ XK_period, XK_enfilledcircbullet, XK_apostrophe, (uint)X.string_to_keysym("U03D1"), XK_KP_3, (uint)X.string_to_keysym("U21A6"), 0 /*NoSymbol*/ })); keysyms.set( 61, new ArrayBox({ XK_j, XK_J, XK_semicolon, XK_Greek_theta, XK_semicolon, XK_Greek_THETA, 0 /*NoSymbol*/ })); keysyms.set( 62, new ArrayBox({ XK_Shift_R, XK_Caps_Lock })); keysyms.set( 63, new ArrayBox({ XK_KP_Multiply, XK_KP_Multiply, (uint)X.string_to_keysym("U2219"), (uint)X.string_to_keysym("U2299"), XK_multiply, (uint)X.string_to_keysym("U2297"), 0 /*NoSymbol*/ })); keysyms.set( 64, new ArrayBox({ XK_Alt_L, XK_Alt_L, XK_Alt_L, XK_Alt_L, XK_Alt_L, XK_Alt_L })); keysyms.set( 65, new ArrayBox({ XK_space, XK_space, XK_space, XK_nobreakspace, XK_KP_0, (uint)X.string_to_keysym("U202F"), 0 /*NoSymbol*/ })); keysyms.set( 66, new ArrayBox({ XK_ISO_Level3_Shift })); keysyms.set( 67, new ArrayBox({ XK_F1, 0 /*XK_XF86_Switch_VT_1*/ })); keysyms.set( 68, new ArrayBox({ XK_F2, 0 /*XK_XF86_Switch_VT_2*/ })); keysyms.set( 69, new ArrayBox({ XK_F3, 0 /*XK_XF86_Switch_VT_3*/ })); keysyms.set( 70, new ArrayBox({ XK_F4, 0 /*XK_XF86_Switch_VT_4*/ })); keysyms.set( 71, new ArrayBox({ XK_F5, 0 /*XK_XF86_Switch_VT_5*/ })); keysyms.set( 72, new ArrayBox({ XK_F6, 0 /*XK_XF86_Switch_VT_6*/ })); keysyms.set( 73, new ArrayBox({ XK_F7, 0 /*XK_XF86_Switch_VT_7*/ })); keysyms.set( 74, new ArrayBox({ XK_F8, 0 /*XK_XF86_Switch_VT_8*/ })); keysyms.set( 75, new ArrayBox({ XK_F9, 0 /*XK_XF86_Switch_VT_9*/ })); keysyms.set( 76, new ArrayBox({ XK_F10, 0 /*XK_XF86_Switch_VT_10*/ })); keysyms.set( 77, new ArrayBox({ XK_Tab, XK_ISO_Left_Tab, XK_equal, XK_approxeq, XK_notequal, XK_identical, 0 /*NoSymbol*/ })); keysyms.set( 78, new ArrayBox({ XK_Scroll_Lock, XK_Scroll_Lock, XK_Scroll_Lock, XK_Scroll_Lock, XK_Scroll_Lock })); 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_upstile, 0 /*NoSymbol*/ })); keysyms.set( 80, new ArrayBox({ XK_KP_8, (uint)X.string_to_keysym("U2718"), XK_uparrow, XK_intersection, XK_KP_Up, (uint)X.string_to_keysym("U22C2"), 0 /*NoSymbol*/ })); keysyms.set( 81, new ArrayBox({ XK_KP_9, XK_dagger, (uint)X.string_to_keysym("U20D7"), (uint)X.string_to_keysym("U226B"), XK_KP_Prior, (uint)X.string_to_keysym("U2309"), 0 /*NoSymbol*/ })); keysyms.set( 82, new ArrayBox({ XK_KP_Subtract, XK_KP_Subtract, (uint)X.string_to_keysym("U2212"), (uint)X.string_to_keysym("U2296"), (uint)X.string_to_keysym("U2216"), (uint)X.string_to_keysym("U2238"), 0 /*NoSymbol*/ })); keysyms.set( 83, new ArrayBox({ XK_KP_4, XK_club, XK_leftarrow, XK_includedin, XK_KP_Left, (uint)X.string_to_keysym("U2286"), 0 /*NoSymbol*/ })); keysyms.set( 84, new ArrayBox({ XK_KP_5, XK_EuroSign, XK_colon, (uint)X.string_to_keysym("U22B6"), XK_KP_Begin, (uint)X.string_to_keysym("U22B7"), 0 /*NoSymbol*/ })); keysyms.set( 85, new ArrayBox({ XK_KP_6, (uint)X.string_to_keysym("U2023"), XK_rightarrow, XK_includes, XK_KP_Right, (uint)X.string_to_keysym("U2287"), 0 /*NoSymbol*/ })); keysyms.set( 86, new ArrayBox({ XK_KP_Add, XK_KP_Add, XK_plusminus, (uint)X.string_to_keysym("U2295"), (uint)X.string_to_keysym("U2213"), (uint)X.string_to_keysym("U2214"), 0 /*NoSymbol*/ })); keysyms.set( 87, new ArrayBox({ XK_KP_1, XK_diamond, (uint)X.string_to_keysym("U2194"), XK_lessthanequal, XK_KP_End, XK_downstile, 0 /*NoSymbol*/ })); keysyms.set( 88, new ArrayBox({ XK_KP_2, XK_heart, XK_downarrow, XK_union, XK_KP_Down, (uint)X.string_to_keysym("U22C3"), 0 /*NoSymbol*/ })); 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, (uint)X.string_to_keysym("U230B"), 0 /*NoSymbol*/ })); 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, (uint)X.string_to_keysym("U25A1"), 0 /*NoSymbol*/ })); keysyms.set( 91, new ArrayBox({ XK_KP_Separator, XK_period, XK_comma, XK_minutes, XK_KP_Delete, XK_seconds, 0 /*NoSymbol*/ })); keysyms.set( 92, new ArrayBox({ XK_ISO_Level3_Shift })); keysyms.set( 93, new ArrayBox({ })); keysyms.set( 94, new ArrayBox({ XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Lock, XK_ISO_Level5_Lock, XK_ISO_Level5_Lock })); keysyms.set( 95, new ArrayBox({ XK_F11, 0 /*XK_XF86_Switch_VT_11*/ })); keysyms.set( 96, new ArrayBox({ XK_F12, 0 /*XK_XF86_Switch_VT_12*/ })); keysyms.set( 97, new ArrayBox({ })); keysyms.set( 98, new ArrayBox({ XK_Katakana })); keysyms.set( 99, new ArrayBox({ XK_Hiragana })); keysyms.set(100, new ArrayBox({ XK_Henkan_Mode })); keysyms.set(101, new ArrayBox({ XK_Hiragana_Katakana })); keysyms.set(102, new ArrayBox({ 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, 0 /*NoSymbol*/ })); keysyms.set(105, new ArrayBox({ XK_Control_R, XK_Control_R, XK_Control_R, XK_Control_R, XK_Control_R })); keysyms.set(106, new ArrayBox({ XK_KP_Divide, XK_KP_Divide, XK_division, (uint)X.string_to_keysym("U2300"), (uint)X.string_to_keysym("U2215"), (uint)X.string_to_keysym("U2223"), 0 /*NoSymbol*/ })); keysyms.set(107, new ArrayBox({ XK_Print, XK_Sys_Req })); keysyms.set(108, new ArrayBox({ XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Lock, XK_ISO_Level5_Lock, XK_ISO_Level5_Lock })); keysyms.set(109, new ArrayBox({ XK_Linefeed, XK_Linefeed, XK_Linefeed, XK_Linefeed, XK_Linefeed })); keysyms.set(110, new ArrayBox({ XK_Home, XK_Home, XK_Home, XK_Home, XK_Home })); keysyms.set(111, new ArrayBox({ XK_Up, XK_Up, XK_Up, XK_Up, XK_Up })); keysyms.set(112, new ArrayBox({ XK_Prior, XK_Prior, XK_Prior, XK_Prior, XK_Prior })); keysyms.set(113, new ArrayBox({ XK_Left, XK_Left, XK_Left, XK_Left, XK_Left })); keysyms.set(114, new ArrayBox({ XK_Right, XK_Right, XK_Right, XK_Right, XK_Right })); keysyms.set(115, new ArrayBox({ XK_End, XK_End, XK_End, XK_End, XK_End })); keysyms.set(116, new ArrayBox({ XK_Down, XK_Down, XK_Down, XK_Down, XK_Down })); keysyms.set(117, new ArrayBox({ XK_Next, XK_Next, XK_Next, XK_Next, XK_Next })); keysyms.set(118, new ArrayBox({ XK_Insert, XK_Insert, XK_Insert, XK_Insert, XK_Insert })); keysyms.set(119, new ArrayBox({ XK_Delete, XK_Delete, XK_Delete, XK_Delete, XK_Delete })); keysyms.set(120, new ArrayBox({ })); keysyms.set(121, new ArrayBox({ 0 /*XK_XF86AudioMute*/ })); keysyms.set(122, new ArrayBox({ 0 /*XK_XF86AudioLowerVolume*/ })); keysyms.set(123, new ArrayBox({ 0 /*XK_XF86AudioRaiseVolume*/ })); keysyms.set(124, new ArrayBox({ 0 /*XK_XF86PowerOff*/ })); keysyms.set(125, new ArrayBox({ XK_KP_Equal, 0 /*NoSymbol*/, 0 /*NoSymbol*/, 0 /*NoSymbol*/, 0 /*NoSymbol*/, 0 /*NoSymbol*/, 0 /*NoSymbol*/ })); keysyms.set(126, new ArrayBox({ XK_plusminus })); keysyms.set(127, new ArrayBox({ XK_Pause, XK_Break })); keysyms.set(128, new ArrayBox({ 0 /*XK_XF86LaunchA*/ })); keysyms.set(129, new ArrayBox({ XK_KP_Decimal })); keysyms.set(130, new ArrayBox({ XK_Hangul })); keysyms.set(131, new ArrayBox({ XK_Hangul_Hanja })); keysyms.set(132, new ArrayBox({ })); keysyms.set(133, new ArrayBox({ XK_Super_L })); keysyms.set(134, new ArrayBox({ XK_Super_R })); keysyms.set(135, new ArrayBox({ XK_Menu })); keysyms.set(136, new ArrayBox({ XK_Cancel })); keysyms.set(137, new ArrayBox({ XK_Redo })); keysyms.set(138, new ArrayBox({ 0 /*XK_SunProps*/ })); keysyms.set(139, new ArrayBox({ XK_Undo })); keysyms.set(140, new ArrayBox({ 0 /*XK_SunFront*/ })); keysyms.set(141, new ArrayBox({ 0 /*XK_XF86Copy*/ })); keysyms.set(142, new ArrayBox({ 0 /*XK_SunOpen*/ })); keysyms.set(143, new ArrayBox({ 0 /*XK_XF86Paste*/ })); keysyms.set(144, new ArrayBox({ XK_Find })); keysyms.set(145, new ArrayBox({ 0 /*XK_XF86Cut*/ })); keysyms.set(146, new ArrayBox({ XK_Help })); keysyms.set(147, new ArrayBox({ 0 /*XK_XF86MenuKB*/ })); keysyms.set(148, new ArrayBox({ 0 /*XK_XF86Calculator*/ })); keysyms.set(149, new ArrayBox({ })); keysyms.set(150, new ArrayBox({ 0 /*XK_XF86Sleep*/ })); keysyms.set(151, new ArrayBox({ 0 /*XK_XF86WakeUp*/ })); keysyms.set(152, new ArrayBox({ 0 /*XK_XF86Explorer*/ })); keysyms.set(153, new ArrayBox({ 0 /*XK_XF86Send*/ })); keysyms.set(154, new ArrayBox({ })); keysyms.set(155, new ArrayBox({ 0 /*XK_XF86Xfer*/ })); keysyms.set(156, new ArrayBox({ 0 /*XK_XF86Launch1*/ })); keysyms.set(157, new ArrayBox({ 0 /*XK_XF86Launch2*/ })); keysyms.set(158, new ArrayBox({ 0 /*XK_XF86WWW*/ })); keysyms.set(159, new ArrayBox({ 0 /*XK_XF86DOS*/ })); keysyms.set(160, new ArrayBox({ 0 /*XK_XF86ScreenSaver*/ })); keysyms.set(161, new ArrayBox({ })); keysyms.set(162, new ArrayBox({ 0 /*XK_XF86RotateWindows*/ })); keysyms.set(163, new ArrayBox({ 0 /*XK_XF86Mail*/ })); keysyms.set(164, new ArrayBox({ 0 /*XK_XF86Favorites*/ })); keysyms.set(165, new ArrayBox({ 0 /*XK_XF86MyComputer*/ })); keysyms.set(166, new ArrayBox({ 0 /*XK_XF86Back*/ })); keysyms.set(167, new ArrayBox({ 0 /*XK_XF86Forward*/ })); keysyms.set(168, new ArrayBox({ })); keysyms.set(169, new ArrayBox({ 0 /*XK_XF86Eject*/ })); keysyms.set(170, new ArrayBox({ 0 /*XK_XF86Eject*/, 0 /*XK_XF86Eject*/ })); keysyms.set(171, new ArrayBox({ 0 /*XK_XF86AudioNext*/ })); keysyms.set(172, new ArrayBox({ 0 /*XK_XF86AudioPlay*/, 0 /*XK_XF86AudioPause*/ })); keysyms.set(173, new ArrayBox({ 0 /*XK_XF86AudioPrev*/ })); keysyms.set(174, new ArrayBox({ 0 /*XK_XF86AudioStop*/, 0 /*XK_XF86Eject*/ })); keysyms.set(175, new ArrayBox({ 0 /*XK_XF86AudioRecord*/ })); keysyms.set(176, new ArrayBox({ 0 /*XK_XF86AudioRewind*/ })); keysyms.set(177, new ArrayBox({ 0 /*XK_XF86Phone*/ })); keysyms.set(178, new ArrayBox({ })); keysyms.set(179, new ArrayBox({ 0 /*XK_XF86Tools*/ })); keysyms.set(180, new ArrayBox({ 0 /*XK_XF86HomePage*/ })); keysyms.set(181, new ArrayBox({ 0 /*XK_XF86Reload*/ })); keysyms.set(182, new ArrayBox({ 0 /*XK_XF86Close*/ })); keysyms.set(183, new ArrayBox({ })); keysyms.set(184, new ArrayBox({ })); keysyms.set(185, new ArrayBox({ 0 /*XK_XF86ScrollUp*/ })); keysyms.set(186, new ArrayBox({ 0 /*XK_XF86ScrollDown*/ })); keysyms.set(187, new ArrayBox({ XK_parenleft })); keysyms.set(188, new ArrayBox({ XK_parenright })); keysyms.set(189, new ArrayBox({ 0 /*XK_XF86New*/ })); keysyms.set(190, new ArrayBox({ XK_Redo })); keysyms.set(191, new ArrayBox({ 0 /*XK_XF86Tools*/ })); keysyms.set(192, new ArrayBox({ 0 /*XK_XF86Launch5*/ })); keysyms.set(193, new ArrayBox({ 0 /*XK_XF86MenuKB*/ })); keysyms.set(194, new ArrayBox({ })); keysyms.set(195, new ArrayBox({ })); keysyms.set(196, new ArrayBox({ })); keysyms.set(197, new ArrayBox({ })); keysyms.set(198, new ArrayBox({ })); keysyms.set(199, new ArrayBox({ })); keysyms.set(200, new ArrayBox({ 0 /*XK_XF86TouchpadToggle*/ })); keysyms.set(201, new ArrayBox({ })); keysyms.set(202, new ArrayBox({ })); keysyms.set(203, new ArrayBox({ XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift, XK_ISO_Level5_Shift })); keysyms.set(204, new ArrayBox({ XK_Alt_L })); keysyms.set(205, new ArrayBox({ XK_Alt_L })); keysyms.set(206, new ArrayBox({ XK_Super_L })); keysyms.set(207, new ArrayBox({ })); keysyms.set(208, new ArrayBox({ 0 /*XK_XF86AudioPlay*/ })); keysyms.set(209, new ArrayBox({ 0 /*XK_XF86AudioPause*/ })); keysyms.set(210, new ArrayBox({ 0 /*XK_XF86Launch3*/ })); keysyms.set(211, new ArrayBox({ 0 /*XK_XF86Launch4*/ })); keysyms.set(212, new ArrayBox({ 0 /*XK_XF86LaunchB*/ })); keysyms.set(213, new ArrayBox({ 0 /*XK_XF86Suspend*/ })); keysyms.set(214, new ArrayBox({ 0 /*XK_XF86Close*/ })); keysyms.set(215, new ArrayBox({ 0 /*XK_XF86AudioPlay*/ })); keysyms.set(216, new ArrayBox({ 0 /*XK_XF86AudioForward*/ })); keysyms.set(217, new ArrayBox({ })); keysyms.set(218, new ArrayBox({ XK_Print })); keysyms.set(219, new ArrayBox({ })); keysyms.set(220, new ArrayBox({ 0 /*XK_XF86WebCam*/ })); keysyms.set(221, new ArrayBox({ })); keysyms.set(222, new ArrayBox({ })); keysyms.set(223, new ArrayBox({ 0 /*XK_XF86Mail*/ })); keysyms.set(224, new ArrayBox({ })); keysyms.set(225, new ArrayBox({ 0 /*XK_XF86Search*/ })); keysyms.set(226, new ArrayBox({ })); keysyms.set(227, new ArrayBox({ 0 /*XK_XF86Finance*/ })); keysyms.set(228, new ArrayBox({ })); keysyms.set(229, new ArrayBox({ 0 /*XK_XF86Shop*/ })); keysyms.set(230, new ArrayBox({ })); keysyms.set(231, new ArrayBox({ XK_Cancel })); keysyms.set(232, new ArrayBox({ 0 /*XK_XF86MonBrightnessDown*/ })); keysyms.set(233, new ArrayBox({ 0 /*XK_XF86MonBrightnessUp*/ })); keysyms.set(234, new ArrayBox({ 0 /*XK_XF86AudioMedia*/ })); keysyms.set(235, new ArrayBox({ 0 /*XK_XF86Display*/ })); keysyms.set(236, new ArrayBox({ 0 /*XK_XF86KbdLightOnOff*/ })); keysyms.set(237, new ArrayBox({ 0 /*XK_XF86KbdBrightnessDown*/ })); keysyms.set(238, new ArrayBox({ 0 /*XK_XF86KbdBrightnessUp*/ })); keysyms.set(239, new ArrayBox({ 0 /*XK_XF86Send*/ })); keysyms.set(240, new ArrayBox({ 0 /*XK_XF86Reply*/ })); keysyms.set(241, new ArrayBox({ 0 /*XK_XF86MailForward*/ })); keysyms.set(242, new ArrayBox({ 0 /*XK_XF86Save*/ })); keysyms.set(243, new ArrayBox({ 0 /*XK_XF86Documents*/ })); keysyms.set(244, new ArrayBox({ 0 /*XK_XF86Battery*/ })); keysyms.set(245, new ArrayBox({ 0 /*XK_XF86Bluetooth*/ })); keysyms.set(246, new ArrayBox({ 0 /*XK_XF86WLAN*/ })); keysyms.set(247, new ArrayBox({ })); keysyms.set(248, new ArrayBox({ })); keysyms.set(249, new ArrayBox({ })); keysyms.set(250, new ArrayBox({ })); keysyms.set(251, new ArrayBox({ })); keysyms.set(252, new ArrayBox({ })); keysyms.set(253, new ArrayBox({ })); keysyms.set(254, new ArrayBox({ })); keysyms.set(255, new ArrayBox({ })); return keysyms; } private Box genHBox(){ Box b = new Box(Gtk.Orientation.HORIZONTAL, 0); b.set_homogeneous(false); return b; } public void generateKeyevents() { Box[] hboxes = { genHBox(), // top row (1,2,3,…) genHBox(), // upper row (x,v,l,…) genHBox(), // home row (u,i,a,…) genHBox(), // lower row (ü,ö,ä,…) genHBox(), // space row genHBox() //function key row }; if (winMain.config.get("display_function_keys") != "0") { this.pack_start( hboxes[5], false, true, 0 ); } this.pack_start( hboxes[0], false, true, 0 ); this.pack_start( hboxes[1], false, true, 0 ); this.pack_start( hboxes[2], false, true, 0 ); this.pack_start( hboxes[3], false, true, 0 ); this.pack_start( hboxes[4], false, true, 0 ); foreach( var hbox in hboxes ) { hbox.show(); } double winWidthUnscaled = 1000.0; double winHeightUnscaled = 250.0; if (winMain.config.get("display_function_keys") == "0") { winHeightUnscaled -= winMain.function_keys_height; } if (winMain.config.get("display_numpad") == "0") { winWidthUnscaled -= winMain.numpad_width; } int width, height; winMain.get_size2(out width, out height); double scaleX = width/winWidthUnscaled; double scaleY = height/winHeightUnscaled; double posXUnscaled = 0.0; double posYUnscaled = 0.0; int posX = 0; int posY = 0; if (winMain.config.get("display_function_keys") != "0") { //esc scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 9, false, winMain, hboxes[5], 0); //free space scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[5], -1); // F1-F4 scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 67, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 68, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 69, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 70, false, winMain, hboxes[5], 0); //free space scaledBox(22.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[5], -1); // F5-F8 scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 71, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 72, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 73, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 74, false, winMain, hboxes[5], 0); //free space scaledBox(22.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[5], -1); // F9-F11 scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 75, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 76, false, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 95, false, winMain, hboxes[5], 0); if (winMain.config.get("display_numpad") != "0") { //F12 scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 96, false, winMain, hboxes[5], 0); //free space scaledBox(22.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[5], -1); // print,scroll,break scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 107, true, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 78, true, winMain, hboxes[5], 0); scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 127, true, winMain, hboxes[5], 0); } else { //F12 scaledBox(44.0,30.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 96, true, winMain, hboxes[5], 0); } //Reset right shift. posXUnscaled = 0.0; posX = 0; } //++ Top row ++ scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 49, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 10, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 11, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 12, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 13, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 14, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 15, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 16, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 17, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 18, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 19, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 20, false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 21 , false, winMain, hboxes[0], 0); if (winMain.config.get("display_numpad") != "0") { scaledBox(78.0-1.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 22 , false, winMain, hboxes[0], 0); //free space scaledBox(22.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[0], -1); //ins home page_up scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 118 , false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 110 , false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 112 , false, winMain, hboxes[0], 0); //free space scaledBox(22.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[0], -1); //num key, divide, times, and minus scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 77 , false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 106 , false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 63 , false, winMain, hboxes[0], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 82 , true, winMain, hboxes[0], 0); } else { scaledBox(78.0-1.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 22 , true, winMain, hboxes[0], 0); } //Reset right shift. posXUnscaled = 0.0; posX = 0; //++ End top row ++ //++ Second row ++ scaledBox(60.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 23 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 24 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 25 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 26 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 27 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 28 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 29 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 30 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 31 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 32 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 33 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 34 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 35 , false, winMain, hboxes[1], 0); if (winMain.config.get("display_numpad") != "0") { //Halve of Return/Enter scaledBox(62.0-1,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 36 , false, winMain, hboxes[1], 0); //free space scaledBox(22.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[1], -1); //entf end page_down scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 119 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 115 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 117 , false, winMain, hboxes[1], 0); //free space scaledBox(22.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[1], -1); //7, 8, 9, and halve of plus scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 79 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 80 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 81 , false, winMain, hboxes[1], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 86 , true, winMain, hboxes[1], 0); } else { //Halve of Return/Enter scaledBox(62.0-1,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 36 , true, winMain, hboxes[1], 0); } //Reset right shift. posXUnscaled = 0.0; posX = 0; //++ End upper row ++ //++ home row ++ //left mod3 scaledBox(73.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 2/*37*/ , false, winMain, hboxes[2], 1); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 38 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 39 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 40 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 41 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 42 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 43 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 44 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 45 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 46 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 47 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 48 , false, winMain, hboxes[2], 0); //right mod3 scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 2/*51*/ , false, winMain, hboxes[2], 1); if (winMain.config.get("display_numpad") != "0") { //Second halve of Enter/Return scaledBox(49.0-1,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 36 , false, winMain, hboxes[2], 0); //free space scaledBox(174.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[2], -1); //4, 5, 6, and halve of plus scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 83 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 84 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 85 , false, winMain, hboxes[2], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 86 , true, winMain, hboxes[2], 0); } else { //Second halve of Enter/Return scaledBox(49.0-1,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 36 , true, winMain, hboxes[2], 0); } //Reset right shift. posXUnscaled = 0.0; posX = 0; //++ End home row ++ //++ lower row ++ //left shift scaledBox(52.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 1/*50*/ , false, winMain, hboxes[3], 1); //mod4 scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 3/*94*/ , false, winMain, hboxes[3], 1); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 52 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 53 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 54 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 55 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 56 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 57 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 58 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 59 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 60 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 61 , false, winMain, hboxes[3], 0); if (winMain.config.get("display_numpad") != "0") { //right shift scaledBox(114.0-1,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 1 /*62*/ , false, winMain, hboxes[3], 1); //free space scaledBox(66.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[3], -1); // up scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 111 , false, winMain, hboxes[3], 0); //free space scaledBox(66.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[3], -1); //1, 2, 3, and halve of enter scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 87 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 88 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 89 , false, winMain, hboxes[3], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 104 , true, winMain, hboxes[3], 0); } else { //right shift scaledBox(114.0-1,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 1 /*62*/ , true, winMain, hboxes[3], 1); } //Reset right shift. posXUnscaled = 0.0; posX = 0; //++ End lower row ++ //++ last/space row ++ //left ctrl, 37 scaledBox(61.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 4/*37*/ , false, winMain, hboxes[4], 2); //free space scaledBox(48.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[4], -1); //alt scaledBox(61.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 5/*64*/ , false, winMain, hboxes[4], 4); //space scaledBox(316.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 65 , false, winMain, hboxes[4], 0); //mod4 scaledBox(61.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 3/*94*/ , false, winMain, hboxes[4], 1); //free space scaledBox(40.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[4], -1); if (winMain.config.get("display_numpad") != "0") { // right ctrl scaledBox(61.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 4/*105*/ , false, winMain, hboxes[4], 3); //free space scaledBox(22.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[4], -1); //left, down, right scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 113 , false, winMain, hboxes[4], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 116 , false, winMain, hboxes[4], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 114 , false, winMain, hboxes[4], 0); //free space scaledBox(22.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , -1 , false, winMain, hboxes[4], -1); //0, comma, and halve of enter scaledBox(88.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 90 , false, winMain, hboxes[4], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 91 , false, winMain, hboxes[4], 0); scaledBox(44.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 104 , false, winMain, hboxes[4], 0); } else { // right ctrl scaledBox(61.0,44.0,ref posXUnscaled, ref posYUnscaled, ref posX, ref posY, scaleX, scaleY , 4/*105*/ , false, winMain, hboxes[4], 3); } //++ End last/space row ++ } /* Gibt skalierte EventBox zurück. Damit sich die Rundungfehler durch int-Cast nicht aufzusummieren, basieren die Werte auf der bis zu diesem Zeitpunkt zu erwartenden Gesamtbreite/höhe. */ private KeyEventBox scaledBox(double widthUnscaled, double heightUnscaled, ref double posXUnscaled, ref double posYUnscaled, ref int posX, ref int posY, double scaleX, double scaleY, int keycode, bool vertical, NeoWindow winMain, Box box, int boxtype) { int width = (int)GLib.Math.floor((posXUnscaled + widthUnscaled) * scaleX - posX ); int height = (int)GLib.Math.floor((posYUnscaled + heightUnscaled) * scaleY - posY); if (vertical) { posYUnscaled += heightUnscaled; posY += height; } else { posXUnscaled += widthUnscaled; posX += width; } KeyEventBox keybox; switch (boxtype) { case 0: // Normale Taste ArrayBox ks = this.keysyms.get(keycode); keybox = new KeyEventBox(winMain, width, height, ref ks.val ); this.keyBoxes.set(keycode, keybox); box.pack_start(keybox, false, true, 0 ); break; case 1: // Modifier, die andere Buchstabenebenen aktivieren. Zusätzlich Ebenen-Bild einblenden. keybox = new KeyEventBox.modifier(winMain, width, height, keycode /*=modifier array index*/ ); this.keyBoxes.set(keycode, keybox); box.pack_start(keybox, false, true, 0 ); break; //Andere Modifier (CTRL, Alt,... ) case 2: //left ctrl keybox = new KeyEventBox.modifier2(winMain, width, height, keycode /*modifier array index */, "tastatur_ctrl_left_2.png" ); this.keyBoxes.set(keycode, keybox); box.pack_start(keybox, false, true, 0 ); break; case 3: //right ctrl keybox = new KeyEventBox.modifier2(winMain, width, height, keycode /*modifier array index */, "tastatur_ctrl_right_2.png" ); this.keyBoxes.set(keycode, keybox); box.pack_start(keybox, false, true, 0 ); break; case 4: //left alt keybox = new KeyEventBox.modifier2(winMain, width, height, keycode /*modifier array index */, "tastatur_alt_left_2.png" ); this.keyBoxes.set(keycode, keybox); box.pack_start(keybox, false, true, 0 ); break; default: // Fläche ohne Funktion keybox = new KeyEventBox.freeArea(winMain, width, height ); this.keyBoxes.set(keycode, keybox); box.pack_start(keybox, false, true, 0 ); break; } return keybox; } } //End Class KeyOverlay public class KeyEventBox : EventBox{ private uint[] keysym;// or private int modifier_index; private NeoWindow winMain; private int width; private int height; private Gtk.Image image; /* Die Reihenfolge der Zeichen in keysyms passt nicht zur Nummerierung der Ebenen in winMain. Mit diesem Array wird der Wert permutiert. Achtung, mittlerweile ist es die Identitätsabbildung, da die zwei redundanten Layer, die durch Caps-Lock entstehen, entfernt wurden. */ private static const short[] layer_permutation = {0,1,2,3,5,4,6}; private KeyEventBox.all(NeoWindow winMain, int width, int height) { this.winMain = winMain; this.width = width; this.height = height; this.set_visible_window(false); this.show(); } public KeyEventBox(NeoWindow winMain, int width, int height , ref uint[] keysym) { this.all(winMain, width, height); this.keysym = keysym; this.button_press_event.connect ((event) => { if (event.button != 1){ return false; } uint ks = this.keysym[NeoLayoutViewer.KeyEventBox.layer_permutation[winMain.layer] - 1]; int modi = winMain.getActiveModifierMask({4,5}); //ctrl+alt mask if (ks < 1) return false; #if _NO_WIN if (modi == 0 || true) { // Alt-Mask do not work :-( keysend(ks,modi); } else { //debug("Variante mit zweitem Modifier."); keysend2(ks,modi & Gdk.ModifierType.CONTROL_MASK, modi & Gdk.ModifierType.MOD1_MASK); } #endif //GLib.stdout.printf(@"Key: $(ks)\n"); GLib.stdout.flush(); return false; }); } public KeyEventBox.modifier(NeoWindow winMain, int width, int height , int modifier_index) { this.all(winMain, width, height); this.modifier_index = modifier_index; this.button_press_event.connect ((event) => { 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.change_active_modifier( this.modifier_index, false, 0 ); //winMain.status.set_label(@"Deactivate\nModifier $(this.modifier_index)"); } winMain.redraw(); return false; }); } public KeyEventBox.modifier2(NeoWindow winMain, int width, int height , int modifier_index, string pressed_key_image ){ this.all(winMain, width, height); this.modifier_index = modifier_index; this.button_press_event.connect ((event) => { if (winMain.active_modifier_by_mouse[this.modifier_index] == 0) { 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 ); this.image.show(); } else { winMain.change_active_modifier( this.modifier_index, false, 0 ); this.image.hide(); } winMain.redraw(); return false; }); // Image of pressed Button Gdk.Pixbuf image_buffer = winMain.open_image_str(@"$(winMain.config.get("asset_folder"))/neo2.0/$(pressed_key_image)"); var w = image_buffer.width; var h = image_buffer.height; image_buffer = image_buffer.scale_simple(width, h*width/w,Gdk.InterpType.BILINEAR); this.image = new Gtk.Image(); this.image.set_from_pixbuf(image_buffer); this.image.hide(); add(this.image); winMain.modifier_key_images.add( new Modkey(ref this.image, this.modifier_index) ); } public KeyEventBox.freeArea(NeoWindow winMain, int width, int height) { this.all(winMain, width, height); } /* * This method Gtk+ is calling on a widget to ask * the widget how large it wishes to be. It's not guaranteed * that Gtk+ will actually give this size to the widget. */ public override void get_preferred_width(out int minimum_width, out int natural_width){ minimum_width = width; natural_width = width; } public override void get_preferred_height(out int minimum_height, out int natural_height){ minimum_height = height; natural_height = height; } } }