diff options
author | Nikolay Yakimov <root@livid.pp.ru> | 2021-08-12 08:13:01 +0300 |
---|---|---|
committer | Nikolay Yakimov <root@livid.pp.ru> | 2021-08-12 22:14:17 +0300 |
commit | 898e5aa5fca6065a657592c59d9c517310869cd1 (patch) | |
tree | d391488e26e7dd94385eb07f7d913f39201fa2f7 | |
parent | 30747e72a4701f6af808cc41d45ee270839d387e (diff) | |
download | xmobar-898e5aa5fca6065a657592c59d9c517310869cd1.tar.gz xmobar-898e5aa5fca6065a657592c59d9c517310869cd1.tar.bz2 |
Add getGrpNames to get layout group names
-rw-r--r-- | src/Xmobar/System/Kbd.hsc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/Xmobar/System/Kbd.hsc b/src/Xmobar/System/Kbd.hsc index bbacc8f..d42d9d3 100644 --- a/src/Xmobar/System/Kbd.hsc +++ b/src/Xmobar/System/Kbd.hsc @@ -15,11 +15,14 @@ module Xmobar.System.Kbd where +import Control.Monad ((<=<)) + import Foreign import Foreign.C.Types import Foreign.C.String import Graphics.X11.Xlib +import Graphics.X11.Xlib.Extras (none) #include <X11/XKBlib.h> #include <X11/extensions/XKB.h> @@ -319,3 +322,23 @@ getLayoutStr' st dpy kbdDescPtr = else -- Behaviour on error do return "Error while requesting layout!" + +getGrpNames :: Display -> IO [String] +getGrpNames dpy = do + kbdDescPtr <- xkbAllocKeyboard + status <- xkbGetNames dpy xkbGroupNamesMask kbdDescPtr + str <- getGrpNames' status dpy kbdDescPtr + xkbFreeNames kbdDescPtr xkbGroupNamesMask 1 + xkbFreeKeyboard kbdDescPtr 0 1 + return str + +getGrpNames' :: Status -> Display -> (Ptr XkbDescRec) -> IO [String] +getGrpNames' st dpy kbdDescPtr = + if st == 0 then -- Success + do + kbdDesc <- peek kbdDescPtr + nameArray <- peek (names kbdDesc) + let grpsArr = groups nameArray + let grps = takeWhile (/=none) grpsArr + mapM (peekCString <=< xGetAtomName dpy) grps + else return ["Error while requesting layout!"] |