Compare commits

...

8 Commits
1.1.5 ... 1.1.7

Author SHA1 Message Date
dec05eba
b0ab2099fd 1.1.7 2025-02-05 22:36:19 +01:00
dec05eba
4a0612ae8f Update flatpak version 2025-02-05 22:16:22 +01:00
dec05eba
c650974a11 Launch gsr-global-hotkeys in flatpak through kms-server-proxy 2025-02-05 22:12:10 +01:00
dec05eba
6fe9f1a8d5 Fix global hotkeys when using virtual mapper that pretends to be a joystick as well (kanata) 2025-02-05 21:03:42 +01:00
dec05eba
8c148aceda Limit combobox item width, use multiple rows 2025-02-05 20:41:11 +01:00
dec05eba
b4c85910ce 1.1.6 2025-02-03 20:43:08 +01:00
dec05eba
fd63ac3626 Fix for steamdeck 2025-02-03 20:27:35 +01:00
dec05eba
2a0782eb02 Attempt to fix global hotkeys not working on steam deck (grabs keys, cant press buttons) 2025-02-03 19:58:42 +01:00
14 changed files with 84 additions and 71 deletions

2
TODO
View File

@@ -113,3 +113,5 @@ For keyboards that report supporting mice the keyboard grab will be delayed unti
See if there is any way around this. See if there is any way around this.
Instead of installing gsr-global-hotkeys in flatpak use kms-server-proxy to launch gsr-global-hotkeys inside the flatpak with root, just like gsr-kms-server. This removes the need to update gsr-global-hotkeys everytime there is an update. Instead of installing gsr-global-hotkeys in flatpak use kms-server-proxy to launch gsr-global-hotkeys inside the flatpak with root, just like gsr-kms-server. This removes the need to update gsr-global-hotkeys everytime there is an update.
Check if "modprobe uinput" is needed on some systems (old fedora?).

View File

@@ -1,4 +1,4 @@
project('gsr-ui', ['c', 'cpp'], version : '1.1.5', default_options : ['warning_level=2', 'cpp_std=c++17'], subproject_dir : 'depends') project('gsr-ui', ['c', 'cpp'], version : '1.1.7', default_options : ['warning_level=2', 'cpp_std=c++17'], subproject_dir : 'depends')
if get_option('buildtype') == 'debug' if get_option('buildtype') == 'debug'
add_project_arguments('-g3', language : ['c', 'cpp']) add_project_arguments('-g3', language : ['c', 'cpp'])
@@ -52,7 +52,7 @@ datadir = get_option('datadir')
gsr_ui_resources_path = join_paths(prefix, datadir, 'gsr-ui') gsr_ui_resources_path = join_paths(prefix, datadir, 'gsr-ui')
add_project_arguments('-DGSR_UI_VERSION="' + meson.project_version() + '"', language: ['c', 'cpp']) add_project_arguments('-DGSR_UI_VERSION="' + meson.project_version() + '"', language: ['c', 'cpp'])
add_project_arguments('-DGSR_FLATPAK_VERSION="5.1.2"', language: ['c', 'cpp']) add_project_arguments('-DGSR_FLATPAK_VERSION="5.1.4"', language: ['c', 'cpp'])
executable( executable(
meson.project_name(), meson.project_name(),
@@ -74,6 +74,7 @@ executable(
[ [
'tools/gsr-global-hotkeys/hotplug.c', 'tools/gsr-global-hotkeys/hotplug.c',
'tools/gsr-global-hotkeys/keyboard_event.c', 'tools/gsr-global-hotkeys/keyboard_event.c',
'tools/gsr-global-hotkeys/keys.c',
'tools/gsr-global-hotkeys/main.c' 'tools/gsr-global-hotkeys/main.c'
], ],
c_args : '-fstack-protector-all', c_args : '-fstack-protector-all',

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "gsr-ui" name = "gsr-ui"
type = "executable" type = "executable"
version = "1.1.5" version = "1.1.7"
platforms = ["posix"] platforms = ["posix"]
[lang.cpp] [lang.cpp]

View File

@@ -91,15 +91,6 @@ namespace gsr {
if(!user_homepath) if(!user_homepath)
user_homepath = "/tmp"; user_homepath = "/tmp";
char gsr_global_hotkeys_flatpak[PATH_MAX];
snprintf(gsr_global_hotkeys_flatpak, sizeof(gsr_global_hotkeys_flatpak), "%s/.local/share/gpu-screen-recorder/gsr-global-hotkeys", user_homepath);
const char *display = getenv("DISPLAY");
if(!display)
display = ":0";
char env_arg[256];
snprintf(env_arg, sizeof(env_arg), "--env=DISPLAY=%s", display);
if(process_id > 0) if(process_id > 0)
return false; return false;
@@ -136,7 +127,7 @@ namespace gsr {
} }
if(inside_flatpak) { if(inside_flatpak) {
const char *args[] = { "flatpak-spawn", "--host", env_arg, "--", gsr_global_hotkeys_flatpak, grab_type_arg, nullptr }; const char *args[] = { "flatpak-spawn", "--host", "/var/lib/flatpak/app/com.dec05eba.gpu_screen_recorder/current/active/files/bin/kms-server-proxy", "launch-gsr-global-hotkeys", user_homepath, grab_type_arg, nullptr };
execvp(args[0], (char* const*)args); execvp(args[0], (char* const*)args);
} else { } else {
const char *args[] = { "gsr-global-hotkeys", grab_type_arg, nullptr }; const char *args[] = { "gsr-global-hotkeys", grab_type_arg, nullptr };

View File

@@ -26,16 +26,21 @@ namespace gsr {
return true; return true;
if(event.type == mgl::Event::MouseButtonPressed && event.mouse_button.button == mgl::Mouse::Left) { if(event.type == mgl::Event::MouseButtonPressed && event.mouse_button.button == mgl::Mouse::Left) {
const int padding_top = padding_top_scale * get_theme().window_height;
const int padding_bottom = padding_bottom_scale * get_theme().window_height;
const mgl::vec2f mouse_pos = { (float)event.mouse_button.x, (float)event.mouse_button.y }; const mgl::vec2f mouse_pos = { (float)event.mouse_button.x, (float)event.mouse_button.y };
const mgl::vec2f item_size = get_size(); mgl::vec2f item_size = get_size();
if(show_dropdown) { if(show_dropdown) {
for(size_t i = 0; i < items.size(); ++i) { for(size_t i = 0; i < items.size(); ++i) {
Item &item = items[i]; Item &item = items[i];
item_size.y = padding_top + item.text.get_bounds().size.y + padding_bottom;
if(mgl::FloatRect(item.position, item_size).contains(mouse_pos)) { if(mgl::FloatRect(item.position, item_size).contains(mouse_pos)) {
const size_t prev_selected_item = selected_item; const size_t prev_selected_item = selected_item;
selected_item = i; selected_item = i;
show_dropdown = false; show_dropdown = false;
dirty = true;
remove_widget_as_selected_in_parent(); remove_widget_as_selected_in_parent();
if(selected_item != prev_selected_item && on_selection_changed) if(selected_item != prev_selected_item && on_selection_changed)
@@ -47,6 +52,7 @@ namespace gsr {
} }
const mgl::vec2f draw_pos = position + offset; const mgl::vec2f draw_pos = position + offset;
item_size = get_size();
if(mgl::FloatRect(draw_pos, item_size).contains(mouse_pos)) { if(mgl::FloatRect(draw_pos, item_size).contains(mouse_pos)) {
show_dropdown = !show_dropdown; show_dropdown = !show_dropdown;
if(show_dropdown) if(show_dropdown)
@@ -66,9 +72,10 @@ namespace gsr {
if(!visible) if(!visible)
return; return;
//const mgl::Scissor scissor = window.get_scissor();
update_if_dirty(); update_if_dirty();
const mgl::vec2f draw_pos = (position + offset).floor(); const mgl::vec2f draw_pos = (position + offset).floor();
//max_size.x = std::min((scissor.position.x + scissor.size.x) - draw_pos.x, max_size.x);
if(show_dropdown) if(show_dropdown)
draw_selected(window, draw_pos); draw_selected(window, draw_pos);
@@ -78,6 +85,8 @@ namespace gsr {
void ComboBox::add_item(const std::string &text, const std::string &id) { void ComboBox::add_item(const std::string &text, const std::string &id) {
items.push_back({mgl::Text(text, *font), id, {0.0f, 0.0f}}); items.push_back({mgl::Text(text, *font), id, {0.0f, 0.0f}});
items.back().text.set_max_width(font->get_character_size() * 22); // TODO: Make a proper solution
//items.back().text.set_max_rows(1);
dirty = true; dirty = true;
} }
@@ -87,6 +96,7 @@ namespace gsr {
if(item.id == id) { if(item.id == id) {
const size_t prev_selected_item = selected_item; const size_t prev_selected_item = selected_item;
selected_item = i; selected_item = i;
dirty = true;
if(trigger_event && (trigger_event_even_if_selection_not_changed || selected_item != prev_selected_item) && on_selection_changed) if(trigger_event && (trigger_event_even_if_selection_not_changed || selected_item != prev_selected_item) && on_selection_changed)
on_selection_changed(item.text.get_string(), item.id); on_selection_changed(item.text.get_string(), item.id);
@@ -107,13 +117,13 @@ namespace gsr {
void ComboBox::draw_selected(mgl::Window &window, mgl::vec2f draw_pos) { void ComboBox::draw_selected(mgl::Window &window, mgl::vec2f draw_pos) {
const int padding_top = padding_top_scale * get_theme().window_height; const int padding_top = padding_top_scale * get_theme().window_height;
const int padding_bottom = padding_bottom_scale * get_theme().window_height;
const int padding_left = padding_left_scale * get_theme().window_height; const int padding_left = padding_left_scale * get_theme().window_height;
mgl_scissor scissor; const mgl::Scissor scissor = window.get_scissor();
mgl_window_get_scissor(window.internal_window(), &scissor);
const bool bottom_is_outside_scissor = draw_pos.y + max_size.y > scissor.position.y + scissor.size.y; const bool bottom_is_outside_scissor = draw_pos.y + max_size.y > scissor.position.y + scissor.size.y;
const mgl::vec2f item_size = get_size(); mgl::vec2f item_size = get_size();
mgl::vec2f items_draw_pos = draw_pos + mgl::vec2f(0.0f, item_size.y); mgl::vec2f items_draw_pos = draw_pos + mgl::vec2f(0.0f, item_size.y);
mgl::Rectangle background(draw_pos, item_size.floor()); mgl::Rectangle background(draw_pos, item_size.floor());
@@ -137,6 +147,9 @@ namespace gsr {
const mgl::vec2f mouse_pos = window.get_mouse_position().to_vec2f(); const mgl::vec2f mouse_pos = window.get_mouse_position().to_vec2f();
for(size_t i = 0; i < items.size(); ++i) { for(size_t i = 0; i < items.size(); ++i) {
Item &item = items[i];
item_size.y = padding_top + item.text.get_bounds().size.y + padding_bottom;
if(!cursor_inside) { if(!cursor_inside) {
cursor_inside = mgl::FloatRect(items_draw_pos, item_size).contains(mouse_pos); cursor_inside = mgl::FloatRect(items_draw_pos, item_size).contains(mouse_pos);
if(cursor_inside) { if(cursor_inside) {
@@ -146,7 +159,6 @@ namespace gsr {
} }
} }
Item &item = items[i];
item.text.set_position((items_draw_pos + mgl::vec2f(padding_left, padding_top)).floor()); item.text.set_position((items_draw_pos + mgl::vec2f(padding_left, padding_top)).floor());
window.draw(item.text); window.draw(item.text);
@@ -160,7 +172,7 @@ namespace gsr {
const int padding_left = padding_left_scale * get_theme().window_height; const int padding_left = padding_left_scale * get_theme().window_height;
const int padding_right = padding_right_scale * get_theme().window_height; const int padding_right = padding_right_scale * get_theme().window_height;
const mgl::vec2f item_size = get_size(); mgl::vec2f item_size = get_size();
mgl::Rectangle background(draw_pos.floor(), item_size.floor()); mgl::Rectangle background(draw_pos.floor(), item_size.floor());
background.set_color(mgl::Color(0, 0, 0, 120)); background.set_color(mgl::Color(0, 0, 0, 120));
window.draw(background); window.draw(background);
@@ -197,11 +209,12 @@ namespace gsr {
const int padding_left = padding_left_scale * get_theme().window_height; const int padding_left = padding_left_scale * get_theme().window_height;
const int padding_right = padding_right_scale * get_theme().window_height; const int padding_right = padding_right_scale * get_theme().window_height;
max_size = { 0.0f, font->get_character_size() + (float)padding_top + (float)padding_bottom }; Item *selected_item_ptr = (selected_item < items.size()) ? &items[selected_item] : nullptr;
max_size = { 0.0f, padding_top + padding_bottom + (selected_item_ptr ? selected_item_ptr->text.get_bounds().size.y : 0.0f) };
for(Item &item : items) { for(Item &item : items) {
const mgl::vec2f bounds = item.text.get_bounds().size; const mgl::vec2f bounds = item.text.get_bounds().size;
max_size.x = std::max(max_size.x, bounds.x + padding_left + padding_right); max_size.x = std::max(max_size.x, bounds.x + padding_left + padding_right);
max_size.y += bounds.y + padding_top + padding_bottom; max_size.y += padding_top + bounds.y + padding_bottom;
} }
if(max_size.x <= 0.001f) if(max_size.x <= 0.001f)
@@ -219,7 +232,8 @@ namespace gsr {
const int padding_top = padding_top_scale * get_theme().window_height; const int padding_top = padding_top_scale * get_theme().window_height;
const int padding_bottom = padding_bottom_scale * get_theme().window_height; const int padding_bottom = padding_bottom_scale * get_theme().window_height;
return { max_size.x, font->get_character_size() + (float)padding_top + (float)padding_bottom }; Item *selected_item_ptr = (selected_item < items.size()) ? &items[selected_item] : nullptr;
return { max_size.x, padding_top + padding_bottom + (selected_item_ptr ? selected_item_ptr->text.get_bounds().size.y : 0.0f) };
} }
float ComboBox::get_dropdown_arrow_height() const { float ComboBox::get_dropdown_arrow_height() const {

View File

@@ -17,19 +17,11 @@ namespace gsr {
const mgl::vec2f draw_pos = position + offset; const mgl::vec2f draw_pos = position + offset;
mgl_scissor prev_scissor; const mgl::Scissor prev_scissor = window.get_scissor();
mgl_window_get_scissor(window.internal_window(), &prev_scissor); window.set_scissor({draw_pos.to_vec2i(), size.to_vec2i()});
const mgl_scissor new_scissor = {
mgl_vec2i{(int)draw_pos.x, (int)draw_pos.y},
mgl_vec2i{(int)size.x, (int)size.y}
};
mgl_window_set_scissor(window.internal_window(), &new_scissor);
if(draw_handler) if(draw_handler)
draw_handler(window, draw_pos, size); draw_handler(window, draw_pos, size);
window.set_scissor(prev_scissor);
mgl_window_set_scissor(window.internal_window(), &prev_scissor);
} }
mgl::vec2f CustomRendererWidget::get_size() { mgl::vec2f CustomRendererWidget::get_size() {

View File

@@ -65,8 +65,7 @@ namespace gsr {
if(!visible) if(!visible)
return; return;
mgl_scissor scissor; const mgl::Scissor scissor = window.get_scissor();
mgl_window_get_scissor(window.internal_window(), &scissor);
const mgl::vec2f draw_pos = position + offset; const mgl::vec2f draw_pos = position + offset;
const mgl::vec2f mouse_pos = window.get_mouse_position().to_vec2f(); const mgl::vec2f mouse_pos = window.get_mouse_position().to_vec2f();

View File

@@ -102,15 +102,8 @@ namespace gsr {
void GsrPage::draw_children(mgl::Window &window, mgl::vec2f position) { void GsrPage::draw_children(mgl::Window &window, mgl::vec2f position) {
Widget *selected_widget = selected_child_widget; Widget *selected_widget = selected_child_widget;
mgl_scissor prev_scissor; const mgl::Scissor prev_scissor = window.get_scissor();
mgl_window_get_scissor(window.internal_window(), &prev_scissor); window.set_scissor({position.to_vec2i(), get_inner_size().to_vec2i()});
const mgl::vec2f inner_size = get_inner_size();
const mgl_scissor new_scissor = {
mgl_vec2i{(int)position.x, (int)position.y},
mgl_vec2i{(int)inner_size.x, (int)inner_size.y}
};
mgl_window_set_scissor(window.internal_window(), &new_scissor);
for(size_t i = 0; i < widgets.size(); ++i) { for(size_t i = 0; i < widgets.size(); ++i) {
auto &widget = widgets[i]; auto &widget = widgets[i];
@@ -121,7 +114,7 @@ namespace gsr {
if(selected_widget) if(selected_widget)
selected_widget->draw(window, position); selected_widget->draw(window, position);
mgl_window_set_scissor(window.internal_window(), &prev_scissor); window.set_scissor(prev_scissor);
} }
mgl::vec2f GsrPage::get_size() { mgl::vec2f GsrPage::get_size() {

View File

@@ -89,8 +89,7 @@ namespace gsr {
offset = position + offset; offset = position + offset;
mgl_scissor prev_scissor; const mgl::Scissor prev_scissor = window.get_scissor();
mgl_window_get_scissor(window.internal_window(), &prev_scissor);
const mgl::vec2f content_size = get_inner_size(); const mgl::vec2f content_size = get_inner_size();
const mgl_scissor new_scissor = { const mgl_scissor new_scissor = {
@@ -150,7 +149,7 @@ namespace gsr {
apply_animation(); apply_animation();
limit_scroll(child_height); limit_scroll(child_height);
mgl_window_set_scissor(window.internal_window(), &prev_scissor); window.set_scissor(prev_scissor);
double scrollbar_height = 1.0; double scrollbar_height = 1.0;
if(child_height > 0.001) if(child_height > 0.001)

View File

@@ -36,14 +36,8 @@ namespace gsr {
offset = draw_pos; offset = draw_pos;
Widget *selected_widget = selected_child_widget; Widget *selected_widget = selected_child_widget;
mgl_scissor prev_scissor; const mgl::Scissor prev_scissor = window.get_scissor();
mgl_window_get_scissor(window.internal_window(), &prev_scissor); window.set_scissor({draw_pos.to_vec2i(), size.to_vec2i()});
const mgl_scissor new_scissor = {
mgl_vec2i{(int)draw_pos.x, (int)draw_pos.y},
mgl_vec2i{(int)size.x, (int)size.y}
};
mgl_window_set_scissor(window.internal_window(), &new_scissor);
for(size_t i = 0; i < widgets.size(); ++i) { for(size_t i = 0; i < widgets.size(); ++i) {
auto &widget = widgets[i]; auto &widget = widgets[i];
@@ -54,7 +48,7 @@ namespace gsr {
if(selected_widget) if(selected_widget)
selected_widget->draw(window, offset); selected_widget->draw(window, offset);
mgl_window_set_scissor(window.internal_window(), &prev_scissor); window.set_scissor(prev_scissor);
} }
mgl::vec2f StaticPage::get_size() { mgl::vec2f StaticPage::get_size() {

View File

@@ -1,4 +1,5 @@
#include "keyboard_event.h" #include "keyboard_event.h"
#include "keys.h"
/* C stdlib */ /* C stdlib */
#include <stdio.h> #include <stdio.h>
@@ -154,12 +155,6 @@ static uint32_t keycode_to_modifier_bit(uint32_t keycode) {
return 0; return 0;
} }
static bool key_is_mouse_button(uint32_t keycode) {
return (keycode >= BTN_MISC && keycode <= BTN_GEAR_UP)
|| (keycode >= BTN_TRIGGER_HAPPY && keycode <= BTN_TRIGGER_HAPPY40)
|| (keycode >= BTN_DPAD_UP && keycode <= BTN_DPAD_RIGHT);
}
static void keyboard_event_process_input_event_data(keyboard_event *self, event_extra_data *extra_data, int fd) { static void keyboard_event_process_input_event_data(keyboard_event *self, event_extra_data *extra_data, int fd) {
struct input_event event; struct input_event event;
if(read(fd, &event, sizeof(event)) != sizeof(event)) { if(read(fd, &event, sizeof(event)) != sizeof(event)) {
@@ -177,7 +172,7 @@ static void keyboard_event_process_input_event_data(keyboard_event *self, event_
//fprintf(stderr, "fd: %d, type: %d, pressed %d, value: %d\n", fd, event.type, event.code, event.value); //fprintf(stderr, "fd: %d, type: %d, pressed %d, value: %d\n", fd, event.type, event.code, event.value);
//} //}
if(event.type == EV_KEY && !key_is_mouse_button(event.code)) { if(event.type == EV_KEY && is_keyboard_key(event.code)) {
keyboard_event_process_key_state_change(self, &event, extra_data, fd); keyboard_event_process_key_state_change(self, &event, extra_data, fd);
const uint32_t modifier_bit = keycode_to_modifier_bit(event.code); const uint32_t modifier_bit = keycode_to_modifier_bit(event.code);
if(modifier_bit == 0) { if(modifier_bit == 0) {
@@ -276,7 +271,8 @@ static bool keyboard_event_try_add_device_if_keyboard(keyboard_event *self, cons
if(dev_input_id == -1) if(dev_input_id == -1)
return false; return false;
if(self->grab_type == KEYBOARD_GRAB_TYPE_VIRTUAL && !dev_input_is_virtual(dev_input_id)) const bool is_virtual_device = dev_input_is_virtual(dev_input_id);
if(self->grab_type == KEYBOARD_GRAB_TYPE_VIRTUAL && !is_virtual_device)
return false; return false;
if(keyboard_event_has_event_with_dev_input_fd(self, dev_input_id)) if(keyboard_event_has_event_with_dev_input_fd(self, dev_input_id))
@@ -292,7 +288,7 @@ static bool keyboard_event_try_add_device_if_keyboard(keyboard_event *self, cons
unsigned long evbit = 0; unsigned long evbit = 0;
ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), &evbit); ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), &evbit);
const bool is_keyboard = (evbit & (1 << EV_SYN)) && (evbit & (1 << EV_KEY)) && (evbit & (1 << EV_MSC)) && (evbit & (1 << EV_REP)); const bool is_keyboard = (evbit & (1 << EV_SYN)) && (evbit & (1 << EV_KEY));
if(is_keyboard && strcmp(device_name, GSR_UI_VIRTUAL_KEYBOARD_NAME) != 0) { if(is_keyboard && strcmp(device_name, GSR_UI_VIRTUAL_KEYBOARD_NAME) != 0) {
unsigned char key_bits[KEY_MAX/8 + 1] = {0}; unsigned char key_bits[KEY_MAX/8 + 1] = {0};
@@ -303,7 +299,7 @@ static bool keyboard_event_try_add_device_if_keyboard(keyboard_event *self, cons
//const bool supports_touch_events = key_bits[BTN_TOUCH/8] & (1 << (BTN_TOUCH % 8)); //const bool supports_touch_events = key_bits[BTN_TOUCH/8] & (1 << (BTN_TOUCH % 8));
const bool supports_joystick_events = key_bits[BTN_JOYSTICK/8] & (1 << (BTN_JOYSTICK % 8)); const bool supports_joystick_events = key_bits[BTN_JOYSTICK/8] & (1 << (BTN_JOYSTICK % 8));
const bool supports_wheel_events = key_bits[BTN_WHEEL/8] & (1 << (BTN_WHEEL % 8)); const bool supports_wheel_events = key_bits[BTN_WHEEL/8] & (1 << (BTN_WHEEL % 8));
if(supports_key_events && !supports_joystick_events && !supports_wheel_events) { if(supports_key_events && (is_virtual_device || (!supports_joystick_events && !supports_wheel_events))) {
unsigned char *key_states = calloc(1, KEY_STATES_SIZE); unsigned char *key_states = calloc(1, KEY_STATES_SIZE);
if(key_states && self->num_event_polls < MAX_EVENT_POLLS) { if(key_states && self->num_event_polls < MAX_EVENT_POLLS) {
//fprintf(stderr, "%s (%s) supports key inputs\n", dev_input_filepath, device_name); //fprintf(stderr, "%s (%s) supports key inputs\n", dev_input_filepath, device_name);
@@ -320,7 +316,7 @@ static bool keyboard_event_try_add_device_if_keyboard(keyboard_event *self, cons
.num_keys_pressed = 0 .num_keys_pressed = 0
}; };
if(supports_mouse_events) { if(supports_mouse_events || supports_joystick_events || supports_wheel_events) {
fprintf(stderr, "Info: device not grabbed yet because it might be a mouse: /dev/input/event%d\n", dev_input_id); fprintf(stderr, "Info: device not grabbed yet because it might be a mouse: /dev/input/event%d\n", dev_input_id);
fsync(fd); fsync(fd);
if(ioctl(fd, EVIOCGKEY(KEY_STATES_SIZE), self->event_extra_data[self->num_event_polls].key_states) == -1) if(ioctl(fd, EVIOCGKEY(KEY_STATES_SIZE), self->event_extra_data[self->num_event_polls].key_states) == -1)
@@ -408,7 +404,8 @@ static int setup_virtual_keyboard_input(const char *name) {
success &= (ioctl(fd, UI_SET_MSCBIT, MSC_SCAN) != -1); success &= (ioctl(fd, UI_SET_MSCBIT, MSC_SCAN) != -1);
for(int i = 1; i < KEY_MAX; ++i) { for(int i = 1; i < KEY_MAX; ++i) {
success &= (ioctl(fd, UI_SET_KEYBIT, i) != -1); if(is_keyboard_key(i) || is_mouse_button(i))
success &= (ioctl(fd, UI_SET_KEYBIT, i) != -1);
} }
for(int i = 0; i < REL_MAX; ++i) { for(int i = 0; i < REL_MAX; ++i) {
success &= (ioctl(fd, UI_SET_RELBIT, i) != -1); success &= (ioctl(fd, UI_SET_RELBIT, i) != -1);

View File

@@ -0,0 +1,21 @@
#include "keys.h"
#include <linux/input-event-codes.h>
bool is_keyboard_key(uint32_t keycode) {
return (keycode >= KEY_ESC && keycode <= KEY_KPDOT)
|| (keycode >= KEY_ZENKAKUHANKAKU && keycode <= KEY_F24)
|| (keycode >= KEY_PLAYCD && keycode <= KEY_MICMUTE)
|| (keycode >= KEY_OK && keycode <= KEY_IMAGES)
|| (keycode >= KEY_DEL_EOL && keycode <= KEY_DEL_LINE)
|| (keycode >= KEY_FN && keycode <= KEY_FN_B)
|| (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT10)
|| (keycode >= KEY_NUMERIC_0 && keycode <= KEY_LIGHTS_TOGGLE)
|| (keycode == KEY_ALS_TOGGLE)
|| (keycode >= KEY_BUTTONCONFIG && keycode <= KEY_VOICECOMMAND)
|| (keycode >= KEY_BRIGHTNESS_MIN && keycode <= KEY_BRIGHTNESS_MAX)
|| (keycode >= KEY_KBDINPUTASSIST_PREV && keycode <= KEY_ONSCREEN_KEYBOARD);
}
bool is_mouse_button(uint32_t keycode) {
return (keycode >= BTN_MOUSE && keycode <= BTN_TASK);
}

View File

@@ -0,0 +1,10 @@
#ifndef KEYS_H
#define KEYS_H
#include <stdbool.h>
#include <stdint.h>
bool is_keyboard_key(uint32_t keycode);
bool is_mouse_button(uint32_t keycode);
#endif /* KEYS_H */