Как преобразовать клавиши событий клавиатуры GTK в английский в любых языковых раскладках? - PullRequest
2 голосов
/ 09 июля 2019

Я хочу использовать клавиатурные сокращения (например, Ctrl + Z / Ctrl + C / Ctrl / V и т. Д.) В моем приложении GTK-3. Я получаю разные события клавиатуры для разных раскладок клавиатуры. Например, моя клавиатура имеет английскую и русскую раскладки, поэтому моя русская клавиша «Я» находится на «Z». В мире много языков. Как я могу сделать приложение, которое работает с любыми языками?

Теперь я перевожу коды клавиш только для русской клавиатуры следующим образом:

func main_event_listener(event *gdk.Event){
    eventObject := &gdk.EventKey{event}
    key := eventObject.KeyVal()
    state := eventObject.State()
    key, state = GTK_TranslateKeyLayoutEnglish(key, state)
    if state == gdk.GDK_CONTROL_MASK {
        if key == gdk.KEY_z {
            //Ctrl+Z
        } 
        if key == gdk.KEY_c {
            //Ctrl+C
        }
        if key == gdk.KEY_v {
            //Ctrl+V
        }
    } else {
        if key == gdk.KEY_F5 {
            //F5
        }
        if key == gdk.KEY_Delete {
            //Delete
        }
    }
}

func GTK_TranslateKeyLayoutEnglish(key uint, state uint) (uint, uint) {
    key2 := key
    state2 := state
    if state2 > 8192 { //RUSSIAN Ctrl 8196 == English Ctrl 4
        state2 -= 8192
    }
    switch key {
    case gdk.KEY_Cyrillic_ya: //RUSSIAN 'я'
        key2 = gdk.KEY_z
    case gdk.KEY_Cyrillic_ef: //RUSSIAN 'ф'
        key2 = gdk.KEY_a
    case gdk.KEY_Cyrillic_che: //RUSSIAN 'ч'
        key2 = gdk.KEY_x
    case gdk.KEY_Cyrillic_es: //RUSSIAN 'с'
        key2 = gdk.KEY_c
    case gdk.KEY_Cyrillic_em: //RUSSIAN 'м'
        key2 = gdk.KEY_v
        //etc
    }
    return key2, state2
}

Я ожидаю лучшей реализации функции GTK_TranslateKeyLayoutEnglish ()

...