LINUX.ORG.RU

[shell] Изменение раскладки

 


0

0

Есть ли какой способ изменить раскладку клавиатуры из скрипта на shell? Я знаю про setxkbmap, но это как-то радикально, и еще с ним не получилось заставить правильно scroll lock гореть.

Еще бы хотелось, что бы так можно было еще и текущую раскладку узнать.



Последнее исправление: plambir (всего исправлений: 1)

http://kbde.sourceforge.net/ - посылаешь комбинацию клавиш для переключения раскладки (Ctrl+Shift или что там у тебя), а чтобы узнать раскладку смотришь через setleds выставлен ли флаг scroll =)

kranky ★★★★★
()
Ответ на: комментарий от plambir

kxkb, например, не анонсирует факт переключения. у него всего три метода: «bool setLayout(String)», «String getCurrentLayout()» и «StringList getLayoutsList()». искать в окрестностях org.kde.kxkb/kxkb или как-то так. qdbusview-ом можно посмотреть и попробовать. если вам нужно только изменять раскладку, то этого должно быть достаточно. а вообще программа на сях в три строчки решает поставленную задачу ;)

arsi ★★★★★
()

Нет способа поменять группу из командной строки. Только сетхкбмап. Правда, такую утилиту можно написать - она будет всего несколько строк.

svu ★★★★★
()
Ответ на: комментарий от svu
int main(int argc, char **argv) {
    Display *dpy;
    if (argc != 2 || (dpy = XOpenDisplay(NULL)) == NULL)
        return 1;
    XkbLockGroup(dpy, XkbUseCoreKbd, atoi(argv[1]));
    XCloseDisplay(dpy);
    return 0;
}
arsi ★★★★★
()
Ответ на: комментарий от arsi

Ух, ты! Спасибо, как-раз то что надо!

Для того что бы узнать текущую раскладку, я написал так, правда это только ее номер (ну, текущей раскладки).

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>

int main(int argc, char **argv) 
{ 
  Display *dpy; 
  XkbStateRec state;
  if ((dpy = XOpenDisplay(NULL)) == NULL) 
	return 1; 
  XkbGetState(dpy, XkbUseCoreKbd, &state);
  printf("%d\n", state.group);
  XCloseDisplay(dpy); 
  return 0; 
}
plambir
() автор топика
Ответ на: комментарий от plambir

всё верно) одно смущает: я ещё и state зачем-то обнулял, даже не помню зачем и где я такое подсмотрел…

static int get_group(Display *dpy) {
    XkbStateRec state[1];
    memset(state, 0, sizeof(state));
    XkbGetState(dpy, XkbUseCoreKbd, state);
    return state->group;
}
ну и для полноты картины:
static int get_layout(Display *dpy, char **names) {
    XkbDescRec desc[1];
    int gc;
    memset(desc, 0, sizeof(desc));
    desc->device_spec = XkbUseCoreKbd;
    XkbGetControls(dpy, XkbGroupsWrapMask, desc);
    XkbGetNames(dpy, XkbGroupNamesMask, desc);
    XGetAtomNames(dpy, desc->names->groups, gc = desc->ctrls->num_groups, names);
    XkbFreeControls(desc, XkbGroupsWrapMask, True);
    XkbFreeNames(desc, XkbGroupNamesMask, True);
    return gc;
}

static void free_layout(char **names, int gc) {
    for (; gc--; ++names)
        if (*names) {
            XFree(*names);
            *names = NULL;
        }
}
:)

arsi ★★★★★
()
Ответ на: комментарий от true_admin

Я хочу что бы в awesome каждое окно имела свою раскладку.

Собственно я это уже сделал.

CL = {}

client.add_signal("manage", function (c, startup)
    c:add_signal("mouse::enter", function(c)
        if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
            and awful.client.focus.filter(c) then
            client.focus = c
        end
    end)

    if not startup then
        if not c.size_hints.user_position and not c.size_hints.program_position then
            awful.placement.no_overlap(c)
            awful.placement.no_offscreen(c)
        end
	 end
	 
	 CL[tostring(c)] = "0"
end)

client.add_signal("unmanage", function (c)
								 CL[tostring(c)] = nil
							  end)

client.add_signal("focus", function(c) 
							  c.border_color = beautiful.border_focus 
							  c.opacity = 1
							  awful.util.spawn_with_shell("/home/?/.config/bin "..CL[tostring(c)])
						   end)

client.add_signal("unfocus", function(c) 
								c.border_color = beautiful.border_normal 
								c.opacity = 0.8
								local fd = io.popen("/home/?/.config/bin2", "r")
								if fd then
								   CL[tostring(c)] = fd:read("*line")
								   io.close(fd)
								end
							 end)

За bin (программа переключающая раскладку) большое спасибо arsi.

plambir
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.