[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [анонс патча] поддержка акселераторов в программах использующих gtk (и gnome-libs) в X независимо от текущего языка клавиатуры



On Tue, 29 Aug 2000, Ivan Pascal wrote:

> 
>   Ну и ... довольно кривой патч.
> 
>   Во-первых, перебирать keycodes от 0 до 1500 - фи.
> "Идеологически корректно" - взять display->min_keycode и display->max_keycode.
> В бльшинстве случаев (обычные "писишные" клавиатуры) получится на порядок
> меньше.
    
   Да, эта часть кода (для определния в какой клавиатурной группе находятся
латинские символы), выполняемая только при инициализации библиотеки gdk,
написана идеологически некорректно по отношению к X (но дает корректные
результаты). Мне было вломы делать корректно (и если честно, я был не уверен,
как корректнее). А display->min_keycode и display->max_keycode есть в старых
Xlib от различных вендоров? 

>   А вот index в XKeycodeToKeysym в общем случае может быть до 255.
> 
>   Но это не так важно. "Контролизацию" не-latin1 символов должна правильно
> отрабатывать Xlib. Но не делает.
 
 Что значит "контролизация" (то, что делает мой патч?) ?

>   Я исправил, но как обычно патч вошел только в current ветку, то есть 4.0.*.
> 
>   Кстати, буквально на днях приложили патч, в котором я слегка переделал
> XLookupString. Теперь она должна правильно работать с не-latin1 keysym'ами
> (правильно переводить их в байты) и отрабатывать "контролизацию"
> даже в том случае, если сервер не имеет XKB.

 Хмм, а до этого она неправильно работала с с не-latin1 keysym'ами? Я на
русском языке и XFree86-3.3.3 этого не прочувствовал.

>   (То о чем жаловался в ru.linux Костя Белоус. А Витус посоветовал ему -
> "не пользоваться gnome", или KDE? - не помню точно.)
> 
> >  Это анонс второй ревизии данного патча, в которую добавлена (идеологически
> > корректная) операция очистки некоторых битов XEventKey.state которые
> 
>   И это никак не "корректно".
> Во-первых, биты 13,14 в event.state - это 'группа' в терминах XKB.

 gdk не использует биты старше 13. 

> Самое правильное для gtk - не лезть туда со своими локальными флагами
> или если уж залезли - чистить оригинальный state "по полной программе" -
> накладывать маску 0xff - это все традиционные модификаторы.
>   А то завтра или в xkb задействуют биты 8-12, или в gtk запользуют 14'й.
> И придется делать новый "идеологически корректный" патч.

   Биты 8-12 уже задействованы X (и gdk) под Button[1-5]Mask. 
   13й бит используется как GDK_RELEASE_MASK просто из-за незнания о его
использовании XKB (и значение этого enum'a не меняют чтобы не нарушить
бинарную совместимость библиотек). Gdk вроде бы больше никаких флагов не будет
нужно - так что то, что патч чистит только 13й бит - идеологически корректно.

> > устанавливаются XKB когда текущий язык клавиатуры - не анлийский (не знаю, как
> > лучше это грамотно описать). Эти уставноленные биты совпадали с другими
> > масками используемыми gdk (GDK_RELEASE_MASK) что нарушало функционирование
> > bindings при русском языке клавиатуры (например, не-буквенные клавиши типа 
> > Ctrl-End не срабатывали в GtkCList). 
> 
>   Как я не смотрел в исходники - так и не понял - где этоа GDK_RELEASE_MASK
> проверяется. И соответственно - почему это мешает.
	
  Надо было смотреть в /gtk/gtk*.c - он используется GtkBindingSet очень
активно (а его в свою очередь используют многие виджеты).

>   Но в любом случае, как я уже сказал - раз из event.state иннтересуют только
> модификаторы - то их и надо отфильтровывать для дальнейшего использования,
> а не "давить" отдельные случайно совпавшие биты.

 Случайно совпавший бит - только один (и будет только один).

>   Вот это будет - идеологически корректно.

 Спасибо за конструктивную критику.
 
> -- 
>  Ivan U. Pascal         |   e-mail: pascal@tsu.ru
>    Administrator of     |   Tomsk State University
>      University Network |       Tomsk, Russia
> 

 Best regards,
  -Vlad