mirror of
https://github.com/swaywm/sway.git
synced 2026-04-22 06:46:27 -04:00
input/keyboard: enable user xkb configs with cap_sys_nice
This commit is contained in:
parent
e1b268af98
commit
78b9762016
3 changed files with 52 additions and 0 deletions
|
|
@ -81,6 +81,8 @@ struct sway_keyboard_group {
|
||||||
struct wl_list link; // sway_seat::keyboard_groups
|
struct wl_list link; // sway_seat::keyboard_groups
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int xkb_context_include_path_append_default_unsecured(struct xkb_context *ctx);
|
||||||
|
|
||||||
struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
|
struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
|
||||||
char **error);
|
char **error);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <wordexp.h>
|
#include <wordexp.h>
|
||||||
|
#include <sys/auxv.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
@ -17,6 +18,7 @@
|
||||||
#include <wlr/types/wlr_output.h>
|
#include <wlr/types/wlr_output.h>
|
||||||
#include "sway/input/input-manager.h"
|
#include "sway/input/input-manager.h"
|
||||||
#include "sway/input/seat.h"
|
#include "sway/input/seat.h"
|
||||||
|
#include "sway/input/keyboard.h"
|
||||||
#include "sway/input/switch.h"
|
#include "sway/input/switch.h"
|
||||||
#include "sway/commands.h"
|
#include "sway/commands.h"
|
||||||
#include "sway/config.h"
|
#include "sway/config.h"
|
||||||
|
|
@ -38,6 +40,9 @@ struct sway_config *config = NULL;
|
||||||
static struct xkb_state *keysym_translation_state_create(
|
static struct xkb_state *keysym_translation_state_create(
|
||||||
struct xkb_rule_names rules) {
|
struct xkb_rule_names rules) {
|
||||||
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
|
if (getauxval(AT_SECURE) > 0) {
|
||||||
|
xkb_context_include_path_append_default_unsecured(context);
|
||||||
|
}
|
||||||
struct xkb_keymap *xkb_keymap = xkb_keymap_new_from_names(
|
struct xkb_keymap *xkb_keymap = xkb_keymap_new_from_names(
|
||||||
context,
|
context,
|
||||||
&rules,
|
&rules,
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#include <sys/auxv.h>
|
||||||
#include <wlr/config.h>
|
#include <wlr/config.h>
|
||||||
#include <wlr/backend/multi.h>
|
#include <wlr/backend/multi.h>
|
||||||
#include <wlr/interfaces/wlr_keyboard.h>
|
#include <wlr/interfaces/wlr_keyboard.h>
|
||||||
#include <wlr/types/wlr_idle.h>
|
#include <wlr/types/wlr_idle.h>
|
||||||
#include <wlr/types/wlr_keyboard.h>
|
#include <wlr/types/wlr_keyboard.h>
|
||||||
#include <wlr/types/wlr_keyboard_group.h>
|
#include <wlr/types/wlr_keyboard_group.h>
|
||||||
|
#include <xkbcommon/xkbcommon.h>
|
||||||
#include <xkbcommon/xkbcommon-names.h>
|
#include <xkbcommon/xkbcommon-names.h>
|
||||||
#include "sway/commands.h"
|
#include "sway/commands.h"
|
||||||
#include "sway/input/input-manager.h"
|
#include "sway/input/input-manager.h"
|
||||||
|
|
@ -752,6 +754,45 @@ static void handle_xkb_context_log(struct xkb_context *context,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int xkb_context_include_path_append_default_unsecured(struct xkb_context *ctx) {
|
||||||
|
char *user_path;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
const char *home = getenv("HOME");
|
||||||
|
const char *xdg = getenv("XDG_CONFIG_HOME");
|
||||||
|
|
||||||
|
if (xdg != NULL) {
|
||||||
|
int len = strlen(xdg) + strlen("/xkb") + 1;
|
||||||
|
user_path = calloc(len, sizeof(char));
|
||||||
|
if (user_path) {
|
||||||
|
snprintf(user_path, len, "%s/xkb", xdg);
|
||||||
|
ret |= xkb_context_include_path_append(ctx, user_path);
|
||||||
|
free(user_path);
|
||||||
|
}
|
||||||
|
} else if (home != NULL) {
|
||||||
|
int len = strlen(home) + strlen("/.config/xkb") + 1;
|
||||||
|
user_path = calloc(len, sizeof(char));
|
||||||
|
if (user_path) {
|
||||||
|
snprintf(user_path, len, "%s/.config/xkb", home);
|
||||||
|
ret |= xkb_context_include_path_append(ctx, user_path);
|
||||||
|
free(user_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (home != NULL) {
|
||||||
|
int len = strlen(home) + strlen("/.xkb") + 1;
|
||||||
|
user_path = calloc(len, sizeof(char));
|
||||||
|
if (user_path) {
|
||||||
|
snprintf(user_path, len, "%s/.xkb", home);
|
||||||
|
ret |= xkb_context_include_path_append(ctx, user_path);
|
||||||
|
free(user_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
|
struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
|
||||||
char **error) {
|
char **error) {
|
||||||
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||||||
|
|
@ -761,6 +802,10 @@ struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
|
||||||
xkb_context_set_user_data(context, error);
|
xkb_context_set_user_data(context, error);
|
||||||
xkb_context_set_log_fn(context, handle_xkb_context_log);
|
xkb_context_set_log_fn(context, handle_xkb_context_log);
|
||||||
|
|
||||||
|
if (getauxval(AT_SECURE) > 0) {
|
||||||
|
xkb_context_include_path_append_default_unsecured(context);
|
||||||
|
}
|
||||||
|
|
||||||
struct xkb_keymap *keymap = NULL;
|
struct xkb_keymap *keymap = NULL;
|
||||||
|
|
||||||
if (ic && ic->xkb_file) {
|
if (ic && ic->xkb_file) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue