mirror of
https://github.com/wizbright/waybox.git
synced 2025-10-29 05:40:20 -04:00
Implemented Reconfigure action
This commit is contained in:
parent
740c8c3393
commit
141a941bed
3 changed files with 49 additions and 28 deletions
|
|
@ -91,19 +91,27 @@ static bool parse_key_bindings(struct wb_config *config, xmlXPathContextPtr ctxt
|
|||
{
|
||||
attr = attr->next;
|
||||
}
|
||||
key_bind->action = malloc(sizeof(char) * 64);
|
||||
strcpy(key_bind->action, (char *) attr->children->content);
|
||||
wlr_log(WLR_INFO, "Registering action %s", (char *) key_bind->action);
|
||||
if (strcmp((char *) key_bind->action, "Execute") != 0)
|
||||
char *action = (char *) attr->children->content;
|
||||
if (strcmp(action, "Execute") == 0)
|
||||
key_bind->action = ACTION_EXECUTE;
|
||||
else if (strcmp(action, "NextWindow") == 0)
|
||||
key_bind->action = ACTION_NEXT_WINDOW;
|
||||
else if (strcmp(action, "PreviousWindow") == 0)
|
||||
key_bind->action = ACTION_PREVIOUS_WINDOW;
|
||||
else if (strcmp(action, "Close") == 0)
|
||||
key_bind->action = ACTION_CLOSE;
|
||||
else if (strcmp(action, "Exit") == 0)
|
||||
key_bind->action = ACTION_EXIT;
|
||||
else if (strcmp(action, "Reconfigure") == 0)
|
||||
key_bind->action = ACTION_RECONFIGURE;
|
||||
if (key_bind->action != ACTION_EXECUTE)
|
||||
break;
|
||||
cur_node = cur_node->children;
|
||||
}
|
||||
if (strcmp((char *) cur_node->name, "execute") == 0)
|
||||
{
|
||||
/* Bad things can happen if the command is greater than 1024 characters */
|
||||
key_bind->cmd = malloc(sizeof(char) * 1024);
|
||||
strncpy(key_bind->cmd, (char *) cur_node->children->content, 1023);
|
||||
key_bind->cmd[1023] = '\0';
|
||||
key_bind->cmd = (char *) xmlStrdup(cur_node->children->content);
|
||||
if (key_bind->action)
|
||||
break;
|
||||
}
|
||||
|
|
@ -175,7 +183,6 @@ void deinit_config(struct wb_config *config) {
|
|||
/* Free everything allocated in init_config */
|
||||
struct wb_key_binding *key_binding;
|
||||
wl_list_for_each(key_binding, &config->key_bindings, link) {
|
||||
free(key_binding->action);
|
||||
free(key_binding->cmd);
|
||||
free(key_binding);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,16 @@
|
|||
|
||||
#include "waybox/server.h"
|
||||
|
||||
enum action_type {
|
||||
ACTION_FIRST,
|
||||
ACTION_CLOSE,
|
||||
ACTION_EXECUTE,
|
||||
ACTION_EXIT,
|
||||
ACTION_NEXT_WINDOW,
|
||||
ACTION_PREVIOUS_WINDOW,
|
||||
ACTION_RECONFIGURE
|
||||
};
|
||||
|
||||
struct wb_config {
|
||||
struct wb_server *server;
|
||||
struct {
|
||||
|
|
@ -20,7 +30,7 @@ struct wb_config {
|
|||
struct wb_key_binding {
|
||||
xkb_keysym_t sym;
|
||||
uint32_t modifiers;
|
||||
char *action;
|
||||
enum action_type action;
|
||||
char *cmd;
|
||||
struct wl_list link;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -62,25 +62,29 @@ static bool handle_keybinding(struct wb_server *server, xkb_keysym_t sym, uint32
|
|||
wl_list_for_each(key_binding, &server->config->key_bindings, link) {
|
||||
if (sym == key_binding->sym && modifiers == key_binding->modifiers)
|
||||
{
|
||||
if ((strcmp("NextWindow", key_binding->action) == 0)) {
|
||||
return cycle_views(server);
|
||||
}
|
||||
else if ((strcmp("PreviousWindow", key_binding->action) == 0)) {
|
||||
return cycle_views_reverse(server);
|
||||
}
|
||||
else if ((strcmp("Close", key_binding->action) == 0)) {
|
||||
struct wb_view *current_view = wl_container_of(
|
||||
server->views.next, current_view, link);
|
||||
wlr_xdg_toplevel_send_close(current_view->xdg_toplevel);
|
||||
return true;
|
||||
}
|
||||
else if ((strcmp("Execute", key_binding->action) == 0)) {
|
||||
if (fork() == 0) {
|
||||
execl("/bin/sh", "/bin/sh", "-c", key_binding->cmd, (char *) NULL);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if ((strcmp("Exit", key_binding->action) == 0)) {
|
||||
switch (key_binding->action)
|
||||
{
|
||||
case ACTION_NEXT_WINDOW:
|
||||
return cycle_views(server);
|
||||
case ACTION_PREVIOUS_WINDOW:
|
||||
return cycle_views_reverse(server);
|
||||
case ACTION_CLOSE:
|
||||
{
|
||||
struct wb_view *current_view = wl_container_of(
|
||||
server->views.next, current_view, link);
|
||||
wlr_xdg_toplevel_send_close(current_view->xdg_toplevel);
|
||||
return true;
|
||||
}
|
||||
case ACTION_EXECUTE:
|
||||
if (fork() == 0) {
|
||||
execl("/bin/sh", "/bin/sh", "-c", key_binding->cmd, (char *) NULL);
|
||||
}
|
||||
return true;
|
||||
case ACTION_RECONFIGURE:
|
||||
deinit_config(server->config);
|
||||
init_config(server);
|
||||
return true;
|
||||
case ACTION_EXIT:
|
||||
wl_display_terminate(server->wl_display);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue