LINUX.ORG.RU

Рамочка вокруг окошечка в качестве индикатора раскладочки

 , ,


0

1

Захотелось своеобразного - видеть что сейчас за раскладка активна по цвету рамки активного окна.

FVWM2. После недолгого поиска, решение видится мне следующим: Запилить демона, который будет хватать события от xorg - xkb и при смене layout сигналить в сокет. А для fvwm - модуль, повисающий на этом сокете и меняющий рамку по событию.

Ну или организовать ловлю события xkb в модуле FVWM. Но на сайте либы x11 для перла написано, что там всё как-то переусложнено, медленно стартует и т.д. Так что может лучше легковесный демон на Си.

FvwmEvent - не умеет ловить нужное событие. Из х-тулзей тоже не нашёл ничего подходящего.

Но может я плохо искал, и можно не красноглазить велосипед, а использовать уже что-то имеющееся?


Ответ на: комментарий от lv

Я не нашёл. По приведённой ссылке там про события нажатия на клавиши всякие, в каком контексте нажатия и т.п. Но вот про раскладку нет.

Может быть в код FVWM2 добавить возможность появления такого события?

Владимир

anonymous ()
Ответ на: комментарий от anonymous

Да, была мысль, что более рассово верным действием было бы допиливание FvwmEvent. Только вот fvwm2, как я понимаю, уже legacy. Пилят fvwm3. Можно бы и туда подключиться, но… как-то много телодвижений для простой подсветки рамочки. Тогда уж проще своего демона на Си наваять. Плюс это будет решение не завязанное на fvwm, что тоже хорошо.

lv ()
Ответ на: комментарий от mord0d

Это не задача менеджера окон. Может и можно как-то накостылять, но точно не штатно.

Так «не знать текущую раскладку окна» не удобно же?
«Что-то в консерватории не так».

Владимир

anonymous ()
Ответ на: комментарий от anonymous

Так «не знать текущую раскладку окна» не удобно же?

У окна нет раскладки. Все эти perwindowlayoutd, kbdd и прочие реализуют свои надстройки, реагируя на события фокуса.

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

Это не задача менеджера окон. Может и можно как-то накостылять, но точно не штатно.

Тлеет надежда, что уже накостылено что-то типо xkbwatch, но чтобы оно не огоньками подмигивало, а кидало события на сокет.

lv ()
Ответ на: комментарий от lv

Рисовать рамки окна — это задача менеджера окон, потому чтобы их как-то перекрашивать или ещё что-то, нужно скармливать событие ему. Чем ловить это событие — решать тебе.

mord0d ★★★ ()

xxkb может впихнуть иконку в отдельное окно и рамку тоже может сделать. Я сделал на панели fvwm большую иконку раскладки, используя xxkb. Но рамку не смог. К тому же xxkb регулярно глючит и иконка панели с пропадает. В итоге выкинул его на хер, надоело перезапускать fvwm по десять раз на день.

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

Уже пошёл по пути «свой демон, слушающий xkb и вызывающий FvwmCommand». Но там какие-то свои непонятные нюансы проявляются, как разберусь - напишу сюда.

Мож кто в курсе почему так? В config fvwm добавил две функции: [code] DestroyFunc FvwmLayoutChanged1
AddToFunc FvwmLayoutChanged1
#+ I Exec exec xterm

  • I ThisWindow (*) WindowStyle BorderWidth 0
  • I ThisWindow (*) RefreshWindow

DestroyFunc FvwmLayoutChanged0
AddToFunc FvwmLayoutChanged0
#+ I Exec exec killall xterm

  • I ThisWindow (*) WindowStyle BorderWidth 5
  • I ThisWindow (*) RefreshWindow [/code]

Если забиндить их на кнопки, то и вариант с запуском/убийством xterm работает и ширину рамочки меняет. [code] Key R A 4 Function FvwmLayoutChanged1
Key T A 4 Function FvwmLayoutChanged0
[/code]

Если делать вызов с помощью FvwmCommand, то вариант с xterm работает, а вот рамочка не меняется. [code] vlad@debian:~/.fvwm$ FvwmCommand «Function FvwmLayoutChanged0» vlad@debian:~/.fvwm$ FvwmCommand «Function FvwmLayoutChanged1» [/code]

lv ()
Последнее исправление: lv (всего исправлений: 1)
Ответ на: комментарий от lv

Похоже при обращении из FvwmCommand просто нет такой штуки как ThisWindow. Попробовал сделать для All - всё работает. Для интересующихся - код демона:

#include <stdio.h>                                                              
#include <stdlib.h>                                                             
#include <unistd.h>                                                             
#include <X11/Xutil.h>                                                          
#include <X11/XKBlib.h>                                                         
                                                                                
#define LAYOUT_CHANGE_MASK 0x1190                                               
                                                                                
int main(int argc, char **argv)                                                 
{                                                                                
    XEvent e;                                                                       
    Display *d;                                                                     
                                                                                    
    if (!(d = XOpenDisplay(NULL))) {                                                
        fprintf(stderr, "cannot open display\n");                                   
        return 1;                                                                   
    }                                                                               

    daemon(0,0);
                                                                                    
    XKeysymToKeycode(d, XK_F1);                                                     
                                                                                    
    int xkbEventType;                                                               
    XkbQueryExtension(d, 0, &xkbEventType, 0, 0, 0);                                
    XkbSelectEvents(d, XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask);          
                                                                                    
    XSync(d, False);                                                                
                                                                                    
    while (1) {                                                                     
        XNextEvent(d, &e);                                                          
        if (e.type == xkbEventType) {                                               
            XkbEvent* xkbEvent = (XkbEvent*) &e;                                    
            if (xkbEvent->any.xkb_type == XkbStateNotify) {                         
                int lang = xkbEvent->state.group;                                   
                if (xkbEvent->state.changed == LAYOUT_CHANGE_MASK) {                
                    if (lang == 1) {                                                
                        system("FvwmCommand \"Function FvwmLayoutChanged1\"");      
                    } else {                                                    
                        system("FvwmCommand \"Function FvwmLayoutChanged0\"");  
                    }                                                           
                }                                                               
            }                                                                   
        }                                                                       
    }                                                                           
                                                                                
    return(0);                                                                  
}                          

lv ()

сделай свою переключалку средствами fvwm

лови нужную комбинацию клавиш, и дальше меняй раскладку через setxkbmap и стиль окон, на какой тебе нравится

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

Да, возможный вариант. И похоже лучше текущего - меньше доп. сущностей типо следящего демона. Запользовал kbdd, посмотрю ещё варианты, как с ним будет удобно сделать.

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