Просмотр исходного кода

Fix input for SDL_VIDEODRIVER=wayland

Luna Stadler лет назад: 4
Родитель
Сommit
e747c49700
1 измененных файлов с 25 добавлено и 23 удалено
  1. 25 23
      zig/sdl/hello_sdl.zig

+ 25 - 23
zig/sdl/hello_sdl.zig

67
67
68
    const keyboardState = c.SDL_GetKeyboardState(null);
68
    const keyboardState = c.SDL_GetKeyboardState(null);
69
69
70
    c.SDL_StartTextInput();
71
70
    var quit = false;
72
    var quit = false;
71
    while (!quit) {
73
    while (!quit) {
72
        var event: c.SDL_Event = undefined;
74
        var event: c.SDL_Event = undefined;
73
        while (c.SDL_PollEvent(&event) != 0) {
75
        while (c.SDL_PollEvent(&event) != 0) {
76
            const ctrlPressed = (keyboardState[c.SDL_SCANCODE_LCTRL] != 0);
74
            switch (event.@"type") {
77
            switch (event.@"type") {
75
                c.SDL_QUIT => {
78
                c.SDL_QUIT => {
76
                    quit = true;
79
                    quit = true;
84
                    }
87
                    }
85
                },
88
                },
86
                c.SDL_KEYDOWN => {
89
                c.SDL_KEYDOWN => {
87
                    switch (event.key.keysym.sym) {
88
                        c.SDLK_ESCAPE => {
89
                            quit = true;
90
                        },
91
                        c.SDLK_BACKSPACE => {
92
                            pos = if (pos == 0) max_chars - 1 else (pos - 1) % (max_chars - 1);
93
                            msg[pos] = '_';
94
                        },
95
                        c.SDLK_RETURN => {
96
                            result = runCommand(&msg, gpa);
97
                            var i: usize = 0;
98
                            while (i < max_chars) : (i += 1) {
99
                                msg[i] = ' ';
100
                            }
101
                            msg[max_chars] = 0;
102
                            pos = 0;
103
                        },
104
                        else => {},
105
                    }
106
107
                    // ctrl + key combinations
108
                    if (keyboardState[c.SDL_SCANCODE_LCTRL] != 0) {
90
                    if (ctrlPressed) {
109
                        switch (event.key.keysym.sym) {
91
                        switch (event.key.keysym.sym) {
110
                            c.SDLK_a => {
92
                            c.SDLK_a => {
111
                                pos = 0;
93
                                pos = 0;
121
                            },
103
                            },
122
                            else => {},
104
                            else => {},
123
                        }
105
                        }
106
                    } else {
107
                        switch (event.key.keysym.sym) {
108
                            c.SDLK_ESCAPE => {
109
                                quit = true;
110
                            },
111
                            c.SDLK_BACKSPACE => {
112
                                pos = if (pos == 0) max_chars - 1 else (pos - 1) % (max_chars - 1);
113
                                msg[pos] = '_';
114
                            },
115
                            c.SDLK_RETURN => {
116
                                result = runCommand(&msg, gpa);
117
                                var i: usize = 0;
118
                                while (i < max_chars) : (i += 1) {
119
                                    msg[i] = ' ';
120
                                }
121
                                msg[max_chars] = 0;
122
                                pos = 0;
123
                            },
124
                            else => {},
125
                        }
124
                    }
126
                    }
125
                },
127
                },
126
                c.SDL_TEXTINPUT => {
128
                c.SDL_TEXTINPUT => {
127
                    if (event.text.text.len > 0) {
129
                    if (!ctrlPressed and event.text.text.len > 0) {
128
                        c.SDL_Log("input: '%s' at %d", event.text.text, pos);
130
                        c.SDL_Log("input: '%s' at %d", event.text.text, pos);
129
                        msg[pos] = event.text.text[0];
131
                        msg[pos] = event.text.text[0];
130
                        pos = (pos + 1) % (max_chars - 1);
132
                        pos = (pos + 1) % (max_chars - 1);