mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 12:55:58 +01:00
Working switches in rootston:
Factor out switch handling to separate file Add formal enum for toggle action Implement binding actions
This commit is contained in:
parent
62a9cf87fa
commit
810c7b700c
7 changed files with 60 additions and 16 deletions
|
@ -5,6 +5,7 @@
|
||||||
#include "rootston/input.h"
|
#include "rootston/input.h"
|
||||||
#include "rootston/keyboard.h"
|
#include "rootston/keyboard.h"
|
||||||
#include "rootston/layers.h"
|
#include "rootston/layers.h"
|
||||||
|
#include "rootston/switch.h"
|
||||||
#include "rootston/text_input.h"
|
#include "rootston/text_input.h"
|
||||||
|
|
||||||
struct roots_seat {
|
struct roots_seat {
|
||||||
|
@ -75,15 +76,6 @@ struct roots_pointer {
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct roots_switch {
|
|
||||||
struct roots_seat *seat;
|
|
||||||
struct wlr_input_device *device;
|
|
||||||
struct wl_listener device_destroy;
|
|
||||||
|
|
||||||
struct wl_listener toggle;
|
|
||||||
struct wl_list link;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct roots_touch {
|
struct roots_touch {
|
||||||
struct roots_seat *seat;
|
struct roots_seat *seat;
|
||||||
struct wlr_input_device *device;
|
struct wlr_input_device *device;
|
||||||
|
|
18
include/rootston/switch.h
Normal file
18
include/rootston/switch.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef ROOTSTON_SWITCH_H
|
||||||
|
#define ROOTSTON_SWITCH_H
|
||||||
|
|
||||||
|
#include "rootston/input.h"
|
||||||
|
|
||||||
|
struct roots_switch {
|
||||||
|
struct roots_seat *seat;
|
||||||
|
struct wlr_input_device *device;
|
||||||
|
struct wl_listener device_destroy;
|
||||||
|
|
||||||
|
struct wl_listener toggle;
|
||||||
|
struct wl_list link;
|
||||||
|
};
|
||||||
|
|
||||||
|
void roots_switch_handle_toggle(struct roots_switch *lid_switch,
|
||||||
|
struct wlr_event_switch_toggle *event);
|
||||||
|
|
||||||
|
#endif // ROOTSTON_SWITCH_H
|
|
@ -33,7 +33,8 @@ enum wlr_switch_type {
|
||||||
|
|
||||||
enum wlr_switch_state {
|
enum wlr_switch_state {
|
||||||
WLR_SWITCH_STATE_OFF = 0,
|
WLR_SWITCH_STATE_OFF = 0,
|
||||||
WLR_SWITCH_STATE_ON = 1,
|
WLR_SWITCH_STATE_ON,
|
||||||
|
WLR_SWITCH_STATE_TOGGLE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wlr_event_switch_toggle {
|
struct wlr_event_switch_toggle {
|
||||||
|
|
|
@ -201,7 +201,7 @@ void add_binding_config(struct wl_list *bindings, const char* combination,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_switch_config(struct wl_list *switches, const char *switch_name, const char *action,
|
void add_switch_config(struct wl_list *switches, const char *switch_name, const char *action,
|
||||||
const char* command) {
|
const char* command) {
|
||||||
struct roots_switch_config *sc = calloc(1, sizeof(struct roots_switch_config));
|
struct roots_switch_config *sc = calloc(1, sizeof(struct roots_switch_config));
|
||||||
|
|
||||||
|
@ -218,10 +218,11 @@ void add_switch_config(struct wl_list *switches, const char *switch_name, const
|
||||||
} else if (strcmp(action, "off") == 0) {
|
} else if (strcmp(action, "off") == 0) {
|
||||||
sc->switch_state = WLR_SWITCH_STATE_OFF;
|
sc->switch_state = WLR_SWITCH_STATE_OFF;
|
||||||
} else if (strcmp(action, "toggle") == 0) {
|
} else if (strcmp(action, "toggle") == 0) {
|
||||||
sc->switch_state = -1;
|
sc->switch_state = WLR_SWITCH_STATE_TOGGLE;
|
||||||
} else {
|
} else {
|
||||||
wlr_log(WLR_ERROR, "Invalid switch action %s/n for switch %s:%s",
|
wlr_log(WLR_ERROR, "Invalid switch action %s/n for switch %s:%s",
|
||||||
action, switch_name, action);
|
action, switch_name, action);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
sc->command = strdup(command);
|
sc->command = strdup(command);
|
||||||
wl_list_insert(switches, &sc->link);
|
wl_list_insert(switches, &sc->link);
|
||||||
|
@ -465,7 +466,7 @@ static int config_ini_handler(void *user, const char *section, const char *name,
|
||||||
add_binding_config(&config->bindings, name, value);
|
add_binding_config(&config->bindings, name, value);
|
||||||
} else if (strncmp(switch_prefix, section, strlen(switch_prefix)) == 0) {
|
} else if (strncmp(switch_prefix, section, strlen(switch_prefix)) == 0) {
|
||||||
const char *switch_name = section + strlen(switch_prefix);
|
const char *switch_name = section + strlen(switch_prefix);
|
||||||
add_switch_config(&config->bindings, switch_name, name, value);
|
add_switch_config(&config->switches, switch_name, name, value);
|
||||||
} else {
|
} else {
|
||||||
wlr_log(WLR_ERROR, "got unknown config section: %s", section);
|
wlr_log(WLR_ERROR, "got unknown config section: %s", section);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ sources = [
|
||||||
'main.c',
|
'main.c',
|
||||||
'output.c',
|
'output.c',
|
||||||
'seat.c',
|
'seat.c',
|
||||||
|
'switch.c',
|
||||||
'text_input.c',
|
'text_input.c',
|
||||||
'virtual_keyboard.c',
|
'virtual_keyboard.c',
|
||||||
'wl_shell.c',
|
'wl_shell.c',
|
||||||
|
|
|
@ -82,8 +82,7 @@ static void handle_switch_toggle(struct wl_listener *listener, void *data) {
|
||||||
struct roots_desktop *desktop = lid_switch->seat->input->server->desktop;
|
struct roots_desktop *desktop = lid_switch->seat->input->server->desktop;
|
||||||
wlr_idle_notify_activity(desktop->idle, lid_switch->seat->seat);
|
wlr_idle_notify_activity(desktop->idle, lid_switch->seat->seat);
|
||||||
struct wlr_event_switch_toggle *event = data;
|
struct wlr_event_switch_toggle *event = data;
|
||||||
wlr_log(WLR_DEBUG, "Switch event %s: type %i state %i", event->device->name, event->switch_type, event->switch_state);
|
roots_switch_handle_toggle(lid_switch, event);
|
||||||
//roots_switch_handle_toggle(lid_switch, event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_touch_down(struct wl_listener *listener, void *data) {
|
static void handle_touch_down(struct wl_listener *listener, void *data) {
|
||||||
|
@ -742,7 +741,6 @@ static void seat_add_switch(struct roots_seat *seat,
|
||||||
wlr_log(WLR_ERROR, "could not allocate switch for seat");
|
wlr_log(WLR_ERROR, "could not allocate switch for seat");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
device->data = lid_switch;
|
device->data = lid_switch;
|
||||||
lid_switch->device = device;
|
lid_switch->device = device;
|
||||||
lid_switch->seat = seat;
|
lid_switch->seat = seat;
|
||||||
|
|
33
rootston/switch.c
Normal file
33
rootston/switch.c
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <wlr/util/log.h>
|
||||||
|
|
||||||
|
#include "rootston/bindings.h"
|
||||||
|
#include "rootston/config.h"
|
||||||
|
#include "rootston/input.h"
|
||||||
|
#include "rootston/seat.h"
|
||||||
|
#include "rootston/switch.h"
|
||||||
|
|
||||||
|
void roots_switch_handle_toggle(struct roots_switch *lid_switch,
|
||||||
|
struct wlr_event_switch_toggle *event) {
|
||||||
|
struct wl_list *bound_switches = &lid_switch->seat->input->server->config->switches;
|
||||||
|
struct roots_switch_config *sc;
|
||||||
|
wl_list_for_each(sc, bound_switches, link) {
|
||||||
|
bool device_match = false;
|
||||||
|
bool state_match = false;
|
||||||
|
if ((sc->name != NULL && strcmp(event->device->name, sc->name) == 0) ||
|
||||||
|
(sc->name == NULL && event->switch_type == sc->switch_type)) {
|
||||||
|
device_match = true;
|
||||||
|
}
|
||||||
|
if (!device_match) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sc->switch_state == WLR_SWITCH_STATE_TOGGLE ||
|
||||||
|
event->switch_state == sc->switch_state) {
|
||||||
|
state_match = true;
|
||||||
|
}
|
||||||
|
if (device_match && state_match) {
|
||||||
|
execute_binding_command(lid_switch->seat, lid_switch->seat->input, sc->command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue