Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 14 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
Вопрос следующего плана
Нужно по символу русского, украинского алфавита получить код клавиши на клавиатуре которой соответсвует данный символ.
То есть есть строка "тест" нужно из нее получить набор кодов соответсвующих клавишам "т" "е" "с" "т".
Функция XStringToKeysym и XKeysymToKeycode в с лучае с кирилицей возвращают NoSymbol. Кто сталкивался ? Куда копать?

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


Последний раз редактировалось _DiseL_ 06.05.2009 22:54, всего редактировалось 1 раз.


Партнер
 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
Совсем никто не сталкивался и не интересовался ? У меня просто проблема с не латиницей и со спец символами {}[].,></?"':;!@#$%^&*()_+=-~`

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Advanced member
Предупреждение 
Статус: Не в сети
Регистрация: 27.02.2007
Откуда: Москва
Фото: 54
_DiseL_ писал(а):
/Sid

Xlib обновлять пробовал?

Посмотри этот примерчик, может чем поможет.

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
HertZ писал(а):
_DiseL_ писал(а):
/Sid

Xlib обновлять пробовал?

Посмотри этот примерчик, может чем поможет.

Проблема в том что это наблюдается в сследующих дистрах lenny, sid, squizzy) Ubuntu, Gentoo. За примерчик спасибо.
Вопрос один, кодировка файла в котором соответсвие смволов прописано какая ? я так понимаю язык немецкий ?

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Advanced member
Предупреждение 
Статус: Не в сети
Регистрация: 27.02.2007
Откуда: Москва
Фото: 54
_DiseL_ писал(а):
я так понимаю язык немецкий ?

Нет, это итальянский и английский местами... Бывает.

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
HertZ В общем так я ничего и не добился. Сделал обманку для спец символов. Но осталась основная проблема. Кирилические символы игнорируются полностью Выдается результат NoSymbol... По поводу кодировки в которой надо скармливать строку XStringToKeysym ничего подсказать не можешь ?
сейчас вот так

Код:
void convertString(QString content)
{
    Display* disp = QX11Info::display();

    XkbStateRec rec;
    XkbGetState(QX11Info::display(), XkbUseCoreKbd, &rec);
    int layotNumber = rec.group;

    Window focus_return;
    int revert_to_return;
    XKeyEvent xev; // create key event sdtruct
    XGetInputFocus(disp, &focus_return, &revert_to_return); // get input foc
    xev.window = focus_return;
    xev.serial       = 0;
    xev.send_event   = 0;
    xev.display      = disp;
    xev.root         = None;
    xev.subwindow    = None;
    xev.time         = 0;
    xev.same_screen  = 1;
    xev.state        =0;
    xev.x            = 1;
    xev.y            = 1;
    xev.x_root       = 1;
    xev.y_root       = 1;

       //set state  (2<<12)*layotNumber if louwer case and  (2<<12)*layotNumber+1 if Upper

 for (int ii=0;ii<content.count();ii++)
    {
       // check space in input string
       if (content[ii].isSpace())
          xev.keycode = 65;
       else
       {
         xev.keycode = lowwerSymbol.value(QString(content[ii]),255);
         xev.state =(2<<12)*layotNumber;
         if  (xev.keycode==255)
         {  xev.keycode = upperSymbol.value(QString(content[ii]),255);
            xev.state =(2<<12)*layotNumber+1;
          }
         if  (xev.keycode==255)
         {
             if (content[ii].isUpper())
                  xev.state =(2<<12)*layotNumber+1;
             else
                  xev.state =(2<<12)*layotNumber;
             char *symbol;
             symbol=(char*) malloc(10);
             strcpy(symbol,QString(content[ii]).toLocal8Bit().data());
             xev.keycode =  XKeysymToKeycode(disp,XStringToKeysym(symbol));
         }
       }

       xev.type         = KeyPress;
       (void) XSendEvent(disp, xev.window, True, KeyPressMask,(XEvent *)&xev);
       XFlush(disp);
       xev.type         = KeyRelease;
       (void) XSendEvent(disp, xev.window, True, KeyReleaseMask,(XEvent *)&xev);
       XFlush(disp);
    }


_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Advanced member
Предупреждение 
Статус: Не в сети
Регистрация: 27.02.2007
Откуда: Москва
Фото: 54
_DiseL_, у тебя локаль UTF-8? Что-то мне думается, что ты пытаешься ей скармливать строку в однобайтной кодировке, а оно ждет юникод, либо наоборот... Попробуй поменять локаль для проверки, интересно что выйдет.

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
HertZ писал(а):
_DiseL_, у тебя локаль UTF-8? Что-то мне думается, что ты пытаешься ей скармливать строку в однобайтной кодировке, а оно ждет юникод, либо наоборот... Попробуй поменять локаль для проверки, интересно что выйдет.

да utf-8 и с кармливаю ее в однобайтовой кодировке... хм Сейчас попробую
Добавлено спустя 1 час, 34 минуты, 55 секунд
HertZ в общем принимает только в однобайтовой кодировке и похоже только латиницу. Вот строки Cyrillic_ef, Cyrillic_a и т.д. распознает на ура... Буду делать обратную qt`шной keysymToUnicode

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
С кодами клавиш разобрался по средством своего велосипеда.. погнутого из qt ишного, теперь возник вопрос, как перехватывать все сообщения от xserver (интересует смена фокуса окна) а не только те что к приложениию идут. Есть информация? а то натыкался только на варианты с ручной обработкой цикла сообщений XNextEvent (dpy, &event);

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Advanced member
Предупреждение 
Статус: Не в сети
Регистрация: 27.02.2007
Откуда: Москва
Фото: 54
_DiseL_ писал(а):
С кодами клавиш разобрался по средством своего велосипеда..

Интересно... А можно подробнее?

_DiseL_ писал(а):
Есть информация? а то натыкался только на варианты с ручной обработкой цикла сообщений XNextEvent (dpy, &event);

Честно говоря, кроме как использовать цикл, в данной ситуации и не пробовал ничего. Имхо а нем ничего криминального нет, в WinAPI, например, сообщения по большому счету обрабатываются точно так же:

Код:
    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


А выше определена структура типа WNDCLASS или WNDCLASSEX, в которой хранится адрес обработчика событий, прототип которой должен иметь такой вид:

Код:
LRESULT CALLBACK MessageLoopProc(HWND, UINT, WPARAM, LPARAM)


А внутри обработчика кейсами уже обрабатываются нужные сообщения... Стандартное решение, которым пользуются даже авторы авторан-червей :-)

Ладно, с виндой это я отвлекся, в случае иксов сообщения о событиях я обрабатываю примерно так (пример от автора xscreensaver):

Код:
static void
check_events (struct hyper_state *hs)
{   

  Display *dpy;
  int count;
  int ic;
  int resize;
  Window win;
  int redraw;
  dpy = hs->hs_display;
  count = XEventsQueued (dpy, QueuedAfterReading);
  ic = count;
  hs->hs_resize = 0;
  hs->hs_redraw = 0;


  while (--ic >= 0)
    {
      XEvent    e;
      XNextEvent (dpy, &e);
      switch (e.type)
    {
    case Expose:

      hs->hs_icon = 0;
      hs->hs_redraw = 1;
      break;
    case ConfigureNotify:
      hs->hs_icon = 0;
      hs->hs_resize = 1;
      hs->hs_redraw = 1;
      break;
    case ButtonPress:
      switch (e.xbutton.button)
        {
        case 2:
          hs->hs_stop = !hs->hs_stop;
          break;
        default:
          break;
        }
      break;
    case UnmapNotify:
      hs->hs_icon = 1;
      hs->hs_redraw = 0;
      break;
    default:
      screenhack_handle_event(dpy, &e);
      break;
    }
    }
  resize = hs->hs_resize;
  win = hs->hs_window;
  if (resize)
    {
      XWindowAttributes wa;
      int width;
      int height;
      XGetWindowAttributes (dpy, win, &wa);
      width = wa.width;
      height = wa.height;
      set_sizes (&hyper_state, width, height);
    }
  redraw = hs->hs_redraw;


  if (redraw)
    XClearWindow (dpy, win);
}

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
HertZ писал(а):
Интересно... А можно подробнее?

Поскольку символы были в юникоде то xorg их просто так не принимал. У qt есть функция keysymToUnicode, вот на ее основе сделал unicodeToKeysymа дальше все просто
HertZ писал(а):
Честно говоря, кроме как использовать цикл, в данной ситуации и не пробовал ничего. Имхо а нем ничего криминального нет, в WinAPI, например, сообщения по большому счету обрабатываются точно так же:

Да вот нашел один кривой вариант. Просто приложению приходят в любом случае события, можно в это время принуительно отлавливать текущий активный фокус через XGetInputFocus .. вопрост в том на сколько это корректно и что можно огрести в этом случае

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
HertZ Такой вопрос, а как то можно перехватывать сообщения от клавиатуры, но чсто бы при этом они прохродилди дальше.
А то вариант с XGrabKeyboard(dpy, DefaultRootWindow(dpy), False, GrabModeAsync, GrabModeAsync, CurrentTime) + XNextEvent (dpy, &event) рубят их на корню и дальше не пропускают
Я просто очередно велосипед по поводу глобальных хоткеев делаю. и что то никак

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


 

Advanced member
Предупреждение 
Статус: Не в сети
Регистрация: 27.02.2007
Откуда: Москва
Фото: 54
_DiseL_, попробуй owner_events == True, а не False.

_DiseL_ писал(а):
Я просто очередно велосипед по поводу глобальных хоткеев делаю

Свою DE пишешь, что-ли?

_________________
14900KF@6000/4800 (p95 & Linpack)
96G Trident Z5 @ 7200 (34-42-42-53, ICE-RDT)
z790 Aorus Master X
RX 6900XT GAMING OC 16G+Bykski WB
macOS Sequia 15.5


 

Member
Статус: Не в сети
Регистрация: 17.09.2003
Откуда: UA г.Донецк
HertZ один фиг.
Несовсем, делаю замену KXKB без kdelibs
И еще такой, может кому покажется тупой, вопрос.
При использовании XGrаbKey, получается привызываем к приложению XEvent который будет сформирован при нажатии указанных в XGrаbKey клавиш, то есть данный XEvent будет отправлен в приложение ? или я не так что то понял ?

Правда XGrаbKey почемуто возвращает результат = 1 .... и ничего естественно не работает

_________________
Debian Lenny/Sid
при установке линукс не пострадал ни один пингвин, полегли все дятлы


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 14 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan