fpxkbtest.pp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. program fpxkbtest;
  2. {$mode objfpc}{$H+}
  3. uses
  4. {$IFDEF UNIX}
  5. cthreads,
  6. {$ENDIF}
  7. Classes, SysUtils, Unix, x, xlib, XKB, xkblib
  8. { you can add units after this };
  9. var
  10. LXDisplay: PDisplay;
  11. pDesc: PXkbDescPtr;
  12. pKeySyms: PKeySym;
  13. iKeycodeLow, iKeycodeHigh, iKeySymsPerKeycode: cint;
  14. btKeycode: TKeyCode;
  15. btGroup, btGroups, btLevel, btLevels, btMap, btMask: Byte;
  16. wXkbKeySym: TKeySym;
  17. pXkbKeyType: PXkbKeyTypePtr;
  18. pMap: PXkbKTMapEntryPtr;
  19. begin
  20. LXDisplay := XOpenDisplay(nil);
  21. XDisplayKeycodes(LXDisplay, @iKeycodeLow, @iKeycodeHigh);
  22. pKeySyms := XGetKeyboardMapping(LXDisplay, iKeycodeLow, iKeycodeHigh - iKeycodeLow + 1, @iKeySymsPerKeycode);
  23. XFree(pKeySyms);
  24. pDesc := XkbGetMap(LXDisplay, XkbAllClientInfoMask, XkbUseCoreKbd);
  25. try
  26. for btKeycode := iKeycodeLow to iKeycodeHigh do
  27. begin
  28. btGroups := XkbKeyNumGroups(pDesc, btKeycode);
  29. if (btKeycode = 17) then
  30. WriteLn('Keycode=', btKeycode, ', Groups=', btGroups);
  31. for btGroup := 0 to btGroups-1 do
  32. begin
  33. pXkbKeyType := XkbKeyKeyType(pDesc, btKeycode, btGroup);
  34. btLevels := pXkbKeyType^.num_levels;
  35. if (btKeycode = 17) then
  36. WriteLn('Keycode=', btKeycode, ', Group=', btGroup, ', Levels=', btLevels);
  37. for btLevel:=0 to btLevels-1 do
  38. begin
  39. wXkbKeySym := XkbKeycodeToKeysym(LXDisplay, btKeycode, btGroup, btLevel);
  40. if (btKeycode = 17) and (wXkbKeySym <> 0) then
  41. begin
  42. btMask := 0;
  43. for btMap:=0 to pXkbKeyType^.map_count-1 do
  44. begin
  45. // crashing due to active being Boolean
  46. //try
  47. pMap := PXkbKTMapEntryPtr(@(pXkbKeyType^.map[btMap]));
  48. if {(pXkbKeyType^.map[btMap].active) and} (pMap^.level = btLevel) then
  49. begin
  50. btMask := pMap^.mods.mask;
  51. Break;
  52. end;
  53. //except
  54. //end;
  55. end;
  56. WriteLn('Keycode=', btKeycode, ', KeySym=', IntToHex(wXkbKeySym, 4), ', Group=', btGroup, ', Level=', btLevel, ', Mask=', btMask);
  57. end;
  58. end;
  59. end;
  60. end;
  61. finally
  62. XkbFreeKeyboard(pDesc, 0, True);
  63. end;
  64. end.