Доброе время суток всем.
Подскажите, кто-то решал проблему отображения текущей раскладки?
В Windows есть WM_INPUTLANGCHANGE, мне бы хотелось что-то подобное под linux. Не хотелось бы по каждому нажатию кнопки определять текущую раскладку.
Может кто-то подскажет куда копать?
Перехват изменения раскладки аля WM_INPUTLANGCHANGE Topic is solved
-
- Earned a small fee
- Posts: 12
- Joined: Sun Jan 14, 2007 12:01 pm
- Location: Ukraine,Odessa
- Contact:
Re: Перехват изменения раскладки аля WM_INPUTLANGCHANGE
Нашел решение этого вопроса для gtk (gnome) работает, должно работать и для других x11, но я не проверял.
использовал xklivier. Не судите строго, возможно что-то и лишнее тут, а может чего-то не хватает.
Я делал так:
Инициализация:
В onLayoutChange использовал:
Это как один из вариантов решения. При этом получаешь состояние раскладки для любого окна.
использовал xklivier. Не судите строго, возможно что-то и лишнее тут, а может чего-то не хватает.
Я делал так:
Инициализация:
Code: Select all
mXklEng=xkl_engine_get_instance(GDK_DISPLAY());
xkl_engine_start_listen (mXklEng, XKLL_TRACK_KEYBOARD_STATE);
g_signal_connect(mXklEng, "X-state-changed", G_CALLBACK(xkb_config_state_changed), this);
gdk_window_add_filter(NULL, (GdkFilterFunc)handle_xevent, mXklEng);
GroupMax=xkl_engine_get_num_groups(mXklEng);
xklconfig_rec=xkl_config_rec_new();
Code: Select all
GdkFilterReturn handle_xevent (GdkXEvent * xev, void* event, gpointer data){
XklEngine *mXklEng=(XklEngine *)data;
XEvent *xevent = (XEvent *) xev;
xkl_engine_filter_events (mXklEng, xevent);
return GDK_FILTER_CONTINUE;
}
Code: Select all
void xkb_config_state_changed (XklEngine *engine, XklEngineStateChange change, gint group, gboolean restore, void *data){
if ( change == GROUP_CHANGED){
wxKBDLayoutIcon *obj=(wxKBDLayoutIcon *)data;
obj->OnLayoutChange(group);
}
}
Code: Select all
XklState* state = xkl_engine_get_current_state(mXklEng);
wxString layoutname=xklconfig_rec->layouts[state->group];