Compare commits

...

33 Commits

Author SHA1 Message Date
Ryan Reaves
e6dbd5ea13 - Updated setup.py installer to set the IBus Input Method for the installer if it is not currently set as the default. 2020-02-18 21:20:01 -06:00
Ryan Reaves
6b0f3fc0dd - Updated readme with more troubleshooting tips 2020-02-18 20:24:05 -06:00
Ryan Reaves
c9bf5c1937 - cleanup script needs to be executable or an error will occur if the service has to be restarted for any reason. 2020-02-18 19:22:12 -06:00
Ryan Reaves
0f0c86af0f - Added support for standard version of Chrome for linux, not just Chromium 2020-02-18 19:02:45 -06:00
Ryan Reaves
ce937065c9 - Updated installer, some sort of regression on a copy .xkb directory fix.. Also updated readme 2020-02-18 18:57:44 -06:00
Ben Reaves
acf6bd9317 - Updated readme with credits to people who have contributor to this project over time 2020-02-18 17:30:57 -06:00
Ben Reaves
19d58a3a05 Merge branch 'dev' 2020-02-17 23:35:45 -06:00
Ben Reaves
cf8e78073a - Added Alt+Backspace = Delete key, particularly useful for chromebooks 2020-02-17 23:35:08 -06:00
Ben Reaves
86c5715853 Merge branch 'dev' 2020-02-17 22:01:18 -06:00
Ben Reaves
4e75cfb047 - Updated readme 2020-02-17 22:00:43 -06:00
Ben Reaves
159d2b63f0 - Removed and added comments 2020-02-17 20:52:49 -06:00
Ben Reaves
5a2299d8dc Merge pull request #33 from rbreaves/dev
Full wordwise support for Web Browsers, misc kintox11 optimizations.
2020-02-18 02:29:44 +00:00
Ben Reaves
83ae169fb7 - Added notes about IBus requirement for full wordwise support and added chromium name to json config 2020-02-17 20:22:21 -06:00
Ben Reaves
5c6e42b811 - Fixed caret status script to not over exclude matches 2020-02-17 20:16:53 -06:00
Ben Reaves
cd57efd89b - Added missing type definition 2020-02-17 16:51:19 -06:00
Ben Reaves
28bad9ed42 - Added proper mac_chrome symbols 2020-02-17 16:40:19 -06:00
Ben Reaves
ddfcd57c6b - Fixed setup installer 2020-02-17 16:24:54 -06:00
Ben Reaves
4b4fc7fc3f - Added firefox xbindkeys keymap file for overlaying back and forward buttons over wordwise 2020-02-17 16:20:37 -06:00
Ben Reaves
16c4378c2e - Added some changes to firefox and app requirements for keybinding browsers 2020-02-17 14:46:34 -06:00
Ben Reaves
9dc026695b - Fixed chrome keymap issue with xkb and no looping issues 2020-02-17 13:51:46 -06:00
Ben Reaves
c65d68d816 Merge branch 'master' into dev 2020-02-17 12:52:59 -06:00
Ben Reaves
3983107be5 - Fixed copy issue of xkb files, prevented xkb from overwriting previous directory 2020-02-17 12:51:54 -06:00
Ben Reaves
56391169ff Merge branch 'master' into dev 2020-02-16 20:56:07 -06:00
Ben Reaves
ac5c5f6648 - Added keyboard reset and kill any xbindkeys services running when the kinto keyswap service is stopped via systemctl 2020-02-16 20:54:57 -06:00
Ben Reaves
778d1df1ba - Additional updates that give Firefox and Chrome separate keymap files due to shortcut differences 2020-02-16 20:11:39 -06:00
Ben Reaves
fbe2451a3c - Fixed possible issue where the browser keymap would not fully undo if switched out with another app category 2020-02-16 18:11:57 -06:00
Ben Reaves
5a56ea823f - Added browsers category, input/caret detection, includes xbindkeys, and xautomation for one off fixes 2020-02-16 17:38:50 -06:00
Ben Reaves
5d5d8de92e - Updated kintox11 to filter out dragging windows 2020-02-16 03:33:51 -06:00
Ben Reaves
086ab8bb35 - Added Input Caret check to kintox11, updated json with run_onInput 2020-02-15 22:48:49 -06:00
Ben Reaves
dc016d9270 - Added timeout to blocking XNextEvent for caret/input check 2020-02-15 21:23:53 -06:00
Ben Reaves
8f1795339e - Added script to monitor the status of the input caret 2020-02-15 20:12:10 -06:00
Ben Reaves
4fb65d7025 Merge branch 'dev' 2020-02-15 00:09:17 -06:00
Ben Reaves
93daf8707e - Updated readme to include how to set the keyboard back to normal if the user decides to stop the running service 2020-02-15 00:09:04 -06:00
15 changed files with 347 additions and 22 deletions

View File

@@ -23,10 +23,24 @@ default partial xkb_symbols "mac_levelssym" {
symbols[Group1]= [ Down, Down, NoSymbol ],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<END>)]
};
// CTRL BKSP to DELETE
// replace key <BKSP> {
// type[Group1]= "TWO_LEVEL_CTRL",
// symbols[Group1]= [ BackSpace, BackSpace, NoSymbol ],
// actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<DELE>,clearmods=Control)]
// };
// Alt BKSP to DELETE
replace key <BKSP> {
type[Group1]= "ONE_LEVEL_CTRL",
symbols[Group1]= [ BackSpace, BackSpace, NoSymbol ],
actions[Group1]= [ NoAction(), RedirectKey(key=<DELE>,clearmods=Mod1), NoAction()]
};
};
partial xkb_symbols "mac_chrome" {
// Back Button
replace key <LEFT> {
type[Group1]= "ONE_LEVEL_CTRL",
symbols[Group1]= [ Left, Left, Left ],
actions[Group1]= [ NoAction(), RedirectKey(key=<UP>), RedirectKey(key=<LEFT>,modifiers=Mod1,clearmods=Control)]
};
// Forwards Button
replace key <RGHT> {
type[Group1]= "ONE_LEVEL_CTRL",
symbols[Group1]= [ Right, Right, Right ],
actions[Group1]= [ NoAction(), RedirectKey(key=<DOWN>), RedirectKey(key=<RGHT>,modifiers=Mod1,clearmods=Control)]
};
};

View File

@@ -32,12 +32,17 @@ Kinto works for standard Windows, Apple and Chromebook keyboards. The following
- Python (initial install only)
- systemd
- x11
- IBus*
- Debian/Ubuntu based distro 16.04+
If you need kintox11 recompiled for your distro please let me know and I will add a binary for your distro if my binary fails.
You can also attempt to compile kintox11.c on your system as well, but you will need to compile and install json-c first as its libraries will be required to compile and run the program.
*IBUS is needed to support wordwise during browser app usage as the keymap will need to change slightly depending if the cursor/caret is on screen waiting for input. Setup.py will set it but you can manually set it as well or check your current Input Method.
To confirm navigate to your "Language Support" and set "Keyboard input method system:" to IBus for full word-wise support with web browsers.
Wayland support is planned, but not ready yet.
## How to install
@@ -129,9 +134,9 @@ Status
systemctl --user status keyswap
```
Stop
Stop (and reset keyboard to normal)
```
systemctl --user stop keyswap
systemctl --user stop keyswap && setxkbmap -option
```
Start
@@ -176,7 +181,25 @@ systemctl --user status keyswap
journalctl -xe
```
Open a ticket and send me the info.
You may need to manually set your DISPLAY in the systemd service file. Normally it pulls in the proper DISPLAY value but if it doesn't you can try this.
```
echo $DISPLAY
# :0.0
```
nano ~/.config/systemd/user/keyswap.service
```
...
[Service]
Type=simple
Restart=always
Environment=DISPLAY=:0.0
...
```
If you continue to have issues then open a ticket and send me the info.
### Keyswap is not occurring, but it was working.
@@ -222,3 +245,22 @@ https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58
## License
GPL v2
## Credits and Contributions
I would just like to thank a few people here directly that have helped me tremendously with completing this project and without their support, direct, indirect or otherwise I would have had difficulty completing this undertaking. I will list these things off in chronological order mostly.
First off I'd like to thank the Stackoverflow and Stackexchange community. I have probably rubbed some mods the wrong way over there, but the people from the community in general are extremely helpful and gracious and without their contributions would have made this much more difficult. The person I'd like to thank most though from over there is Glen Whitney. Without his detailed explaining of how to rebind keys in xkb this would not have come together at all, as every other remapping solution were non-starters as complexity increases.
Secondarily I'd like to thank Christian Eriksson*, as he provided information that kept me up at night.. literally. Even after I implemented a similar bash script to one he had suggested I knew that fully implementing a c/c++ solution was where Kinto needed to head to and his explaination was better than I remember it being now that I have gone back to read it again. He also never provided a full implementation of a c/c++ solution - he did hit on the pain points pretty well of what one would need to do and watch out for. I am not sure where I got the first example code of implementing a based solution, but he definitely went over it well.
Kui and his gist file** was really the c based solution that I found had the fewest issues to resolve to making it a reliable solution. It didn't account for all failures very well, aka BadWindow issues, but it made for a great foundation on which Kintox11 is built. I cannot thank him enough for putting it out there for others to work with.
Lastly these four people were also very helpful to me as well. @probonopd for being one of the first people to install and use Kinto and gave me the initial feedback to include wordwise support! He also has really great articles*** posted on HackerNews & Medium about UI/UX design. Another person I'd like to thank is @owzim, his feedback allowed me to rapidly iterate and fix several bugs to support additional platforms better. The last two are members of the #ubuntu channel in IRC on freenode, tarzeau ( @alexmyczko ) and sarnold. Alex contributing a proper Makefile, so the project can be packaged properly, and sarnold help me find that IBus could resolve an issue I was having with needing to detect the caret status.
If I left anyone out then I apologize, that was not intentional. I am happy to say that this project is at a state of completion. Bug fixes will primarily be the only activity happening going forward and possibly a rewrite for Wayland at some point. Contributions as mentioned above are welcomed, and will be merged into master if they help with the goal of making typing on linux more like a mac.
*https://askubuntu.com/questions/1010276/can-i-act-on-the-event-that-a-window-opens-without-polling
**https://gist.github.com/kui/2622504
***https://medium.com/@probonopd/make-it-simple-linux-desktop-usability-part-1-5fa0fb369b42

View File

@@ -4,15 +4,18 @@ systemctl --user stop keyswap >/dev/null 2>&1
systemctl --user disable keyswap >/dev/null 2>&1
systemctl --user stop keyswap.timer >/dev/null 2>&1
systemctl --user disable keyswap.timer >/dev/null 2>&1
swapcmd="\/home\/`whoami`\/.config\/kinto\/xactive.sh"
swapcmd="\/bin\/bash -c \"\/home\/`whoami`\/.config\/kinto\/xactive.sh carrots\""
swapstopcmd="\/bin\/bash \/home\/`whoami`\/.config\/kinto\/cleanup.sh"
mkdir -p ~/.config/systemd/user
mkdir -p ~/.config/autostart
cp ./system-config/keyswap.service ~/.config/systemd/user/keyswap.service
cp ./system-config/kinto.desktop ~/.config/autostart/kinto.desktop
cp ./kintox11/binary/kintox11 ~/.config/kinto/kintox11
cp ./system-config/xactive.sh ~/.config/kinto/xactive.sh
cp ./system-config/caret_status.sh ~/.config/kinto/caret_status.sh
cp ./system-config/cleanup.sh ~/.config/kinto/cleanup.sh
cp ./system-config/.firefox-nw ~/.config/kinto/.firefox-nw
sed -i "s/{username}/`whoami`/g" ~/.config/systemd/user/keyswap.service
sed -i "s/ExecStart=/ExecStart=${swapcmd}/g" ~/.config/systemd/user/keyswap.service
systemctl --user daemon-reload
systemctl --user enable keyswap
systemctl --user start keyswap

Binary file not shown.

View File

@@ -2,4 +2,4 @@ CFLAGS=-g $(shell pkg-config --cflags json-c xmu)
LDFLAGS=-g $(shell pkg-config --libs json-c xmu)
all:
$(CC) kintox11.c $(CFLAGS) $(LDFLAGS) -o kintox11
$(CC) kintox11.c $(CFLAGS) $(LDFLAGS) -lm -o kintox11

View File

@@ -22,9 +22,99 @@
#include <X11/Xlib.h> // `apt-get install libx11-dev`
#include <X11/Xmu/WinUtil.h> // `apt-get install libxmu-dev`
#include <json-c/json.h> // `apt install libjson-c-dev`
#include <sys/select.h>
#include <math.h>
#include <sys/time.h>
long long timeInMilliseconds(void) {
struct timeval tv;
gettimeofday(&tv,NULL);
return (((long long)tv.tv_sec)*1000)+(tv.tv_usec/1000);
}
static int wait_fd(int fd, double seconds)
{
struct timeval tv;
fd_set in_fds;
FD_ZERO(&in_fds);
FD_SET(fd, &in_fds);
tv.tv_sec = trunc(seconds);
tv.tv_usec = (seconds - trunc(seconds))*1000000;
return select(fd+1, &in_fds, 0, 0, &tv);
}
int XNextEventTimeout(Display *d, XEvent *e, double seconds, long long event_ts, int last_event, long long *event_ts_ptr, int *last_event_ptr)
{
if (XPending(d) || wait_fd(ConnectionNumber(d),seconds)) {
while (1) {
XNextEvent(d, e);
long long int new_ts = timeInMilliseconds();
// Make sure window dragging or resizing is not occuring
if(!(e->type == 22 && (e->type == last_event) && timeInMilliseconds()-event_ts < 419)){
*event_ts_ptr = new_ts;
*last_event_ptr = e->type;
break;
}
*event_ts_ptr = new_ts;
*last_event_ptr = e->type;
}
return 0;
} else {
return 1;
}
}
Bool xerror = False;
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while(isspace((unsigned char)*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator character
end[1] = '\0';
return str;
}
int check_caret()
{
int caretint;
char * fpname;
fpname = malloc(sizeof(char)*20);
strcpy(fpname,"/tmp/kinto/caret");
if( access( fpname, F_OK ) != -1 ) {
char *buffer = NULL;
size_t size = 0;
FILE *fp = fopen(fpname, "r");
fseek(fp, 0, SEEK_END);
size = ftell(fp);
rewind(fp);
buffer = malloc((size + 1) * sizeof(*buffer));
fread(buffer, size, 1, fp);
buffer[size] = '\0';
trimwhitespace(buffer);
caretint = atoi(buffer);
if(caretint == 1){
// printf("caret: %s\n", buffer);
return 1;
}
// printf("found nothing\n");
return 0;
}
else{
printf("file %s does not exist\n",fpname);
return 0;
}
}
int in_int(int a[],int size,int item)
{
int i,pos=-1;
@@ -173,10 +263,10 @@ int main(void){
FILE *fp;
char buffer[10240];
struct json_object *parsed_json, *config, *config_obj,
*config_obj_name, *config_obj_run, *config_obj_de,
*config_obj_appnames, *appnames_obj, *init, *de,
*de_obj, *de_obj_id, *de_obj_active, *de_obj_run,
*de_obj_runterm,*de_obj_rungui;
*config_obj_name, *config_obj_run, *config_obj_run_oninput,
*config_obj_run_offinput, *config_obj_de, *config_obj_appnames,
*appnames_obj, *init, *de, *de_obj, *de_obj_id, *de_obj_active,
*de_obj_run, *de_obj_runterm,*de_obj_rungui;
int arraylen;
int appnames_len, init_len, de_len, config_de_len;
@@ -201,6 +291,8 @@ int main(void){
const char *name_array[arraylen];
const char *run_array[arraylen];
const char *run_oninput_array[arraylen];
const char *run_offinput_array[arraylen];
int init_array[init_len];
int de_id_array[de_len];
@@ -249,10 +341,16 @@ int main(void){
for (i = 0; i < arraylen; i++) {
config_obj = json_object_array_get_idx(config, i);
config_obj_name = json_object_object_get(config_obj, "name");
config_obj_run = json_object_object_get(config_obj, "run");
config_obj_run_oninput = json_object_object_get(config_obj, "run_onInput");
config_obj_run_offinput = json_object_object_get(config_obj, "run_offInput");
name_array[i] = json_object_get_string(config_obj_name);
run_array[i] = json_object_get_string(config_obj_run);
run_oninput_array[i] = json_object_get_string(config_obj_run_oninput);
run_offinput_array[i] = json_object_get_string(config_obj_run_offinput);
// printf("%s\n%s\n", json_object_get_string(config_obj_name), json_object_get_string(config_obj_run));
config_obj_appnames = json_object_object_get(config_obj, "appnames");
@@ -310,10 +408,16 @@ int main(void){
XSelectInput(d, DefaultRootWindow(d), SubstructureNotifyMask);
XSetErrorHandler(handle_error);
char * run_normal;
char * run_onInput;
char * run_offInput;
char * prior_app;
char * current_app;
char * prior_category;
char * current_category;
run_onInput = malloc(sizeof(char)*400);
run_offInput = malloc(sizeof(char)*400);
run_normal = malloc(sizeof(char)*400);
prior_app = malloc(sizeof(char)*100);
current_app = malloc(sizeof(char)*100);
prior_category = malloc(sizeof(char)*100);
@@ -335,10 +439,12 @@ int main(void){
printf("First window name: %s \n",str_window_class(d, w,prior_app));
int breakouter;
int last_event=0;
Bool ran_onInput = 0;
long long int event_ts = timeInMilliseconds();
for (;;)
{
strcpy(current_app,str_window_class(d, w,prior_app));
int category_idx;
// printf("current: %s\n",current_app);
@@ -379,6 +485,11 @@ int main(void){
printf("%s: %s\n",current_category,current_app);
// printf("run: %s\n",run_array[category_idx]);
system(run_array[category_idx]);
strcpy(run_normal,run_array[category_idx]);
ran_onInput = 0;
strcpy(run_onInput,run_oninput_array[category_idx]);
strcpy(run_offInput,run_offinput_array[category_idx]);
system(run_offInput);
for(r = 0; r < config_de_max; r++){
if(config_de_array[category_idx][r] != -1){
int de_id_idx = in_int(de_id_array, de_len, config_de_array[category_idx][r]);
@@ -403,8 +514,38 @@ int main(void){
strcpy(prior_app,current_app);
strcpy(prior_category,current_category);
// printf("run_onInput: %ld\n",strlen(run_onInput));
XEvent e;
if(strlen(run_onInput) > 0){
while(XNextEventTimeout(d, &e, .5, event_ts, last_event, &event_ts, &last_event)){
if(check_caret() && ran_onInput == 0){
// printf("run_onInput: %s\n",run_onInput);
system(run_onInput);
ran_onInput = 1;
}
else if(!check_caret() && ran_onInput == 1){
// printf("run_offInput: %s\n",run_offInput);
system(run_offInput);
ran_onInput = 0;
}
}
}
else{
while (1) {
XNextEvent(d, &e);
// Make sure window dragging or resizing is not occuring
if(!(e.type == 22 && (e.type == last_event) && timeInMilliseconds()-event_ts < 300)){
// printf("%d == %d\n",e.type, last_event);
// printf("Timestamp: %lld\n",timeInMilliseconds()-event_ts);
event_ts = timeInMilliseconds();
last_event = e.type;
break;
}
event_ts = timeInMilliseconds();
last_event = e.type;
}
}
w = get_focus_window(d);
w = get_top_window(d, w);
w = get_named_window(d, w);

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env python3
import json, time, os
import json, time, os, sys
from shutil import copyfile
from subprocess import PIPE, Popen
from prekinto import *
@@ -15,6 +15,54 @@ def cmdline(command):
)
return process.communicate()[0]
def requirements():
print(bcolors.CYELLOW + "You need to install some packages, " +run_pkg+ ", for Kinto to fully remap browsers during input focus.\n" + bcolors.ENDC)
print("sudo apt-get install -y " + run_pkg + "\n")
run_install = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require sudo privileges.)\n" + bcolors.ENDC)
if(run_install):
os.system("sudo apt-get install -y " + run_pkg)
print("\n")
def install_ibus():
print(bcolors.CYELLOW + "You need to set IBus as the default Input Method for full word-wise support and re-run this installer.\n" + bcolors.ENDC)
print("im-config -n ibus\n")
run_install = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require logoff and logon.)\n" + bcolors.ENDC)
if(run_install):
os.system("im-config -n ibus")
print("\n")
input("IBus has been set as the default Input Method.\nPress any key to exit and re-run after logoff & logon...")
sys.exit()
check_xbind = symbols_gui_line = cmdline("which xbindkeys").strip()
check_xdotool = symbols_gui_line = cmdline("which xdotool").strip()
runpkg = 0
run_pkg = ""
if len(check_xbind) > 0 and len(check_xdotool) > 0:
print("Xbindkeys, and xdotool requirement is installed.")
if len(check_xbind) == 0:
run_pkg = "xbindkeys"
runpkg = 1
if len(check_xdotool) == 0:
run_pkg += " xdotool"
runpkg = 1
if runpkg != 0:
requirements()
if os.path.exists(homedir + '/.config/ibus/bus') and cmdline("ls ~/.config/ibus/bus -1rt") == "":
install_ibus()
try:
f = open("defaults.json")
except IOError:
print("defaults.json file is missing. Will exit.\n")
exit()
f.close()
try:
f = open("defaults.json")
except IOError:
@@ -90,12 +138,14 @@ if 'hack' in keyboardconfigs[defaultkb-1]:
os.system(keyboardconfigs[defaultkb-1]['hack'])
# Setup the selected keyboards config
os.system("cp -rf ./.xkb ~/.xkb")
os.system("cp -TRv ./.xkb ~/.xkb/")
if os.path.isdir(homedir + "/.xkb/keymap") == False:
os.mkdir(homedir + "/.xkb/keymap")
time.sleep(0.5)
os.system('setxkbmap -option')
os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui')
os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui.nw')
os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui.chrome')
os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.term')
time.sleep(0.5)
@@ -107,6 +157,11 @@ cmdline('sed -i '' -e "' + symbols_gui_line + 's/\\"/' + keyboardconfigs[default
cmdline('sed -i '' -e "' + types_gui_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui')
cmdline('sed -i '' -e "' + symbols_term_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_term'] + '\\"/2" ~/.xkb/keymap/kbd.mac.term')
cmdline('sed -i '' -e "' + symbols_gui_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'].replace("+mac_gui(mac_levelssym)","") + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.nw')
cmdline('sed -i '' -e "' + symbols_gui_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'].replace("+mac_gui(mac_levelssym)","+mac_gui(mac_chrome)") + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.chrome')
cmdline('sed -i '' -e "' + types_gui_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.nw')
cmdline('sed -i '' -e "' + types_gui_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.chrome')
user_file = homedir + '/.config/kinto/user_config.json'
with open(user_file, 'r') as f:
@@ -152,9 +207,15 @@ if len(defaultde) != 0:
user_config['config'][0]['de'] = tweaks_selected
# term
user_config['config'][1]['de'] = tweaks_selected
# firefox
user_config['config'][2]['de'] = tweaks_selected
# chrome
user_config['config'][3]['de'] = tweaks_selected
user_config['config'][0]['run'] = keyboardconfigs[defaultkb-1]['gui']
user_config['config'][1]['run'] = keyboardconfigs[defaultkb-1]['term']
user_config['config'][2]['run'] = keyboardconfigs[defaultkb-1]['gui']
user_config['config'][3]['run'] = keyboardconfigs[defaultkb-1]['gui'].replace("kbd.mac.gui","kbd.mac.gui.chrome")
os.remove(user_file)
with open(user_file, 'w') as f:

7
system-config/.chrome-nw Normal file
View File

@@ -0,0 +1,7 @@
"xdotool key --delay 0 --clearmodifiers Alt+Left"
Control + Left + Release
#Home + release
"xdotool key --delay 0 --clearmodifiers Alt+Right"
Control + Right + Release
#End + release

5
system-config/.chrome-ww Normal file
View File

@@ -0,0 +1,5 @@
"xdotool key --delay 0 --clearmodifiers Home"
Control + Left + Release
"xdotool key --delay 0 --clearmodifiers End"
Control + Right + Release

View File

@@ -0,0 +1,7 @@
#"xte 'keydown Control_L' 'key bracketleft' 'keyup Control_L'"
"xdotool key --delay 0 --clearmodifiers Control_L+bracketleft"
Home + Release
#"xte 'keydown Control_R' 'key bracketright' 'keyup Control_R'"
"xdotool key --delay 0 --clearmodifiers Control_L+bracketright"
End + Release

10
system-config/caret_status.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
mkdir -p /tmp/kinto
IBUSADD=$(cat ~/.config/ibus/bus/`ls ~/.config/ibus/bus -1rt | tail -n1` | awk -F'IBUS_ADDRESS=' '{print $2}' | xargs)
dbus-monitor --address $IBUSADD "path='/org/freedesktop/IBus/Panel',interface='org.freedesktop.IBus.Panel',member='FocusOut'" 2> /dev/null | grep --line-buffered -o -P '(?<=object path \"/org/freedesktop/IBus/InputContext_).*(?=[\"])' |
while read ln
do
printf '%s\n' "$ln" > /tmp/kinto/caret
done

5
system-config/cleanup.sh Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/bash
setxkbmap -option
killall xbindkeys > /dev/null 2>&1
rm /tmp/kinto/caret

View File

@@ -7,7 +7,8 @@ Type=simple
Restart=always
RestartSec=1
WorkingDirectory=/home/{username}/.config/kinto
ExecStart=
ExecStart=/bin/bash -c "/home/{username}/.config/kinto/xactive.sh carrots"
ExecStop=/bin/bash /home/{username}/.config/kinto/cleanup.sh
[Install]
WantedBy=default.target

View File

@@ -1,3 +1,4 @@
#!/bin/bash
./caret_status.sh &
./kintox11

View File

@@ -1,14 +1,42 @@
{"config":[{
"name":"gui",
"run":"",
"run_onInput":"",
"run_offInput": "killall xbindkeys > /dev/null 2>&1",
"symbols":"",
"types":"",
"de":[],
"appnames":[ "" ]
},
{
"name":"term",
"run":"",
"run_onInput":"",
"run_offInput": "killall xbindkeys > /dev/null 2>&1",
"symbols":"",
"types":"",
"de":[],
"appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ]
},
{
"name": "firefox",
"run": "",
"run_onInput": "killall xbindkeys > /dev/null 2>&1",
"run_offInput": "killall xbindkeys > /dev/null 2>&1;xbindkeys -f $HOME/.config/kinto/.firefox-nw",
"symbols": "",
"types": "",
"de": [],
"appnames": [ "Firefox" ]
},
{
"name": "chrome",
"run": "",
"run_onInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY",
"run_offInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui.chrome $DISPLAY",
"symbols": "",
"types": "",
"de": [],
"appnames": [ "Chromium","Chromium-browser","Google-chrome" ]
}],
"init": [],
"detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"],