Перехват изменения раскладки аля WM_INPUTLANGCHANGE Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
SamKV
Earned a small fee
Earned a small fee
Posts: 12
Joined: Sun Jan 14, 2007 12:01 pm
Location: Ukraine,Odessa
Contact:

Перехват изменения раскладки аля WM_INPUTLANGCHANGE

Post by SamKV »

Доброе время суток всем.
Подскажите, кто-то решал проблему отображения текущей раскладки?
В Windows есть WM_INPUTLANGCHANGE, мне бы хотелось что-то подобное под linux. Не хотелось бы по каждому нажатию кнопки определять текущую раскладку.
Может кто-то подскажет куда копать?
SamKV
Earned a small fee
Earned a small fee
Posts: 12
Joined: Sun Jan 14, 2007 12:01 pm
Location: Ukraine,Odessa
Contact:

Re: Перехват изменения раскладки аля WM_INPUTLANGCHANGE

Post by SamKV »

Нашел решение этого вопроса для gtk (gnome) работает, должно работать и для других x11, но я не проверял.
использовал 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);
    }
}
В onLayoutChange использовал:

Code: Select all

 XklState* state = xkl_engine_get_current_state(mXklEng);
wxString layoutname=xklconfig_rec->layouts[state->group];
Это как один из вариантов решения. При этом получаешь состояние раскладки для любого окна.
Post Reply