From dfd00323c95e83b0c899218530d4cfb98ea7d79b Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Tue, 28 Jan 2020 17:09:55 -0600 Subject: [PATCH 01/29] - Added source and binary for kintox11 --- kintox11/binary/appnames.csv | 8 + kintox11/binary/kintox11_ubuntu19-10 | Bin 0 -> 18072 bytes kintox11/src/kintox11.c | 249 +++++++++++++++++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 kintox11/binary/appnames.csv create mode 100755 kintox11/binary/kintox11_ubuntu19-10 create mode 100644 kintox11/src/kintox11.c diff --git a/kintox11/binary/appnames.csv b/kintox11/binary/appnames.csv new file mode 100644 index 0000000..f66a63c --- /dev/null +++ b/kintox11/binary/appnames.csv @@ -0,0 +1,8 @@ +Gnome-terminal +konsole +terminator +sakura +guake +tilda +xterm +eterm \ No newline at end of file diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 new file mode 100755 index 0000000000000000000000000000000000000000..c8daa567e7373753c9f11c2171d1b7fe75e29ddc GIT binary patch literal 18072 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 +#include +#include +#include +#include +#include // `apt-get install libx11-dev` +#include // `apt-get install libxmu-dev` +#define LSIZ 128 // buffer +#define RSIZ 50 // array size + +Bool xerror = False; + +int strcicmp(char const *a, char const *b) +{ + for (;; a++, b++) { + int d = tolower((unsigned char)*a) - tolower((unsigned char)*b); + if (d != 0 || !*a) + return d; + } +} + +Display* open_display(){ + Display* d = XOpenDisplay(NULL); + if(d == NULL){ + printf("fail to open X server display...\n"); + exit(1); + } + return d; +} + +int handle_error(Display* display, XErrorEvent* error){ + printf("ERROR: X11 error\n"); + xerror = True; + return 1; +} + +Window get_focus_window(Display* d){ + Window w; + int revert_to; + XGetInputFocus(d, &w, &revert_to); // see man + if(xerror){ + printf("Error getting focused window\n"); + exit(1); + }else if(w == None){ + printf("no focus window\n"); + exit(1); + } + + return w; +} + +// get the top window. +// a top window have the following specifications. +// * the start window is contained the descendent windows. +// * the parent window is the root window. +Window get_top_window(Display* d, Window start){ + Window w = start; + Window parent = start; + Window root = None; + Window *children; + unsigned int nchildren; + Status s; + + while (parent != root) { + w = parent; + s = XQueryTree(d, w, &root, &parent, &children, &nchildren); // see man + + if (s) + XFree(children); + + if(xerror){ + printf("failed to get top window\n"); + exit(1); + } + } + + return w; +} + +// search a named window (that has a WM_STATE prop) +// on the descendent windows of the argment Window. +Window get_named_window(Display* d, Window start){ + Window w; + w = XmuClientWindow(d, start); // see man + if(w == start) + return w; +} + +// (XFetchName cannot get a name with multi-byte chars) +void print_window_name(Display* d, Window w){ + XTextProperty prop; + Status s; + + s = XGetWMName(d, w, &prop); // see man + if(!xerror && s){ + int count = 0, result; + char **list = NULL; + result = XmbTextPropertyToTextList(d, &prop, &list, &count); // see man + if(result == Success){ + printf("\t%s\n", list[0]); + }else{ + // printf("ERROR: XmbTextPropertyToTextList\n"); + } + }else{ + // printf("ERROR: XGetWMName\n"); + } +} + +void print_window_class(Display* d, Window w){ + Status s; + XClassHint* class; + + class = XAllocClassHint(); // see man + if(xerror){ + // printf("ERROR: XAllocClassHint\n"); + } + + s = XGetClassHint(d, w, class); // see man + if(xerror || s){ + // printf("\tname: %s\n\tclass: %s\n", class->res_name, class->res_class); + printf("%s\n", class->res_class); + }else{ + printf("ERROR: XGetClassHint\n"); + } +} + +const char * str_window_class(Display* d, Window w){ + Status s; + XClassHint* class; + + class = XAllocClassHint(); // see man + if(xerror){ + // printf("ERROR: XAllocClassHint\n"); + } + + s = XGetClassHint(d, w, class); // see man + if(xerror || s){ + char * app_class; + app_class = malloc(sizeof(char)*100); + strcpy(app_class,class->res_class); + // printf("\tname: %s\n\tclass: %s\n", class->res_name, class->res_class); + return app_class; + }else{ + char * error_msg; + error_msg = malloc(sizeof(char)*50); + strcpy(error_msg, "ERROR: XGetClassHint"); + return error_msg; + } +} + +void print_window_info(Display* d, Window w){ + print_window_class(d, w); +} + +int main(void){ + + char line[RSIZ][LSIZ]; + FILE *fptr = NULL; + int i = 0; + int tot = 0; + + fptr = fopen("./appnames.csv", "r"); + while(fgets(line[i], LSIZ, fptr)) + { + line[i][strlen(line[i])] = '\0'; + if( line[i][strlen(line[i])-1] == '\n' ) + line[i][strlen(line[i])-1] = 0; + i++; + } + tot = i; + + // printf("\n The content of the file %s are : \n","./appnames.csv"); + // for(i = 0; i < tot; ++i) + // { + // printf("%s\n", line[i]); + // } + // printf("\n"); + + Display* d; + Window w; + + // for XmbTextPropertyToTextList + setlocale(LC_ALL, ""); // see man locale + + d = open_display(); + XSelectInput(d, DefaultRootWindow(d), SubstructureNotifyMask); + XSetErrorHandler(handle_error); + + char * prior_app; + prior_app = malloc(sizeof(char)*100); + strcpy(prior_app,"none"); + + int remap_bool = 2; + + // get active window + w = get_focus_window(d); + w = get_top_window(d, w); + w = get_named_window(d, w); + + for (;;) + { + + if(strcmp(str_window_class(d, w),prior_app)){ + int len = sizeof(line)/sizeof(line[0]); + // printf("length: %d\n",len); + int i; + for(i = 0; i < len; ++i){ + // printf("i: %d\n",i); + // printf(strcicmp(line[i], str_window_class(d, w))); + if((strcicmp(line[i], str_window_class(d, w)) == 0 && (remap_bool == 1 || remap_bool == 2))) { + // printf("Gotcha!\n"); + // printf("%s - prior app %s\n",str_window_class(d, w),prior_app); + printf("%s\n","term"); + remap_bool = 0; + break; + } + else if((strcicmp(line[i], str_window_class(d, w)) == 0 && remap_bool == 0)){ + break; + } + else if (i == 49 && (remap_bool == 0 || remap_bool == 2)){ + printf("%s\n","gui"); + // printf("no match - %s - prior app %s\n",str_window_class(d, w),prior_app); + remap_bool = 1; + break; + } + } + } + strcpy(prior_app,str_window_class(d, w)); + + XEvent e; + XNextEvent(d, &e); + // get active window + w = get_focus_window(d); + w = get_top_window(d, w); + w = get_named_window(d, w); + } +} \ No newline at end of file From d26e6ab3eb13418f8f57f2687ec8215e37d4c4b8 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Tue, 28 Jan 2020 17:47:52 -0600 Subject: [PATCH 02/29] - Flushing output of kintox11 --- kintox11/binary/kintox11_ubuntu19-10 | Bin 18072 -> 18160 bytes kintox11/src/kintox11.c | 2 ++ 2 files changed, 2 insertions(+) diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 index c8daa567e7373753c9f11c2171d1b7fe75e29ddc..88f2955d6e2edf2019ee58201a37903ea5d07972 100755 GIT binary patch delta 3601 zcmZ`*3vg4%72TCABgr@uXo?aQJHjS z-k#la@7}%l?!Mja?w~^*w9`JWF_TCoAOrE%bd~Hgbf(MQ&aQJF!`=+JvllFMp>uGG z+#9U=U#!&1eF2`QoF$=XB^0eh{0&+||LY;8)(;-P3Q@#93oZCXO zi8&z6M)Wd}-O!cF@dr_AMrnZ}RfHrAe@o@)>+y4`E}FV><(kMd%{%oAQ=bVp{W=nc z1^RYggR1h!YSzZcSPj?oeC=N(yM#otR~wk@ILiPQbpcc_0#=#7prl;oi4`6*tfRSb z%)k{pWgV$j!_Z-mWl=3=xM<)q>@{+K41xx}HE@t?OwVv7u{y{zaxf3s$|QCS%tv-J zvO*GTfEHxmMs{fun+6AvJ&$a25<3>YKsG%sJ!3->Yle(84yusdp2TKCHL`1v?M`B| z;Av!cBfCF|<=|yxKScIO63fFskbQvc=_ED>9wK|uml^k_uh#A~7wSKA6LLc={ybh{ zZl_tzc1+8S%getL#m<|i{Cg-Vb;mDTo}%U0?7-b`a?}x`h}s_Mw>;91KxJlrgUv{Y z(2?;fuCmZkorlXJW<8FYw>q)A5gS5>ZXE;va5zhd>D;W{)*Cj67fg<=Y_(1*i2C)C z{Iks;B;pGqzt4;WO9ShTK(_I*c76d!s$Y+`YY@tc0CluM3X3rr*xOVWUaC; z!qB28g;;37^e!>I+Z*jq%!FmukbMv}g=lD4Xl)rL5gX3sPD2Auc+Xmr?qJR94@9wF zr-d8V+1}m~LeNL1_7TRHcoAhiYzHSkV0L1mAq+vXa+ZlB(46I@tBp|MpO+#AzPfRAk68GfnT z*V@uYA~|U5v=GDiPoY;enC>I!4@um1WsXv?4wjSM6njKB%5FknSn7-VW|%a{k1gy&5Thw@06x(`D+p017{cY)A zi6S%J-><2D0p&a&8TWUMv$UmgWS+WN^n|&yD_ow4z6n(ld=K00~d^EyQn`g z0c~I22ksoZ=0EpA$SL||70!+!D>g{@sn%m`B45NWTP5F{pNQroDQLduwrZa34>W(g zNH+fmocAiAls z743~O{fP!>&vno~R?qnr%YC%XjLMg<;s#x5a%^M4N`G?j$$1^sZ#f7FK2ab2B-l_N zy&YTnV6kWMan0Bc4R8L;M!839%V} zkFAJ2c5N;$1~^4Mz2{!prH(lm(XVJXFNO%RmO9zSKc4!0J+ureF-bRGLpe zfTN`z%kWHD14ER`QWz<9I4kiCV1?aPtTf_3&5C*j4uaoZqwyMGlRKYYfnDxZGy&A} zDLoWF>v2%NKpiL#lWHxFz5-5PmexSLun5se8X2afkxC;x?wbvVd^W9#48UO@$E)wC zBnw1~uZ3>BM3&J(2$pdWD6?rfl7O{koMw0?w3j_gJAqE+>U)((m^#>r4Glgfh;pT? zd<8ZrJ~8Y8nNgQ;w#3^o&C929{Ag}vC9+YHW?@phrmly|a)ydwLbb6(i)`e+y+_GrVcSo`K9J_3>l*mBzxcbbS+<;85O~;A}g3~!V zNvg}GdNHewD^cIf_ErGioIZj6Rua7kXQy-g>&%pfC;EV7VYE5~w1VS%P|8Aj)+P(o zkOm|R7p3|Rt9gnKSf*K^Y~&S+B@0}y;AkyIJ#Ll49?$}H*@@+f2dip_&rGSRQ_ z0<*?9pp;otUvY|%ESIDkl(Bo2)JZ=ks%P4UU6 z*qX2K1@VpkCTd|%=Rjc2y!zT%%gWqk?rHJQX7s49>v*i{fRT&g3~SPQKI4?Yz%rV>Vc!;QaBpiqTi$Zk8m-_!IQNX z*k5ag4YgkTfJF{NMfL2J6hE!CSk$FgaT<)&dJO8R*bTl}cMa-$e-M0i72vA#LU)}R zn(;eQ=N&y5hw+)piXKMlwm@a50J=ksbOVfpDhx;bvg~KzpIu?JDMx8Gg&8&Z{{<%4 BwBG;# delta 3532 zcmZ`+3s98T6~1?0*@dO-0?WS(;_gD3B8m%$B8`MyVD)D-sEsHyHbZUE#F=&)Qb=tp z#S9^FMH1jlrnZx|I;oHF20X@c-L6pmz?C!`zYg44R%$~_dZcJL<1A=+i}j@rDuNGPb%=B0RzjW$|xXt~8pJ8YHwd3x0* z(XOQykBb#BZ&)4pezlFR*(CnrgyVrSPRs4BG-QuSjG16yQfn~*juv94ki*w_2n`ps zJq6nx!e&fN3dKmTT@zU#PirLggc^Jzm-aZGfy_COiP(^k{}eU(Rr5 zm8G#38Uni)?D90$Mkl~df|b))J6!>L8EktRn?XgH63xqWW<8$9I_Y7sYryVEW3#Cj z>`t(|)7Tt(1?*9<`_kAv`a9V7!Tvmr&8IAv$ULrFyU{z)q*J1@sN4#OF%v({VKhgJCB!AGI#!hQc$dCVVm4vZxT&8_F=bE9;~-PNFKhYD9KJmQQolLqfp+8 zye*$9O6-(87(J7HjAb8-$EK34)R!0aCSfVZqH}V8?;PvN$5^eIa8O0>=aoAfM3ci} z%34S{o|Tp7${9n9!fZAJx`THW<)qk*$v+4`gV7YGpnAC`)C08J6XZm{@O*ud4W_Z^ z+5XXlJ+wnA;V;rl zlCNUZZAH11g`O91SduM}hKFZPiS=$nM&sO=UgDO0z2ARG0 z_NNptkn%TUb>!G<^58%j-0G?N9_^p!bvGg|@Bx*dN`7mOep@i#bY6vMOk^`Q;DYia z2lljnM8tYUHm$*~^fMOO*b;j$($*6DII*EaXMleO9t8dbvpx;{ z8}K4<55l+LDxU>@9{4g=su}n;uoGB@Ex!x64>)aNv^rSI&rnyekPp*Pu!J)j4@$nd ztFVGMqXf{{i(dK*?u(FMYP3o3+yi zRUI73s+N$fNVUf-u@rSxOD5Jpd#az}PY_=swd~i^ZFCQ!VZsN1u?z-Ziw4K{g)6Kv zMjlqGd_Kc^ERlT1B5F2_eMi-L5d6rJZ~Kf-1w;Fqsuf`cYb3JQxJa%E$926#7;kr&novCl=hqxSbuWSPVRYTcmLU!ntG zIz*d}FY{W&nIw00u8F-syjH4u39=iJV`^$K{2c)==Cd(h+_=aUC}KQ z^EAt?8nAmp+j0WZ|N1y=*LxXzD5Upt;~0r?U+`$el+Fj})mpq`&Z+51UL;-2`Hy-`Rl2WIoo5q=>pJ;F@WDww zac#v<&Af(2!VTO@?}S5c Date: Tue, 28 Jan 2020 19:46:58 -0600 Subject: [PATCH 03/29] - Updated keyswap service and xactive to use kintox11 binary over xprop --- keyswap_service.sh | 2 + system-config/xactive.sh | 82 ++++++++++++---------------------------- 2 files changed, 27 insertions(+), 57 deletions(-) diff --git a/keyswap_service.sh b/keyswap_service.sh index 7453fef..878492d 100755 --- a/keyswap_service.sh +++ b/keyswap_service.sh @@ -16,6 +16,8 @@ if [[ "$swapbehavior" == "1" ]]; then cp ./system-config/keyswap.sh ~/.config/autostart/keyswap.sh cp ./system-config/xactive.sh ~/.config/xactive.sh cp ./system-config/keyswap_toggle.sh ~/.config/keyswap_toggle.sh + cp ./kintox11/binary/kintox11_ubuntu19-10 ~/.config/kintox11 + cp ./kintox11/binary/appnames.csv ~/.config/appnames.csv 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 enable keyswap diff --git a/system-config/xactive.sh b/system-config/xactive.sh index f64f0cd..f125004 100755 --- a/system-config/xactive.sh +++ b/system-config/xactive.sh @@ -1,9 +1,4 @@ #!/bin/bash -# How to add more terminal editors -# run this command while using the terminal -# and add the name to class_name -# xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) WM_CLASS -class_name='konsole\|Gnome-terminal\|terminator\|sakura\|guake\|tilda\|xterm\|eterm' systemtype=$1 internalid=$2 @@ -21,73 +16,46 @@ if [[ "$systemtype" == "windows" || "$systemtype" == "mac" ]]; then # mac_only is for apple keyboards without an apple hid driver elif [[ "$systemtype" == "mac_only" ]]; then swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" - check_gt="setxkbmap -query | grep -v 'alt_super_win' 1>/dev/null" - check_tg="setxkbmap -query | grep -q 'alt_super_win'" swapcmd_term="setxkbmap -option" # Chromebook options elif [[ "$swapbehavior" == "both_mac" ]]; then swapcmd_gui="setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" swapcmd_term="setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" - check_gt="setxkbmap -query | grep -v 'swap_alt_win' 1>/dev/null" - check_tg="setxkbmap -query | grep -q 'swap_alt_win'" elif [[ "$swapbehavior" == "both_win" ]]; then swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win" fallbackcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - check_gt="setxkbmap -query | grep -q 'ctrl_alt_win'" - check_tg="setxkbmap -query | grep -v 'ctrl_alt_win' 1>/dev/null" elif [[ "$swapbehavior" == "none" ]]; then swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - check_gt="setxkbmap -query | grep -v 'swap_alt_win' 1>/dev/null" - check_tg="setxkbmap -query | grep -q 'swap_alt_win'" fi -# echo "$systemtype $swapbehavior" -# echo "$swapcmd_gui" - eval "$swapcmd_gui" -# regex for extracting hex id's -grep_id='0[xX][a-zA-Z0-9]\+' +# If running gnome this will disable the overlay-key mapping +gsettings set org.gnome.mutter overlay-key '' -#Storing timestamp and will use timediff to prevent xprop duplicates -timestp=$(date +%s) - -xprop -spy -root _NET_ACTIVE_WINDOW | grep --line-buffered -o $grep_id | +./kintox11 | while read -r id; do - class="`xprop -id $id WM_CLASS | grep $class_name`" - newtime=$(date +%s) - timediff=$((newtime-timestp)) - if [ $timediff -gt 0 ]; then - if [ -n "$class" ]; then - # Set keymap for terminal, Alt is Super, Ctrl is Ctrl, Super is Alt - eval "$check_gt" - echo $? - if [ $? -eq 0 ]; then - echo "internal gui to term" - eval "$swapcmd_term" - - # Quick hack, will want to refactor later - # just resets required checks, for chromebooks that - # use usb windows keyboards - if [[ "$swapbehavior" == "both_win" ]]; then - check_gt="setxkbmap -query | grep -q 'ctrl_alt_win'" - check_tg="setxkbmap -query | grep -v 'ctrl_alt_win' 1>/dev/null" - fi - fi - else - # Set keymap for gui, Alt is Ctrl,Super is Alt, Ctrl is Super - eval "$check_tg" - echo $? - if [ $? -eq 0 ]; then - echo "internal term to gui" - eval "$swapcmd_gui" - if [ $? -eq 0 ] && [[ "$swapbehavior" == "both_win" ]]; then - eval "$fallbackcmd_gui" - check_gt="setxkbmap -query | grep -v 'swap_alt_win' 1>/dev/null" - check_tg="setxkbmap -query | grep -q 'swap_alt_win'" - fi - fi - fi - timestp=$(date +%s) + if [[ "$id" == "term" ]]; then + echo "internal gui to term" + eval "$swapcmd_term" + + # Gnome - Set Activities Overview + gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" fi + + if [[ "$id" == "gui" ]]; then + echo "internal term to gui" + eval "$swapcmd_gui" + + # Gnome - Set Activities Overview + gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" + + # # Fallback code + # if [ $? -eq 0 ] && [[ "$swapbehavior" == "both_win" ]]; then + # eval "$fallbackcmd_gui" + # check_gt="setxkbmap -query | grep -v 'swap_alt_win' 1>/dev/null" + # check_tg="setxkbmap -query | grep -q 'swap_alt_win'" + # fi + fi + done \ No newline at end of file From b167c0a90ff3f7499114ea8840283dca411dfaae Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Tue, 28 Jan 2020 22:14:26 -0600 Subject: [PATCH 04/29] - Added KDE Plasma 5 commands to unbind Meta key --- system-config/xactive.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/system-config/xactive.sh b/system-config/xactive.sh index f125004..8f4a6f5 100755 --- a/system-config/xactive.sh +++ b/system-config/xactive.sh @@ -32,6 +32,8 @@ eval "$swapcmd_gui" # If running gnome this will disable the overlay-key mapping gsettings set org.gnome.mutter overlay-key '' +kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "" +qdbus org.kde.KWin /KWin reconfigure ./kintox11 | while read -r id; do @@ -41,6 +43,10 @@ while read -r id; do # Gnome - Set Activities Overview gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" + # ~/.config/kglobalshortcutsrc + # activate widget 78=Super+Space,none,Activate Application Launcher Widget + # kquitapp kglobalaccel && sleep 2s && kglobalaccel5& + # kquitapp5 plasmashell && kstart5 plasmashell fi if [[ "$id" == "gui" ]]; then @@ -49,6 +55,9 @@ while read -r id; do # Gnome - Set Activities Overview gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" + # ~/.config/kglobalshortcutsrc + # activate widget 78=Ctrl+Space,none,Activate Application Launcher Widget + # kquitapp kglobalaccel && sleep 2s && kglobalaccel & # # Fallback code # if [ $? -eq 0 ] && [[ "$swapbehavior" == "both_win" ]]; then From 69697ce905234a0974bb3758226a839ae047ce83 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Wed, 29 Jan 2020 21:29:59 -0600 Subject: [PATCH 05/29] - Improved stability of kintox11, removed unneeded functions --- kintox11/binary/kintox11_ubuntu19-10 | Bin 18160 -> 17720 bytes kintox11/src/kintox11.c | 117 ++++----------------------- 2 files changed, 14 insertions(+), 103 deletions(-) diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 index 88f2955d6e2edf2019ee58201a37903ea5d07972..4e6ae5af4d682494e2b025f6d6e20093d6c60030 100755 GIT binary patch delta 4082 zcmaJ^3v83u6~6bko!E{|Z0GUYF>UN*9cdtO5?E-Oy4Z;WKWl)|F0|6tigw{O=m?Z- zVS)imGT{WTgj1w!Vp3SeW8Ij_LM1khQA#0!tyMs3huUnV)i#XCAUw9FA@tw5_rEta zrsGP!-#w3e&iT(h_uAhR*BG(NTgNxJv|=m2pBffagD(yYv5E_rqLs)R044h8G6WrxUKvQfWP$$WVPtFi00EAc2VZd;xyAo}ogY z#SD(jcG#U+3fD3Vq139uMr&K9f+u5DdvNgvT1jNcoek2FFY^6TAeoX1&97C0rMJBvsQ+=YYID0fjnh$qS z>NnJR?}`|N1;Go)?5a=1!`Ygcn~9VO{%u#CW<#C#&%idj3ME+%AM-5R%9J@)SdgW{ zh~43AOX1pKbC&9J$O(wsQ>0EfgmW6R9M0YpZZ`Z4xtoxCFoo*|r$cp$y~XVvg}tb! zIULU16#Ij44!La(2RIy#{yoK`=3TBLn>|Fx4gI04Q2%sS4c&snL^&bZg)u^IWw>rqc^9~t!ea&Y4ox*`q?zP=?i)q z|KbH-FgV?iMu*GbjN1>*Ii4leSQT2rc^nsCON3v=iq!KwsD5iFk~KKc5|%0kHDep{ zv~J7Q8945IbAwI4m|eJ)tuwmu$Xc1Whlx+Y_PpShlc;p&BrAm`bgi|IM6~$k3tGH& zNQ*ZOCYw>L#c^hL6aE$qp%oOqtHlSBHE1;6Fw$)qDP?|JGuk(gkPXw1H#3jJ#=J4^ zwfh@Z#4#=YKARV0A|$Vvv8RLZs(0a(-{7@?aUDQN{%Qhr@59P(Z$qiCMtSKr9Pm8| z?Y<(Vk`13yCdOgHSCHR}CktB^l3adU*N@_WBtM^k83i$K1~SmvRdkemZ5)%pLmC=~ z?FFGNAMwaKUH@WH>@MMuFsRM|ql~Yc$5Ix5OY83BD)G}={IAIzG}ifMcE=N#)qze2 zYFDA#flf1ySOAv;D7c^1>l3ijU#u*@4GF(LR)gnV@`=xI1v`nbfF<;YX{-tclIKxy z`4C#YpTRY-!v7WJ<8jEETDIi?7Hjgzn6$^19_p$I%h~8fYz9_u(We^| z;qGEWqD$t--;XxUkN+q7&1ih0NlTP%LiSUQ58uIhv?dq*w|~(Chn4=m;y%-^zzXd#>sF9>n2MU4I*K1aTN~>J44*K(yS{^;?MFL-b-&evSAD;xOVf zh^ueudK=;;#9qV+{DdQjYcOFG6cz@H=uTJ{R4rpybv*)!;GDb)6w4OC!4CY{;NxI1 zT?m$z4kW;(50IK1YnY<=q((cPQ=Io3jL`@e7$DOAT-0c6JJK%x4S) zOkT?J#*~+EfzS_x;f1pD;7)P>$!qX}$&iZ&9a#s5%R+S};^LB5_n=6Wyr{53c~b>y zxQkhn{1z(|l`jlNL=brNtz}|ih2Y9^T7jPO6-r4M4lDWK3ibA12zlxAGDJ2*HWRTD zMShZGBASSeNG~aDsZa=&JgD)lllg09B^oPhk%-Q5JGm zQ1J0-RW-A`D&50uN70RA%tWCozz$E4kBe1g)Pl|b~T$t_k;fiy;K2Z$#=Hu;;+{zi0vbVk~BG>}nnlCD*I68Kk;_%Wf?x2jiS5mgIh4(S6SGy{<0y42zI*(B9ila=r5U9~xPNo# zR;FF_val5rwkm~>J%Yb9xBs=8dG-ByTUE~yTc#S z{3IABDxykX@by5i4{>tL^d#!1L&AwAv$&DT#v= zJas>!5$LH4*_OJEP?y4)y4mg)K}oCtcYSE`zp-4Qrc8LUzT7U$4o`}%`nmMSaIQY& zzULn*xMLyrXu$9y@gOX2P+?`vYnT73yk*c8tG3JC87PCZv1+$GKjgn;EWw75TW-1% pQ7RXpCsqh84Hp&s;wR@;+h2dgaCgWAyXIEgo_)+93owO+{{y~m+av%0 literal 18160 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 ql~Tg-^ZZLhQ diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 84bb958..717708e 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -6,7 +6,7 @@ http://k-ui.jp/blog/2012/05/07/get-active-window-on-x-window-system/ */ // To compile -// gcc active_window.c -lX11 -lXmu +// gcc kintox11.c -lX11 -lXmu // // @@ -61,82 +61,8 @@ Window get_focus_window(Display* d){ return w; } -// get the top window. -// a top window have the following specifications. -// * the start window is contained the descendent windows. -// * the parent window is the root window. -Window get_top_window(Display* d, Window start){ - Window w = start; - Window parent = start; - Window root = None; - Window *children; - unsigned int nchildren; - Status s; - while (parent != root) { - w = parent; - s = XQueryTree(d, w, &root, &parent, &children, &nchildren); // see man - - if (s) - XFree(children); - - if(xerror){ - printf("failed to get top window\n"); - exit(1); - } - } - - return w; -} - -// search a named window (that has a WM_STATE prop) -// on the descendent windows of the argment Window. -Window get_named_window(Display* d, Window start){ - Window w; - w = XmuClientWindow(d, start); // see man - if(w == start) - return w; -} - -// (XFetchName cannot get a name with multi-byte chars) -void print_window_name(Display* d, Window w){ - XTextProperty prop; - Status s; - - s = XGetWMName(d, w, &prop); // see man - if(!xerror && s){ - int count = 0, result; - char **list = NULL; - result = XmbTextPropertyToTextList(d, &prop, &list, &count); // see man - if(result == Success){ - printf("\t%s\n", list[0]); - }else{ - // printf("ERROR: XmbTextPropertyToTextList\n"); - } - }else{ - // printf("ERROR: XGetWMName\n"); - } -} - -void print_window_class(Display* d, Window w){ - Status s; - XClassHint* class; - - class = XAllocClassHint(); // see man - if(xerror){ - // printf("ERROR: XAllocClassHint\n"); - } - - s = XGetClassHint(d, w, class); // see man - if(xerror || s){ - // printf("\tname: %s\n\tclass: %s\n", class->res_name, class->res_class); - printf("%s\n", class->res_class); - }else{ - printf("ERROR: XGetClassHint\n"); - } -} - -const char * str_window_class(Display* d, Window w){ +const char * str_window_class(Display* d, Window w, char *prior_app ){ Status s; XClassHint* class; @@ -153,17 +79,13 @@ const char * str_window_class(Display* d, Window w){ // printf("\tname: %s\n\tclass: %s\n", class->res_name, class->res_class); return app_class; }else{ - char * error_msg; - error_msg = malloc(sizeof(char)*50); - strcpy(error_msg, "ERROR: XGetClassHint"); - return error_msg; + // char * error_msg; + // error_msg = malloc(sizeof(char)*50); + // strcpy(error_msg, "ERROR: XGetClassHint"); + return prior_app; } } -void print_window_info(Display* d, Window w){ - print_window_class(d, w); -} - int main(void){ char line[RSIZ][LSIZ]; @@ -181,13 +103,6 @@ int main(void){ } tot = i; - // printf("\n The content of the file %s are : \n","./appnames.csv"); - // for(i = 0; i < tot; ++i) - // { - // printf("%s\n", line[i]); - // } - // printf("\n"); - Display* d; Window w; @@ -206,46 +121,42 @@ int main(void){ // get active window w = get_focus_window(d); - w = get_top_window(d, w); - w = get_named_window(d, w); for (;;) { - if(strcmp(str_window_class(d, w),prior_app)){ + if(strcmp(str_window_class(d, w,prior_app),prior_app)){ int len = sizeof(line)/sizeof(line[0]); // printf("length: %d\n",len); int i; for(i = 0; i < len; ++i){ // printf("i: %d\n",i); - // printf(strcicmp(line[i], str_window_class(d, w))); - if((strcicmp(line[i], str_window_class(d, w)) == 0 && (remap_bool == 1 || remap_bool == 2))) { + // printf(strcicmp(line[i], str_window_class(d, w, prior_app))); + if((strcicmp(line[i], str_window_class(d, w,prior_app)) == 0 && (remap_bool == 1 || remap_bool == 2))) { // printf("Gotcha!\n"); - // printf("%s - prior app %s\n",str_window_class(d, w),prior_app); + // printf("%s - prior app %s\n",str_window_class(d, w, prior_app),prior_app); printf("%s\n","term"); remap_bool = 0; fflush(stdout); break; } - else if((strcicmp(line[i], str_window_class(d, w)) == 0 && remap_bool == 0)){ + else if((strcicmp(line[i], str_window_class(d, w,prior_app)) == 0 && remap_bool == 0)){ break; } else if (i == 49 && (remap_bool == 0 || remap_bool == 2)){ printf("%s\n","gui"); - // printf("no match - %s - prior app %s\n",str_window_class(d, w),prior_app); + // printf("no match - %s - prior app %s\n",str_window_class(d, w, prior_app),prior_app); remap_bool = 1; fflush(stdout); break; } } } - strcpy(prior_app,str_window_class(d, w)); + strcpy(prior_app,str_window_class(d, w, prior_app)); XEvent e; XNextEvent(d, &e); - // get active window w = get_focus_window(d); - w = get_top_window(d, w); - w = get_named_window(d, w); + } } \ No newline at end of file From 962805c6f6afde10fede7908cc81ee72bd49b468 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Thu, 30 Jan 2020 17:02:07 -0600 Subject: [PATCH 06/29] - Added elementaryos terminal to app list --- kintox11/binary/appnames.csv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kintox11/binary/appnames.csv b/kintox11/binary/appnames.csv index f66a63c..bab2088 100644 --- a/kintox11/binary/appnames.csv +++ b/kintox11/binary/appnames.csv @@ -5,4 +5,5 @@ sakura guake tilda xterm -eterm \ No newline at end of file +eterm +io.elementary.terminal From 4a41a382892e69d378dd62625acfc86c225fe16d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Thu, 30 Jan 2020 23:18:48 -0600 Subject: [PATCH 07/29] - kintox11 updated to support json config files, added support for unlimited app types and keyboard configurations (no longer binary). --- kintox11/binary/kintox11_ubuntu19-10 | Bin 17720 -> 22208 bytes kintox11/src/kinto.json | 16 +++ kintox11/src/kintox11.c | 148 ++++++++++++++++++++------- 3 files changed, 128 insertions(+), 36 deletions(-) create mode 100644 kintox11/src/kinto.json diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 index 4e6ae5af4d682494e2b025f6d6e20093d6c60030..35050c9657a6e00fb5c05a27d7125698fe5c14d9 100755 GIT binary patch literal 22208 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 Pigw+oG?sV_JgoR{?n=h} diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json new file mode 100644 index 0000000..0188da6 --- /dev/null +++ b/kintox11/src/kinto.json @@ -0,0 +1,16 @@ +{"config":[{ + "name":"gui", + "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "appnames":[ "" ] + }, + { + "name":"term", + "run":"setxkbmap -option", + "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + }, + { + "name":"eosterm", + "run":"setxkbmap -option", + "appnames":[ "io.elementary.terminal" ] + }] +} \ No newline at end of file diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 717708e..9a44305 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -6,7 +6,7 @@ http://k-ui.jp/blog/2012/05/07/get-active-window-on-x-window-system/ */ // To compile -// gcc kintox11.c -lX11 -lXmu +// gcc kintox11.c -lX11 -lXmu -ljson-c // // @@ -17,11 +17,20 @@ #include #include // `apt-get install libx11-dev` #include // `apt-get install libxmu-dev` -#define LSIZ 128 // buffer -#define RSIZ 50 // array size +#include // `apt install libjson-c-dev` Bool xerror = False; +int in(const char **arr, int len, char *target) { + int i; + for(i = 0; i < len; i++) { + if(strncmp(arr[i], target, strlen(target)) == 0) { + return i; + } + } + return -1; +} + int strcicmp(char const *a, char const *b) { for (;; a++, b++) { @@ -88,20 +97,67 @@ const char * str_window_class(Display* d, Window w, char *prior_app ){ int main(void){ - char line[RSIZ][LSIZ]; - FILE *fptr = NULL; - int i = 0; - int tot = 0; + FILE *fp; + char buffer[1024]; + struct json_object *parsed_json, *config, *config_obj, *config_obj_name, *config_obj_run, *config_obj_appnames, *appnames_obj; + int arraylen; + int appnames_len; + int system(const char *command); - fptr = fopen("./appnames.csv", "r"); - while(fgets(line[i], LSIZ, fptr)) - { - line[i][strlen(line[i])] = '\0'; - if( line[i][strlen(line[i])-1] == '\n' ) - line[i][strlen(line[i])-1] = 0; - i++; + size_t i,n; + + fp = fopen("kinto.json","r"); + fread(buffer, 1024, 1, fp); + fclose(fp); + + parsed_json = json_tokener_parse(buffer); + + config = json_object_object_get(parsed_json, "config"); + + arraylen = json_object_array_length(config); + const char *name_array[arraylen]; + const char *run_array[arraylen]; + int appnames_max = 0; + + for (i = 0; i < arraylen; i++) { + config_obj = json_object_array_get_idx(config, i); + config_obj_appnames = json_object_object_get(config_obj, "appnames"); + appnames_len = json_object_array_length(config_obj_appnames); + if (appnames_len > appnames_max){ + appnames_max = appnames_len; + } + } + const char *appnames_array[arraylen][appnames_max]; + + + 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"); + name_array[i] = json_object_get_string(config_obj_name); + run_array[i] = json_object_get_string(config_obj_run); + // 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"); + appnames_len = json_object_array_length(config_obj_appnames); + for (n = 0; n < appnames_len; n++) { + // printf("name_array[i]: %s\n",name_array[i]); + if(!strcicmp(name_array[i], "gui")){ + appnames_array[i][n] = NULL; + // printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + } + else{ + appnames_array[i][n] = json_object_get_string(json_object_array_get_idx(config_obj_appnames, n)); + // printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + } + } + if(appnames_max > appnames_len){ + for (n = appnames_len; n < appnames_max; n++){ + appnames_array[i][n] = NULL; + // printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + } + } } - tot = i; Display* d; Window w; @@ -122,32 +178,52 @@ int main(void){ // get active window w = get_focus_window(d); + int breakouter; + for (;;) { + breakouter = 0; if(strcmp(str_window_class(d, w,prior_app),prior_app)){ - int len = sizeof(line)/sizeof(line[0]); - // printf("length: %d\n",len); - int i; - for(i = 0; i < len; ++i){ - // printf("i: %d\n",i); - // printf(strcicmp(line[i], str_window_class(d, w, prior_app))); - if((strcicmp(line[i], str_window_class(d, w,prior_app)) == 0 && (remap_bool == 1 || remap_bool == 2))) { - // printf("Gotcha!\n"); - // printf("%s - prior app %s\n",str_window_class(d, w, prior_app),prior_app); - printf("%s\n","term"); - remap_bool = 0; - fflush(stdout); - break; + for(i = 0; i < arraylen; ++i){ + if(breakouter == 0){ + if(strcmp(name_array[i],"gui")){ + for(n = 0; n < appnames_max; ++n){ + if (appnames_array[i][n] != NULL){ + // printf("%s\n",appnames_array[i][n]); + if((strcicmp(appnames_array[i][n], str_window_class(d, w,prior_app)) == 0 && (remap_bool == 1 || remap_bool == 2))) { + // printf("1st if %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + printf("%s\n",name_array[i]); + system(run_array[i]); + remap_bool = 0; + fflush(stdout); + breakouter = 1; + break; + } + else if((strcicmp(appnames_array[i][n], str_window_class(d, w,prior_app)) == 0 && remap_bool == 0)){ + // printf("2nd elseif %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + breakouter = 1; + break; + } + else if ((i == arraylen-1 || appnames_array[i][n+1] == NULL) && (remap_bool == 0 || remap_bool == 2)){ + char *find = "gui"; + int gui_idx = in(name_array, arraylen, find); + + if(gui_idx >= 0) { + printf("%s\n",name_array[gui_idx]); + system(run_array[gui_idx]); + } + // printf("3rd elseif %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + remap_bool = 1; + fflush(stdout); + breakouter = 1; + break; + } + } + } + } } - else if((strcicmp(line[i], str_window_class(d, w,prior_app)) == 0 && remap_bool == 0)){ - break; - } - else if (i == 49 && (remap_bool == 0 || remap_bool == 2)){ - printf("%s\n","gui"); - // printf("no match - %s - prior app %s\n",str_window_class(d, w, prior_app),prior_app); - remap_bool = 1; - fflush(stdout); + else{ break; } } From e801610774ab3d2e5f5921f4bc6b882d970a1938 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 00:52:02 -0600 Subject: [PATCH 08/29] - Increased buffer size for larger json configs and added additional config options for future use --- kintox11/src/kinto.json | 88 +++++++++++++++++++++++++++++++++++++++++ kintox11/src/kintox11.c | 4 +- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json index 0188da6..a5b29b8 100644 --- a/kintox11/src/kinto.json +++ b/kintox11/src/kinto.json @@ -1,16 +1,104 @@ {"config":[{ "name":"gui", "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "de":[3], "appnames":[ "" ] }, { "name":"term", "run":"setxkbmap -option", + "de":[2], "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] }, { "name":"eosterm", "run":"setxkbmap -option", + "de":"", "appnames":[ "io.elementary.terminal" ] + }], + "init": [1], + "defaults":[{ + "name":"Windows", + "active": false, + "description":"Standard Windows 104 Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Mac - hid driver", + "active": false, + "description":"Standard Mac Keyboards with Apple driver", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option", + "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" + }, + { + "name":"Mac Only", + "active": true, + "description":"Standard Mac Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Chromebook", + "active": false, + "description":"Standard Chromebook Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Chromebook - Windows", + "active": false, + "description":"Chromebook with Windows 104 Keyboard", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", + "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" + }, + { + "name":"Chromebook - Mac", + "active": false, + "description":"Chromebook with Mac Keyboard", + "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" + }], + "defaultapps":[{ + "name":"term", + "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + }, + { + "name":"eosterm", + "appnames": [ "io.elementary.terminal" ] + }], + "de":[{ + "id": 1, + "type": "gnome3", + "active": true, + "name":"gnome-init", + "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", + "run":"gsettings set org.gnome.mutter overlay-key ''" + }, + { + "id": 2, + "type": "gnome3", + "active": true, + "name":"gnome-term", + "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 3, + "type": "gnome3", + "active": true, + "name":"gnome-gui", + "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 4, + "type": "kde5", + "active": false, + "name":"kde-init", + "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", + "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" }] } \ No newline at end of file diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 9a44305..955f662 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -98,7 +98,7 @@ const char * str_window_class(Display* d, Window w, char *prior_app ){ int main(void){ FILE *fp; - char buffer[1024]; + char buffer[10240]; struct json_object *parsed_json, *config, *config_obj, *config_obj_name, *config_obj_run, *config_obj_appnames, *appnames_obj; int arraylen; int appnames_len; @@ -107,7 +107,7 @@ int main(void){ size_t i,n; fp = fopen("kinto.json","r"); - fread(buffer, 1024, 1, fp); + fread(buffer, 10240, 1, fp); fclose(fp); parsed_json = json_tokener_parse(buffer); From 781f3bdbbfdc9f50e8868e07a07f0133b92fc569 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 00:57:10 -0600 Subject: [PATCH 09/29] - Updated kintox11 binary to the latest --- kintox11/binary/kintox11_ubuntu19-10 | Bin 22208 -> 22208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 index 35050c9657a6e00fb5c05a27d7125698fe5c14d9..6ee14dbc9ab4f866d29401b9dace1c3d892dbdd3 100755 GIT binary patch delta 2518 zcmb7GZ%AEb7=Mpm=XK0oSF$u}rZliz5O+L<_Ol2nytLGx|7oAJ(>)$i`jj2+~LYiA))xn4D19O7naRW6;a*bQNq zEG80M*N#LX3@Oav&=eWNg9=WaV>oLs+*tAJmc2--smVCYR!!1%twW*+VV2J1P)^I9 zUJ%Z1=@bIiw{S$)_Q7Zb=*gQ#xzARB(&K2lmPK!tmIFboP>8NEX>_kL`lGiQ<Gl{A1dziJ1QKH@=yg42*gptd%gnFYl9{ih(dhTlSTF_n#FhqO( zcp`;NO82j#2v-E_ljoov$8~C<_FY{6frl@qA~+;U`<8po$SREh!Et4RTdoM9#yJ`h zwq$xSOA%C1qyJPBo=K(AItdkVgyz-%0NMccta8JYaC4%4pQsgcLIWk{guI@v8k!R^ zO69_JtbRE}7f0d`{*Q_=js%M|YVGPguMKTDsPQG#W0u~;r)*>snzlbeKVMM$_K>`Q zaY8aQDSB*p9L?yMCZ(5$r_;F-;RergJcCSSZhTJ86G3~3AhY6ApxJ-^ok)xvB=AhK zVh1ER35&HJYHc3d?P8YZg^r0$W+IqASxqBFY8+3vX{05BN%mxw$gASSf;ce>tBBFD zM^pCWs6Y#Oj{ijqv1&oap!$Tp@M|MzWjMP$U~}6b_Tf;)r<>At` z&rmyoqkqCoiSdTEl(w77?Q)h-au^5v6enDhyk(>w|ybgcopZG+*1J6%ig)H!wP>FTD<-RSpc zC!BGmXM;OZ#bQQ4H(gS4Kg2M-F$<#^U{esz(#t7(Om;I)MW9TVIIPjy#a_g}C7!$v z^uexpcHF4k?=>rayqB@cr)%_RWqpl)wQ^sjzF5!AU0=go=XKw+#C^`{^iUQ zMe`Y6p#KgghJs4*^Gf~_{uN?XTeIFw*^{}c<=xbGTxQzan|$eeVQxcMqrbDHI<5Os zB9Rt+p{1Ypn@4|2tHHyQtH2Zk%BV- delta 2516 zcmb7GYiv|S6rQ^e+$EMRw2{_;*d|TzfwX7?TAHvC!YtVzo0JMD2wFgX)k@mfM8n!H zgS}iYG_D&lQ9?*a8Y7BXNf2$>CEDB61glX%BoPxZcU^=6BBg~~zcX|D2*pJDW9FXM zch33d%xp6Uwah{7P(TaT&tUSeK0RGqSgI3S%3&;j5U7Xs$2otIBY*dR-~`)UL*6uejwnToR~>(6_LiZ>y}+iqA8T0WgnnuUA(10j!t7!ZDzSS>s$5N>v|s<^RA>XODw|1*i*!6FEAcf+PPB8Skw^Y7d1@si|YMR zBSkJzfc;rk1`G_ zqx1otUH_18D!xamO)7xvzJ7#DM|ixgJh~=1xW~2C#b2-RhZMft5FJFcIxe)g1vc5< zeym8LlG0qnQG{;*muaDk_92d0WLoBN{S43k>4kGfmi7Y=eWt23QUu4fes1{&2sO{q zh}0QErI#~iUw52{em0W5=%uOp5+eKvEvo+kw8PYMoExTsyCU09$XYQ!G-z^u$Qo*o z(EP{|tC6N{^E^bwLF)YfUkBBf+@b}3ESQN{weUMGl)7l;e9_8SD+&fku6Y$M@RkQUcK;m~HW z##b9R^)B%-OGF`KI29;4TJ~X;cmsI~jumE_UWH(iUKJFFyG&e!)8+bcXr+&iD|5NQ{tj@D3mR3Ik^VN@&9u+1V?2& zCNoWLVzh^t>>5w#FFczYAJ7w{BQ;^73|}ADF^q9=1#&Uhjfrj|Qfm&X4^PY5yL5$i zzPl>P>yjM0FDMFxrR*BfO(=?Pe^aGmpj8@(FZ#jBwPAG+gQk4^G)5cI>4M`h?x7LO zz9eaGDN*IKmXJDmnXwS7dU@#=X!P-IuHx~r%S^|@O|GG7x{2US^@iK*@-IF`@h*CE zfy+`z?4i*z{oX?ARh*{Sv1uU5FzH!WQ+5VK=wdbGL^rK0-nz*3Hd3VE4L{0sU~}^o zi9|e4vK@s@F-`4p!ylYa*)4lI4rjdY{Os}j93ynO&dtIEw{7_=?FhH WRXdO@tD7I> Date: Fri, 31 Jan 2020 01:31:21 -0600 Subject: [PATCH 10/29] - Updated json file for kintox11 --- kintox11/binary/appnames.csv | 9 --- kintox11/binary/kinto.json | 105 +++++++++++++++++++++++++++++++++++ kintox11/src/kinto.json | 3 +- 3 files changed, 107 insertions(+), 10 deletions(-) delete mode 100644 kintox11/binary/appnames.csv create mode 100644 kintox11/binary/kinto.json diff --git a/kintox11/binary/appnames.csv b/kintox11/binary/appnames.csv deleted file mode 100644 index bab2088..0000000 --- a/kintox11/binary/appnames.csv +++ /dev/null @@ -1,9 +0,0 @@ -Gnome-terminal -konsole -terminator -sakura -guake -tilda -xterm -eterm -io.elementary.terminal diff --git a/kintox11/binary/kinto.json b/kintox11/binary/kinto.json new file mode 100644 index 0000000..9ac8292 --- /dev/null +++ b/kintox11/binary/kinto.json @@ -0,0 +1,105 @@ +{"config":[{ + "name":"gui", + "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "de":[3], + "appnames":[ "" ] + }, + { + "name":"term", + "run":"setxkbmap -option", + "de":[2], + "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + }, + { + "name":"eosterm", + "run":"setxkbmap -option", + "de":[], + "appnames":[ "io.elementary.terminal" ] + }], + "init": [1], + "defaults":[{ + "name":"Windows", + "active": false, + "description":"Standard Windows 104 Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Mac - hid driver", + "active": false, + "description":"Standard Mac Keyboards with Apple driver", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option", + "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" + }, + { + "name":"Mac Only", + "active": true, + "description":"Standard Mac Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Chromebook", + "active": false, + "description":"Standard Chromebook Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Chromebook - Windows", + "active": false, + "description":"Chromebook with Windows 104 Keyboard", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", + "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" + }, + { + "name":"Chromebook - Mac", + "active": false, + "description":"Chromebook with Mac Keyboard", + "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" + }], + "defaultapps":[{ + "name":"term", + "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + }, + { + "name":"eosterm", + "appnames": [ "io.elementary.terminal" ] + }], + "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], + "de":[{ + "id": 1, + "type": "gnome3", + "active": true, + "name":"gnome-init", + "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", + "run":"gsettings set org.gnome.mutter overlay-key ''" + }, + { + "id": 2, + "type": "gnome3", + "active": true, + "name":"gnome-term", + "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 3, + "type": "gnome3", + "active": true, + "name":"gnome-gui", + "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 4, + "type": "kde5", + "active": false, + "name":"kde-init", + "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", + "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" + }] +} \ No newline at end of file diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json index a5b29b8..9ac8292 100644 --- a/kintox11/src/kinto.json +++ b/kintox11/src/kinto.json @@ -13,7 +13,7 @@ { "name":"eosterm", "run":"setxkbmap -option", - "de":"", + "de":[], "appnames":[ "io.elementary.terminal" ] }], "init": [1], @@ -69,6 +69,7 @@ "name":"eosterm", "appnames": [ "io.elementary.terminal" ] }], + "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], "de":[{ "id": 1, "type": "gnome3", From 0e68fbd011412660e10369592080e7883334b779 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 01:34:54 -0600 Subject: [PATCH 11/29] - WIP - Broken state while rewriting initial install files, and GUI interface. --- keyswap_service.sh | 2 +- system-config/xactive.sh | 69 +--------------------------------------- 2 files changed, 2 insertions(+), 69 deletions(-) diff --git a/keyswap_service.sh b/keyswap_service.sh index 878492d..a18a9cc 100755 --- a/keyswap_service.sh +++ b/keyswap_service.sh @@ -17,7 +17,7 @@ if [[ "$swapbehavior" == "1" ]]; then cp ./system-config/xactive.sh ~/.config/xactive.sh cp ./system-config/keyswap_toggle.sh ~/.config/keyswap_toggle.sh cp ./kintox11/binary/kintox11_ubuntu19-10 ~/.config/kintox11 - cp ./kintox11/binary/appnames.csv ~/.config/appnames.csv + cp ./kintox11/binary/kinto.json ~/.config/kinto.json 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 enable keyswap diff --git a/system-config/xactive.sh b/system-config/xactive.sh index 8f4a6f5..a8f2afd 100755 --- a/system-config/xactive.sh +++ b/system-config/xactive.sh @@ -1,70 +1,3 @@ #!/bin/bash -systemtype=$1 -internalid=$2 -usbid=$3 -swapbehavior=$4 - -# echo $1 $2 $3 $4 - -swapcmd_term="setxkbmap -option;setxkbmap -option altwin:swap_alt_win" -fallbackcmd_gui="" -if [[ "$systemtype" == "windows" || "$systemtype" == "mac" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" - check_gt="setxkbmap -query | grep -v 'swap_alt_win' 1>/dev/null" - check_tg="setxkbmap -query | grep -q 'swap_alt_win'" -# mac_only is for apple keyboards without an apple hid driver -elif [[ "$systemtype" == "mac_only" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" - swapcmd_term="setxkbmap -option" -# Chromebook options -elif [[ "$swapbehavior" == "both_mac" ]]; then - swapcmd_gui="setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - swapcmd_term="setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" -elif [[ "$swapbehavior" == "both_win" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win" - fallbackcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" -elif [[ "$swapbehavior" == "none" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" -fi - -eval "$swapcmd_gui" - -# If running gnome this will disable the overlay-key mapping -gsettings set org.gnome.mutter overlay-key '' -kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "" -qdbus org.kde.KWin /KWin reconfigure - -./kintox11 | -while read -r id; do - if [[ "$id" == "term" ]]; then - echo "internal gui to term" - eval "$swapcmd_term" - - # Gnome - Set Activities Overview - gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" - # ~/.config/kglobalshortcutsrc - # activate widget 78=Super+Space,none,Activate Application Launcher Widget - # kquitapp kglobalaccel && sleep 2s && kglobalaccel5& - # kquitapp5 plasmashell && kstart5 plasmashell - fi - - if [[ "$id" == "gui" ]]; then - echo "internal term to gui" - eval "$swapcmd_gui" - - # Gnome - Set Activities Overview - gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" - # ~/.config/kglobalshortcutsrc - # activate widget 78=Ctrl+Space,none,Activate Application Launcher Widget - # kquitapp kglobalaccel && sleep 2s && kglobalaccel & - - # # Fallback code - # if [ $? -eq 0 ] && [[ "$swapbehavior" == "both_win" ]]; then - # eval "$fallbackcmd_gui" - # check_gt="setxkbmap -query | grep -v 'swap_alt_win' 1>/dev/null" - # check_tg="setxkbmap -query | grep -q 'swap_alt_win'" - # fi - fi - -done \ No newline at end of file +./kintox11 \ No newline at end of file From 901ffe43c8abb00561d0d6b75b248a96bb43d0b1 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 10:48:36 -0600 Subject: [PATCH 12/29] - Updated kintox11 to read and execute init de commands based on json --- kintox11/src/kinto.json | 36 ++++++++++++++-------------- kintox11/src/kintox11.c | 52 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 20 deletions(-) diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json index 9ac8292..191f4e8 100644 --- a/kintox11/src/kinto.json +++ b/kintox11/src/kinto.json @@ -23,38 +23,38 @@ "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" - }, - { + }, + { "name":"Mac - hid driver", "active": false, "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option", "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" - }, - { + }, + { "name":"Mac Only", "active": true, "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" - }, - { + }, + { "name":"Chromebook", "active": false, "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" - }, - { + }, + { "name":"Chromebook - Windows", "active": false, "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - }, - { + }, + { "name":"Chromebook - Mac", "active": false, "description":"Chromebook with Mac Keyboard", @@ -64,8 +64,8 @@ "defaultapps":[{ "name":"term", "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { + }, + { "name":"eosterm", "appnames": [ "io.elementary.terminal" ] }], @@ -77,24 +77,24 @@ "name":"gnome-init", "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", "run":"gsettings set org.gnome.mutter overlay-key ''" - }, - { + }, + { "id": 2, "type": "gnome3", "active": true, "name":"gnome-term", "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { + }, + { "id": 3, "type": "gnome3", "active": true, "name":"gnome-gui", "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { + }, + { "id": 4, "type": "kde5", "active": false, diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 955f662..a5274dc 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -21,6 +21,20 @@ Bool xerror = False; +int in_int(int a[],int size,int item) +{ + int i,pos=-1; + for(i=0;i< size;i++) + { + if(a[i]==item) + { + pos=i; + break; + } + } + return pos; +} + int in(const char **arr, int len, char *target) { int i; for(i = 0; i < len; i++) { @@ -99,9 +113,13 @@ int main(void){ FILE *fp; char buffer[10240]; - struct json_object *parsed_json, *config, *config_obj, *config_obj_name, *config_obj_run, *config_obj_appnames, *appnames_obj; + 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; + int arraylen; - int appnames_len; + int appnames_len, init_len, de_len; int system(const char *command); size_t i,n; @@ -113,10 +131,33 @@ int main(void){ parsed_json = json_tokener_parse(buffer); config = json_object_object_get(parsed_json, "config"); + init = json_object_object_get(parsed_json, "init"); + de = json_object_object_get(parsed_json, "de"); arraylen = json_object_array_length(config); + init_len = json_object_array_length(init); + de_len = json_object_array_length(de); + const char *name_array[arraylen]; const char *run_array[arraylen]; + int init_array[init_len]; + + int de_id_array[de_len]; + Bool de_active_array[de_len]; + const char *de_run_array[de_len]; + + // Grab all de variable info needed + for (i = 0; i < de_len; i++) { + de_obj = json_object_array_get_idx(de, i); + de_obj_id = json_object_object_get(de_obj, "id"); + de_id_array[i] = json_object_get_int(de_obj_id); + de_obj_active = json_object_object_get(de_obj, "active"); + de_active_array[i] = json_object_get_int(de_obj_active); + de_obj_run = json_object_object_get(de_obj, "run"); + de_run_array[i] = json_object_get_string(de_obj_run); + } + // de ends + int appnames_max = 0; for (i = 0; i < arraylen; i++) { @@ -159,6 +200,13 @@ int main(void){ } } + for (i = 0; i < init_len; i++) { + init_array[i] = json_object_get_int(json_object_array_get_idx(init, i)); + int de_id_idx = in_int(de_id_array, init_len, init_array[i]); + printf("Running init command: %s\n",de_run_array[de_id_idx]); + system(de_run_array[de_id_idx]); + } + Display* d; Window w; From b9f308b262ab76b7d052861c9de094f17404eee5 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 12:13:06 -0600 Subject: [PATCH 13/29] - Updated kintox11 to accept and run de commands per keyboard config --- kintox11/binary/kintox11_ubuntu19-10 | Bin 22208 -> 22328 bytes kintox11/src/kintox11.c | 45 ++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 index 6ee14dbc9ab4f866d29401b9dace1c3d892dbdd3..37760e7afa1cd7f60132b08b74a69ec588c9a4dd 100755 GIT binary patch literal 22328 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 N^8`0SrVr+i`46$jJ8u90 diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index a5274dc..ec5c621 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -119,10 +119,10 @@ int main(void){ *de_obj, *de_obj_id, *de_obj_active, *de_obj_run; int arraylen; - int appnames_len, init_len, de_len; + int appnames_len, init_len, de_len, config_de_len; int system(const char *command); - size_t i,n; + size_t i,n,r; fp = fopen("kinto.json","r"); fread(buffer, 10240, 1, fp); @@ -155,21 +155,30 @@ int main(void){ de_active_array[i] = json_object_get_int(de_obj_active); de_obj_run = json_object_object_get(de_obj, "run"); de_run_array[i] = json_object_get_string(de_obj_run); + printf("de_run_array[%ld]: %s\n",i,de_run_array[i]); } // de ends int appnames_max = 0; + int config_de_max = 0; for (i = 0; i < arraylen; i++) { config_obj = json_object_array_get_idx(config, i); config_obj_appnames = json_object_object_get(config_obj, "appnames"); + config_obj_de = json_object_object_get(config_obj, "de"); + appnames_len = json_object_array_length(config_obj_appnames); if (appnames_len > appnames_max){ appnames_max = appnames_len; } + config_de_len = json_object_array_length(config_obj_de); + if(config_de_len > config_de_max){ + config_de_max = config_de_len; + } } - const char *appnames_array[arraylen][appnames_max]; + const char *appnames_array[arraylen][appnames_max]; + int config_de_array[arraylen][config_de_max]; for (i = 0; i < arraylen; i++) { config_obj = json_object_array_get_idx(config, i); @@ -198,11 +207,25 @@ int main(void){ // printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); } } + + config_obj_de = json_object_object_get(config_obj, "de"); + config_de_len = json_object_array_length(config_obj_de); + for (n = 0; n < config_de_max; n++) { + if(n < config_de_len){ + // printf("de value: %d\n",json_object_get_int(json_object_array_get_idx(config_obj_de, n))); + config_de_array[i][n] = json_object_get_int(json_object_array_get_idx(config_obj_de, n)); + } + else{ + // printf("de -1 value: %d\n",json_object_get_int(json_object_array_get_idx(config_obj_de, n))); + config_de_array[i][n] = -1; + } + + } } for (i = 0; i < init_len; i++) { init_array[i] = json_object_get_int(json_object_array_get_idx(init, i)); - int de_id_idx = in_int(de_id_array, init_len, init_array[i]); + int de_id_idx = in_int(de_id_array, de_len, init_array[i]); printf("Running init command: %s\n",de_run_array[de_id_idx]); system(de_run_array[de_id_idx]); } @@ -243,6 +266,13 @@ int main(void){ // printf("1st if %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); printf("%s\n",name_array[i]); system(run_array[i]); + for(r = 0; r < config_de_max; r++){ + if(config_de_array[i][r] != -1){ + int de_id_idx = in_int(de_id_array, de_len, config_de_array[i][r]); + // printf("Running de command: %s\n",de_run_array[de_id_idx]); + system(de_run_array[de_id_idx]); + } + } remap_bool = 0; fflush(stdout); breakouter = 1; @@ -261,6 +291,13 @@ int main(void){ printf("%s\n",name_array[gui_idx]); system(run_array[gui_idx]); } + for(r = 0; r < config_de_max; r++){ + if(config_de_array[gui_idx][r] != -1){ + int de_id_idx = in_int(de_id_array, de_len, config_de_array[gui_idx][r]); + // printf("Running de command: %s\n",de_run_array[de_id_idx]); + system(de_run_array[de_id_idx]); + } + } // printf("3rd elseif %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); remap_bool = 1; fflush(stdout); From 9e0b56014bc2732aebc8e0575f05b09b51a8dc58 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 12:32:33 -0600 Subject: [PATCH 14/29] - Added comments to kintox11 --- kintox11/src/kintox11.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index ec5c621..49269ee 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -262,6 +262,7 @@ int main(void){ for(n = 0; n < appnames_max; ++n){ if (appnames_array[i][n] != NULL){ // printf("%s\n",appnames_array[i][n]); + // If statement for triggering terminal config if((strcicmp(appnames_array[i][n], str_window_class(d, w,prior_app)) == 0 && (remap_bool == 1 || remap_bool == 2))) { // printf("1st if %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); printf("%s\n",name_array[i]); @@ -277,12 +278,12 @@ int main(void){ fflush(stdout); breakouter = 1; break; - } + } // Else command for ignoring similar app category based on config else if((strcicmp(appnames_array[i][n], str_window_class(d, w,prior_app)) == 0 && remap_bool == 0)){ // printf("2nd elseif %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); breakouter = 1; break; - } + } // Else command for triggering gui config else if ((i == arraylen-1 || appnames_array[i][n+1] == NULL) && (remap_bool == 0 || remap_bool == 2)){ char *find = "gui"; int gui_idx = in(name_array, arraylen, find); From 9089777a2962dc5b5bd40f084cfd5c2968c7270b Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 12:45:39 -0600 Subject: [PATCH 15/29] - Adding a default json file for installer. --- kintox11/binary/default.json | 112 +++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 kintox11/binary/default.json diff --git a/kintox11/binary/default.json b/kintox11/binary/default.json new file mode 100644 index 0000000..ddb886d --- /dev/null +++ b/kintox11/binary/default.json @@ -0,0 +1,112 @@ +{"config":[{ + "name":"gui", + "run":"", + "de":[], + "appnames":[ "" ] + }, + { + "name":"term", + "run":"", + "de":[], + "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + }, + { + "name":"eosterm", + "run":"", + "de":[], + "appnames":[ "io.elementary.terminal" ] + }], + "init": [], + "defaulttypes":["windows","mac","chromebook"], + "defaults":[{ + "name":"Windows", + "active": false, + "type":"windows", + "description":"Standard Windows 104 Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Mac - hid driver", + "active": false, + "type":"mac", + "description":"Standard Mac Keyboards with Apple driver", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option", + "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" + }, + { + "name":"Mac Only", + "active": true, + "type":"mac", + "description":"Standard Mac Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Chromebook", + "active": false, + "type":"chromebook", + "description":"Standard Chromebook Keyboards", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + }, + { + "name":"Chromebook - Windows", + "active": false, + "type":"chromebook", + "description":"Chromebook with Windows 104 Keyboard", + "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", + "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", + "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" + }, + { + "name":"Chromebook - Mac", + "active": false, + "type":"chromebook", + "description":"Chromebook with Mac Keyboard", + "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "term":"setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" + }], + "defaultapps":[{ + "name":"term", + "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + }, + { + "name":"eosterm", + "appnames": [ "io.elementary.terminal" ] + }], + "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], + "de":[{ + "id": 1, + "type": "gnome3", + "active": true, + "name":"gnome-init", + "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", + "run":"gsettings set org.gnome.mutter overlay-key ''" + }, + { + "id": 2, + "type": "gnome3", + "active": true, + "name":"gnome-term", + "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 3, + "type": "gnome3", + "active": true, + "name":"gnome-gui", + "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 4, + "type": "kde5", + "active": false, + "name":"kde-init", + "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", + "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" + }] +} \ No newline at end of file From 25292bae8c80423eade7911d0f75c0deca5bb927 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 31 Jan 2020 18:21:42 -0600 Subject: [PATCH 16/29] - Increased stability of kintox11 --- kintox11/binary/kintox11-ubuntu19-10 | Bin 0 -> 22328 bytes kintox11/binary/kintox11_ubuntu19-10 | Bin 22328 -> 22328 bytes kintox11/src/kintox11.c | 16 +++++++++++----- 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100755 kintox11/binary/kintox11-ubuntu19-10 diff --git a/kintox11/binary/kintox11-ubuntu19-10 b/kintox11/binary/kintox11-ubuntu19-10 new file mode 100755 index 0000000000000000000000000000000000000000..27ec88241f9e5744828cb1c0756c1e7da445ee1e GIT binary patch literal 22328 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 diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 49269ee..6e44ff0 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -64,9 +64,10 @@ Display* open_display(){ } int handle_error(Display* display, XErrorEvent* error){ - printf("ERROR: X11 error\n"); - xerror = True; - return 1; + // printf("X11 error: type=%d, serial=%lu, code=%d\n", + // error->type, error->serial, (int)error->error_code); + // xerror = True; + return 0; } Window get_focus_window(Display* d){ @@ -155,7 +156,7 @@ int main(void){ de_active_array[i] = json_object_get_int(de_obj_active); de_obj_run = json_object_object_get(de_obj, "run"); de_run_array[i] = json_object_get_string(de_obj_run); - printf("de_run_array[%ld]: %s\n",i,de_run_array[i]); + // printf("de_run_array[%ld]: %s\n",i,de_run_array[i]); } // de ends @@ -254,11 +255,14 @@ int main(void){ for (;;) { breakouter = 0; - + // printf("%s\n","1"); + // printf("%s\n",str_window_class(d, w,prior_app)); if(strcmp(str_window_class(d, w,prior_app),prior_app)){ + // printf("%s\n","2"); for(i = 0; i < arraylen; ++i){ if(breakouter == 0){ if(strcmp(name_array[i],"gui")){ + // printf("%s\n","3"); for(n = 0; n < appnames_max; ++n){ if (appnames_array[i][n] != NULL){ // printf("%s\n",appnames_array[i][n]); @@ -281,6 +285,7 @@ int main(void){ } // Else command for ignoring similar app category based on config else if((strcicmp(appnames_array[i][n], str_window_class(d, w,prior_app)) == 0 && remap_bool == 0)){ // printf("2nd elseif %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + // printf("%s\n","4"); breakouter = 1; break; } // Else command for triggering gui config @@ -314,6 +319,7 @@ int main(void){ } } } + // printf("%s\n","5"); strcpy(prior_app,str_window_class(d, w, prior_app)); XEvent e; From 499bf51dd7ee592feae2e997faac080b347ad507 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 1 Feb 2020 01:08:48 -0600 Subject: [PATCH 17/29] - Updated default json for setup --- kintox11/binary/default.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/kintox11/binary/default.json b/kintox11/binary/default.json index ddb886d..2bd660b 100644 --- a/kintox11/binary/default.json +++ b/kintox11/binary/default.json @@ -19,6 +19,7 @@ "init": [], "defaulttypes":["windows","mac","chromebook"], "defaults":[{ + "id": 1, "name":"Windows", "active": false, "type":"windows", @@ -27,7 +28,8 @@ "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" }, { - "name":"Mac - hid driver", + "id": 2, + "name":"Mac - hid driver (Recommended)", "active": false, "type":"mac", "description":"Standard Mac Keyboards with Apple driver", @@ -36,7 +38,8 @@ "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" }, { - "name":"Mac Only", + "id": 3, + "name":"Mac Only - (Best for VMs or non-official Mac keyboards)", "active": true, "type":"mac", "description":"Standard Mac Keyboards", @@ -44,6 +47,7 @@ "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" }, { + "id": 4, "name":"Chromebook", "active": false, "type":"chromebook", @@ -52,6 +56,7 @@ "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" }, { + "id": 5, "name":"Chromebook - Windows", "active": false, "type":"chromebook", @@ -61,6 +66,7 @@ "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" }, { + "id": 6, "name":"Chromebook - Mac", "active": false, "type":"chromebook", From 4d1eb2f94a347259916a2924c7351bc247d5210d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 1 Feb 2020 16:21:31 -0600 Subject: [PATCH 18/29] - Added compiled version with json-c library baked in --- kintox11/binary/kintox11-ubuntu19-10 | Bin 22328 -> 0 bytes kintox11/binary/kintox11_ubuntu19-10 | Bin 22328 -> 236168 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 kintox11/binary/kintox11-ubuntu19-10 diff --git a/kintox11/binary/kintox11-ubuntu19-10 b/kintox11/binary/kintox11-ubuntu19-10 deleted file mode 100755 index 27ec88241f9e5744828cb1c0756c1e7da445ee1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22328 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

4tip(@%? z^<|#k3POX>KKNp<9K-unY)&dhhwfKNbyA^uHCug!a+QMcMJWBkvpI=~deNasD1I_p zzW?Td-;y?G!eX&Qn3+A zt<8B%)b9>OLSaiTPM-MIrV^fW^oQD!W8{lav@@m#sgONPenO#Q+$cDJ8=Ugk1lCKWP>J`)NR*=Jn3`{u^xnEhU+AS@C3vBksYAhfT=$|RJ2Z`%xns6Vv6BRN@pd{V;Fm zK|i>D89(oX?`H%PO@rz*zECm0B(Pd_aIMwR6hft$3?3X(tVE>>%4;>kp@Tu@s%*5&zL{Ig2l%jS7iNE-|x@CJt?4ZrhX#@_jFeLQR3o}Ne1sPF3TY9pOG~x z736_Xhl5Nf2b+)Z?o%>Vusao0zsW-+^+BSTa+LjTuaf%GOd8hju+8)%<=G;&|vZ;(Z#_LCk z_jAqrL6vD=^UI@R`o);>}^A0w_Lt|Qi& z?@$kx$&r1*g0;4~OPoV|iWnxY(tq9b6_$%*gy1gvDx`?}i2cORi05B0trtyp@JPRC zTR)+*T47y$tOS=-Tk$gD3Stv6PVA~S)?IP^`jfP{olSV+a!GP{jE;)pxY*0`heUB? z4A6@)^paq{ z6&6u@8&UjryS&d|VSpL)#yTdFBUT0Y~co!qXZMxuPmjCv|{;G(b(!Iow zh@TM86GM&0nty%N@qQ9kFT(Ok;u+#_)Ked3QQ{LyxWGh{H6y|OMw&czQIj}&lcUVt zVzt~2MmLN1IeQC_%vU zY3he5Y^ui+rR1-ZPxlN)H>hu6sZaYi!8CGI)NE4qm2$d%f)$#lI!-=rf&>X&rpeX4Oe1N&qju2vP4WXVOUR&{9BU7mdq-izM=-rafeF4z{S$ zpnO)4{=_K{?6noxB5dIPm-&wntWiDReXT@aq>tu|4Lld2TyRm zVXb+;5y~a1^Ir0|$Rpx@&UW-W-fIQ2n3mulrr(GgUIn>Hkh9Yu5{jHNh$Imsrk>;! zkSFpttcS?y{siu~e3c(!yZJMD{i<~;p%(jZ%(8;j8ipl>87oUQGTh`4e>>p?9~drEXx2mCE9rpc1lZjI^V($P<#^ zfx(V(b<53e$E+}eO0&Ma#rBg&I`32m>JMoBIWU+xV%zzdow-B3$UBxeNj?WR$=F4* z1-BCyDf6}!$l#VyF8 zK1BWt@`$iMjt-jy5XD^>u>7B;JSAooa29aY;yQc31>}*JVrLg-@w_U_ONY8CM;3+= z*hPeRo!^aBjXbuAZj^`W22XXX>^Z*Euj@01ROw84%nMG}w~JI!&zISQ(+;cTl>Y$b CpHVFU diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 793ca59..b716937 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -120,7 +120,8 @@ int main(void){ 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, *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; @@ -149,6 +150,8 @@ int main(void){ int de_id_array[de_len]; Bool de_active_array[de_len]; const char *de_run_array[de_len]; + const char *de_runterm_array[de_len]; + const char *de_rungui_array[de_len]; // Grab all de variable info needed for (i = 0; i < de_len; i++) { @@ -159,6 +162,10 @@ int main(void){ de_active_array[i] = json_object_get_int(de_obj_active); de_obj_run = json_object_object_get(de_obj, "run"); de_run_array[i] = json_object_get_string(de_obj_run); + de_obj_runterm = json_object_object_get(de_obj, "run_term"); + de_runterm_array[i] = json_object_get_string(de_obj_runterm); + de_obj_rungui = json_object_object_get(de_obj, "run_gui"); + de_rungui_array[i] = json_object_get_string(de_obj_rungui); // printf("de_run_array[%ld]: %s\n",i,de_run_array[i]); } // de ends @@ -278,7 +285,7 @@ int main(void){ if(config_de_array[i][r] != -1){ int de_id_idx = in_int(de_id_array, de_len, config_de_array[i][r]); // printf("Running de command: %s\n",de_run_array[de_id_idx]); - system(de_run_array[de_id_idx]); + system(de_runterm_array[de_id_idx]); } } remap_bool = 0; @@ -304,7 +311,7 @@ int main(void){ if(config_de_array[gui_idx][r] != -1){ int de_id_idx = in_int(de_id_array, de_len, config_de_array[gui_idx][r]); // printf("Running de command: %s\n",de_run_array[de_id_idx]); - system(de_run_array[de_id_idx]); + system(de_rungui_array[de_id_idx]); } } // printf("3rd elseif %s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); diff --git a/install.py b/old-files/install.py similarity index 100% rename from install.py rename to old-files/install.py diff --git a/prekinto.py b/prekinto.py index 38eeb13..335425e 100644 --- a/prekinto.py +++ b/prekinto.py @@ -50,23 +50,6 @@ class bcolors: CBEIGEBG2 = '\033[106m' CWHITEBG2 = '\033[107m' -def cmdline(command): - process = Popen( - args=command, - stdout=PIPE, - shell=True - ) - return process.communicate()[0] - -def copytree(src, dst, symlinks=False, ignore=None): - for item in os.listdir(src): - s = os.path.join(src, item) - d = os.path.join(dst, item) - if os.path.isdir(s): - shutil.copytree(s, d, symlinks, ignore) - else: - shutil.copy2(s, d) - def yn_choice(message, default='y'): choices = 'Y/n' if default.lower() in ('y', 'yes') else 'y/N' choice = input("%s (%s) " % (message, choices)) diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 027508c..5e21479 --- a/setup.py +++ b/setup.py @@ -1,115 +1,165 @@ #!/usr/bin/env python3 - -import json -import os -from subprocess import PIPE, Popen +import json, time, os from shutil import copyfile +from subprocess import PIPE, Popen from prekinto import * -print("\nKinto - Type in Linux like it's a Mac.\n") +homedir = os.path.expanduser("~") + +def cmdline(command): + process = Popen( + args=command, + stdout=PIPE, + universal_newlines=True, + shell=True + ) + return process.communicate()[0] try: - f = open("default.json") + f = open("defaults.json") except IOError: - print("default.json file is missing. Will exit.\n") + print("defaults.json file is missing. Will exit.\n") exit() f.close() try: - f = open("kinto.json") - rewrite = yn_choice("kinto.json already exists. Do you want to overwrite it with a new config?") + f = open("user_config.json") +except IOError: + print("user_config.json file is missing. Will exit.\n") + exit() +f.close() + +if os.path.isdir(homedir + "/.config/kinto") == False: + os.mkdir(homedir + "/.config/kinto") + time.sleep(0.5) + +try: + f = open(homedir + "/.config/kinto/user_config.json") + rewrite = yn_choice("~/.config/kinto/user_config.json already exists. Do you want to overwrite it with a new config?") print("") if(rewrite): - copyfile("default.json", "kinto.json") + copyfile("user_config.json", homedir + "/.config/kinto/user_config.json") else: exit() except IOError: pass - copyfile("default.json", "kinto.json") + copyfile("user_config.json", homedir + "/.config/kinto/user_config.json") finally: f.close() -with open('kinto.json') as json_file: +with open('defaults.json') as json_file: data = json.load(json_file) - for index, item in enumerate(data['defaulttypes']): - ossym = "" - color_arr = [bcolors.CBLUE,bcolors.CRED,bcolors.CGREEN] - if item == "windows": - ossym = u'\u2756' - elif item == "mac": - ossym = u'\u2318' - elif item == "chromebook": - ossym = u'\u2707' - print("%s %i. %s %s %s" % (color_arr[index], index+1, ossym, item.capitalize(), bcolors.ENDC)) +color_arr = [bcolors.CBLUE,bcolors.CRED,bcolors.CGREEN] - default = 0 - while not int(default) in range(1,len(data['defaulttypes'])+1): - default = int(input(bcolors.CYELLOW + "Please enter your keyboard type (1 - " + str(len(data['defaulttypes'])) + ") : " + bcolors.ENDC)) - print("") - # print(data['defaulttypes'][default-1]) +print("\nKinto - Type in Linux like it's a Mac.\n") - keyboardconfigs = [obj for obj in data['defaults'] if(obj['type'] == data['defaulttypes'][default-1])] - # print(len(keyboardconfigs)) +for index, item in enumerate(data['defaulttypes']): + ossym = "" + if item == "windows": + ossym = u'\u2756' + elif item == "mac": + ossym = u'\u2318' + elif item == "chromebook": + ossym = u'\u2707' + print("%s %i. %s %s %s" % (color_arr[index], index+1, ossym, item.capitalize(), bcolors.ENDC)) - # for k in keyboardconfigs: - for index, k in enumerate(keyboardconfigs): +default = 0 +while not int(default) in range(1,len(data['defaulttypes'])+1): + default = int(input(bcolors.CYELLOW + "\nPlease enter your keyboard type (1 - " + str(len(data['defaulttypes'])) + ") : " + bcolors.ENDC)) +print("") + +keyboardconfigs = [obj for obj in data['defaults'] if(obj['type'] == data['defaulttypes'][default-1])] + +# for k in keyboardconfigs: +for index, k in enumerate(keyboardconfigs): + print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) + print(bcolors.CYELLOW + 'Description: ' + k['description'] + bcolors.ENDC) + +print("") +defaultkb = 0 +while not int(defaultkb) in range(1,len(keyboardconfigs)+1): + defaultkb = int(input(bcolors.CYELLOW + "Please enter your keyboard config (1 - " + str(len(keyboardconfigs)) + ") : " + bcolors.ENDC)) +print("") + +if 'hack' in keyboardconfigs[defaultkb-1]: + print(bcolors.CYELLOW + "You have selected a keyboard config that needs the following command to be ran.\n" + bcolors.ENDC) + print(keyboardconfigs[defaultkb-1]['hack'].replace(";", "\n") + "\n") + runhack = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require sudo privileges. Will exit on No.)" + bcolors.ENDC) + if(runhack): + os.system(keyboardconfigs[defaultkb-1]['hack']) + +# Setup the selected keyboards config +os.system("cp -rf ./.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.term') +time.sleep(0.5) + +symbols_gui_line = cmdline("cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_symbols' | cut -f1 -d:").strip() +types_gui_line = cmdline("cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:").strip() +symbols_term_line = cmdline("cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:").strip() + +cmdline('sed -i '' -e "' + symbols_gui_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui') +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') + + +user_file = homedir + '/.config/kinto/user_config.json' +with open(user_file, 'r') as f: + user_config = json.load(f) + +onetime = yn_choice("One time initialization tweaks are available. Would you like to view them?") +print("") +if(onetime): + intents = [obj for obj in user_config['de'] if(obj['intent'] == "init")] + + for index, k in enumerate(intents): print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) print(bcolors.CYELLOW + 'Description: ' + k['description'] + bcolors.ENDC) + print(bcolors.CYELLOW + 'run: ' + k['run'].replace(";", "\n") + bcolors.ENDC + '\n') - # print(keyboardconfigs[0]['id']) - # print(keyboardconfigs[len(keyboardconfigs)-1]['id']) - print("") - defaultkb = 0 - while not int(defaultkb) in range(1,len(keyboardconfigs)+1): - defaultkb = int(input(bcolors.CYELLOW + "Please enter your keyboard config (1 - " + str(len(keyboardconfigs)) + ") : " + bcolors.ENDC)) - print("") + print(bcolors.CYELLOW + "Please enter your init tweak(s) (eg 1 or 1 2 3 - leave blank to skip): " + bcolors.ENDC) + defaultinit = [int(i) for i in input().split()] + if len(defaultinit) != 0: + user_config['init'] = defaultinit - if 'hack' in keyboardconfigs[defaultkb-1]: - print(bcolors.CYELLOW + "You have selected a keyboard config that needs the following command to be ran.\n" + bcolors.ENDC) - print(keyboardconfigs[defaultkb-1]['hack'].replace(";", "\n") + "\n") - runhack = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require sudo privileges. Will exit on No.)" + bcolors.ENDC) - if(runhack): - # keyboardconfigs[defaultkb-1]['hack'] - os.system('sudo hostname') - # else: - # exit() +print("\nDynamic shortcut tweaks\n") - # Setup the selected keyboards config - copytree("./.xkb/","~/.xkb/") - os.system('setxkbmap -option') - os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui') - os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.term') - winmac = ["Windows","Mac - hid driver"] - if keyboardconfigs[defaultkb-1]['name'] in winmac: +intents = [obj for obj in user_config['de'] if(obj['intent'] == "gui_term")] +for index, k in enumerate(intents): + print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) + print(bcolors.CYELLOW + 'Description: ' + k['description'] + bcolors.ENDC) + print(bcolors.CYELLOW + 'run in gui mode: ' + k['run_gui'].replace(";", "\n") + bcolors.ENDC) + print(bcolors.CYELLOW + 'run in terminal mode: ' + k['run_term'].replace(";", "\n") + bcolors.ENDC + '\n') -# line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_symbols' | cut -f1 -d:) -# sed -ie "${line}s/\"/+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.gui -# sleep 1 -# line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:) -# sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.mac.gui -# sleep 1 -# line=$(cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:) -# sed -ie "${line}s/\"/+altwin(swap_alt_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.term - +print(bcolors.CYELLOW + "Please enter your dynamic shortcut tweak(s) (eg 1 or 1 2 3 - leave blank to skip): " + bcolors.ENDC) +defaultde = [int(i) for i in input().split()] +if len(defaultde) != 0: + # gui + user_config['config'][0]['de'] = defaultde + # term + user_config['config'][1]['de'] = defaultde -# Tweaks available for initialization (on boot) +for d in defaultde: + user_config['de'][d-1]['active'] = True -# Tweaks available while in gui keymap mode - -# Tweaks available while in terminal keymap mode - - -# "id": 2, -# "name":"Mac - hid driver", -# "active": false, -# "description":"Standard Mac Keyboards with Apple driver", -# "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", -# "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", -# "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", -# "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", -# "xkb_types_gui":"+mac_gui(addmac_levels)", -# "xkb_types_term":"", -# "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" +user_config['config'][0]['run'] = keyboardconfigs[defaultkb-1]['gui'] +user_config['config'][1]['run'] = keyboardconfigs[defaultkb-1]['term'] +os.remove(user_file) +with open(user_file, 'w') as f: + json.dump(user_config, f, indent=4) +print("Saved configuration to ~/.config/kinto/user_config.json\n") +print("Now running keyswap_service.sh to setup the keyswap service...") +print("Keyswap will be configured to run on user login\n") +print("You may start, stop, restart or view the status of the service with following commands\n") +print("systemctl --user start keyswap") +print("systemctl --user stop keyswap") +print("systemctl --user restart keyswap") +print("systemctl --user status keyswap") +os.system("./keyswap_service.sh") \ No newline at end of file diff --git a/user_config.json b/user_config.json index 4b2516a..d6ee4f8 100644 --- a/user_config.json +++ b/user_config.json @@ -11,41 +11,38 @@ "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "init": [], - "defaultapps":[{ - "name":"term", - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], "de":[{ "id": 1, "type": ["gnome3"], "active": false, + "intent":"init", "name":"gnome-init", "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", - "run":"gsettings set org.gnome.mutter overlay-key ''" + "run":"gsettings set org.gnome.mutter overlay-key ''", + "run_term":"", + "run_gui":"" }, { "id": 2, "type": ["gnome3"], "active": false, - "name":"gnome-term", - "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + "intent":"gui_term", + "name":"Gnome Activities Overview", + "description":"Cmd+Space activates Activities Overview", + "run":"", + "run_term":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"", + "run_gui":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" }, { "id": 3, - "type": ["gnome3"], - "active": false, - "name":"gnome-gui", - "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 4, "type": ["kde5"], "active": false, + "intent":"init", "name":"kde-init", "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", - "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" + "run":"kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure", + "run_term":"", + "run_gui":"" }] } \ No newline at end of file From bf0988f8b6f4a8679f086a2735c5396915ebfb9b Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 21:32:42 -0600 Subject: [PATCH 27/29] - Added preview image of new installer --- splash.png | Bin 0 -> 41372 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 splash.png diff --git a/splash.png b/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..ff452ca1fc0666218c5b6f8b8ae1bb81bc3b8c14 GIT binary patch literal 41372 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%0AW8QcDXYG3EZ*~!|r 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 iJ2M@@oyol~yLro0j>mdX9hj4Oz|`m(@}r@1 Date: Sun, 2 Feb 2020 21:59:15 -0600 Subject: [PATCH 28/29] - Updated keyswap service script to continue to use shell script to run kintox11 --- keyswap_service.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyswap_service.sh b/keyswap_service.sh index b187909..c389788 100755 --- a/keyswap_service.sh +++ b/keyswap_service.sh @@ -1,11 +1,12 @@ #!/bin/bash -swapcmd="\/bin\/bash\ \/home\/`whoami`\/.config\/kinto\/kintox11" +swapcmd="\/bin\/bash\ \/home\/`whoami`\/.config\/kinto\/xactive.sh" mkdir -p ~/.config/systemd/user mkdir -p ~/.config/autostart cp ./system-config/keyswap.service ~/.config/systemd/user/keyswap.service cp ./system-config/keyswap.sh ~/.config/autostart/keyswap.sh cp ./kintox11/binary/kintox11 ~/.config/kinto/kintox11 +cp ./system-config/xactive.sh ~/.config/kinto/xactive.sh 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 enable keyswap From e11414604ee54842dd96c7ef62c997f04256919e Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 22:09:59 -0600 Subject: [PATCH 29/29] - Updated readme and uninstaller --- README.md | 6 ++++-- old_uninstall.sh | 9 +++++++++ uninstall.sh | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100755 old_uninstall.sh diff --git a/README.md b/README.md index a78484e..f1fb807 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,9 @@ [![GitHub release](https://img.shields.io/github/release/rbreaves/kinto.svg)](https://github.com/rbreaves/kinto/releases) -\- A better linux keyboard layout for professional mac users \- +![alt text](https://raw.githubusercontent.com/rbreaves/kinto/master/splash.png) + +\- Type in Linux like it's a Mac. \- Memory muscle matters for programmers and developers. @@ -41,7 +43,7 @@ git clone https://github.com/rbreaves/kinto.git Debian or Ubuntu 16.04 or 18.04 ``` sudo apt update -sudo apt install python3 x11-utils +sudo apt install python3 ``` 3. Follow the prompts and the script will guide you through the rest of the setup. diff --git a/old_uninstall.sh b/old_uninstall.sh new file mode 100755 index 0000000..1b3eec0 --- /dev/null +++ b/old_uninstall.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +systemctl --user stop keyswap +systemctl --user disable keyswap +rm -rf ~/.config/autostart/keyswap.sh +rm -rf ~/.config/xactive.sh +rm -rf ~/.xkb + +sed -i '/xkb/d' ~/.Xsession \ No newline at end of file diff --git a/uninstall.sh b/uninstall.sh index 1b3eec0..bc702dc 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -3,7 +3,7 @@ systemctl --user stop keyswap systemctl --user disable keyswap rm -rf ~/.config/autostart/keyswap.sh -rm -rf ~/.config/xactive.sh +rm -rf ~/.config/kinto rm -rf ~/.xkb sed -i '/xkb/d' ~/.Xsession \ No newline at end of file

NqL6Mjy^v=h>|Xc5N4q`QwB{2Snl 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 T>mWhqPTK!}&|7U0 literal 22328 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 Date: Sat, 1 Feb 2020 22:42:11 -0600 Subject: [PATCH 19/29] - Updated symbols file to properly map superkey to ctrl+shift by default on all terminals, updated install files and json to reflect the changes --- .xkb/symbols/mac_term | 84 +++--------------------------------- kintox11/binary/default.json | 6 +-- kintox11/binary/kinto.json | 8 ++-- mac_only.sh | 2 +- mac_wordwise.sh | 2 +- 5 files changed, 15 insertions(+), 87 deletions(-) diff --git a/.xkb/symbols/mac_term b/.xkb/symbols/mac_term index e0403ba..e7078af 100644 --- a/.xkb/symbols/mac_term +++ b/.xkb/symbols/mac_term @@ -1,80 +1,8 @@ default partial xkb_symbols "mac_levelssym" { - // Cut - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ x, X, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Hyper_L ], + actions[group1]=[ SetMods(modifiers=Shift+Control) ] }; - // Copy - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ c, C, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Paste - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ v, V, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // New Tab - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ t, T, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // New Window - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ n, N, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Close Tab - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ w, W, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Close Window - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ q, Q, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Scroll back reset - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ k, K, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Detach Tab - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ h, H, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Find - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ f, F, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Close Active - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ s, S, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Close Others - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ o, O, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; - // Show Menu - replace key { - type[Group1]= "ALPHABETIC_SUPER", - symbols[Group1]= [ m, M, NoSymbol ], - actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,mods=Control+Shift,clearmods=Super)] - }; -}; +}; \ No newline at end of file diff --git a/kintox11/binary/default.json b/kintox11/binary/default.json index 2bd660b..d970435 100644 --- a/kintox11/binary/default.json +++ b/kintox11/binary/default.json @@ -8,13 +8,13 @@ "name":"term", "run":"", "de":[], - "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + "appnames":[ "konsole","Gnome-terminal","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }, { - "name":"eosterm", + "name":"some3rdApp", "run":"", "de":[], - "appnames":[ "io.elementary.terminal" ] + "appnames":[ "some3rdApp" ] }], "init": [], "defaulttypes":["windows","mac","chromebook"], diff --git a/kintox11/binary/kinto.json b/kintox11/binary/kinto.json index 9ac8292..4aa4371 100644 --- a/kintox11/binary/kinto.json +++ b/kintox11/binary/kinto.json @@ -6,15 +6,15 @@ }, { "name":"term", - "run":"setxkbmap -option", + "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "de":[2], - "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] + "appnames":[ "konsole","Gnome-terminal","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }, { - "name":"eosterm", + "name":"some3rdApp", "run":"setxkbmap -option", "de":[], - "appnames":[ "io.elementary.terminal" ] + "appnames":[ "some3rdApp" ] }], "init": [1], "defaults":[{ diff --git a/mac_only.sh b/mac_only.sh index 2d4fa0e..0ebd002 100755 --- a/mac_only.sh +++ b/mac_only.sh @@ -12,4 +12,4 @@ line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:) sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.mac.gui sleep 1 line=$(cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(alt_super_win)\"/2" ~/.xkb/keymap/kbd.mac.term +sed -ie "${line}s/\"/+altwin(alt_super_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.term diff --git a/mac_wordwise.sh b/mac_wordwise.sh index 1c1be91..684a9d8 100755 --- a/mac_wordwise.sh +++ b/mac_wordwise.sh @@ -12,4 +12,4 @@ line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:) sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.mac.gui sleep 1 line=$(cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(swap_alt_win)\"/2" ~/.xkb/keymap/kbd.mac.term +sed -ie "${line}s/\"/+altwin(swap_alt_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.term From 1ff39694646d390b61e61b84929a5fed358c6cab Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 1 Feb 2020 23:49:49 -0600 Subject: [PATCH 20/29] - Updated script and json files to reflect new keymap changes --- chromebook.sh | 2 +- kintox11/binary/default.json | 41 +++++++---------------- kintox11/binary/kinto.json | 30 ++++++++--------- kintox11/src/kinto.json | 64 +++++++++++++++++------------------- 4 files changed, 56 insertions(+), 81 deletions(-) diff --git a/chromebook.sh b/chromebook.sh index b1a3b7c..8b2d666 100755 --- a/chromebook.sh +++ b/chromebook.sh @@ -13,4 +13,4 @@ line=$(cat ~/.xkb/keymap/kbd.chromebook.gui | grep -n 'xkb_types' | cut -f1 -d:) sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.chromebook.gui sleep 1 line=$(cat ~/.xkb/keymap/kbd.chromebook.term | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(swap_alt_win)\"/2" ~/.xkb/keymap/kbd.chromebook.term +sed -ie "${line}s/\"/+altwin(swap_alt_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.chromebook.term diff --git a/kintox11/binary/default.json b/kintox11/binary/default.json index d970435..2d0dcd8 100644 --- a/kintox11/binary/default.json +++ b/kintox11/binary/default.json @@ -8,85 +8,68 @@ "name":"term", "run":"", "de":[], - "appnames":[ "konsole","Gnome-terminal","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { - "name":"some3rdApp", - "run":"", - "de":[], - "appnames":[ "some3rdApp" ] + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "init": [], - "defaulttypes":["windows","mac","chromebook"], "defaults":[{ "id": 1, "name":"Windows", "active": false, - "type":"windows", "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" }, { "id": 2, - "name":"Mac - hid driver (Recommended)", + "name":"Mac - hid driver", "active": false, - "type":"mac", "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" }, { "id": 3, - "name":"Mac Only - (Best for VMs or non-official Mac keyboards)", + "name":"Mac Only", "active": true, - "type":"mac", "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { "id": 4, "name":"Chromebook", "active": false, - "type":"chromebook", "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { "id": 5, "name":"Chromebook - Windows", "active": false, - "type":"chromebook", "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" }, { "id": 6, "name":"Chromebook - Mac", "active": false, - "type":"chromebook", "description":"Chromebook with Mac Keyboard", "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }], "defaultapps":[{ "name":"term", - "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { - "name":"eosterm", - "appnames": [ "io.elementary.terminal" ] + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], "de":[{ "id": 1, "type": "gnome3", - "active": true, + "active": false, "name":"gnome-init", "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", "run":"gsettings set org.gnome.mutter overlay-key ''" @@ -94,7 +77,7 @@ { "id": 2, "type": "gnome3", - "active": true, + "active": false, "name":"gnome-term", "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" @@ -102,7 +85,7 @@ { "id": 3, "type": "gnome3", - "active": true, + "active": false, "name":"gnome-gui", "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" diff --git a/kintox11/binary/kinto.json b/kintox11/binary/kinto.json index 4aa4371..8dbebf9 100644 --- a/kintox11/binary/kinto.json +++ b/kintox11/binary/kinto.json @@ -8,16 +8,11 @@ "name":"term", "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "de":[2], - "appnames":[ "konsole","Gnome-terminal","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { - "name":"some3rdApp", - "run":"setxkbmap -option", - "de":[], - "appnames":[ "some3rdApp" ] + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "init": [1], "defaults":[{ + "id": 1, "name":"Windows", "active": false, "description":"Standard Windows 104 Keyboards", @@ -25,49 +20,50 @@ "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" }, { + "id": 2, "name":"Mac - hid driver", "active": false, "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" }, { + "id": 3, "name":"Mac Only", "active": true, "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { + "id": 4, "name":"Chromebook", "active": false, "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { + "id": 5, "name":"Chromebook - Windows", "active": false, "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" }, { + "id": 6, "name":"Chromebook - Mac", "active": false, "description":"Chromebook with Mac Keyboard", "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }], "defaultapps":[{ "name":"term", - "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { - "name":"eosterm", - "appnames": [ "io.elementary.terminal" ] + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], "de":[{ diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json index 191f4e8..8dbebf9 100644 --- a/kintox11/src/kinto.json +++ b/kintox11/src/kinto.json @@ -6,68 +6,64 @@ }, { "name":"term", - "run":"setxkbmap -option", + "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "de":[2], - "appnames":[ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { - "name":"eosterm", - "run":"setxkbmap -option", - "de":[], - "appnames":[ "io.elementary.terminal" ] + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "init": [1], "defaults":[{ + "id": 1, "name":"Windows", "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" - }, - { + }, + { + "id": 2, "name":"Mac - hid driver", "active": false, "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" - }, - { + }, + { + "id": 3, "name":"Mac Only", "active": true, "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" - }, - { + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + }, + { + "id": 4, "name":"Chromebook", "active": false, "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" - }, - { + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + }, + { + "id": 5, "name":"Chromebook - Windows", "active": false, "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - }, - { + }, + { + "id": 6, "name":"Chromebook - Mac", "active": false, "description":"Chromebook with Mac Keyboard", "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }], "defaultapps":[{ "name":"term", - "appnames": [ "Gnome-terminal","konsole","terminator","sakura","guake","tilda","xterm","eterm" ] - }, - { - "name":"eosterm", - "appnames": [ "io.elementary.terminal" ] + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] }], "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], "de":[{ @@ -77,24 +73,24 @@ "name":"gnome-init", "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", "run":"gsettings set org.gnome.mutter overlay-key ''" - }, - { + }, + { "id": 2, "type": "gnome3", "active": true, "name":"gnome-term", "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { + }, + { "id": 3, "type": "gnome3", "active": true, "name":"gnome-gui", "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { + }, + { "id": 4, "type": "kde5", "active": false, From b97b45ad2e04fd39b560ccff35c88fd57e224c77 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 00:23:50 -0600 Subject: [PATCH 21/29] - Updated json config files and readme file to reflect new changes --- README.md | 66 +++++------------------------------- kintox11/binary/default.json | 2 +- kintox11/binary/kinto.json | 2 +- kintox11/src/kinto.json | 2 +- 4 files changed, 11 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 6cc4c5d..a78484e 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ Kinto works for standard Windows, Apple and Chromebook keyboards. The following - Normal apps - Alt will be Ctrl, Win/Super will be Alt, Ctrl will be Win/Super -- Terminal apps (optional) - Alt will be Win/Super, Win/Super will be Alt, Ctrl will be Ctrl +- Terminal apps - Alt will be Ctrl+Shift, Win/Super will be Alt, Ctrl will be Ctrl -- New Features - Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts. +- Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts. ## What does Kinto require? @@ -83,91 +83,41 @@ Disable systemctl --user disable keyswap ``` -## Manually Toggling Kinto via hotkey - -I have not automated this part of the install due to the wide range of DE's and each one needing the shortcut setup to be a little different. - -Here's what you will want to do, if you want to set this up. - -1. Run a Status check on Kinto -``` -systemctl --user status keyswap -``` -and pay attention to the values that come after xactive.sh in the output. - -2. Run the following command, replacing the 4 values below with yours. -``` -~/.config/keyswap_toggle.sh win 0 0 0 -``` -3. Run this command a few more times and make sure it is swapping between "gui to term" and "term to gui" -4. Go into the DE system settings and bind the hotkeys you want to use to activate it. - - ## Learning macOS style hotkeys on Linux You can use websites like https://www.shortcutfoo.com in Google Chrome while using the terminal style keymap, but Firefox is not compatible due to detecting "cmd" as keycode 224. Chrome detects Win/Super/Cmd as keycode 91 on all OS's. To make sure you are in the terminal style keymap you can just simply open the terminal and turn off the kinto service, and then switch back to Chrome. ``` -systemctl --user stop keyswap +systemctl --user stop keyswap && setxkbmap -option;setxkbmap -option altwin:swap_alt_win ``` -or alternatively, you can follow the instructions about how to manually trigger a toggle of the keyswap. - ## Troubleshooting ### Keyswap is not occurring, but it was working. -Sometimes something about the Desktop Environment may throw xprop for a loop, it's rare, but if this occurs then you have 2 options. + +Now that Kinto is using a custom written C program I am not aware of any specific bugs or issues, but you can start here if you having difficulties and please report it if it is reproducible. + 1. Restart Kinto ``` systemctl --user restart keyswap ``` -2. Check the Status of Kinto and open a ticket with the output, especially if you can reliably reproduce the problem. +2. Check the Status of Kinto and open a ticket with the output. ``` systemctl --user status keyswap ``` -### Chromebook with external keyboard not being detected -If your keyboard is not being autodetected and configured then please run `xinput list`, if you are on linux, and copy the output into a ticket under issues. - ## Language Support I'd appreciate any help from people with non-US based keyboards, to help ensure that these keymaps and keyswap methods work in all or most languages. If you would like to attempt adding additional custom keymaps for other languages then I strongly recommend reading Glen Whitney's post here. https://superuser.com/questions/385748/binding-superc-superv-to-copy-and-paste - -## Known Issues - -### USB Hubs - -No longer an issue. USB hubs may prevent Apple keyboards from loading an official driver, but Kinto will adapt if this occurs. The benefit of an official Apple driver is that it can allow Kinto to support a mix of Windows and Mac based keyboards simultaneously. - -## Debugging - -You can output the xactive.sh script with parameters with following command. - -``` -cat ~/.config/systemd/user/keyswap.service -``` - -After that just stop the service as described and run the xactive.sh script with parameters. - -``` -systemctl --user disable keyswap -systemctl --user stop keyswap - -~/.config/xactive.sh mac 12 0 none -``` - -You can also refer to this Gist file to better understand what Kinto is doing and the simplicity of it. (The gist does not make use of any custom keymaps.) -https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb - ## Contributing I welcome any and all contributors who want to contribute something to this project. -If you are specifically wanting to contribute additional custom keymaps to help with aligning Kinto's behavior to that of a mac keyboard then I would strongly recommend that you read Glen Whitney's comment on Superuser (the link is below). You may also look at the .xkb directory, mac_worsewise.sh and xactive.sh files to better understand how Kinto operates so that you can test your own keymaps without having to use the systemd service or running the xactive.sh script. +If you are specifically wanting to contribute additional custom keymaps to help with aligning Kinto's behavior to that of a mac keyboard then I would strongly recommend that you read Glen Whitney's comment on Superuser (the link is below). You may also look at the .xkb directory, mac_wordwise.sh and xactive.sh files to better understand how Kinto operates so that you can test your own keymaps without having to use the systemd service or running the xactive.sh script. https://superuser.com/questions/385748/binding-superc-superv-to-copy-and-paste diff --git a/kintox11/binary/default.json b/kintox11/binary/default.json index 2d0dcd8..f6c224c 100644 --- a/kintox11/binary/default.json +++ b/kintox11/binary/default.json @@ -17,7 +17,7 @@ "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { "id": 2, diff --git a/kintox11/binary/kinto.json b/kintox11/binary/kinto.json index 8dbebf9..9ba0f50 100644 --- a/kintox11/binary/kinto.json +++ b/kintox11/binary/kinto.json @@ -17,7 +17,7 @@ "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { "id": 2, diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json index 8dbebf9..9ba0f50 100644 --- a/kintox11/src/kinto.json +++ b/kintox11/src/kinto.json @@ -17,7 +17,7 @@ "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;setxkbmap -option altwin:swap_alt_win" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" }, { "id": 2, From 1c6379c03775872a98328fdd6998fa5f422aa1f2 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 13:09:01 -0600 Subject: [PATCH 22/29] - WIP - Adding and updating new setup files --- .xkb/types/mac_term | 13 ---- kintox11/binary/default.json | 34 +++++++++-- kintox11/src/kinto.json | 34 +++++++++-- prekinto.py | 74 ++++++++++++++++++++++ setup.py | 115 +++++++++++++++++++++++++++++++++++ 5 files changed, 247 insertions(+), 23 deletions(-) delete mode 100644 .xkb/types/mac_term create mode 100644 prekinto.py create mode 100644 setup.py diff --git a/.xkb/types/mac_term b/.xkb/types/mac_term deleted file mode 100644 index ddfeb71..0000000 --- a/.xkb/types/mac_term +++ /dev/null @@ -1,13 +0,0 @@ -default partial xkb_types "addmac_levels" { - type "ALPHABETIC_SUPER" { - modifiers= Shift+Lock+Mod4; - map[Shift]= Level2; - map[Lock]= Level2; - map[Mod4]= Level3; - map[Shift+Mod4]= Level3; - map[Lock+Mod4]= Level3; - level_name[Level1]= "Base"; - level_name[Level2]= "Caps"; - level_name[Level3]= "With Super"; - }; -}; diff --git a/kintox11/binary/default.json b/kintox11/binary/default.json index f6c224c..1e003f1 100644 --- a/kintox11/binary/default.json +++ b/kintox11/binary/default.json @@ -17,7 +17,11 @@ "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 2, @@ -26,6 +30,10 @@ "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"", "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" }, { @@ -34,7 +42,11 @@ "active": true, "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(alt_super_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 4, @@ -42,7 +54,11 @@ "active": false, "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 5, @@ -51,7 +67,11 @@ "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" + "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 6, @@ -59,7 +79,11 @@ "active": false, "description":"Chromebook with Mac Keyboard", "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }], "defaultapps":[{ "name":"term", diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json index 9ba0f50..8def26b 100644 --- a/kintox11/src/kinto.json +++ b/kintox11/src/kinto.json @@ -17,7 +17,11 @@ "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 2, @@ -26,6 +30,10 @@ "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"", "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" }, { @@ -34,7 +42,11 @@ "active": true, "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(alt_super_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 4, @@ -42,7 +54,11 @@ "active": false, "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 5, @@ -51,7 +67,11 @@ "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" + "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }, { "id": 6, @@ -59,7 +79,11 @@ "active": false, "description":"Chromebook with Mac Keyboard", "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"" }], "defaultapps":[{ "name":"term", diff --git a/prekinto.py b/prekinto.py new file mode 100644 index 0000000..38eeb13 --- /dev/null +++ b/prekinto.py @@ -0,0 +1,74 @@ +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + CBOLD = '\033[1m' + CITALIC = '\033[3m' + CURL = '\033[4m' + CBLINK = '\033[5m' + CBLINK2 = '\033[6m' + CSELECTED = '\033[7m' + + CBLACK = '\033[30m' + CRED = '\033[31m' + CGREEN = '\033[32m' + CYELLOW = '\033[33m' + CBLUE = '\033[34m' + CVIOLET = '\033[35m' + CBEIGE = '\033[36m' + CWHITE = '\033[37m' + + CBLACKBG = '\033[40m' + CREDBG = '\033[41m' + CGREENBG = '\033[42m' + CYELLOWBG = '\033[43m' + CBLUEBG = '\033[44m' + CVIOLETBG = '\033[45m' + CBEIGEBG = '\033[46m' + CWHITEBG = '\033[47m' + + CGREY = '\033[90m' + CRED2 = '\033[91m' + CGREEN2 = '\033[92m' + CYELLOW2 = '\033[93m' + CBLUE2 = '\033[94m' + CVIOLET2 = '\033[95m' + CBEIGE2 = '\033[96m' + CWHITE2 = '\033[97m' + + CGREYBG = '\033[100m' + CREDBG2 = '\033[101m' + CGREENBG2 = '\033[102m' + CYELLOWBG2 = '\033[103m' + CBLUEBG2 = '\033[104m' + CVIOLETBG2 = '\033[105m' + CBEIGEBG2 = '\033[106m' + CWHITEBG2 = '\033[107m' + +def cmdline(command): + process = Popen( + args=command, + stdout=PIPE, + shell=True + ) + return process.communicate()[0] + +def copytree(src, dst, symlinks=False, ignore=None): + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + +def yn_choice(message, default='y'): + choices = 'Y/n' if default.lower() in ('y', 'yes') else 'y/N' + choice = input("%s (%s) " % (message, choices)) + values = ('y', 'yes', '') if choices == 'Y/n' else ('y', 'yes') + return choice.strip().lower() in values \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..027508c --- /dev/null +++ b/setup.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 + +import json +import os +from subprocess import PIPE, Popen +from shutil import copyfile +from prekinto import * + +print("\nKinto - Type in Linux like it's a Mac.\n") + +try: + f = open("default.json") +except IOError: + print("default.json file is missing. Will exit.\n") + exit() +f.close() + +try: + f = open("kinto.json") + rewrite = yn_choice("kinto.json already exists. Do you want to overwrite it with a new config?") + print("") + if(rewrite): + copyfile("default.json", "kinto.json") + else: + exit() +except IOError: + pass + copyfile("default.json", "kinto.json") +finally: + f.close() + +with open('kinto.json') as json_file: + data = json.load(json_file) + + for index, item in enumerate(data['defaulttypes']): + ossym = "" + color_arr = [bcolors.CBLUE,bcolors.CRED,bcolors.CGREEN] + if item == "windows": + ossym = u'\u2756' + elif item == "mac": + ossym = u'\u2318' + elif item == "chromebook": + ossym = u'\u2707' + print("%s %i. %s %s %s" % (color_arr[index], index+1, ossym, item.capitalize(), bcolors.ENDC)) + + default = 0 + while not int(default) in range(1,len(data['defaulttypes'])+1): + default = int(input(bcolors.CYELLOW + "Please enter your keyboard type (1 - " + str(len(data['defaulttypes'])) + ") : " + bcolors.ENDC)) + print("") + # print(data['defaulttypes'][default-1]) + + keyboardconfigs = [obj for obj in data['defaults'] if(obj['type'] == data['defaulttypes'][default-1])] + # print(len(keyboardconfigs)) + + # for k in keyboardconfigs: + for index, k in enumerate(keyboardconfigs): + print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) + print(bcolors.CYELLOW + 'Description: ' + k['description'] + bcolors.ENDC) + + # print(keyboardconfigs[0]['id']) + # print(keyboardconfigs[len(keyboardconfigs)-1]['id']) + print("") + defaultkb = 0 + while not int(defaultkb) in range(1,len(keyboardconfigs)+1): + defaultkb = int(input(bcolors.CYELLOW + "Please enter your keyboard config (1 - " + str(len(keyboardconfigs)) + ") : " + bcolors.ENDC)) + print("") + + if 'hack' in keyboardconfigs[defaultkb-1]: + print(bcolors.CYELLOW + "You have selected a keyboard config that needs the following command to be ran.\n" + bcolors.ENDC) + print(keyboardconfigs[defaultkb-1]['hack'].replace(";", "\n") + "\n") + runhack = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require sudo privileges. Will exit on No.)" + bcolors.ENDC) + if(runhack): + # keyboardconfigs[defaultkb-1]['hack'] + os.system('sudo hostname') + # else: + # exit() + + # Setup the selected keyboards config + copytree("./.xkb/","~/.xkb/") + os.system('setxkbmap -option') + os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui') + os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.term') + winmac = ["Windows","Mac - hid driver"] + if keyboardconfigs[defaultkb-1]['name'] in winmac: + + +# line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_symbols' | cut -f1 -d:) +# sed -ie "${line}s/\"/+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.gui +# sleep 1 +# line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:) +# sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.mac.gui +# sleep 1 +# line=$(cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:) +# sed -ie "${line}s/\"/+altwin(swap_alt_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.term + + +# Tweaks available for initialization (on boot) + +# Tweaks available while in gui keymap mode + +# Tweaks available while in terminal keymap mode + + +# "id": 2, +# "name":"Mac - hid driver", +# "active": false, +# "description":"Standard Mac Keyboards with Apple driver", +# "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", +# "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", +# "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", +# "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", +# "xkb_types_gui":"+mac_gui(addmac_levels)", +# "xkb_types_term":"", +# "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" + From 7b5b7a7f06d6a1e692477e8347927a041e3f9eb1 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 16:12:26 -0600 Subject: [PATCH 23/29] - Consolidating json config to the root, splitting json into 2 files --- kintox11/binary/default.json => defaults.json | 58 +------- kintox11/binary/kinto.json | 101 -------------- kintox11/src/kinto.json | 125 ------------------ user_config.json | 51 +++++++ 4 files changed, 58 insertions(+), 277 deletions(-) rename kintox11/binary/default.json => defaults.json (69%) delete mode 100644 kintox11/binary/kinto.json delete mode 100644 kintox11/src/kinto.json create mode 100644 user_config.json diff --git a/kintox11/binary/default.json b/defaults.json similarity index 69% rename from kintox11/binary/default.json rename to defaults.json index 1e003f1..9292244 100644 --- a/kintox11/binary/default.json +++ b/defaults.json @@ -1,19 +1,7 @@ -{"config":[{ - "name":"gui", - "run":"", - "de":[], - "appnames":[ "" ] - }, - { - "name":"term", - "run":"", - "de":[], - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], - "init": [], - "defaults":[{ +{"defaults":[{ "id": 1, "name":"Windows", + "type":"windows", "active": false, "description":"Standard Windows 104 Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", @@ -26,6 +14,7 @@ { "id": 2, "name":"Mac - hid driver", + "type":"mac", "active": false, "description":"Standard Mac Keyboards with Apple driver", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", @@ -39,6 +28,7 @@ { "id": 3, "name":"Mac Only", + "type":"mac", "active": true, "description":"Standard Mac Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", @@ -51,6 +41,7 @@ { "id": 4, "name":"Chromebook", + "type":"chromebook", "active": false, "description":"Standard Chromebook Keyboards", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", @@ -63,6 +54,7 @@ { "id": 5, "name":"Chromebook - Windows", + "type":"chromebook", "active": false, "description":"Chromebook with Windows 104 Keyboard", "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", @@ -76,6 +68,7 @@ { "id": 6, "name":"Chromebook - Mac", + "type":"chromebook", "active": false, "description":"Chromebook with Mac Keyboard", "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", @@ -84,42 +77,5 @@ "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", "xkb_types_gui":"+mac_gui(addmac_levels)", "xkb_types_term":"" - }], - "defaultapps":[{ - "name":"term", - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], - "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], - "de":[{ - "id": 1, - "type": "gnome3", - "active": false, - "name":"gnome-init", - "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", - "run":"gsettings set org.gnome.mutter overlay-key ''" - }, - { - "id": 2, - "type": "gnome3", - "active": false, - "name":"gnome-term", - "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 3, - "type": "gnome3", - "active": false, - "name":"gnome-gui", - "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 4, - "type": "kde5", - "active": false, - "name":"kde-init", - "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", - "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" }] } \ No newline at end of file diff --git a/kintox11/binary/kinto.json b/kintox11/binary/kinto.json deleted file mode 100644 index 9ba0f50..0000000 --- a/kintox11/binary/kinto.json +++ /dev/null @@ -1,101 +0,0 @@ -{"config":[{ - "name":"gui", - "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "de":[3], - "appnames":[ "" ] - }, - { - "name":"term", - "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "de":[2], - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], - "init": [1], - "defaults":[{ - "id": 1, - "name":"Windows", - "active": false, - "description":"Standard Windows 104 Keyboards", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" - }, - { - "id": 2, - "name":"Mac - hid driver", - "active": false, - "description":"Standard Mac Keyboards with Apple driver", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" - }, - { - "id": 3, - "name":"Mac Only", - "active": true, - "description":"Standard Mac Keyboards", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" - }, - { - "id": 4, - "name":"Chromebook", - "active": false, - "description":"Standard Chromebook Keyboards", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" - }, - { - "id": 5, - "name":"Chromebook - Windows", - "active": false, - "description":"Chromebook with Windows 104 Keyboard", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - }, - { - "id": 6, - "name":"Chromebook - Mac", - "active": false, - "description":"Chromebook with Mac Keyboard", - "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY" - }], - "defaultapps":[{ - "name":"term", - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], - "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], - "de":[{ - "id": 1, - "type": "gnome3", - "active": true, - "name":"gnome-init", - "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", - "run":"gsettings set org.gnome.mutter overlay-key ''" - }, - { - "id": 2, - "type": "gnome3", - "active": true, - "name":"gnome-term", - "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 3, - "type": "gnome3", - "active": true, - "name":"gnome-gui", - "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 4, - "type": "kde5", - "active": false, - "name":"kde-init", - "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", - "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" - }] -} \ No newline at end of file diff --git a/kintox11/src/kinto.json b/kintox11/src/kinto.json deleted file mode 100644 index 8def26b..0000000 --- a/kintox11/src/kinto.json +++ /dev/null @@ -1,125 +0,0 @@ -{"config":[{ - "name":"gui", - "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "de":[3], - "appnames":[ "" ] - }, - { - "name":"term", - "run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "de":[2], - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], - "init": [1], - "defaults":[{ - "id": 1, - "name":"Windows", - "active": false, - "description":"Standard Windows 104 Keyboards", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"" - }, - { - "id": 2, - "name":"Mac - hid driver", - "active": false, - "description":"Standard Mac Keyboards with Apple driver", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"", - "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" - }, - { - "id": 3, - "name":"Mac Only", - "active": true, - "description":"Standard Mac Keyboards", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "xkb_symbols_gui":"+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)", - "xkb_symbols_term":"+altwin(alt_super_win)+mac_term(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"" - }, - { - "id": 4, - "name":"Chromebook", - "active": false, - "description":"Standard Chromebook Keyboards", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"" - }, - { - "id": 5, - "name":"Chromebook - Windows", - "active": false, - "description":"Chromebook with Windows 104 Keyboard", - "gui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "fallbackgui":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"" - }, - { - "id": 6, - "name":"Chromebook - Mac", - "active": false, - "description":"Chromebook with Mac Keyboard", - "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY", - "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"" - }], - "defaultapps":[{ - "name":"term", - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] - }], - "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], - "de":[{ - "id": 1, - "type": "gnome3", - "active": true, - "name":"gnome-init", - "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", - "run":"gsettings set org.gnome.mutter overlay-key ''" - }, - { - "id": 2, - "type": "gnome3", - "active": true, - "name":"gnome-term", - "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 3, - "type": "gnome3", - "active": true, - "name":"gnome-gui", - "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", - "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 4, - "type": "kde5", - "active": false, - "name":"kde-init", - "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", - "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" - }] -} \ No newline at end of file diff --git a/user_config.json b/user_config.json new file mode 100644 index 0000000..f2b974c --- /dev/null +++ b/user_config.json @@ -0,0 +1,51 @@ +{"config":[{ + "name":"gui", + "run":"", + "de":[], + "appnames":[ "" ] + }, + { + "name":"term", + "run":"", + "de":[], + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] + }], + "init": [], + "defaultapps":[{ + "name":"term", + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] + }], + "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], + "de":[{ + "id": 1, + "type": ["gnome3"], + "active": false, + "name":"gnome-init", + "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", + "run":"gsettings set org.gnome.mutter overlay-key ''" + }, + { + "id": 2, + "type": ["gnome3"], + "active": false, + "name":"gnome-term", + "description":"Gnome - Terminal - Superkey+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 3, + "type": ["gnome3"], + "active": false, + "name":"gnome-gui", + "description":"Gnome - GUI - Ctrl+Space opens Activities Overview", + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 4, + "type": ["kde5"], + "active": false, + "name":"kde-init", + "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", + "run":"gsettings set org.gnome.mutter overlay-key '';kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure" + }] +} \ No newline at end of file From f8470df22a13b413fcc5dc97531074eef3dbfb3c Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 16:21:11 -0600 Subject: [PATCH 24/29] - Added notes for compiling kintox11 with static json-c library --- kintox11/src/kintox11.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kintox11/src/kintox11.c b/kintox11/src/kintox11.c index 6e44ff0..f5fb0a5 100644 --- a/kintox11/src/kintox11.c +++ b/kintox11/src/kintox11.c @@ -5,9 +5,12 @@ get the active window on X window system http://k-ui.jp/blog/2012/05/07/get-active-window-on-x-window-system/ */ -// To compile +// To compile without static libraries // gcc kintox11.c -lX11 -lXmu -ljson-c // +// To compile with static library json-c +// Make sure archive with object files exist ar -t /usr/local/lib/libjson-c.a +// gcc -L/usr/local/lib/ kintox11.c -ljson-c -lXmu -lXt -lX11 -o kintox11 // #include From 4c95a9d2eb1f0f533d2ca7e5172a5d2005407ef7 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 16:46:20 -0600 Subject: [PATCH 25/29] - Updated files to create service for kintox11 --- keyswap_service.sh | 44 ++++++--------------------- kintox11/binary/kintox11_ubuntu19-10 | Bin 236168 -> 236168 bytes kintox11/src/kintox11.c | 2 +- system-config/keyswap.service | 2 +- user_config.json | 2 +- 5 files changed, 13 insertions(+), 37 deletions(-) diff --git a/keyswap_service.sh b/keyswap_service.sh index a18a9cc..0f41f93 100755 --- a/keyswap_service.sh +++ b/keyswap_service.sh @@ -1,36 +1,12 @@ #!/bin/bash -swapbehavior=$1 -noswapcmd=$2 - -systemtype=$3 -internalid=$4 -usbid=$5 -chromeswap=$6 - -if [[ "$swapbehavior" == "1" ]]; then - swapcmd="\/bin\/bash\ \/home\/`whoami`\/.config\/xactive.sh\ ${systemtype}\ ${internalid}\ ${usbid}\ ${chromeswap}" - mkdir -p ~/.config/systemd/user - mkdir -p ~/.config/autostart - cp ./system-config/keyswap.service ~/.config/systemd/user/keyswap.service - cp ./system-config/keyswap.sh ~/.config/autostart/keyswap.sh - cp ./system-config/xactive.sh ~/.config/xactive.sh - cp ./system-config/keyswap_toggle.sh ~/.config/keyswap_toggle.sh - cp ./kintox11/binary/kintox11_ubuntu19-10 ~/.config/kintox11 - cp ./kintox11/binary/kinto.json ~/.config/kinto.json - 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 enable keyswap - systemctl --user start keyswap -else - #/usr/bin/setxkbmap - #/usr/bin/xkbcomp - #echo $XDG_SESSION_TYPE - if [ ! -f "~/.Xsession" ]; then - echo "$noswapcmd" > ~/.Xsession - fi - grep "xkb" ~/.Xsession 1>/dev/null - if [ $? -eq 1 ]; then - echo "$noswapcmd" >> ~/.Xsession - fi -fi \ No newline at end of file +swapcmd="\/bin\/bash\ \/home\/`whoami`\/.config\/kinto\/kintox11" +mkdir -p ~/.config/systemd/user +mkdir -p ~/.config/autostart +cp ./system-config/keyswap.service ~/.config/systemd/user/keyswap.service +cp ./system-config/keyswap.sh ~/.config/autostart/keyswap.sh +cp ./kintox11/binary/kintox11_ubuntu19-10 ~/.config/kinto/kintox11 +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 enable keyswap +systemctl --user start keyswap \ No newline at end of file diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11_ubuntu19-10 index fed97216cc9616a8407fd41139f62929f9eff4f2..6320156ba346b896548e0b5c7320de4f74a86fb2 100755 GIT binary patch delta 1243 zcmY*XYfzL`82+BK3oO?~z))CRN{C%RK$zt^T$fltaFvmYjQdT-&{EUT85t)Va2lyR z<>4|VwNloPWIe(sP+6e{mD5Z*Wm7n0VuFcXn1(Xh&d1gi-;d{g&hvind)~`wAMj}( z@agYW1^CV^i=MBw1=$A6{KrluUhU{u>CaEA4timhr}(<5QA4u>0@1?D0vZF+M?Z?v z;RSkC;2wTAs>TI@v|?=rzNN1Uw9)U@zD`{B)7JQ4e9e2}i5j!?wL~4x(UHUoG|`}> zB1H1WBp=`}zB{=UI7WX@DZqA~l^O;_^ZK+C1kZAxj9~%?AI}Pf$UT$&uDGWwM~^@0 zP);l^(rLl_sk>PZN{s?{(*l8Iw8E48s}p zA}z5zh-TVi(Zfo+EIOFzpe2%s=B`=7wKH2JX_wc(KTpv6@>B5=-I#x2`9z~6eUcmI zrQ|6{Ik!tED)@p&7gPZ|=;6XjX!z~I7-(+PDaEDVrmKq@HG7Ths-sr#rSC`!Jgb$r7uf;p`(Ta7bpvNn$iX!j>npJ(Pfi&eq+gHBiJF+ts{_4t??tFyFI*8jJ1g+5cA6=W1z{-HZJz0$-$ z_b&W57GM5lburOgD_SfuibvGB5nST24M*>Xj$ddyV(@%=XZ?=K+U?sKni_d|e>!-t z{lg^j%&MnPy1Lic#aP7G!dL#>rq!1Ib2MO+yUNARPdYwT5f{6>PX#p;azKr@6~dxj zaa|Go+z_L}Z!FsbMoh7-ikW7wcpx0JY{UbR*uZXh;DGRL@f6~e+~J9CSBx^FAIun) zoBgoU6PM-hLr_PQjFwQuFOq!^AYqa8he4yl4{Rs`#UjwnfO`DMnhmgui{CfE$Wo2) zV!s-&O5DB7C`!1+(iAhx>V|?k-hO%PSZ3YRl<`;8p3a&27W}iMOJf_*qqpAEtTcN^doG(7d1!H1Tag&JY}@ zpTz5NfPN=%7hi~fd<9m~@^v}*h8`1mj9yvyCh_d0u9R?m#a~Y$YE08N()9R{o=+=B zH4RHIhLJnd1AyE7*$fxZNpEKsqMqkw8G*IDcKs=Wy*waikl;@~k{bn~eLe3zQKvKC zfH^vlZ^k7$Bm8%%kHvsCY7+PiEfn|&t+yn=NRL`l@hkn(5|6L>yyXN!G8-gmCh;*z z(isXQX;3XmlD#c8lJ-8h9i!CW+6^DtYt0by*R4g7ef5$wO}9wWp<<)v#SvYL&ExS5 zVkzk$Ew!zMlRj@VppbUj^f1$Nwm7m-N58j4>!#`?soC$}%i}cIo`pknlYMygxKolY z6&U>#ox;q|n)RZC5uQ+33GAe8MHL|YMo|(plQl|n+1KcrVy9-;QgDQ}7ke~MRxh5M zpq(X?XyCgaiYDTDx*o2^JXLSZ~8(*=gO+lL${W1#8%ok%~kbR{1_6=xAj)Zqb=a1IDROl>r}6Q&p~R!twu6#^`fZxnXMrXFqUr+HbvB z=YON3Yn4_?q~=zqRUgj(@^fZ1z!k-29B^3l;IWp*Z{0ct>$qf)}O~ zBG4O2D%@asT9`1w8Wi&bJEBE2rrCKd;!wnX(qf-DtMe7)gnZZ+uX$mJnF3+KklYxE zCSP2ZuSTGTD2lcyq%1mn?#Ba*j@t;03g5DU7?g-a?^x90Dr<~|Llhp0T`YV}7}g&H z9W$5^&JLU4$E+qqiY{tRi#J|2iL?p%4->YjbpFc+mCF)g1un9lB=q9~D>I9f)2vl7 zZq{o?9(&0ww2_Q(oMREmf*)WuVVFKy@GikKYcc}lQz9f7WBnSpace']\"" + "run":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" }, { "id": 3, From 536e528196c38262d02f0875baf2a1cbac282138 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 2 Feb 2020 21:27:38 -0600 Subject: [PATCH 26/29] - Updated all setup files for kintox11 --- defaults.json | 7 +- keyswap_service.sh | 2 +- .../binary/{kintox11_ubuntu19-10 => kintox11} | Bin 236168 -> 236168 bytes kintox11/src/kintox11.c | 13 +- install.py => old-files/install.py | 0 prekinto.py | 17 -- setup.py | 210 +++++++++++------- user_config.json | 31 ++- 8 files changed, 161 insertions(+), 119 deletions(-) rename kintox11/binary/{kintox11_ubuntu19-10 => kintox11} (59%) rename install.py => old-files/install.py (100%) mode change 100644 => 100755 setup.py diff --git a/defaults.json b/defaults.json index 9292244..8af0ba8 100644 --- a/defaults.json +++ b/defaults.json @@ -1,4 +1,9 @@ -{"defaults":[{ +{"defaultapps":[{ + "name":"term", + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm" ] + }], + "defaulttypes":["windows","mac","chromebook"], + "defaults":[{ "id": 1, "name":"Windows", "type":"windows", diff --git a/keyswap_service.sh b/keyswap_service.sh index 0f41f93..b187909 100755 --- a/keyswap_service.sh +++ b/keyswap_service.sh @@ -5,7 +5,7 @@ mkdir -p ~/.config/systemd/user mkdir -p ~/.config/autostart cp ./system-config/keyswap.service ~/.config/systemd/user/keyswap.service cp ./system-config/keyswap.sh ~/.config/autostart/keyswap.sh -cp ./kintox11/binary/kintox11_ubuntu19-10 ~/.config/kinto/kintox11 +cp ./kintox11/binary/kintox11 ~/.config/kinto/kintox11 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 enable keyswap diff --git a/kintox11/binary/kintox11_ubuntu19-10 b/kintox11/binary/kintox11 similarity index 59% rename from kintox11/binary/kintox11_ubuntu19-10 rename to kintox11/binary/kintox11 index 6320156ba346b896548e0b5c7320de4f74a86fb2..6c1d9e4572f6968983f49b6b371a35473654a675 100755 GIT binary patch delta 46324 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