Compare commits
235 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
26bc4a203d | ||
![]() |
5a46aad268 | ||
![]() |
c66dcbca9a | ||
![]() |
72bedf856d | ||
![]() |
af2784865b | ||
![]() |
3d9d2524a2 | ||
![]() |
8848f8cbea | ||
![]() |
f5318c9807 | ||
![]() |
de42816a01 | ||
![]() |
1acc948fbc | ||
![]() |
7174904434 | ||
![]() |
b5ab41de9d | ||
![]() |
86582466cf | ||
![]() |
cc05da2f59 | ||
![]() |
2b9598c84f | ||
![]() |
7f9ccabf77 | ||
![]() |
2249c4538d | ||
![]() |
fb630a7d33 | ||
![]() |
28e5141079 | ||
![]() |
d29579e0a5 | ||
![]() |
dcd8191bfb | ||
![]() |
5b4269fc1f | ||
![]() |
1fc62a54da | ||
![]() |
4c8d8412b8 | ||
![]() |
6cb66a6b72 | ||
![]() |
7c36021642 | ||
![]() |
3622eeb279 | ||
![]() |
a82632fc63 | ||
![]() |
3d55b232a9 | ||
![]() |
d68ca6226c | ||
![]() |
9d5ac9142b | ||
![]() |
87a4c6934d | ||
![]() |
7b67a4988e | ||
![]() |
f0404299ac | ||
![]() |
894c7b7a69 | ||
![]() |
bcabd5d65b | ||
![]() |
ffab720b50 | ||
![]() |
57d430ae36 | ||
![]() |
49613ec470 | ||
![]() |
7c1f92db5b | ||
![]() |
329e821440 | ||
![]() |
046eaa05cd | ||
![]() |
7c0a431472 | ||
![]() |
1b2e7ab57b | ||
![]() |
ea78de7909 | ||
![]() |
dae728d04a | ||
![]() |
6578065024 | ||
![]() |
8f22bc63ff | ||
![]() |
1ed7fa5f73 | ||
![]() |
c9f7b81796 | ||
![]() |
4f259481f4 | ||
![]() |
3143f11d4b | ||
![]() |
520ea7683b | ||
![]() |
ba1471e397 | ||
![]() |
a00998b1e3 | ||
![]() |
cbb60668e3 | ||
![]() |
1a0c99a763 | ||
![]() |
0275669be1 | ||
![]() |
e741989128 | ||
![]() |
0adc44907c | ||
![]() |
7a2aac9d79 | ||
![]() |
3899fcf596 | ||
![]() |
f3df35662b | ||
![]() |
20c93600e1 | ||
![]() |
1ab00452b0 | ||
![]() |
c0bfec035f | ||
![]() |
712b2e0e69 | ||
![]() |
eb576a6217 | ||
![]() |
06180c3517 | ||
![]() |
8b07fb9037 | ||
![]() |
b34dc4e928 | ||
![]() |
7a07382d30 | ||
![]() |
2ffe639024 | ||
![]() |
8dc05e7ace | ||
![]() |
4c5cb36503 | ||
![]() |
8fdaaf592d | ||
![]() |
6b4c697dd0 | ||
![]() |
e2a767fbec | ||
![]() |
7fe9230b5f | ||
![]() |
1d088b2e1d | ||
![]() |
e63d8ee5b5 | ||
![]() |
e3d42651b7 | ||
![]() |
42c04d062e | ||
![]() |
ca54bf89d6 | ||
![]() |
772413a9c3 | ||
![]() |
bbd7b3fc93 | ||
![]() |
98120062eb | ||
![]() |
637a8fecaa | ||
![]() |
ad53b7034d | ||
![]() |
896c6fd6a1 | ||
![]() |
dbaf02f884 | ||
![]() |
79857af79c | ||
![]() |
53206855f4 | ||
![]() |
6298c6c9cc | ||
![]() |
318efcc3fd | ||
![]() |
2567f5006e | ||
![]() |
fd648d3850 | ||
![]() |
ac34350392 | ||
![]() |
8df691a52d | ||
![]() |
11f8e33fdf | ||
![]() |
7de111726b | ||
![]() |
5a12521b58 | ||
![]() |
ad196c4d6b | ||
![]() |
17a877c693 | ||
![]() |
0c3e03a81b | ||
![]() |
163117d4fb | ||
![]() |
4c8ae68027 | ||
![]() |
ed771f4ae4 | ||
![]() |
9d5c7b6230 | ||
![]() |
b85b786dcc | ||
![]() |
7904be6d5c | ||
![]() |
df5d2d8c0e | ||
![]() |
a556f1afa9 | ||
![]() |
61fe293af8 | ||
![]() |
3ac264ea99 | ||
![]() |
32111fe5a4 | ||
![]() |
dff590e7df | ||
![]() |
bc27f3c205 | ||
![]() |
4c820d9f67 | ||
![]() |
8e6f1962e0 | ||
![]() |
59521772af | ||
![]() |
099b3cea88 | ||
![]() |
e1b3911546 | ||
![]() |
7bf3ccdda3 | ||
![]() |
029d83ad5b | ||
![]() |
5da49257dc | ||
![]() |
b529a5b14a | ||
![]() |
fcb823bb2f | ||
![]() |
69acc58487 | ||
![]() |
50e6dfd863 | ||
![]() |
0843103eda | ||
![]() |
a52bf9959d | ||
![]() |
fbea226894 | ||
![]() |
e6db6a9726 | ||
![]() |
05b0694776 | ||
![]() |
d6c98a345c | ||
![]() |
bf84cb3153 | ||
![]() |
c98268c287 | ||
![]() |
a48246d3e3 | ||
![]() |
ad35946adb | ||
![]() |
3de9a1dd9d | ||
![]() |
6aa77a30a8 | ||
![]() |
376a7edd6f | ||
![]() |
e22cc5b6c7 | ||
![]() |
a7e6ff2374 | ||
![]() |
4cae4d2d6f | ||
![]() |
9d3cd94ca0 | ||
![]() |
9e379363d0 | ||
![]() |
e6b1793348 | ||
![]() |
ae36d7f955 | ||
![]() |
af9036ec24 | ||
![]() |
6a4ad3f92a | ||
![]() |
954049a251 | ||
![]() |
78efb69287 | ||
![]() |
49d9cee349 | ||
![]() |
da711e2421 | ||
![]() |
b2dd812f3f | ||
![]() |
39df46ff5e | ||
![]() |
45801d9ff0 | ||
![]() |
17db80f54c | ||
![]() |
a0cfff7395 | ||
![]() |
650ff78b92 | ||
![]() |
7c0e22e33f | ||
![]() |
48170b9ad7 | ||
![]() |
1626443290 | ||
![]() |
670d948ab0 | ||
![]() |
b5f533a83b | ||
![]() |
31d7c736b0 | ||
![]() |
268a1bdbff | ||
![]() |
c0b12f1627 | ||
![]() |
76e69ecc25 | ||
![]() |
bae786c3af | ||
![]() |
701bf25c69 | ||
![]() |
fc551d265b | ||
![]() |
4e428e79c1 | ||
![]() |
da1e38d751 | ||
![]() |
303023d90f | ||
![]() |
e4d710d5ae | ||
![]() |
3f5064c28c | ||
![]() |
00cc80036c | ||
![]() |
2f3e59b80c | ||
![]() |
ce125d4c1f | ||
![]() |
31baab1b34 | ||
![]() |
c442a0fceb | ||
![]() |
bd84ad9cfc | ||
![]() |
15f9195da6 | ||
![]() |
1743b7d46d | ||
![]() |
496240dfe1 | ||
![]() |
cb6cf4f886 | ||
![]() |
655a5f9027 | ||
![]() |
aff8253831 | ||
![]() |
1113378617 | ||
![]() |
6230c189fa | ||
![]() |
ca153cca93 | ||
![]() |
362c48953e | ||
![]() |
754b18066f | ||
![]() |
d8b1d2b684 | ||
![]() |
5593fdfe5a | ||
![]() |
315a6a0541 | ||
![]() |
0e53a36f99 | ||
![]() |
477d276639 | ||
![]() |
406f57e61b | ||
![]() |
4d5aba930f | ||
![]() |
2eb5a33b93 | ||
![]() |
f0f152e21f | ||
![]() |
696fb6ad7f | ||
![]() |
a66c82d84c | ||
![]() |
f134e9d13b | ||
![]() |
6eedd8b4f7 | ||
![]() |
162aa3e5d0 | ||
![]() |
c1e2db9a2e | ||
![]() |
3b802d1d49 | ||
![]() |
81ecd3f031 | ||
![]() |
a646ae8227 | ||
![]() |
21991b8479 | ||
![]() |
079cb6e54a | ||
![]() |
3f493c0472 | ||
![]() |
059f5bea26 | ||
![]() |
e1745c0362 | ||
![]() |
08e5a01a89 | ||
![]() |
5e0fccae5d | ||
![]() |
ac87e8f144 | ||
![]() |
4cbc665cd3 | ||
![]() |
d11598077d | ||
![]() |
7197b5bb39 | ||
![]() |
543a10884d | ||
![]() |
6c8bcb8d7c | ||
![]() |
7ec0b0ad7e | ||
![]() |
e885fa0033 | ||
![]() |
97e6ed076a | ||
![]() |
e3d693cfcd | ||
![]() |
a06d983b97 | ||
![]() |
eb691d5174 | ||
![]() |
5922e1b5a9 | ||
![]() |
f9e000ef23 |
4
.gitattributes
vendored
@@ -1,3 +1,3 @@
|
||||
*.py linguist-detectable=false
|
||||
*.py linguist-detectable=true
|
||||
*.json liguist-detectable=false
|
||||
*.c linguist-detectable=true
|
||||
*.c linguist-detectable=true
|
||||
|
17
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -19,21 +19,16 @@ A clear and concise description of what you expected to happen.
|
||||
**Branch:** master, dev
|
||||
**Commit:** git rev-parse --short HEAD
|
||||
|
||||
**Kinto Input Caret Status**
|
||||
```
|
||||
cat /tmp/kinto/caret
|
||||
Logs and status if relevant
|
||||
```
|
||||
# xkeysnail
|
||||
sudo systemctl status xkeysnail
|
||||
sudo journalctl --unit=xkeysnail.service -b
|
||||
|
||||
**Kinto Standard Log**
|
||||
```
|
||||
# xkb
|
||||
systemctl --user status keyswap
|
||||
journalctl --user-unit=keyswap.service -b
|
||||
```
|
||||
**Kinto Debug Log (1.0.6-2+)**
|
||||
```
|
||||
systemctl --user stop keyswap
|
||||
cd ~/.config/kinto
|
||||
./kintox11 --debug
|
||||
```
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
||||
.env/
|
||||
.DS_Store
|
||||
__pycache__/
|
||||
xkeysnail/
|
||||
keybindings_*
|
||||
mutter_*
|
||||
|
@@ -2,14 +2,14 @@ default partial xkb_symbols "mac_apple" {
|
||||
key <LWIN> {
|
||||
repeat= no,
|
||||
type= "ONE_LEVEL",
|
||||
symbols[Group1]= [ Hyper_L ],
|
||||
actions[group1]=[ SetMods(modifiers=Shift+Control) ]
|
||||
symbols[Group1]= [ Control_L ],
|
||||
actions[group1]=[ SetMods(modifiers=Control+Shift) ]
|
||||
};
|
||||
key <RWIN> {
|
||||
repeat= no,
|
||||
type= "ONE_LEVEL",
|
||||
symbols[Group1]= [ Hyper_R ],
|
||||
actions[group1]=[ SetMods(modifiers=Shift+Control) ]
|
||||
symbols[Group1]= [ Control_R ],
|
||||
actions[group1]=[ SetMods(modifiers=Control+Shift) ]
|
||||
};
|
||||
};
|
||||
partial xkb_symbols "mac_win" {
|
||||
@@ -104,14 +104,14 @@ partial xkb_symbols "mac_global" {
|
||||
Tab,
|
||||
Tab,
|
||||
// F13 // Default cmdtab
|
||||
// F14 // KDE cmdtab
|
||||
// F13 // KDE cmdtab
|
||||
// Right // Elementary ecmdtab
|
||||
],
|
||||
actions[Group1]= [
|
||||
NoAction(),
|
||||
NoAction(),
|
||||
// Redirect(key=<FK13>) // Default cmdtab
|
||||
// Redirect(key=<FK14>) // KDE cmdtab
|
||||
// Redirect(key=<FK13>,clearmods=Shift) // KDE cmdtab
|
||||
// Redirect(key=<RGHT>,mods=Control+Shift,clearmods=Mod4+Super) // Elementary cmdtab
|
||||
]
|
||||
};
|
||||
|
599
README.md
@@ -1,34 +1,73 @@
|
||||
# Kinto
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
[](https://github.com/rbreaves/kinto/releases/latest)
|
||||
|
||||
\- Type in Linux & Windows like it's a Mac. \-
|
||||
|
||||
Seamless copy and paste with all apps and terminals. Also the only linux remapper that is aware of your cursor/caret status - meaning it avoids shortcut conflicts within an app versus wordwise shortcuts when a text field is in use.
|
||||
Seamless copy and paste with all apps and terminals. The zero effort solution.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
[What does this do exactly?](#What-does-this-do-exactly)
|
||||
|
||||
[What does Kinto require?](#What-does-Kinto-require)
|
||||
|
||||
[How to install](#How-to-install)
|
||||
|
||||
[Shortcut Creation (Xkeysnail)](#Shortcut-Creation-Xkeysnail)
|
||||
|
||||
[Other Notes Related to Install](#Other-Notes-Related-to-Install)
|
||||
|
||||
[How to Upgrade/Control Kinto](#How-to-Upgrade-Kinto)
|
||||
|
||||
[Troubleshooting](#Troubleshooting)
|
||||
|
||||
[Language Support](#Language-Support)
|
||||
|
||||
[Related or Useful Resources](#Related-or-Useful-Resources)
|
||||
|
||||
[Contributing](#Contributing)
|
||||
|
||||
[More information about Kinto](#More-information-about-Kinto)
|
||||
|
||||
[License](#License)
|
||||
|
||||
[Credits and Contributions](#Credits-and-Contributions)
|
||||
|
||||
## What does this do exactly?
|
||||
|
||||
Kinto works for standard Windows, Apple and Chromebook keyboards. The following however describes the dynamic rebinding based on a standard Windows keyboard. (Alt location is Cmd for Apple keyboards)
|
||||
|
||||
- Normal apps - Alt → Ctrl, Win/Super → Alt, Ctrl → Win/Super
|
||||
|
||||
- Terminal apps - Alt → Ctrl+Shift, Win/Super → Alt, Ctrl → Ctrl
|
||||
Kinto works for standard Windows, Apple and Chromebook keyboards. The following however describes the dynamic rebinding based on a standard Windows/Mac keyboard.
|
||||
|
||||
- Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts.
|
||||
|
||||
**GUI**
|
||||
|**Physical**| Ctrl | Win/Alt | Alt/Cmd | Spacebar|
|
||||
|---|---|---|---|---|
|
||||
|**Virtual**| Win/Super* | Alt | RCtrl |Spacebar|
|
||||
|
||||
*Win/Super will properly remap to LCtrl when needed to fully support expected keymaps.
|
||||
|
||||
**Terminal**
|
||||
|**Physical**| Ctrl | Win/Alt | Alt/Cmd | Spacebar|
|
||||
|---|---|---|---|---|
|
||||
|**Virtual**| LCtrl | Alt | RCtrl |Spacebar|
|
||||
|
||||
Does Kinto have to have specific keymaps for individual apps?
|
||||
|
||||
I'd say 90+% of the time no, but every OS has their default conventions that sometimes run afoul to macs. For this reason you can easily edit kinto.py or kinto.ahk to support the few shortcut keys Kinto may miss. If you do add additional support please consider forking this project and sharing your new keymaps with the rest of us!
|
||||
|
||||
## What does Kinto require?
|
||||
|
||||
- Python (initial install only)
|
||||
- Python
|
||||
- systemd
|
||||
- x11
|
||||
- IBus*
|
||||
- Fedora/RHEL/Manjaro/Arch/Debian/Ubuntu based distro 16.04+
|
||||
|
||||
Binary is included and will be installed, but you can also compile kintox11.c on your system. You will need to compile and install json-c first as its libraries will be required to compile and run the program.
|
||||
- Manjaro/Arch/Debian/Ubuntu based distro 16.04+
|
||||
- Fedora/RHEL (may not work w/ xkeysnail, but original xkb version does)
|
||||
- xkeysnail (Recommended, but optional)
|
||||
|
||||
*IBus is needed to support wordwise during browser app usage as the keymap will need to change slightly depending if the cursor/caret is on screen waiting for input. Setup.py will set it but you can manually set it as well or check your current Input Method.
|
||||
|
||||
@@ -36,19 +75,27 @@ On most distros you can confirm navigate to your "Language Support" and set "Key
|
||||
|
||||
Wayland support is planned, but not ready yet.
|
||||
|
||||
## Kinto for Windows 10 Requirements
|
||||
### Kinto for Windows 10 Requirements
|
||||
|
||||
- WSL Ubuntu edition
|
||||
- [Git for Windows](https://git-scm.com/download/win)
|
||||
- Powershell - run as Administrator
|
||||
- Python3
|
||||
- [Python3](https://www.python.org/downloads/windows/)
|
||||
|
||||
Other programs that will be installed when you run ./setup.py
|
||||
- Chocolatey
|
||||
- Autohotkey
|
||||
|
||||
Does not have complete parity with the Linux edition, but it does work and can be built on and added to as needed. Modify ./windows/kinto.ahk if you want to add more WSL editions or other terminals.
|
||||
Note: Sublime Text users should disable screen rotation hotkeys as they will interfere with multi-cursor and possibly other combos. See https://windowsloop.com/disable-screen-rotation-keyboard-shortcut/ for details.
|
||||
|
||||
## How to install
|
||||
Does not have complete parity with the Linux edition, but it is getting very close now. Only lacks some Sublime Text 3 remaps at this point.
|
||||
|
||||
Users can now hotswap between Apple and Windows based keyboards without having to logoff and back on, and Windows is currently the only implementation with a system tray (but this feature is coming to Budgie, XFCE, Mate, Gnome, and lastly KDE).
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/10969616/84471498-100c7d00-ac4b-11ea-972d-60c1907831ec.png" width="50%">
|
||||
<img src="https://user-images.githubusercontent.com/10969616/84471501-10a51380-ac4b-11ea-9e0e-c19a7ebfad6d.png" width="50%">
|
||||
|
||||
|
||||
## How to install (Linux)
|
||||
|
||||
1. clone this repo
|
||||
```
|
||||
@@ -70,12 +117,70 @@ sudo apt install python3
|
||||
To Uninstall Kinto
|
||||
|
||||
```
|
||||
./uninstall.sh
|
||||
./setup.py
|
||||
```
|
||||
|
||||
## How to Install (Windows)
|
||||
|
||||
Video Tutorial: [How to Install Kinto.sh on Windows 10](https://youtu.be/sRk8A8krz40)
|
||||
|
||||
Install
|
||||
```
|
||||
python setup.py
|
||||
```
|
||||
|
||||
To Uninstall Kinto
|
||||
|
||||
```
|
||||
python setup.py
|
||||
```
|
||||
|
||||
## Shortcut Creation (Xkeysnail)
|
||||
|
||||
**GUI Keys**
|
||||
| Value| Description|Mac/Kinto Equivalent|
|
||||
| ----- |:--------:|:--------:|
|
||||
|C,Ctrl|Control|Cmd|
|
||||
|M,Alt| Alt/Option|Alt/Option|
|
||||
|Super | Win/Super|Ctrl|
|
||||
|
||||
**Terminal Keys**
|
||||
| Value| Description|Mac/Kinto Equivalent|
|
||||
| ----- |:--------:|:--------:|
|
||||
|RC,RCtrl|Right Control → Left & Right Alt/Cmd key|Cmd|
|
||||
|M,Alt|Alt/Option|Alt/Option|
|
||||
|LC,LCtrl |Left Control|Ctrl|
|
||||
|
||||
You can define new keymaps for your specific app via this method. You also do not have to cancel out the original keybinding if you do not need or want to, but you can do so with "pass_through_key".
|
||||
|
||||
### Defining Keymaps Per App
|
||||
```
|
||||
# Keybindings for Sublime Text
|
||||
define_keymap(re.compile("Sublime_text"),{
|
||||
K("C-h"): pass_through_key, # cancel replace
|
||||
K("Ctrl-Alt-f"): K("Ctrl-h"), # replace
|
||||
K("C-M-v"): [K("C-k"), K("C-v")], # paste_from_history
|
||||
}
|
||||
```
|
||||
|
||||
In the above example I am also showing that you can define a single shortcut to enact multiple shortcut keys if needed by defining an array of shortcuts to trigger.
|
||||
|
||||
You can also make changes to the file in your /tmp/kinto/xkeysnail/kinto.py location and see them take affect in real time, but for your changes to be permanent you will need to make your changes in the ~/.config/kinto/kinto.py location & restart the xkeysnail service.
|
||||
|
||||
```
|
||||
sudo systemctl restart xkeysnail
|
||||
```
|
||||
|
||||
More information can be seen on the readme page of [xkeysnail](https://github.com/mooz/xkeysnail).
|
||||
|
||||
## Shortcut Creation (XKB)
|
||||
The older xkb shortcut method info can be read about in ticket [#125](https://github.com/rbreaves/kinto/issues/125).
|
||||
|
||||
## Other Notes Related to Install
|
||||
|
||||
**Manjaro with Gnome there are issues.**
|
||||
**Manjaro with Gnome there are issues with caret/input checking.**
|
||||
|
||||
Only impacts back/forward hotkeys for web browsers.
|
||||
|
||||
Please see this ticket for more information.
|
||||
|
||||
@@ -108,325 +213,44 @@ git pull origin master
|
||||
|
||||
Under systemd this is how you control Kinto.
|
||||
|
||||
Kinto (xkb/x11) = keyswap
|
||||
|
||||
Kinto (udev/xkeysnail/x11) = xkeysnail
|
||||
|
||||
Status
|
||||
```
|
||||
systemctl --user status keyswap
|
||||
sudo systemctl status xkeysnail
|
||||
```
|
||||
|
||||
Stop (your keymap will return to normal)
|
||||
```
|
||||
systemctl --user stop keyswap
|
||||
sudo systemctl stop xkeysnail
|
||||
```
|
||||
|
||||
Start
|
||||
```
|
||||
systemctl --user start keyswap
|
||||
sudo systemctl start xkeysnail
|
||||
```
|
||||
|
||||
Restart
|
||||
```
|
||||
systemctl --user restart keyswap
|
||||
sudo systemctl restart xkeysnail
|
||||
```
|
||||
|
||||
Enable
|
||||
```
|
||||
systemctl --user enable keyswap
|
||||
sudo systemctl enable xkeysnail
|
||||
```
|
||||
|
||||
Disable
|
||||
```
|
||||
systemctl --user disable keyswap
|
||||
```
|
||||
|
||||
## How to Add Setxkbmap Option inside Kinto
|
||||
|
||||
To summarize you'll need to pull the partial out of the symbols file the option resides in and then add that to the mac_gui file and lastly reference it in the keymap file(s) you want it in.
|
||||
|
||||
symbols directory
|
||||
```
|
||||
/usr/share/X11/xkb/symbols/
|
||||
```
|
||||
|
||||
symbols file
|
||||
```
|
||||
~/.xkb/symbols/mac_gui
|
||||
```
|
||||
|
||||
keymap files
|
||||
```
|
||||
~/.xkb/keymap/kbd.mac.gui
|
||||
~/.xkb/keymap/kbd.mac.term
|
||||
```
|
||||
|
||||
A more detailed explaination is here.
|
||||
https://github.com/rbreaves/kinto/issues/50#issuecomment-595953373
|
||||
|
||||
## How to Add or Change keymaps for Applications
|
||||
|
||||
Note: All of the following is already done in Kinto (but may also change as improvements are made). The following is purely for documentation and example sake as they are real examples of how to leverage the json config to support additional keymaps.
|
||||
|
||||
**First it is important to understand how Kinto operates.**
|
||||
|
||||
1. It listens for any focus/active window changes
|
||||
2. It applies the proper keymap based on the programs name.
|
||||
3. It may monitor your caret/cursor input status, if the app is known to cause shortcut conflicts with wordwise
|
||||
4. It runs anywhere from 1 to 3 commands to fully remap your computer.
|
||||
|
||||
Ok great, we've covered the basics, now what are your options on modifying functionality?
|
||||
It depends.
|
||||
|
||||
Do you want to remap keys using xkb or xbindkeys with xdotool, or something else entirely?
|
||||
The choice is yours, but I'd recommend xbindkeys with xdotool for anyone that doesn't want to spend the time or learn xkb. I prefer xkb but it completely remaps your keyboard and it could break things if done poorly.
|
||||
|
||||
**How to Remap using XBindKeys with Xdotool - Firefox**
|
||||
|
||||
1. By default Firefox is mapped with the standard gui based xkb config, and only if no input has focus does it then run xbindkeys to map the Cmd+Left/Right arrow key location to the Back and Forwards functionality you'd expect.
|
||||
|
||||
2. The xbindkeys script takes into account the xkb mapping being the base because it is actually remapping Home and End to Back and Forwards as there is no real reason to reload an entire xkb layout.
|
||||
|
||||
~/.config/kinto/user_config.json
|
||||
```
|
||||
...
|
||||
{
|
||||
"name": "firefox",
|
||||
"run": "setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY",
|
||||
"run_onInput": "killall xbindkeys > /dev/null 2>&1",
|
||||
"run_offInput": "killall xbindkeys > /dev/null 2>&1;xbindkeys -f $HOME/.config/kinto/.firefox-nw",
|
||||
"symbols": "",
|
||||
"types": "",
|
||||
"de": [
|
||||
2
|
||||
],
|
||||
"appnames": [
|
||||
"Firefox"
|
||||
]
|
||||
},
|
||||
...
|
||||
```
|
||||
~/.config/kinto/.firefox-nw
|
||||
```
|
||||
"xdotool key --delay 0 --clearmodifiers Control_L+bracketleft"
|
||||
// Alt/Cmd + Left
|
||||
Home + Release
|
||||
|
||||
"xdotool key --delay 0 --clearmodifiers Control_L+bracketright"
|
||||
// Alt/Cmd + Right
|
||||
End + Release
|
||||
|
||||
# Note additional keymaps can easily be added to this file and I will accept any PR's with keymaps that align with macs
|
||||
```
|
||||
|
||||
Once you have made your changes you can restart the Kinto service and the changes will take affect.
|
||||
```
|
||||
systemctl --user restart keyswap
|
||||
```
|
||||
|
||||
Under normal circumstances this keymap would not have worked well had Firefox not included 2 keymap options for going forwards or back. In the next example, Chrome, you will see how to solve this very same problem but in xkb format and it is the only way to fix it for Chrome due to conflicting with wordwise shortcuts.
|
||||
|
||||
Also the choice of xdotool over something like xte (xautomation) was explicit, xdotool allows you to hold down a modifier and continue to repeat the action(s) and xte does not.
|
||||
|
||||
**How to Remap Using XKB - Chrome**
|
||||
|
||||
This gets to be a little more complicated, but this is what you have to do to accomplish the same on the xkb level.
|
||||
|
||||
**Summary**
|
||||
1. Copy ~/.xkb/keymap/kbd.mac.gui and append the name of the app. (e.g. chrome)
|
||||
2. Edit ~/.xkb/keymap/kbd.mac.gui.chrome
|
||||
3. Add new keybindings to ~/.xkb/symbols/mac_gui
|
||||
4. Only edit types if you absolutely need to add another modifier level (~/.xkb/types/mac_gui)
|
||||
|
||||
Understand that as you add or modify the ~/.xkb/symbols/ files that these two groups **symbols[Group1]** and **actions[Group1]** will be following the order of the modifier levels that are configured in the related ~/.xkb/types/mac_gui or mac_term file.
|
||||
|
||||
Also you will have to discover the proper xkb names for keys and that they will often follow *two different* labels/names. eg RGHT vs Right ... **replace key \<RGHT\>** vs **symbols[Group1]= [ Right, ...**.
|
||||
|
||||
A good place to get the proper names/labels are these two files.
|
||||
```
|
||||
/usr/share/X11/xkb/symbols/us
|
||||
/usr/share/X11/xkb/symbols/inet
|
||||
```
|
||||
|
||||
Ok, so here are the detailed instructions.
|
||||
|
||||
1. cp ~/.xkb/keymap/kbd.mac.gui ~/.xkb/keymap/kbd.mac.gui.chrome
|
||||
|
||||
2. nano ~/.xkb/keymap/kbd.mac.gui.chrome
|
||||
```
|
||||
# Change mac_gui(mac_levelssym)
|
||||
...
|
||||
xkb_symbols { include "pc+us+us:2+inet(evdev)+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)" };
|
||||
...
|
||||
# To +mac_gui(mac_chrome)
|
||||
xkb_symbols { include "pc+us+us:2+inet(evdev)+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_chrome)" };
|
||||
...
|
||||
};
|
||||
```
|
||||
|
||||
3. Add your new "partial xkb_symbols" via nano ~/.xkb/symbols/mac_gui
|
||||
```
|
||||
partial xkb_symbols "mac_chrome" {
|
||||
// Back Button
|
||||
replace key <LEFT> {
|
||||
type[Group1]= "ONE_LEVEL_CTRL",
|
||||
symbols[Group1]= [
|
||||
Left,
|
||||
Left,
|
||||
Left
|
||||
],
|
||||
actions[Group1]= [
|
||||
NoAction(),
|
||||
RedirectKey(key=<UP>),
|
||||
RedirectKey(key=<LEFT>,modifiers=Mod1,clearmods=Control)
|
||||
]
|
||||
};
|
||||
// Forwards Button
|
||||
replace key <RGHT> {
|
||||
type[Group1]= "ONE_LEVEL_CTRL",
|
||||
symbols[Group1]= [
|
||||
Right,
|
||||
Right,
|
||||
Right
|
||||
],
|
||||
actions[Group1]= [
|
||||
NoAction(),
|
||||
RedirectKey(key=<DOWN>),
|
||||
RedirectKey(key=<RGHT>,modifiers=Mod1,clearmods=Control)
|
||||
]
|
||||
};
|
||||
```
|
||||
|
||||
~/.config/kinto/user_config.json
|
||||
```
|
||||
{
|
||||
"name": "chrome",
|
||||
"run": "setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui.chrome $DISPLAY",
|
||||
"run_onInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY",
|
||||
"run_offInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui.chrome $DISPLAY",
|
||||
"symbols": "",
|
||||
"types": "",
|
||||
"de": [
|
||||
2
|
||||
],
|
||||
"appnames": [
|
||||
"Chromium",
|
||||
"Chromium-browser",
|
||||
"Google-chrome"
|
||||
]
|
||||
}
|
||||
```
|
||||
4. Not making changes to types but it looks like this. It contains 5 levels of modifiers, Base, Alt, Control, Shift+Control, and Shift+Alt. Additional Levels can and may be added later, but please do not change the order of the Levels or existing symbols files will break!! You can add new levels however without issue.
|
||||
```
|
||||
default partial xkb_types "addmac_levels" {
|
||||
type "ONE_LEVEL_CTRL" {
|
||||
modifiers= Mod1+Control+Shift;
|
||||
map[Mod1]= Level2;
|
||||
map[Control]= Level3;
|
||||
map[Mod1+Control]= Level3;
|
||||
map[Shift+Control]= Level4;
|
||||
map[Shift+Mod1] = Level5;
|
||||
level_name[Level1]= "Base";
|
||||
level_name[Level2]= "Alt";
|
||||
level_name[Level3]= "Control";
|
||||
level_name[Level4]= "Shift with Control";
|
||||
level_name[Level5] = "Shift Alt";
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
Once you have made your changes you can restart the Kinto service and the changes will take affect.
|
||||
```
|
||||
systemctl --user restart keyswap
|
||||
```
|
||||
|
||||
## JSON config files
|
||||
|
||||
Features
|
||||
- Unlimited keyboard configurations per App/category (user_config.json - config -> create app object)
|
||||
- Dynamic Desktop Environment shortcut capabilities (user_config.json - de -> create DE tweak/remap)
|
||||
|
||||
Located at ~/.config/kinto/ you will find user_config.json which will look like the following after an install. You can modify the defaults.json file in the root directory of kinto to create additional keyboard layout types/support without needing to modify any of the underlying Kinto code.
|
||||
|
||||
You can also add additional Desktop Environment related tweaks to user_config.json in the install directory as well and the installer will prompt you to install them. You may also fork and submit any json or additional .xkb configurations to me for approval if you believe it makes Linux more like typing on a Mac.
|
||||
|
||||
```
|
||||
{"config":[
|
||||
//
|
||||
// Each config category contains the category name, and references to the de tweaks
|
||||
// And contains the default run commands plus what behavior they should exhibit for
|
||||
// input fields on/off focus, if any.
|
||||
// Symbols and types are not currently used - may later replace the need for static
|
||||
// files with xkbcomp.
|
||||
//
|
||||
// If you use xbindkeys outside of Kinto then you may want to remove xbindkeys from
|
||||
// this config after setup or rewrite the command to exclude your own xbindkeys.
|
||||
//
|
||||
{
|
||||
"name":"gui",
|
||||
"run":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY",
|
||||
"de":[2],
|
||||
"appnames":[ "" ],
|
||||
"run_onInput":"",
|
||||
"run_offInput": "killall xbindkeys > /dev/null 2>&1",
|
||||
"symbols":"",
|
||||
"types":"",
|
||||
"de":[],
|
||||
"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","kitty" ],
|
||||
"run_onInput":"",
|
||||
"run_offInput": "killall xbindkeys > /dev/null 2>&1",
|
||||
"symbols":"",
|
||||
"types":"",
|
||||
"de":[],
|
||||
"appnames":[ "" ]
|
||||
}],
|
||||
// Init - Array that references de objects by their ID and runs the "run" command
|
||||
// when the app initially runs.
|
||||
"init": [1],
|
||||
// detypes - DE's with support or planned support
|
||||
"detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"],
|
||||
// de - tweak objects and initial command to be ran on start.
|
||||
//
|
||||
// Intent - init or gui_term, to signify what type of tweak it is.
|
||||
// run, run_term, run_gui - run is only relevant for init, and the
|
||||
// other two relate to gui_term and running under those modes.
|
||||
"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_term":"",
|
||||
"run_gui":""
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"type": ["gnome3"],
|
||||
"active": false,
|
||||
"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 \"['<Control><Shift>Space']\"",
|
||||
"run_gui":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['<Ctrl>Space']\""
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"type": ["kde5"],
|
||||
"active": false,
|
||||
"intent":"init",
|
||||
"name":"kde-init",
|
||||
"description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu",
|
||||
"run":"kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure",
|
||||
"run_term":"",
|
||||
"run_gui":""
|
||||
}]
|
||||
}
|
||||
sudo systemctl disable xkeysnail
|
||||
```
|
||||
|
||||
## Learning macOS style hotkeys on Linux
|
||||
@@ -442,13 +266,25 @@ systemctl --user stop keyswap && setxkbmap -option;setxkbmap -option altwin:swap
|
||||
|
||||
### Does not start when you log in or after you reboot?
|
||||
|
||||
Kinto (xkb/x11) = keyswap
|
||||
|
||||
Kinto (udev/xkeysnail/x11) = xkeysnail
|
||||
|
||||
1. Check the status
|
||||
```
|
||||
systemctl --user status keyswap
|
||||
sudo systemctl status xkeysnail
|
||||
```
|
||||
2. Check the service journal
|
||||
```
|
||||
journalctl --user-unit=keyswap.service -b
|
||||
sudo journalctl --unit=xkeysnail.service -b
|
||||
```
|
||||
|
||||
Note: You can also watch your log live
|
||||
```
|
||||
journalctl -l --user-unit=keyswap.service -b
|
||||
sudo journalctl -l --unit=xkeysnail.service -b
|
||||
```
|
||||
|
||||
You may need to manually set your DISPLAY in the systemd service file. Normally it pulls in the proper DISPLAY value but if it doesn't you can try this.
|
||||
@@ -460,6 +296,8 @@ echo $DISPLAY
|
||||
```
|
||||
|
||||
nano ~/.config/systemd/user/keyswap.service
|
||||
|
||||
sudo nano /etc/systemd/system/xkeysnail.service
|
||||
```
|
||||
...
|
||||
[Service]
|
||||
@@ -473,18 +311,26 @@ If you continue to have issues then open a ticket and send me the info.
|
||||
|
||||
### Keyswap is not occurring, but it was working.
|
||||
|
||||
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.
|
||||
Kinto (xkb/x11) = keyswap
|
||||
|
||||
Kinto (udev/xkeysnail/x11) = xkeysnail
|
||||
|
||||
Now that Kinto (xkb/x11) 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. Get status
|
||||
```
|
||||
systemctl --user status keyswap
|
||||
sudo systemctl status xkeysnail
|
||||
```
|
||||
2. Restart Kinto
|
||||
```
|
||||
systemctl --user restart keyswap
|
||||
sudo systemctl restart xkeysnail
|
||||
```
|
||||
3. Check the Status again and open a ticket if you need to.
|
||||
```
|
||||
systemctl --user status keyswap
|
||||
sudo systemctl status xkeysnail
|
||||
```
|
||||
|
||||
You can also do the following to see if it is an actual issue with kintox11 not running or your service file.
|
||||
@@ -497,22 +343,139 @@ cd ~/.config/kinto
|
||||
|
||||
If all else fails you can now run Kinto in debug mode as of 1.0.6-2. The output will become more verbose and I'd recommend running this directly after stopping the service.
|
||||
|
||||
Kinto (xkb/x11)
|
||||
```
|
||||
systemctl --user stop keyswap
|
||||
cd ~/.config/kinto
|
||||
./kintox11 --debug
|
||||
```
|
||||
|
||||
Kinto (udev/xkeysnail)
|
||||
|
||||
Stop
|
||||
```
|
||||
sudo systemctl stop xkeysnail
|
||||
```
|
||||
nano ~/.config/kinto/xkeystart.sh
|
||||
|
||||
Remove the 2 instances of --quiet and resave
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
/usr/local/bin/xkeysnail --quiet --watch "$1" &
|
||||
|
||||
inotifywait -m -e close_write,moved_to,create -q "$1" |
|
||||
while read -r path; do
|
||||
/usr/bin/killall xkeysnail
|
||||
/usr/local/bin/xkeysnail --quiet --watch "$1" &
|
||||
done
|
||||
```
|
||||
Start
|
||||
```
|
||||
sudo systemctl start xkeysnail
|
||||
sudo systemctl status xkeysnail
|
||||
```
|
||||
|
||||
## 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
|
||||
|
||||
## Notes about Windows 10
|
||||
Sharpkeys was used to create the layout/reg files to swap the Ctrl, Win and Alt keys. Sharpkeys was not required however because the reg keys were extracted. Autohotkey is used to manage keyswaps needed for terminal usage. Autohotkey is also used to add additional mac like keybinds for Sublime text and can be used for other apps as well.
|
||||
## Related or Useful Resources
|
||||
|
||||
Microsoft is working on a new Powertoy Keyboard Manager that could be used with an easier to use GUI interface, but this approach should be fully sufficient for a mac like experience and autohotkeys appears to be more than capable enough to handle complex rebinding of any or most mac like shortcuts.
|
||||
[Xkeysnail](https://github.com/mooz/xkeysnail) by mooz
|
||||
|
||||
Yet another keyboard remapping tool for X environment
|
||||
|
||||
[mac-precision-touchpad](https://github.com/imbushuo/mac-precision-touchpad) by imbushuo
|
||||
|
||||
Windows 10 touchpad to precision touchpad driver
|
||||
|
||||
[fusuma](https://github.com/iberianpig/fusuma) by iberianpig
|
||||
|
||||
Multitouch gestures with libinput driver on Linux
|
||||
|
||||
[Facetime HD Camera for Linux](https://github.com/patjak/bcwc_pcie) by patjak
|
||||
|
||||
Linux driver for Facetime HD on macbooks
|
||||
|
||||
[Fluent Terminal - Windows only](https://github.com/felixse/FluentTerminal) by felixse
|
||||
|
||||
|
||||
A Terminal Emulator based on UWP and web technologies.
|
||||
|
||||
[PowerToys - Windows only](https://github.com/microsoft/PowerToys) by microsoft
|
||||
|
||||
Windows system utilities to maximize productivity
|
||||
|
||||
[AutoHotKey - Windows only](https://github.com/AutoHotkey/AutoHotkey) by AutoHotkey
|
||||
|
||||
AutoHotkey is a powerful and easy to use scripting language for desktop automation on Windows.
|
||||
|
||||
[pykeymacs](https://github.com/zhanghai/pykeymacs) by zhanghai
|
||||
|
||||
Emacs style keyboard macros implemented in Python
|
||||
|
||||
[Dynamic Wallpapers](https://github.com/adi1090x/dynamic-wallpaper) by adi1090x
|
||||
|
||||
Simple bash script to set a Dynamic Wallpaper according to certain conditions.
|
||||
|
||||
[macify-linux](https://github.com/Jonchun/macify-linux) by JonChun
|
||||
|
||||
Automated setup scripts to transform Linux into macOS. (Uses Kinto for key remaps)
|
||||
|
||||
[ibus-typing-booster](https://github.com/mike-fabian/ibus-typing-booster) by mike-fabian
|
||||
|
||||
ibus-typing-booster is a completion input method for faster typing
|
||||
|
||||
[twemoji color font](https://github.com/eosrei/twemoji-color-font) by eosrei
|
||||
|
||||
Twitter Unicode 12 emoji color SVGinOT font for Linux/MacOS/Windows
|
||||
|
||||
[iTerm2 Color Schemes](https://github.com/mbadolato/iTerm2-Color-Schemes) by mbadolato
|
||||
|
||||
Over 225 terminal color schemes/themes for iTerm/iTerm2. Includes ports to Terminal, Konsole, PuTTY, Xresources, XRDB, Remmina, Termite, XFCE, Tilda, FreeBSD VT, Terminator, Kitty...
|
||||
|
||||
[espanso](https://github.com/federico-terzi/espanso) by federico-terzi
|
||||
|
||||
Cross-platform Text Expander written in Rust
|
||||
|
||||
[GalliumOS](https://github.com/GalliumOS/galliumos-distro) by GalliumOS
|
||||
|
||||
Docs, issues, and artwork sources for GalliumOS
|
||||
|
||||
[eOS-X](https://github.com/ipproductions/eOS-X) by ipproductions
|
||||
|
||||
Dark & Light Theme w/ OSX controls for Elementary OS
|
||||
|
||||
[Autorandr](https://github.com/phillipberndt/autorandr) by phillipberndt
|
||||
|
||||
Auto-detect the connected display hardware and load the appropriate X11 setup using xrandr
|
||||
|
||||
[Barrier](https://github.com/debauchee/barrier) by debauchee
|
||||
|
||||
Open-source KVM software
|
||||
|
||||
[Synergy Free Binaries](https://github.com/amankhoza/synergy-binaries) by amankhoza
|
||||
|
||||
The latest freely available Synergy binaries
|
||||
|
||||
[Synergy Official](https://symless.com/) by Symless
|
||||
|
||||
Latest Official Synergy
|
||||
|
||||
[Karabiner-Elements](https://github.com/pqrs-org/Karabiner-Elements) by pqrs-org
|
||||
|
||||
Karabiner-Elements is a powerful utility for keyboard customization on macOS Sierra (10.12) or later.
|
||||
|
||||
[mbpfan](https://github.com/linux-on-mac/mbpfan) by linux-on-mac
|
||||
|
||||
A simple daemon to control fan speed on all MacBook/MacBook Pros (probably all Apple computers) for Linux Kernel 3 and newer
|
||||
|
||||
[vala-panel](https://github.com/rilian-la-te/vala-panel) by rilian-la-te
|
||||
|
||||
Vala rewrite of SimplePanel - GitHub mirror (Global Menu for XFCE)
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -535,7 +498,7 @@ GPL v2
|
||||
|
||||
I would just like to thank a few people here directly that have helped me tremendously with completing this project and without their support, direct, indirect or otherwise I would have had difficulty completing this undertaking. I will list these things off in chronological order mostly.
|
||||
|
||||
First off I'd like to thank the Stackoverflow and Stackexchange community. I have probably rubbed some mods the wrong way over there, but the people from the community in general are extremely helpful and gracious and without their contributions would have made this much more difficult. The person I'd like to thank most though from over there is Glen Whitney. Without his detailed explaining of how to rebind keys in xkb this would not have come together at all, as every other remapping solution were non-starters as complexity increases.
|
||||
First off I'd like to thank the Stackoverflow and Stackexchange community. I have probably rubbed some mods the wrong way over there, but the people from the community in general are extremely helpful and gracious and without their contributions would have made this much more difficult. The person I'd like to thank most though from over there is Glen Whitney. Without his detailed explaining of how to rebind keys in xkb this would not have come together at all, as every other remapping solution were non-starters as complexity increases. *Kinto today no longer uses xkb, but Glen Whitney did provide the basis of a workable method that helped me pursue this method and think it was a worthwhile project to pursue, so for that I thank him.*
|
||||
|
||||
Secondarily I'd like to thank Christian Eriksson*, as he provided information that kept me up at night.. literally. Even after I implemented a similar bash script to one he had suggested I knew that fully implementing a c/c++ solution was where Kinto needed to head to and his explaination was better than I remember it being now that I have gone back to read it again. He also never provided a full implementation of a c/c++ solution - he did hit on the pain points pretty well of what one would need to do and watch out for. I am not sure where I got the first example code of implementing a c based solution, but he definitely went over it well.
|
||||
|
||||
@@ -544,8 +507,14 @@ Kui and his gist file** was really the c based solution that I found had the few
|
||||
|
||||
Lastly these four people were also very helpful to me as well. @probonopd for being one of the first people to install and use Kinto and gave me the initial feedback to include wordwise support! He also has really great articles*** posted on HackerNews & Medium about UI/UX design. Another person I'd like to thank is @owzim, his feedback allowed me to rapidly iterate and fix several bugs to support additional platforms better. The last two are members of the #ubuntu channel in IRC on freenode, tarzeau ( @alexmyczko ) and sarnold. Alex contributing a proper Makefile, so the project can be packaged properly, and sarnold help me find that IBus could resolve an issue I was having with needing to detect the caret status.
|
||||
|
||||
**Updated 6/13/2020**
|
||||
|
||||
I would also like to thank Jonathan Chun for his patience in helping me work through a very difficult problem related to Alt-Tab switching, which led to the current xkeysnail iteration of Kinto for Linux that far exceeds the original xkb implementation. There are also several others that have created issue tickets that have contributed greatly.
|
||||
|
||||
If I left anyone out then I apologize, that was not intentional. I am happy to say that this project is at a state of completion. Bug fixes will primarily be the only activity happening going forward and possibly a rewrite for Wayland at some point. Contributions as mentioned above are welcomed, and will be merged into master if they help with the goal of making typing on linux more like a mac.
|
||||
|
||||
*https://askubuntu.com/questions/1010276/can-i-act-on-the-event-that-a-window-opens-without-polling
|
||||
|
||||
**https://gist.github.com/kui/2622504
|
||||
|
||||
***https://medium.com/@probonopd/make-it-simple-linux-desktop-usability-part-1-5fa0fb369b42
|
||||
|
BIN
assets/kinto-black-invert.ico
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
assets/kinto-black.ico
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
assets/kinto-color-black-invert.ico
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
assets/kinto-color-black.ico
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
assets/kinto-color-invert-border.ico
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
assets/kinto-color-invert.ico
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
assets/kinto-color-white-invert.ico
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
assets/kinto-color.ico
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
assets/kinto-white-invert.ico
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
assets/kinto-white.ico
Normal file
After Width: | Height: | Size: 102 KiB |
344
keycheck.py
Executable file
@@ -0,0 +1,344 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# pip3 install pynput
|
||||
# pip3 install --no-deps pynput
|
||||
|
||||
# from pynput.keyboard import Key, Listener
|
||||
import sys, subprocess, time, os
|
||||
from subprocess import PIPE, Popen
|
||||
delay=3
|
||||
|
||||
def cmdline(command):
|
||||
process = Popen(
|
||||
args=command,
|
||||
stdout=PIPE,
|
||||
universal_newlines=True,
|
||||
shell=True
|
||||
)
|
||||
return process.communicate()[0]
|
||||
|
||||
class color:
|
||||
PURPLE = '\033[95m'
|
||||
CYAN = '\033[96m'
|
||||
DARKCYAN = '\033[36m'
|
||||
BLUE = '\033[94m'
|
||||
GREEN = '\033[92m'
|
||||
YELLOW = '\033[93m'
|
||||
RED = '\033[91m'
|
||||
BOLD = '\033[1m'
|
||||
UNDERLINE = '\033[4m'
|
||||
END = '\033[0m'
|
||||
|
||||
def countdown(secs):
|
||||
for i in range(0,secs):
|
||||
print(secs-i, end="\r", flush=True)
|
||||
time.sleep(1)
|
||||
|
||||
def on_press(key):
|
||||
print('{0} pressed'.format(key))
|
||||
|
||||
def on_release(key):
|
||||
# print('{0} release'.format(key))
|
||||
if key == Key.esc:
|
||||
# Stop listener
|
||||
return False
|
||||
|
||||
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
|
||||
|
||||
modifier_keys = {
|
||||
"primary":"",
|
||||
"secondary":"",
|
||||
"rprimary":"",
|
||||
"rsecondary":"",
|
||||
"capslock":"",
|
||||
"capswap":""
|
||||
}
|
||||
|
||||
def set_key(key):
|
||||
global modifier_keys
|
||||
print("\nWhich key would you like to set?\n")
|
||||
|
||||
while True:
|
||||
try:
|
||||
keytype = int(input(
|
||||
"1) Ctrl\n" +
|
||||
"2) Alt\n" +
|
||||
"3) Super/Win/Cmd/Chrome search key\n"))
|
||||
if keytype < 4 and keytype > 0:
|
||||
break
|
||||
except:
|
||||
print("That's not a valid option!")
|
||||
print("")
|
||||
if keytype == 1:
|
||||
modifier_keys[key] = "Ctrl"
|
||||
elif keytype == 2:
|
||||
modifier_keys[key] = "Alt"
|
||||
elif keytype == 3:
|
||||
modifier_keys[key] = "Cmd"
|
||||
|
||||
def set_cap():
|
||||
global modifier_keys
|
||||
print("\nWhich key would you like to swap?\n")
|
||||
|
||||
while True:
|
||||
try:
|
||||
keytype = int(input(
|
||||
"1) Ctrl (swap)\n" +
|
||||
"2) Ctrl (duplicate)\n" +
|
||||
"3) Esc (swap)\n"))
|
||||
if keytype < 4 and keytype > 0:
|
||||
break
|
||||
except:
|
||||
print("That's not a valid option!")
|
||||
print("")
|
||||
if keytype == 1:
|
||||
modifier_keys["capslock"] = "Ctrl-swap"
|
||||
elif keytype == 2:
|
||||
modifier_keys["capslock"] = "Ctrl-dup"
|
||||
elif keytype == 3:
|
||||
modifier_keys["capswap"] = "Escape"
|
||||
|
||||
def is_primary(key):
|
||||
global modifier_keys
|
||||
if not (str(key).replace("Key.", "").title() == "Enter" or str(key).replace("Key.", "").title() == "Escape"):
|
||||
print(str(key).replace("Key.", "").title() + " will be remapped to Ctrl, the Cmd ⌘ key position.")
|
||||
# countdown(3)
|
||||
modifier_keys["primary"] = str(key).replace("Key.", "").title()
|
||||
elif str(key).replace("Key.", "").title() == "Escape":
|
||||
modifier_keys["primary"] = "Escape"
|
||||
# countdown(3)
|
||||
else:
|
||||
return True
|
||||
return False
|
||||
|
||||
def is_secondary(key):
|
||||
global modifier_keys
|
||||
if not (str(key).replace("Key.", "").title() == "Enter" or str(key).replace("Key.", "").title() == "Escape"):
|
||||
print(str(key).replace("Key.", "").title() + " will be remapped to Alt, the Option ⌥ key position.")
|
||||
# countdown(3)
|
||||
modifier_keys["secondary"] = str(key).replace("Key.", "").title()
|
||||
return False
|
||||
elif str(key).replace("Key.", "").title() == "Escape":
|
||||
modifier_keys["secondary"] = "Escape"
|
||||
# countdown(3)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def is_rprimary(key):
|
||||
global modifier_keys
|
||||
if not (str(key).replace("Key.", "").title() == "Enter" or str(key).replace("Key.", "").title() == "Escape"):
|
||||
print(str(key).replace("Key.", "").title() + " will be remapped to Ctrl, the Cmd ⌘ key position.")
|
||||
# countdown(3)
|
||||
modifier_keys["rprimary"] = str(key).replace("Key.", "").title()
|
||||
return False
|
||||
elif str(key).replace("Key.", "").title() == "Escape":
|
||||
modifier_keys["rprimary"] = "Escape"
|
||||
# countdown(3)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def is_rsecondary(key):
|
||||
global modifier_keys
|
||||
if not (str(key).replace("Key.", "").title() == "Enter" or str(key).replace("Key.", "").title() == "Escape"):
|
||||
print(str(key).replace("Key.", "").title() + " will be remapped to Alt, the Option ⌥ key position.")
|
||||
# countdown(3)
|
||||
modifier_keys["rsecondary"] = str(key).replace("Key.", "").title()
|
||||
return False
|
||||
elif str(key).replace("Key.", "").title() == "Escape":
|
||||
modifier_keys["rsecondary"] = "Escape"
|
||||
# countdown(3)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
print(color.UNDERLINE + color.YELLOW + "\n\nPlease ignore the FN key." + color.END + " FN cannot be remapped by software, some Thinkpads can swap it with Ctrl in the BIOS.\n")
|
||||
input("Press Enter to continue...\n\n")
|
||||
print(chr(27) + "[2J")
|
||||
|
||||
counter = 0
|
||||
|
||||
while True:
|
||||
|
||||
print(color.UNDERLINE + color.YELLOW + "\n\nPress the 1st key Left of the spacebar" + color.END + " (Press Esc to set manaully)\n")
|
||||
print(" 👇")
|
||||
print(" □ □ ▣ ░░░░░░░\n")
|
||||
# listener = Listener(on_release=is_primary,suppress=True)
|
||||
# listener.start()
|
||||
|
||||
# with Listener(
|
||||
# on_release=is_primary,suppress=True) as listener:
|
||||
# try:
|
||||
# listener.join()
|
||||
# except MyException as e:
|
||||
# print('{0} was pressed'.format(e.args[0]))
|
||||
|
||||
modifier_keys["primary"] = cmdline("xbindkeys -k | awk 'END {print $NF}'").strip()
|
||||
print(modifier_keys["primary"] + " will be remapped to Ctrl, the Cmd ⌘ key position.")
|
||||
|
||||
if modifier_keys["primary"] != "Escape":
|
||||
choice = yn_choice("Is this correct?")
|
||||
if(choice):
|
||||
# print("Left Physical " + modifier_keys["primary"] + " = Ctrl/Cmd ⌘")
|
||||
# listener.stop()
|
||||
# input("Press Enter to continue...\n\n")
|
||||
break
|
||||
else:
|
||||
set_key("primary")
|
||||
print("Left Physical " + modifier_keys["primary"] + " = Ctrl/Cmd ⌘\n")
|
||||
# listener.stop()
|
||||
input("Press Enter to continue...\n\n")
|
||||
break
|
||||
counter += 1
|
||||
print(str(counter)+"\n")
|
||||
time.sleep(1)
|
||||
|
||||
print(chr(27) + "[2J")
|
||||
|
||||
while True:
|
||||
print(color.UNDERLINE + color.YELLOW + "\n\nPress the 2nd key Left of the spacebar" + color.END + " (Press Esc to set manaully)\n")
|
||||
print(" 👇")
|
||||
print(" □ ▣ □ ░░░░░░░\n")
|
||||
|
||||
# with Listener(
|
||||
# on_release=is_secondary,suppress=True) as listener:
|
||||
# try:
|
||||
# listener.join()
|
||||
# except MyException as e:
|
||||
# print('{0} was pressed'.format(e.args[0]))
|
||||
modifier_keys["secondary"] = cmdline("xbindkeys -k | awk 'END {print $NF}'").strip()
|
||||
print(modifier_keys["secondary"] + " will be remapped to Alt, the Option ⌥ key position.")
|
||||
|
||||
if modifier_keys["secondary"] != "Escape":
|
||||
choice = yn_choice("Is this correct?")
|
||||
if(choice):
|
||||
# listener.stop()
|
||||
# print("Left Physical " + modifier_keys["secondary"] + " = Alt/Option ⌥")
|
||||
# input("Press Enter to continue...\n\n")
|
||||
break
|
||||
else:
|
||||
set_key("secondary")
|
||||
print("Left Physical " + modifier_keys["secondary"] + " = Alt/Option ⌥\n")
|
||||
# listener.stop()
|
||||
input("Press Enter to continue...\n\n")
|
||||
break
|
||||
|
||||
print(chr(27) + "[2J")
|
||||
|
||||
while True:
|
||||
print(color.UNDERLINE + color.YELLOW + "\n\nPress the 1st key Right of the spacebar" + color.END + " (Press Esc to set manaully)\n")
|
||||
print(" 👇")
|
||||
print(" ░░░░░░░ ▣ □")
|
||||
|
||||
# with Listener(
|
||||
# on_release=is_rprimary,suppress=True) as listener:
|
||||
# try:
|
||||
# listener.join()
|
||||
# except MyException as e:
|
||||
# print('{0} was pressed'.format(e.args[0]))
|
||||
modifier_keys["rprimary"] = cmdline("xbindkeys -k | awk 'END {print $NF}'").strip()
|
||||
print(modifier_keys["rprimary"] + " will be remapped to Ctrl, the Cmd ⌘ key position.")
|
||||
|
||||
if modifier_keys["rprimary"] != "Escape":
|
||||
choice = yn_choice("Is this correct?")
|
||||
if(choice):
|
||||
# listener.stop()
|
||||
# print("Right Physical " + modifier_keys["rprimary"] + " = Ctrl/Cmd ⌘")
|
||||
# input("Press Enter to continue...\n\n")
|
||||
break
|
||||
else:
|
||||
set_key("rprimary")
|
||||
print("Right Physical " + modifier_keys["rprimary"] + " = Ctrl/Cmd ⌘\n")
|
||||
# listener.stop()
|
||||
input("Press Enter to continue...\n\n")
|
||||
break
|
||||
|
||||
print(chr(27) + "[2J")
|
||||
|
||||
while True:
|
||||
print(color.UNDERLINE + color.YELLOW + "\n\nPress the 2nd key Right of the spacebar" + color.END + " (Press Esc to set manaully)\n")
|
||||
print(" 👇")
|
||||
print(" ░░░░░░░ □ ▣")
|
||||
|
||||
# with Listener(
|
||||
# on_release=is_rsecondary,suppress=True) as listener:
|
||||
# try:
|
||||
# listener.join()
|
||||
# except MyException as e:
|
||||
# print('{0} was pressed'.format(e.args[0]))
|
||||
modifier_keys["rsecondary"] = cmdline("xbindkeys -k | awk 'END {print $NF}'").strip()
|
||||
print(modifier_keys["rsecondary"] + " will be remapped to Alt, the Option ⌥ key position.")
|
||||
|
||||
if modifier_keys["rsecondary"] != "Escape":
|
||||
choice = yn_choice("Is this correct?")
|
||||
if(choice):
|
||||
# listener.stop()
|
||||
# print("Right Physical " + modifier_keys["rsecondary"] + " = Alt/Option ⌥")
|
||||
# modifier_keys["rsecondary"] = str(os.system("xbindkeys -k | awk 'END {print $NF}'"))
|
||||
break
|
||||
else:
|
||||
set_key("rsecondary")
|
||||
print("Right Physical " + modifier_keys["rsecondary"] + " = Alt/Option ⌥\n")
|
||||
# listener.stop()
|
||||
input("Press Enter to continue...\n\n")
|
||||
break
|
||||
|
||||
print(chr(27) + "[2J")
|
||||
|
||||
if not (modifier_keys["secondary"] == "Ctrl" or modifier_keys["secondary"] == "Control_R"):
|
||||
print(color.UNDERLINE + color.YELLOW + "GUI Usage (Physical Ctrl key)\n"+ color.END)
|
||||
print("Ctrl key will be mapped to Super. (Search key on chromebooks)")
|
||||
print("👇")
|
||||
print(" ▣ □ □ ░░░░░░░\n")
|
||||
|
||||
print("Note: Super may still activate Ctrl based shortcuts\n")
|
||||
print("at times depending on application or system level shortcuts.\n")
|
||||
print("This will only be done to align shortcuts to their expected functionality.\n")
|
||||
|
||||
input("Press Enter to continue...\n\n")
|
||||
# print(chr(27) + "[2J")
|
||||
|
||||
print(color.UNDERLINE + color.YELLOW + "Terminal Usage" + color.END + "\n")
|
||||
print("Ctrl key will be the Ctrl key.")
|
||||
print("👇")
|
||||
print(" ▣ □ □ ░░░░░░░\n")
|
||||
print("The Cmd ⌘ key position during terminal usage will usually be Ctrl+Shift.")
|
||||
print(" 👇 ")
|
||||
print(" □ □ ▣ ░░░░░░░\n")
|
||||
input("Press Enter to continue...\n")
|
||||
else:
|
||||
print("Chromebook detected.")
|
||||
|
||||
print(color.UNDERLINE + color.YELLOW + "GUI Usage\n"+ color.END)
|
||||
print("Search key (capslock position) on chromebooks will be Super\n")
|
||||
|
||||
print("Note: Super may still activate Ctrl based shortcuts")
|
||||
print("at times depending on application or system level shortcuts.\n")
|
||||
print("Efforts have been made though to use the physical Ctrl key")
|
||||
print("when it makes sense to do so, and more often than standard")
|
||||
print("keyboards. How it feels to type is more important than technical")
|
||||
print("accuracy.\n")
|
||||
print("If you believe an improvement can be made or an error was made")
|
||||
print("please let me know on github or you can fork this project.\n")
|
||||
|
||||
input("Press Enter to continue...\n\n")
|
||||
|
||||
print(color.UNDERLINE + color.YELLOW + "Terminal Usage" + color.END + "\n")
|
||||
print(" □ capslock/search key = Alt")
|
||||
print(" shift")
|
||||
print(" ▣ □ ░░░░░░░")
|
||||
print("☝️\n")
|
||||
|
||||
input("Press Enter to continue...\n\n")
|
||||
|
||||
print(chr(27) + "[2J")
|
||||
|
||||
choice = yn_choice(color.UNDERLINE + color.YELLOW + "Do you want to swap Capslock with another key?" + color.END + "\n","n")
|
||||
if(choice):
|
||||
set_cap()
|
@@ -98,6 +98,9 @@ int check_caret(){
|
||||
char *buffer = NULL;
|
||||
size_t size = 0;
|
||||
FILE *fp = fopen(fpname, "r");
|
||||
if (fp == NULL){
|
||||
return (0);
|
||||
}
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
rewind(fp);
|
||||
@@ -106,6 +109,7 @@ int check_caret(){
|
||||
buffer[size] = '\0';
|
||||
trimwhitespace(buffer);
|
||||
caretint = atoi(buffer);
|
||||
fclose(fp);
|
||||
if(caretint == 1){
|
||||
// printf("caret: %s\n", buffer);
|
||||
return 1;
|
||||
|
432
references/builtin-keyboard.json
Normal file
@@ -0,0 +1,432 @@
|
||||
{"scancode":"01",
|
||||
"eventcode":1,
|
||||
"eventname":"ESC"},
|
||||
{"scancode":"02",
|
||||
"eventcode":2,
|
||||
"eventname":"1"},
|
||||
{"scancode":"03",
|
||||
"eventcode":3,
|
||||
"eventname":"2"},
|
||||
{"scancode":"04",
|
||||
"eventcode":4,
|
||||
"eventname":"3"},
|
||||
{"scancode":"05",
|
||||
"eventcode":5,
|
||||
"eventname":"4"},
|
||||
{"scancode":"06",
|
||||
"eventcode":6,
|
||||
"eventname":"5"},
|
||||
{"scancode":"07",
|
||||
"eventcode":7,
|
||||
"eventname":"6"},
|
||||
{"scancode":"08",
|
||||
"eventcode":8,
|
||||
"eventname":"7"},
|
||||
{"scancode":"09",
|
||||
"eventcode":9,
|
||||
"eventname":"8"},
|
||||
{"scancode":"0a",
|
||||
"eventcode":10,
|
||||
"eventname":"9"},
|
||||
{"scancode":"0b",
|
||||
"eventcode":11,
|
||||
"eventname":"0"},
|
||||
{"scancode":"0c",
|
||||
"eventcode":12,
|
||||
"eventname":"MINUS"},
|
||||
{"scancode":"0d",
|
||||
"eventcode":13,
|
||||
"eventname":"EQUAL"},
|
||||
{"scancode":"0e",
|
||||
"eventcode":14,
|
||||
"eventname":"BACKSPACE"},
|
||||
{"scancode":"0f",
|
||||
"eventcode":15,
|
||||
"eventname":"TAB"},
|
||||
{"scancode":"10",
|
||||
"eventcode":16,
|
||||
"eventname":"Q"},
|
||||
{"scancode":"11",
|
||||
"eventcode":17,
|
||||
"eventname":"W"},
|
||||
{"scancode":"12",
|
||||
"eventcode":18,
|
||||
"eventname":"E"},
|
||||
{"scancode":"13",
|
||||
"eventcode":19,
|
||||
"eventname":"R"},
|
||||
{"scancode":"14",
|
||||
"eventcode":20,
|
||||
"eventname":"T"},
|
||||
{"scancode":"15",
|
||||
"eventcode":21,
|
||||
"eventname":"Y"},
|
||||
{"scancode":"16",
|
||||
"eventcode":22,
|
||||
"eventname":"U"},
|
||||
{"scancode":"17",
|
||||
"eventcode":23,
|
||||
"eventname":"I"},
|
||||
{"scancode":"18",
|
||||
"eventcode":24,
|
||||
"eventname":"O"},
|
||||
{"scancode":"19",
|
||||
"eventcode":25,
|
||||
"eventname":"P"},
|
||||
{"scancode":"1a",
|
||||
"eventcode":26,
|
||||
"eventname":"LEFTBRACE"},
|
||||
{"scancode":"1b",
|
||||
"eventcode":27,
|
||||
"eventname":"RIGHTBRACE"},
|
||||
{"scancode":"1c",
|
||||
"eventcode":28,
|
||||
"eventname":"ENTER"},
|
||||
{"scancode":"1d",
|
||||
"eventcode":29,
|
||||
"eventname":"LEFTCTRL"},
|
||||
{"scancode":"1e",
|
||||
"eventcode":30,
|
||||
"eventname":"A"},
|
||||
{"scancode":"1f",
|
||||
"eventcode":31,
|
||||
"eventname":"S"},
|
||||
{"scancode":"20",
|
||||
"eventcode":32,
|
||||
"eventname":"D"},
|
||||
{"scancode":"21",
|
||||
"eventcode":33,
|
||||
"eventname":"F"},
|
||||
{"scancode":"22",
|
||||
"eventcode":34,
|
||||
"eventname":"G"},
|
||||
{"scancode":"23",
|
||||
"eventcode":35,
|
||||
"eventname":"H"},
|
||||
{"scancode":"24",
|
||||
"eventcode":36,
|
||||
"eventname":"J"},
|
||||
{"scancode":"25",
|
||||
"eventcode":37,
|
||||
"eventname":"K"},
|
||||
{"scancode":"26",
|
||||
"eventcode":38,
|
||||
"eventname":"L"},
|
||||
{"scancode":"27",
|
||||
"eventcode":39,
|
||||
"eventname":"SEMICOLON"},
|
||||
{"scancode":"28",
|
||||
"eventcode":40,
|
||||
"eventname":"APOSTROPHE"},
|
||||
{"scancode":"29",
|
||||
"eventcode":41,
|
||||
"eventname":"GRAVE"},
|
||||
{"scancode":"2a",
|
||||
"eventcode":42,
|
||||
"eventname":"LEFTSHIFT"},
|
||||
{"scancode":"2b",
|
||||
"eventcode":43,
|
||||
"eventname":"BACKSLASH"},
|
||||
{"scancode":"2c",
|
||||
"eventcode":44,
|
||||
"eventname":"Z"},
|
||||
{"scancode":"2d",
|
||||
"eventcode":45,
|
||||
"eventname":"X"},
|
||||
{"scancode":"2e",
|
||||
"eventcode":46,
|
||||
"eventname":"C"},
|
||||
{"scancode":"2f",
|
||||
"eventcode":47,
|
||||
"eventname":"V"},
|
||||
{"scancode":"30",
|
||||
"eventcode":48,
|
||||
"eventname":"B"},
|
||||
{"scancode":"31",
|
||||
"eventcode":49,
|
||||
"eventname":"N"},
|
||||
{"scancode":"32",
|
||||
"eventcode":50,
|
||||
"eventname":"M"},
|
||||
{"scancode":"33",
|
||||
"eventcode":51,
|
||||
"eventname":"COMMA"},
|
||||
{"scancode":"34",
|
||||
"eventcode":52,
|
||||
"eventname":"DOT"},
|
||||
{"scancode":"35",
|
||||
"eventcode":53,
|
||||
"eventname":"SLASH"},
|
||||
{"scancode":"36",
|
||||
"eventcode":54,
|
||||
"eventname":"RIGHTSHIFT"},
|
||||
{"scancode":"37",
|
||||
"eventcode":55,
|
||||
"eventname":"KPASTERISK"},
|
||||
{"scancode":"38",
|
||||
"eventcode":56,
|
||||
"eventname":"LEFTALT"},
|
||||
{"scancode":"39",
|
||||
"eventcode":57,
|
||||
"eventname":"SPACE"},
|
||||
{"scancode":"40",
|
||||
"eventcode":58,
|
||||
"eventname":"CAPSLOCK"},
|
||||
{"scancode":"41",
|
||||
"eventcode":59,
|
||||
"eventname":"F1"},
|
||||
{"scancode":"42",
|
||||
"eventcode":60,
|
||||
"eventname":"F2"},
|
||||
{"scancode":"43",
|
||||
"eventcode":61,
|
||||
"eventname":"F3"},
|
||||
{"scancode":"44",
|
||||
"eventcode":62,
|
||||
"eventname":"F4"},
|
||||
{"scancode":"45",
|
||||
"eventcode":63,
|
||||
"eventname":"F5"},
|
||||
{"scancode":"46",
|
||||
"eventcode":64,
|
||||
"eventname":"F6"},
|
||||
{"scancode":"47",
|
||||
"eventcode":65,
|
||||
"eventname":"F7"},
|
||||
{"scancode":"48",
|
||||
"eventcode":66,
|
||||
"eventname":"F8"},
|
||||
{"scancode":"49",
|
||||
"eventcode":67,
|
||||
"eventname":"F9"},
|
||||
{"scancode":"50",
|
||||
"eventcode":68,
|
||||
"eventname":"F10"},
|
||||
{"scancode":"51",
|
||||
"eventcode":69,
|
||||
"eventname":"NUMLOCK"},
|
||||
{"scancode":"52",
|
||||
"eventcode":70,
|
||||
"eventname":"SCROLLLOCK"},
|
||||
{"scancode":"53",
|
||||
"eventcode":71,
|
||||
"eventname":"KP7"},
|
||||
{"scancode":"54",
|
||||
"eventcode":72,
|
||||
"eventname":"KP8"},
|
||||
{"scancode":"55",
|
||||
"eventcode":73,
|
||||
"eventname":"KP9"},
|
||||
{"scancode":"56",
|
||||
"eventcode":74,
|
||||
"eventname":"KPMINUS"},
|
||||
{"scancode":"57",
|
||||
"eventcode":75,
|
||||
"eventname":"KP4"},
|
||||
{"scancode":"58",
|
||||
"eventcode":76,
|
||||
"eventname":"KP5"},
|
||||
{"scancode":"59",
|
||||
"eventcode":77,
|
||||
"eventname":"KP6"},
|
||||
{"scancode":"5A",
|
||||
"eventcode":78,
|
||||
"eventname":"KPPLUS"},
|
||||
{"scancode":"5B",
|
||||
"eventcode":79,
|
||||
"eventname":"KP1"},
|
||||
{"scancode":"5C",
|
||||
"eventcode":80,
|
||||
"eventname":"KP2"},
|
||||
{"scancode":"5D",
|
||||
"eventcode":81,
|
||||
"eventname":"KP3"},
|
||||
{"scancode":"5E",
|
||||
"eventcode":82,
|
||||
"eventname":"KP0"},
|
||||
{"scancode":"5F",
|
||||
"eventcode":83,
|
||||
"eventname":"KPDOT"},
|
||||
{"scancode":"60",
|
||||
"eventcode":85,
|
||||
"eventname":"ZENKAKUHANKAKU"},
|
||||
{"scancode":"61",
|
||||
"eventcode":86,
|
||||
"eventname":"102ND"},
|
||||
{"scancode":"62",
|
||||
"eventcode":87,
|
||||
"eventname":"F11"},
|
||||
{"scancode":"63",
|
||||
"eventcode":88,
|
||||
"eventname":"F12"},
|
||||
{"scancode":"64",
|
||||
"eventcode":89,
|
||||
"eventname":"RO"},
|
||||
{"scancode":"65",
|
||||
"eventcode":90,
|
||||
"eventname":"KATAKANA"},
|
||||
{"scancode":"66",
|
||||
"eventcode":91,
|
||||
"eventname":"HIRAGANA"},
|
||||
{"scancode":"67",
|
||||
"eventcode":92,
|
||||
"eventname":"HENKAN"},
|
||||
{"scancode":"68",
|
||||
"eventcode":93,
|
||||
"eventname":"KATAKANAHIRAGANA"},
|
||||
{"scancode":"69",
|
||||
"eventcode":94,
|
||||
"eventname":"MUHENKAN"},
|
||||
{"scancode":"6A",
|
||||
"eventcode":95,
|
||||
"eventname":"KPJPCOMMA"},
|
||||
{"scancode":"6B",
|
||||
"eventcode":96,
|
||||
"eventname":"KPENTER"},
|
||||
{"scancode":"6C",
|
||||
"eventcode":97,
|
||||
"eventname":"RIGHTCTRL"},
|
||||
{"scancode":"6D",
|
||||
"eventcode":98,
|
||||
"eventname":"KPSLASH"},
|
||||
{"scancode":"6E",
|
||||
"eventcode":99,
|
||||
"eventname":"SYSRQ"},
|
||||
{"scancode":"6F",
|
||||
"eventcode":100,
|
||||
"eventname":"RIGHTALT"},
|
||||
{"scancode":"70",
|
||||
"eventcode":102,
|
||||
"eventname":"HOME"},
|
||||
{"scancode":"71",
|
||||
"eventcode":103,
|
||||
"eventname":"UP"},
|
||||
{"scancode":"72",
|
||||
"eventcode":104,
|
||||
"eventname":"PAGEUP"},
|
||||
{"scancode":"73",
|
||||
"eventcode":105,
|
||||
"eventname":"LEFT"},
|
||||
{"scancode":"74",
|
||||
"eventcode":106,
|
||||
"eventname":"RIGHT"},
|
||||
{"scancode":"75",
|
||||
"eventcode":107,
|
||||
"eventname":"END"},
|
||||
{"scancode":"76",
|
||||
"eventcode":108,
|
||||
"eventname":"DOWN"},
|
||||
{"scancode":"77",
|
||||
"eventcode":109,
|
||||
"eventname":"PAGEDOWN"},
|
||||
{"scancode":"78",
|
||||
"eventcode":110,
|
||||
"eventname":"INSERT"},
|
||||
{"scancode":"79",
|
||||
"eventcode":111,
|
||||
"eventname":"DELETE"},
|
||||
{"scancode":"7A",
|
||||
"eventcode":112,
|
||||
"eventname":"MACRO"},
|
||||
{"scancode":"7B",
|
||||
"eventcode":113,
|
||||
"eventname":"MUTE"},
|
||||
{"scancode":"7C",
|
||||
"eventcode":114,
|
||||
"eventname":"VOLUMEDOWN"},
|
||||
{"scancode":"7D",
|
||||
"eventcode":115,
|
||||
"eventname":"VOLUMEUP"},
|
||||
{"scancode":"7E",
|
||||
"eventcode":116,
|
||||
"eventname":"POWER"},
|
||||
{"scancode":"7F",
|
||||
"eventcode":117,
|
||||
"eventname":"KPEQUAL"},
|
||||
{"scancode":"80",
|
||||
"eventcode":118,
|
||||
"eventname":"KPPLUSMINUS"},
|
||||
{"scancode":"81",
|
||||
"eventcode":119,
|
||||
"eventname":"PAUSE"},
|
||||
{"scancode":"82",
|
||||
"eventcode":121,
|
||||
"eventname":"KPCOMMA"},
|
||||
{"scancode":"83",
|
||||
"eventcode":122,
|
||||
"eventname":"HANGUEL"},
|
||||
{"scancode":"84",
|
||||
"eventcode":123,
|
||||
"eventname":"HANJA"},
|
||||
{"scancode":"85",
|
||||
"eventcode":124,
|
||||
"eventname":"YEN"},
|
||||
{"scancode":"86",
|
||||
"eventcode":125,
|
||||
"eventname":"LEFTMETA"},
|
||||
{"scancode":"87",
|
||||
"eventcode":126,
|
||||
"eventname":"RIGHTMETA"},
|
||||
{"scancode":"88",
|
||||
"eventcode":127,
|
||||
"eventname":"COMPOSE"},
|
||||
{"scancode":"89",
|
||||
"eventcode":128,
|
||||
"eventname":"STOP"},
|
||||
{"scancode":"8A",
|
||||
"eventcode":140,
|
||||
"eventname":"CALC"},
|
||||
{"scancode":"8B",
|
||||
"eventcode":142,
|
||||
"eventname":"SLEEP"},
|
||||
{"scancode":"8C",
|
||||
"eventcode":143,
|
||||
"eventname":"WAKEUP"},
|
||||
{"scancode":"8D",
|
||||
"eventcode":155,
|
||||
"eventname":"MAIL"},
|
||||
{"scancode":"8E",
|
||||
"eventcode":156,
|
||||
"eventname":"BOOKMARKS"},
|
||||
{"scancode":"8F",
|
||||
"eventcode":157,
|
||||
"eventname":"COMPUTER"},
|
||||
{"scancode":"90",
|
||||
"eventcode":158,
|
||||
"eventname":"BACK"},
|
||||
{"scancode":"91",
|
||||
"eventcode":159,
|
||||
"eventname":"FORWARD"},
|
||||
{"scancode":"92",
|
||||
"eventcode":163,
|
||||
"eventname":"NEXTSONG"},
|
||||
{"scancode":"93",
|
||||
"eventcode":164,
|
||||
"eventname":"PLAYPAUSE"},
|
||||
{"scancode":"94",
|
||||
"eventcode":165,
|
||||
"eventname":"PREVIOUSSONG"},
|
||||
{"scancode":"95",
|
||||
"eventcode":166,
|
||||
"eventname":"STOPCD"},
|
||||
{"scancode":"96",
|
||||
"eventcode":172,
|
||||
"eventname":"HOMEPAGE"},
|
||||
{"scancode":"97",
|
||||
"eventcode":173,
|
||||
"eventname":"REFRESH"},
|
||||
{"scancode":"98",
|
||||
"eventcode":183,
|
||||
"eventname":"F13"},
|
||||
{"scancode":"99",
|
||||
"eventcode":184,
|
||||
"eventname":"F14"},
|
||||
{"scancode":"9A",
|
||||
"eventcode":185,
|
||||
"eventname":"F15"},
|
||||
{"scancode":"9B",
|
||||
"eventcode":217,
|
||||
"eventname":"SEARCH"},
|
||||
{"scancode":"9C",
|
||||
"eventcode":226,
|
||||
"eventname":"MEDIA"}
|
449
setup.py
@@ -1,11 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
import json, time, os, sys
|
||||
import json, time, os, sys, subprocess, shlex
|
||||
from shutil import copyfile
|
||||
from subprocess import PIPE, Popen
|
||||
from prekinto import *
|
||||
|
||||
homedir = os.path.expanduser("~")
|
||||
|
||||
def windows_setup():
|
||||
keymaps = ["Apple keyboard standard", "Windows keyboard standard","Uninstall"]
|
||||
for index, item in enumerate(keymaps):
|
||||
print(" %i. %s" % (index+1, item.capitalize()))
|
||||
default = 0
|
||||
while not int(default) in range(1,len(keymaps)+1):
|
||||
default = int(input("\nPlease enter your desired keymap (1 - " + str(len(keymaps)) + ") : "))
|
||||
print("")
|
||||
# Short DOS path notation
|
||||
path= cmdline('echo %cd%')[:-1]
|
||||
print("Copying autohotkey combinations for Terminals & Editors...")
|
||||
os.system("copy /Y " + path + "\\windows\\kinto.ahk " + path + "\\windows\\kinto-new.ahk")
|
||||
if default == 1:
|
||||
os.system('perl -pi -e "s/(; )(.*)(; MacModifiers)/$2$3/g" ./windows/kinto-new.ahk')
|
||||
# os.system("regedit " + path + "\\windows\\macbook_winctrl_swap.reg")
|
||||
elif default == 2:
|
||||
os.system('perl -pi -e "s/(; )(.*)(; WinModifiers)/$2$3/g" ./windows/kinto-new.ahk')
|
||||
# os.system("regedit " + path + "\\windows\\standard_ctrlalt_swap.reg")
|
||||
elif default == 3:
|
||||
os.system("regedit " + path + "\\windows\\remove_keyswap.reg")
|
||||
os.system("del /f .\\windows\\kinto-new.ahk")
|
||||
os.system("del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\"")
|
||||
os.system("taskkill /IM autohotkey.exe")
|
||||
os.system('rd /s /q %userprofile%\\.kinto')
|
||||
os.system('del "%userprofile%\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Startup\\kinto-start.vbs"')
|
||||
stvscode = yn_choice(bcolors.CYELLOW2 + "Would you like to use Sublime Text 3 keymaps in VS Code?\n" + bcolors.ENDC)
|
||||
if default > 0 and default < 3:
|
||||
print("Will now install chocolatey and autohotkey with elevated privileges...")
|
||||
print("This install will fail if you are not running with elevated privileges")
|
||||
os.system('powershell -executionpolicy bypass ".\\windows\\autohotkey.ps1"')
|
||||
os.system('refreshenv')
|
||||
print("\nWill now install Ubuntu Termimnal Theme as default...")
|
||||
os.system("regedit " + path + "\\windows\\theme_ubuntu.reg")
|
||||
os.system('robocopy '+ path + '\\assets "%userprofile%\\.kinto\\assets" /E')
|
||||
if(stvscode):
|
||||
os.system('perl -pi -e "s/(; )(.*)(; ST2CODE)/$2$3/g" ./windows/kinto-new.ahk')
|
||||
os.system('copy /Y ' + path + '\\windows\\kinto-start.vbs "%userprofile%\\.kinto\\kinto-start.vbs')
|
||||
os.system('copy /Y ' + path + '\\windows\\usb.vbs "%userprofile%\\.kinto\\usb.vbs"')
|
||||
os.system('copy /Y ' + path + '\\windows\\detectUSB.ahk "%userprofile%\\.kinto\\detectUSB.ahk"')
|
||||
os.system('mklink "%userprofile%\\Start Menu\\Programs\\Startup\\kinto-start.vbs" "%userprofile%\\.kinto\\kinto-start.vbs"')
|
||||
os.system('copy /Y '+ path + '\\windows\\NoShell.vbs "%userprofile%\\.kinto\\NoShell.vbs"')
|
||||
os.system('copy /Y '+ path + '\\windows\\toggle_kb.bat "%userprofile%\\.kinto\\toggle_kb.bat"')
|
||||
os.system('copy /Y '+ path + '\\windows\\kinto-new.ahk "%userprofile%\\.kinto\\kinto.ahk"')
|
||||
os.system("del /f .\\windows\\kinto-new.ahk")
|
||||
os.system("del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\"")
|
||||
os.system("%userprofile%\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Startup\\kinto-start.vbs")
|
||||
|
||||
# # print("\nPlease log off and back on for changes to take full effect.")
|
||||
print("If using WSL then please remember to right click on title bar -> Properties -> Edit Options -> Use Ctrl+Shift+C/V as Copy/Paste and enable it.")
|
||||
else:
|
||||
os.system("del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\"")
|
||||
|
||||
def cmdline(command):
|
||||
process = Popen(
|
||||
args=command,
|
||||
@@ -15,31 +67,55 @@ def cmdline(command):
|
||||
)
|
||||
return process.communicate()[0]
|
||||
|
||||
# check_x11 = cmdline("env | grep -i x11").strip()
|
||||
check_x11 = cmdline("(env | grep -i x11 || loginctl show-session \"$XDG_SESSION_ID\" -p Type) | awk -F= '{print $2}'").strip()
|
||||
|
||||
if len(check_x11) == 0:
|
||||
if os.name != 'nt':
|
||||
print("You are not using x11, please logout and back in using x11/Xorg")
|
||||
sys.exit()
|
||||
else:
|
||||
print("\nYou are detected as running Windows.")
|
||||
windows_setup()
|
||||
sys.exit()
|
||||
|
||||
distro = cmdline("awk -F= '$1==\"NAME\" { print $2 ;}' /etc/os-release").replace('"','').strip().split(" ")[0]
|
||||
dename = cmdline("./system-config/dename.sh").replace('"','').strip().split(" ")[0].lower()
|
||||
|
||||
run_pkg = ""
|
||||
|
||||
def requirements(pkgm):
|
||||
print(bcolors.CYELLOW + "You need to install some packages, " +run_pkg+ ", for Kinto to fully remap browsers during input focus.\n" + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + "You need to install some packages, " +run_pkg+ ", for Kinto to fully remap browsers during input focus.\n" + bcolors.ENDC)
|
||||
print("sudo " + pkgm + " " + run_pkg + "\n")
|
||||
run_install = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require sudo privileges.)\n" + bcolors.ENDC)
|
||||
run_install = yn_choice(bcolors.CYELLOW2 + "Would you like to run it now? (Will require sudo privileges.)\n" + bcolors.ENDC)
|
||||
if(run_install):
|
||||
os.system("sudo " + pkgm + run_pkg)
|
||||
print("\n")
|
||||
|
||||
def install_ibus():
|
||||
print(bcolors.CYELLOW + "You need to set IBus as the default Input Method for full word-wise support and re-run this installer.\n" + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW + "Confirm the IBus Setup by saying Yes and then closing the window.\n" + bcolors.ENDC)
|
||||
global distro
|
||||
print(bcolors.CYELLOW2 + "You need to set IBus as the default Input Method for full word-wise support and re-run this installer.\n" + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + "Confirm the IBus Setup by saying Yes and then closing the window.\n" + bcolors.ENDC)
|
||||
print("ibus-setup\n")
|
||||
print("im-config -n ibus\n")
|
||||
run_install = yn_choice(bcolors.CYELLOW + "Would you like to run it now? (Will require logoff and logon.)\n" + bcolors.ENDC)
|
||||
print("im-config -n ibus or im-chooser\n")
|
||||
run_install = yn_choice(bcolors.CYELLOW2 + "Would you like to run it now? (Will require logoff and logon.)\n" + bcolors.ENDC)
|
||||
if(run_install):
|
||||
os.system("ibus-setup")
|
||||
os.system("im-config -n ibus")
|
||||
print("\n")
|
||||
input("IBus has been set as the default Input Method.\nPress any key to exit and re-run after logoff & logon...")
|
||||
if distro=="fedora":
|
||||
os.system("ibus-setup")
|
||||
os.system("im-chooser")
|
||||
print("\n")
|
||||
print("IBus needs to have Input Method set to your language.")
|
||||
print("im-chooser needs IBus to be selected & closed.")
|
||||
input("Will need to log off and back on for it take effect...")
|
||||
else:
|
||||
os.system("ibus-setup")
|
||||
os.system("im-config -n ibus")
|
||||
print("\n")
|
||||
input("IBus has been set as the default Input Method.\nPress any key to exit and re-run after logoff & logon...")
|
||||
sys.exit()
|
||||
|
||||
def setShortcuts():
|
||||
distro = cmdline("awk -F= '$1==\"NAME\" { print $2 ;}' /etc/os-release").replace('"','').strip().split(" ")[0]
|
||||
global distro
|
||||
distroVersion = cmdline("awk -F= '$1==\"VERSION_ID\" { print $2 ;}' /etc/os-release").replace('"','').strip()
|
||||
|
||||
print("\nIf Kinto is already running it will be stopped...")
|
||||
@@ -50,12 +126,29 @@ def setShortcuts():
|
||||
addhotkeys = yn_choice("\nDo you want to apply system level shortcuts?")
|
||||
if(addhotkeys):
|
||||
distro = distro.lower()
|
||||
if dename == "gnome":
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['<Primary>F13','<Primary><Shift>F13','<Alt>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['<Primary>F14','<Primary><Shift>F14','<Alt><Shift>Tab']\"")
|
||||
if dename == "gnome" or dename == "mate" or dename == "budgie":
|
||||
cmdline('dconf dump /org/gnome/desktop/wm/keybindings/ > keybindings_`date +"%Y.%m.%d-%s"`.conf')
|
||||
cmdline('dconf dump /org/gnome/mutter/keybindings/ > mutter_`date +"%Y.%m.%d-%s"`.conf')
|
||||
if(kintotype == 1):
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['<Primary>Tools','<Alt>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['<Primary><Shift>Tools','<Alt><Shift>Tab']\"")
|
||||
else:
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['<Primary>F13','<Primary><Shift>F13','<Alt>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['<Primary>F14','<Primary><Shift>F14','<Alt><Shift>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['<Super>h','<Alt>F9']\"")
|
||||
#
|
||||
# Leaving run dialog disabled for now
|
||||
# Too slow on appearing, compared to the app menu
|
||||
#
|
||||
# if dename != "budgie":
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['<Primary><Shift>Space','<Primary>Space']\"")
|
||||
if distro == "ubuntu" and dename == "gnome":
|
||||
# else:
|
||||
# cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['<Alt>F1']\"")
|
||||
# cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-run-dialog \"['<Primary><Shift>Space','<Primary>Space']\"")
|
||||
cmdline("gsettings set org.gnome.shell.keybindings toggle-application-view \"['LaunchB']\"")
|
||||
if dename != "mate":
|
||||
cmdline("gsettings set org.gnome.mutter overlay-key ''")
|
||||
if (distro == "ubuntu" and dename == "gnome") or (distro == "ubuntu" and dename == "budgie") or (distro == "linux" and dename == "mate") or (distro == "ubuntu" and dename == "mate"):
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up \"['<Super>Up','<Super>Left']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down \"['<Super>Down','<Super>Right']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left ['']")
|
||||
@@ -72,8 +165,12 @@ def setShortcuts():
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left ['']")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right ['']")
|
||||
elif distro == "elementary" and dename == "gnome":
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['<Primary>F13','<Primary><Shift>F13','<Alt>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['<Primary>F14','<Primary><Shift>F14','<Alt><Shift>Tab']\"")
|
||||
if(kintotype == 1):
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['<Primary>Tools','<Alt>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['<Primary><Shift>Tools','<Alt><Shift>Tab']\"")
|
||||
else:
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['<Primary>F13','<Primary><Shift>F13','<Alt>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['<Primary>F14','<Primary><Shift>F14','<Alt><Shift>Tab']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings show-desktop \"['<Super>d','<Super>Down']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings toggle-maximized \"['<Alt>F10','<Super>Up']\"")
|
||||
cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['<Control><Shift>Space','<Super>Space']\"")
|
||||
@@ -83,8 +180,11 @@ def setShortcuts():
|
||||
cmdline('perl -pi -e "s/(\w.*)(\/\/ Default cmdtab)/\/\/ \$1\$2/g" ~/.xkb/symbols/mac_term')
|
||||
cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ Elementary cmdtab)/\$2\$3/g" ~/.xkb/symbols/mac_gui')
|
||||
cmdline('perl -pi -e "s/(\w.*)(\/\/ Default cmdtab)/\/\/ \$1\$2/g" ~/.xkb/symbols/mac_gui')
|
||||
elif distro == "galliumos" and dename == "xfce":
|
||||
print("Applying GalliumOS (xfce) shortcuts...")
|
||||
# elif distro == "budgie" and dename == "gnome":
|
||||
# print("Apply budgie shortcuts here")
|
||||
elif (dename == "xfce"):
|
||||
print("Applying xfce shortcuts...")
|
||||
cmdline('cp ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ./xfce4-keyboard-shortcuts_`date +"%Y.%m.%d-%s"`.xml')
|
||||
# Reset Show desktop
|
||||
cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/<Primary><Alt>d" --reset')
|
||||
cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/<Super>d" --create --type string --set "show_desktop_key"')
|
||||
@@ -124,111 +224,149 @@ def setShortcuts():
|
||||
cmdline("gsettings set org.gnome.mutter.keybindings toggle-tiled-left \"['<Super><Alt>Left']\"")
|
||||
# org.gnome.mutter.keybindings toggle-tiled-right ['<Super>Right']
|
||||
# org.gnome.mutter.keybindings toggle-tiled-left ['<Super>Left']
|
||||
elif distro == "manjaro linux" and dename == "kde":
|
||||
elif dename == "kde":
|
||||
# cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "krunner.desktop" --key "_launch","Alt+Space\tAlt+F2\tSearch,Alt+Space\tAlt+F2\tSearch,KRunner"')
|
||||
# Remove Alt+F3 Operations Menu - Sublimetext Select-All
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Window Operations Menu","none,Alt+F3,Window Operations Menu"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows" "Ctrl+F13,Alt+Tab,Walk Through Windows"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows (Reverse)" "Ctrl+Shift+F14,Alt+Shift+Backtab,Walk Through Windows (Reverse)"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Window Maximize" "Meta+Ctrl+F,Meta+PgUp,Maximize Window"')
|
||||
cmdline('cp ~/.config/kwinrc ./kwinrc_`date +"%Y.%m.%d-%s"`')
|
||||
cmdline('cp ~/.config/kglobalshortcutsrc ./kde_kglobalshortcutsrc_`date +"%Y.%m.%d-%s"`')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Switch to Previous Desktop" "Meta+Left,Meta+Left,Switch to Previous Desktop"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Window Operations Menu" "none,Alt+F3,Window Operations Menu"')
|
||||
if(kintotype == 1):
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows" "Ctrl+Tools,Alt+Tab,Walk Through Windows"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows (Reverse)" "Ctrl+Shift+Tools,Alt+Shift+Backtab,Walk Through Windows (Reverse)"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows of Current Application" "Alt+F6,none,Walk Through Windows of Current Application"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows of Current Application (Reverse)" "Alt+Shift+F6,none,Walk Through Windows of Current Application (Reverse)"')
|
||||
else:
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows" "Ctrl+F13,Alt+Tab,Walk Through Windows"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows (Reverse)" "Ctrl+Shift+F14,Alt+Shift+Backtab,Walk Through Windows (Reverse)"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows Alternative" "none,none,Walk Through Windows"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Maximize Window" "none,Meta+PgUp,Maximize Window"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Window Maximize" "Meta+Ctrl+F,Alt+F10,Maximize Window"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Minimize Window" "Meta+h,Meta+PgDown,Minimize Window"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Switch to Next Desktop" "Meta+Right,Meta+Right,Switch to Next Desktop"')
|
||||
cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Switch to Previous Desktop" "Meta+Left,Meta+Left,Switch to Previous Desktop"')
|
||||
cmdline('kquitapp5 kglobalaccel && sleep 2s && kglobalaccel5 &')
|
||||
os.system('kquitapp5 kglobalaccel && sleep 2s && kglobalaccel5 &')
|
||||
else:
|
||||
print('distro: ' + distro + ' de: ' + dename)
|
||||
print("A supported OS and DE was not found, you may not have full system level shortcuts installed.")
|
||||
print(bcolors.CRED2 + "A supported OS and DE was not found, you may not have full system level shortcuts installed." + bcolors.ENDC)
|
||||
print(bcolors.CRED2 + "You may want to find your DE or Window Manager settings and manually set Alt-Tab & other OS related shortcuts." + bcolors.ENDC)
|
||||
if dename == "gnome":
|
||||
# Apply dconf update to make updates survive reboots
|
||||
cmdline('dconf dump /org/gnome/desktop/wm/keybindings/ > tempkb.conf')
|
||||
cmdline('dconf dump /org/gnome/mutter/keybindings/ > tempmt.conf')
|
||||
cmdline('dconf load /org/gnome/desktop/wm/keybindings/ < tempkb.conf')
|
||||
cmdline('dconf load /org/gnome/mutter/keybindings/ < tempmt.conf')
|
||||
cmdline('sleep 1 && rm -f ./tempkb.conf;rm -f ./tempmt.conf')
|
||||
# cmdline('dconf update')
|
||||
|
||||
def windows_setup():
|
||||
keymaps = ["Apple keyboard standard", "Apple keyboard w/ Caps lock as Esc", "Windows keyboard standard", "Windows keyboard w/ Caps lock as Esc","Uninstall"]
|
||||
for index, item in enumerate(keymaps):
|
||||
print(" %i. %s" % (index+1, item.capitalize()))
|
||||
default = 0
|
||||
while not int(default) in range(1,len(keymaps)+1):
|
||||
default = int(input("\nPlease enter your desired keymap (1 - " + str(len(keymaps)) + ") : "))
|
||||
def Uninstall():
|
||||
print("You selected to Uninstall Kinto.\n")
|
||||
restore = yn_choice("\nYour DE is " + dename + ".\n\nY: Restore hotkeys from backup\nN: Reset OS/DE hotkeys\nWhich option would you prefer?")
|
||||
print("")
|
||||
path= cmdline('echo %cd%')[:-1]
|
||||
if default == 1:
|
||||
os.system("regedit " + path + "\\windows\\macbook_winctrl_swap.reg")
|
||||
elif default == 2:
|
||||
os.system("regedit " + path + "\\windows\\macbook_winctrl_capsesc_swap.reg")
|
||||
elif default == 3:
|
||||
os.system("regedit " + path + "\\windows\\standard_ctrlalt_swap.reg")
|
||||
elif default == 4:
|
||||
os.system("regedit " + path + "\\windows\\standard_ctrlalt_capsesc_swap.reg")
|
||||
elif default == 5:
|
||||
os.system("regedit " + path + "\\windows\\remove_keyswap.reg")
|
||||
if default > 0 and default < 5:
|
||||
print("Will now install chocolatey and autohotkey with elevated privileges...")
|
||||
print("This install will fail if you are not running with elevated privileges")
|
||||
os.system('powershell -executionpolicy bypass ".\\windows\\autohotkey.ps1"')
|
||||
print("\nWill now install Ubuntu Terminal Theme as default...")
|
||||
os.system("regedit " + path + "\\windows\\theme_ubuntu.reg")
|
||||
print("Copying autohotkey combinations for Terminals & Editors...")
|
||||
os.system("copy /Y " + path + "\\windows\\kinto.ahk \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\"")
|
||||
print("\nPlease log off and back on for changes to take full effect.")
|
||||
print("If using WSL then please remember to right click on title bar -> Properties -> Edit Options -> Use Ctrl+Shift+C/V as Copy/Paste and enable it.")
|
||||
if(restore):
|
||||
if dename == "gnome":
|
||||
print("Restoring DE hotkeys...")
|
||||
wmkeys = cmdline('ls | grep -m1 "keybinding"')
|
||||
mutterkeys = cmdline('ls | grep -m1 "mutter_"')
|
||||
if len(wmkeys) > 0:
|
||||
print('dconf load /org/gnome/desktop/wm/keybindings/ < ' + wmkeys)
|
||||
cmdline('dconf load /org/gnome/desktop/wm/keybindings/ < ' + wmkeys)
|
||||
else:
|
||||
print('Gnome Desktop keybindings backup not found...')
|
||||
if len(mutterkeys) > 0:
|
||||
print('dconf load /org/gnome/mutter/keybindings/ < ' + mutterkeys)
|
||||
cmdline('dconf load /org/gnome/mutter/keybindings/ < ' + mutterkeys)
|
||||
if len(wmkeys) > 0 or len(mutterkeys) > 0:
|
||||
print("Gnome hotkeys have been successfully restored.")
|
||||
elif dename == "kde":
|
||||
print("Restoring DE hotkeys...")
|
||||
kwinkeys = cmdline('ls | grep -m1 "kwinrc"').strip()
|
||||
kdekeys = cmdline('ls | grep -m1 "kglobalshortcutsrc"').strip()
|
||||
cmdline('cp ./' + kdekeys + ' ~/.config/kglobalshortcutsrc')
|
||||
cmdline('cp ./' + kwinkeys + ' ~/.config/kwinrc')
|
||||
elif dename == "xfce":
|
||||
print("Restoring DE hotkeys...")
|
||||
xfcekeys = cmdline('ls | grep -m1 "xfce4-keyboard"').strip()
|
||||
cmdline('cp ./' + xfcekeys + ' ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml')
|
||||
if dename == "gnome" or dename == "kde" or dename == "xfce":
|
||||
print("./uninstall.sh\n")
|
||||
subprocess.check_call(shlex.split("./uninstall.sh"))
|
||||
print("Done.")
|
||||
if dename == "kde" or dename == "xfce":
|
||||
print("Please log off and back on for your original hotkeys to take effect.")
|
||||
else:
|
||||
os.system("del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\"")
|
||||
if dename == "gnome":
|
||||
print("Resetting DE hotkeys...\n")
|
||||
print("gsettings reset-recursively org.gnome.desktop.wm.keybindings")
|
||||
cmdline("gsettings reset-recursively org.gnome.desktop.wm.keybindings")
|
||||
print("gsettings reset-recursively org.gnome.mutter.keybindings")
|
||||
cmdline("gsettings reset-recursively org.gnome.mutter.keybindings")
|
||||
print("gsettings set org.gnome.mutter overlay-key 'super'")
|
||||
cmdline("gsettings set org.gnome.mutter overlay-key 'super'")
|
||||
cmdline('dconf dump /org/gnome/mutter/ > mutter.conf')
|
||||
cmdline('dconf load /org/gnome/mutter/ < mutter.conf')
|
||||
elif dename == "kde":
|
||||
print("Resetting DE hotkeys...\n")
|
||||
cmdline('mv ~/.config/kwinrc ~/.config/kwinrc.kinto')
|
||||
cmdline('mv ~/.config/kglobalshortcutsrc ~/.config/kglobalshortcutsrc.kinto')
|
||||
elif dename == "xfce":
|
||||
print("Resetting DE hotkeys...\n")
|
||||
cmdline('cp /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml')
|
||||
if dename == "gnome" or dename == "kde" or dename == "xfce":
|
||||
print("./uninstall.sh\n")
|
||||
subprocess.check_call(shlex.split("./uninstall.sh"))
|
||||
print("Done.")
|
||||
if dename == "kde" or dename == "xfce":
|
||||
print("Please log off and back on for your original DE hotkeys to take effect.")
|
||||
|
||||
# check_x11 = cmdline("env | grep -i x11").strip()
|
||||
check_x11 = cmdline("(env | grep -i x11 || loginctl show-session \"$XDG_SESSION_ID\" -p Type) | awk -F= '{print $2}'").strip()
|
||||
def kintoImpOne():
|
||||
|
||||
if len(check_x11) == 0:
|
||||
if os.name != 'nt':
|
||||
print("You are not using x11, please logout and back in using x11/Xorg")
|
||||
sys.exit()
|
||||
check_xbind = cmdline("which xbindkeys 2>/dev/null").strip()
|
||||
check_xdotool = cmdline("which xdotool 2>/dev/null").strip()
|
||||
check_ibus = cmdline("which ibus-setup 2>/dev/null").strip()
|
||||
|
||||
pkgm = cmdline("which apt-get 2>/dev/null").strip()
|
||||
|
||||
if len(pkgm) == 0:
|
||||
pkgm = cmdline("which dnf 2>/dev/null").strip()
|
||||
if len(pkgm) > 0:
|
||||
pkgm += " check-update;sudo dnf install -y "
|
||||
else:
|
||||
print("You are detected as running Windows.")
|
||||
windows_setup()
|
||||
pkgm += " install -y "
|
||||
pkgm += " update; sudo apt-get install -y "
|
||||
|
||||
if len(pkgm) == 0:
|
||||
pkgm = cmdline("which pacman 2>/dev/null").strip()
|
||||
if len(pkgm) > 0:
|
||||
pkgm += " -Syy; sudo pacman -S "
|
||||
|
||||
|
||||
if len(pkgm) == 0:
|
||||
print("No supported package manager found. Exiting...")
|
||||
sys.exit()
|
||||
|
||||
check_xbind = cmdline("which xbindkeys 2>/dev/null").strip()
|
||||
check_xdotool = cmdline("which xdotool 2>/dev/null").strip()
|
||||
check_ibus = cmdline("which ibus-setup 2>/dev/null").strip()
|
||||
|
||||
pkgm = cmdline("which apt-get 2>/dev/null").strip()
|
||||
runpkg = 0
|
||||
global run_pkg
|
||||
|
||||
if len(pkgm) == 0:
|
||||
pkgm = cmdline("which dnf 2>/dev/null").strip()
|
||||
if len(pkgm) > 0:
|
||||
pkgm += " check-update;sudo dnf install -y "
|
||||
else:
|
||||
pkgm += " install -y "
|
||||
pkgm += " update; sudo apt-get install -y "
|
||||
if len(check_xbind) > 0 and len(check_xdotool) > 0 and len(check_ibus) > 0:
|
||||
print("Xbindkeys, xdotool and IBus requirement is installed.")
|
||||
if len(check_xbind) == 0:
|
||||
run_pkg = "xbindkeys"
|
||||
runpkg = 1
|
||||
if len(check_xdotool) == 0:
|
||||
run_pkg += " xdotool"
|
||||
runpkg = 1
|
||||
if len(check_ibus) == 0:
|
||||
# may differ with distro, but for now
|
||||
run_pkg += " ibus"
|
||||
runpkg = 1
|
||||
|
||||
if len(pkgm) == 0:
|
||||
pkgm = cmdline("which pacman 2>/dev/null").strip()
|
||||
if len(pkgm) > 0:
|
||||
pkgm += " -Syy; sudo pacman -S "
|
||||
if runpkg != 0:
|
||||
print(runpkg)
|
||||
requirements(pkgm)
|
||||
|
||||
|
||||
if len(pkgm) == 0:
|
||||
print("No supported package manager found. Exiting...")
|
||||
sys.exit()
|
||||
|
||||
|
||||
runpkg = 0
|
||||
run_pkg = ""
|
||||
|
||||
if len(check_xbind) > 0 and len(check_xdotool) > 0 and len(check_ibus) > 0:
|
||||
print("Xbindkeys, xdotool and IBus requirement is installed.")
|
||||
if len(check_xbind) == 0:
|
||||
run_pkg = "xbindkeys"
|
||||
runpkg = 1
|
||||
if len(check_xdotool) == 0:
|
||||
run_pkg += " xdotool"
|
||||
runpkg = 1
|
||||
if len(check_ibus) == 0:
|
||||
# may differ with distro, but for now
|
||||
run_pkg += " ibus"
|
||||
runpkg = 1
|
||||
|
||||
if runpkg != 0:
|
||||
requirements(pkgm)
|
||||
|
||||
if not os.path.exists(homedir + '/.config/ibus/bus') and cmdline("ls ~/.config/ibus/bus -1rt") == "":
|
||||
install_ibus()
|
||||
if not os.path.exists(homedir + '/.config/ibus/bus') and cmdline("ls ~/.config/ibus/bus -1rt") == "":
|
||||
install_ibus()
|
||||
|
||||
try:
|
||||
f = open("defaults.json")
|
||||
@@ -255,6 +393,59 @@ if os.path.isdir(homedir + "/.config/kinto") == False:
|
||||
os.mkdir(homedir + "/.config/kinto")
|
||||
time.sleep(0.5)
|
||||
|
||||
with open('defaults.json') as json_file:
|
||||
data = json.load(json_file)
|
||||
|
||||
|
||||
color_arr = [bcolors.CBEIGE,bcolors.CRED2,bcolors.CGREEN,bcolors.CYELLOW ]
|
||||
|
||||
print("\nKinto - Type in Linux like it's a Mac.\n")
|
||||
|
||||
kintotype = int(input(color_arr[2] +
|
||||
"1) Kinto - xkeysnail (udev/x11) - Recommended\n" + color_arr[0] +
|
||||
"2) Kinto - Original xkb/x11 implementation\n" + color_arr[3] +
|
||||
"3) Uninstall Kinto - xkeysnail\n" +
|
||||
"4) Uninstall Kinto - Original xkb\n\n"
|
||||
+ bcolors.ENDC))
|
||||
print("")
|
||||
if(kintotype == 1):
|
||||
subprocess.check_call(shlex.split("./xkeysnail_service.sh"))
|
||||
if os.path.isdir(homedir + "/.config/kinto") == True:
|
||||
setShortcuts()
|
||||
subprocess.check_call(shlex.split("./xkeysnail_service.sh budgieUpdate"))
|
||||
exit()
|
||||
|
||||
if(kintotype == 3):
|
||||
subprocess.check_call(shlex.split("./xkeysnail_service.sh uninstall"))
|
||||
exit()
|
||||
|
||||
if(kintotype == 4):
|
||||
Uninstall()
|
||||
exit()
|
||||
|
||||
kintoImpOne()
|
||||
|
||||
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))
|
||||
|
||||
print("%s %i. Uninstall %s" % (color_arr[3], len(data['defaulttypes'])+1, bcolors.ENDC))
|
||||
|
||||
default = 0
|
||||
while not int(default) in range(1,len(data['defaulttypes'])+2):
|
||||
default = int(input(bcolors.CYELLOW2 + "\nPlease enter your keyboard type (1 - " + str(len(data['defaulttypes'])) + ") : " + bcolors.ENDC))
|
||||
print("")
|
||||
|
||||
if default == len(data['defaulttypes'])+1:
|
||||
Uninstall()
|
||||
exit()
|
||||
|
||||
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?")
|
||||
@@ -269,45 +460,23 @@ except IOError:
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
with open('defaults.json') as json_file:
|
||||
data = json.load(json_file)
|
||||
|
||||
color_arr = [bcolors.CBLUE,bcolors.CRED,bcolors.CGREEN]
|
||||
|
||||
print("\nKinto - Type in Linux like it's a Mac.\n")
|
||||
|
||||
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))
|
||||
|
||||
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(bcolors.CYELLOW2 + '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))
|
||||
defaultkb = int(input(bcolors.CYELLOW2 + "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(bcolors.CYELLOW2 + "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)
|
||||
runhack = yn_choice(bcolors.CYELLOW2 + "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'])
|
||||
|
||||
@@ -368,10 +537,10 @@ if(onetime):
|
||||
|
||||
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(bcolors.CYELLOW2 + 'Description: ' + k['description'] + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + 'run: ' + k['run'].replace(";", "\n") + bcolors.ENDC + '\n')
|
||||
|
||||
print(bcolors.CYELLOW + "Please enter your init tweak(s) (eg 1 or 1 2 3 - leave blank to skip): " + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + "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'] = [intents[defaultinit[0]-1]['id']]
|
||||
@@ -384,12 +553,12 @@ tweaks_selected = []
|
||||
|
||||
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')
|
||||
print(bcolors.CYELLOW2 + 'Description: ' + k['description'] + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + 'run in gui mode: ' + k['run_gui'].replace(";", "\n") + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + 'run in terminal mode: ' + k['run_term'].replace(";", "\n") + bcolors.ENDC + '\n')
|
||||
tweaks.append(k['id'])
|
||||
|
||||
print(bcolors.CYELLOW + "Please enter your dynamic shortcut tweak(s) (eg 1 or 1 2 3 - leave blank to skip): " + bcolors.ENDC)
|
||||
print(bcolors.CYELLOW2 + "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()]
|
||||
|
||||
for d in defaultde:
|
||||
|
1
system-config/budgie-daemon_10.5.1.md5
Normal file
@@ -0,0 +1 @@
|
||||
3cd35e15350ca7dac0c3cbfce1c661f7 /usr/bin/budgie-daemon
|
1
system-config/budgie-desktop_10.5.1.md5
Normal file
@@ -0,0 +1 @@
|
||||
8660c2f8e0a9d3cff896254f6c0f9159 /usr/bin/budgie-desktop
|
78
system-config/caret_status_xkey.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
|
||||
for pid in $(pidof -x caret_status_xkey.sh); do
|
||||
if [ $pid != $$ ]; then
|
||||
echo "[$(date)] : caret_status_xkey.sh : Process is already running with PID $pid"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
mkdir -p /tmp/kinto/xkeysnail
|
||||
echo "0" > /tmp/kinto/caret
|
||||
|
||||
millitime=`date +%s%3N`
|
||||
echo "$millitime" > /tmp/kinto/millitime
|
||||
|
||||
IBUSADD=$(cat ~/.config/ibus/bus/`ls ~/.config/ibus/bus -1rt | tail -n1` | awk -F'IBUS_ADDRESS=' '{print $2}' | xargs)
|
||||
dbus-monitor --address $IBUSADD "path='/org/freedesktop/IBus/Panel',interface='org.freedesktop.IBus.Panel',member='FocusOut'" 2> /dev/null | grep --line-buffered -o -P '(?<=object path \"/org/freedesktop/IBus/InputContext_).*(?=[\"])' |
|
||||
while read ln
|
||||
do
|
||||
newtime=`date +%s%3N`
|
||||
difftime=$(( newtime - millitime ))
|
||||
millitime="$newtime"
|
||||
echo "$millitime" > /tmp/kinto/millitime
|
||||
appname=$(xprop -id `xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | awk '{print $5}'` | grep "WM_CLASS(STRING)" | awk '{print substr($4,2,length($4)-2)}')
|
||||
if [ "${ln}" == "1" ]; then
|
||||
appname=$(xprop -id `xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | awk '{print $5}'` | grep "WM_CLASS(STRING)" | awk '{print substr($4,2,length($4)-2)}')
|
||||
if [ "${appname}" == "Firefox" ]; then
|
||||
# echo "ff ww"
|
||||
printf 'ff ww %s\n' "1" > /tmp/kinto/caret
|
||||
elif [ "${appname}" == "Chromium" ] || [ "${appname}" == "Chromium-browser" ] || [ "${appname}" == "Google-chrome" ] || [ "${appname}" == "Epiphany" ]; then
|
||||
# echo "chrome ww"
|
||||
printf 'chrome ww %s\n' "1" > /tmp/kinto/caret
|
||||
else
|
||||
echo "reset" > /tmp/kinto/caret
|
||||
fi
|
||||
else
|
||||
if [ "${appname}" == "Firefox" ]; then
|
||||
# echo "ff nw"
|
||||
printf 'ff nw\n' > /tmp/kinto/caret
|
||||
elif [ "${appname}" == "Chromium" ] || [ "${appname}" == "Chromium-browser" ] || [ "${appname}" == "Google-chrome" ] || [ "${appname}" == "Epiphany" ]; then
|
||||
# echo "chrome nw"
|
||||
printf 'chrome nw\n' > /tmp/kinto/caret
|
||||
else
|
||||
echo "reset" > /tmp/kinto/caret
|
||||
fi
|
||||
fi
|
||||
|
||||
done&
|
||||
|
||||
while (true);do
|
||||
sleep 0.2
|
||||
appname2=$(xprop -id `xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | awk '{print $5}'` | grep "WM_CLASS(STRING)" | awk '{print substr($4,2,length($4)-2)}')
|
||||
check=$(cat /tmp/kinto/caret)
|
||||
millitime=$(cat /tmp/kinto/millitime)
|
||||
newtime=`date +%s%3N`
|
||||
difftime=$(( newtime - millitime ))
|
||||
if (( $difftime > 200 )); then
|
||||
if [ "${check}" == "ff nw" ] && [ "${lastcheck}" != 1 ]; then
|
||||
echo "firefox no wordwise"
|
||||
# Sets new config
|
||||
perl -pi -e "s/[^\n]\s{3}(K.*)(# Chrome-nw)/ # \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# Firefox-nw)/ \$1\$2/g;s/[^\n]\s{3}(K.*)(# Beginning of Line)/ # \$1\$2/g;s/[^\n]\s{3}(K.*)(# End of Line)/ # \$1\$2/g" /tmp/kinto/xkeysnail/kinto.py 2>/dev/null
|
||||
lastcheck=1
|
||||
ww=0
|
||||
elif [ "${check}" == "chrome nw" ] && [ "${lastcheck}" != 2 ]; then
|
||||
echo "chrome no wordwise"
|
||||
# Sets new config
|
||||
perl -pi -e "s/[^\n]\s{3}(K.*)(# Firefox-nw)/ # \$1\$2/g;s/[^\n]\s{3}(K.*)(# Beginning of Line)/ # \$1\$2/g;s/[^\n]\s{3}(K.*)(# End of Line)/ # \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# Chrome-nw)/ \$1\$2/g" /tmp/kinto/xkeysnail/kinto.py 2>/dev/null
|
||||
lastcheck=2
|
||||
ww=0
|
||||
elif ([ "${check}" != "chrome nw" ] && [ "${check}" != "ff nw" ] && [ "${lastcheck}" != 3 ]) || ([ "${appname2}" != "Firefox" ] && [ "${appname2}" != "Chromium" ] && [ "${appname2}" != "Chromium-browser" ] && [ "${appname2}" != "Google-chrome" ] && [ "${appname2}" != "Epiphany" ] && [ "${check}" == "reset" ] && [ "${lastcheck}" != 3 ]); then
|
||||
echo "wordwise"
|
||||
# Sets original config
|
||||
perl -pi -e "s/[^\n]\s{3}(K.*)(# Firefox-nw)/ # \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# Beginning of Line)/ \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# End of Line)/ \$1\$2/g;s/[^\n]\s{3}(K.*)(# Chrome-nw)/ # \$1\$2/g" /tmp/kinto/xkeysnail/kinto.py 2>/dev/null
|
||||
# cp /home/ryan/.config/kinto/kinto.py /tmp/kinto/xkeysnail/kinto.py
|
||||
lastcheck=3
|
||||
fi
|
||||
fi
|
||||
done
|
@@ -7,3 +7,4 @@ killall xbindkeys > /dev/null 2>&1 || :
|
||||
|
||||
gsettings set org.gnome.desktop.wm.keybindings switch-applications "['<Alt>Tab']"
|
||||
gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "['<Shift><Alt>Tab']"
|
||||
pkill -f /.config/kinto/xactive.sh
|
@@ -1,167 +1,182 @@
|
||||
#!/bin/bash
|
||||
|
||||
function detect_budgie()
|
||||
{
|
||||
ps -e | grep -E '^.* budgie-wm' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
VERSION=`dpkg-query -l | grep budgie-core | awk '{print $3}'`
|
||||
DESKTOP="budgie"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_gnome()
|
||||
{
|
||||
ps -e | grep -E '^.* gnome-session' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
ps -e | grep -E '^.* gnome-session' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
VERSION=`gnome-session --version | awk '{print $2}'`
|
||||
DESKTOP="gnome"
|
||||
return 1
|
||||
fi
|
||||
VERSION=`gnome-session --version | awk '{print $2}'`
|
||||
DESKTOP="gnome"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_kde4()
|
||||
{
|
||||
ps -e | grep -E '^.* kded4$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
else
|
||||
VERSION=`kded4 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'`
|
||||
DESKTOP="KDE"
|
||||
return 1
|
||||
fi
|
||||
ps -e | grep -E '^.* kded4$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
else
|
||||
VERSION=`kded4 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'`
|
||||
DESKTOP="KDE"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function detect_kde()
|
||||
{
|
||||
ps -e | grep -E '^.* kded5$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
else
|
||||
VERSION=`kded5 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'`
|
||||
DESKTOP="KDE"
|
||||
return 1
|
||||
fi
|
||||
ps -e | grep -E '^.* kded5$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
else
|
||||
VERSION=`kded5 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'`
|
||||
DESKTOP="KDE"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function detect_unity()
|
||||
{
|
||||
ps -e | grep -E 'unity-panel' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
ps -e | grep -E 'unity-panel' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
VERSION=`unity --version | awk '{print $2}'`
|
||||
DESKTOP="unity"
|
||||
return 1
|
||||
fi
|
||||
VERSION=`unity --version | awk '{print $2}'`
|
||||
DESKTOP="unity"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_xfce()
|
||||
{
|
||||
ps -e | grep -E '^.* xfce4-session$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
ps -e | grep -E '^.* xfce4-session$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
VERSION=`xfce4-session --version | grep xfce4-session | awk '{print $2}'`
|
||||
DESKTOP="xfce"
|
||||
return 1
|
||||
fi
|
||||
VERSION=`xfce4-session --version | grep xfce4-session | awk '{print $2}'`
|
||||
DESKTOP="xfce"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_cinnamon()
|
||||
{
|
||||
ps -e | grep -E '^.* cinnamon$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
ps -e | grep -E '^.* cinnamon$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
VERSION=`cinnamon --version | awk '{print $2}'`
|
||||
DESKTOP="cinnamon"
|
||||
return 1
|
||||
fi
|
||||
VERSION=`cinnamon --version | awk '{print $2}'`
|
||||
DESKTOP="cinnamon"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_mate()
|
||||
{
|
||||
ps -e | grep -E '^.* mate-panel$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
ps -e | grep -E '^.* mate-panel$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
VERSION=`mate-about --version | awk '{print $4}'`
|
||||
DESKTOP="mate"
|
||||
return 1
|
||||
fi
|
||||
VERSION=`mate-about --version | awk '{print $4}'`
|
||||
DESKTOP="mate"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_lxde()
|
||||
{
|
||||
ps -e | grep -E '^.* lxsession$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
ps -e | grep -E '^.* lxsession$' > /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# We can detect LXDE version only thru package manager
|
||||
which apt-cache > /dev/null 2> /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
# We can detect LXDE version only thru package manager
|
||||
which apt-cache > /dev/null 2> /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
which yum > /dev/null 2> /dev/null
|
||||
if [ $? -ne 0 ];
|
||||
then
|
||||
VERSION='unknown'
|
||||
VERSION='unknown'
|
||||
else
|
||||
# For Fedora
|
||||
VERSION=`yum list lxde-common | grep lxde-common | awk '{print $2}' | awk -F '-' '{print $1}'`
|
||||
# For Fedora
|
||||
VERSION=`yum list lxde-common | grep lxde-common | awk '{print $2}' | awk -F '-' '{print $1}'`
|
||||
fi
|
||||
else
|
||||
else
|
||||
# For Lubuntu and Knoppix
|
||||
VERSION=`apt-cache show lxde-common /| grep 'Version:' | awk '{print $2}' | awk -F '-' '{print $1}'`
|
||||
fi
|
||||
DESKTOP="lxde"
|
||||
return 1
|
||||
fi
|
||||
DESKTOP="lxde"
|
||||
return 1
|
||||
}
|
||||
|
||||
function detect_sugar()
|
||||
{
|
||||
if [ "$DESKTOP_SESSION" == "sugar" ];
|
||||
then
|
||||
if [ "$DESKTOP_SESSION" == "sugar" ];
|
||||
then
|
||||
VERSION=`python -c "from jarabe import config; print config.version"`
|
||||
DESKTOP="sugar"
|
||||
else
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
DESKTOP="unknown"
|
||||
if detect_unity;
|
||||
then
|
||||
if detect_kde;
|
||||
then
|
||||
if detect_kde4;
|
||||
then
|
||||
if detect_gnome;
|
||||
then
|
||||
if detect_xfce;
|
||||
then
|
||||
if detect_cinnamon;
|
||||
then
|
||||
if detect_mate;
|
||||
then
|
||||
if detect_lxde;
|
||||
then
|
||||
detect_sugar
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if detect_kde;
|
||||
then
|
||||
if detect_kde4;
|
||||
then
|
||||
if detect_budgie;
|
||||
then
|
||||
if detect_gnome;
|
||||
then
|
||||
if detect_xfce;
|
||||
then
|
||||
if detect_cinnamon;
|
||||
then
|
||||
if detect_mate;
|
||||
then
|
||||
if detect_lxde;
|
||||
then
|
||||
detect_sugar
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ "$1" == '-v' ];
|
||||
then
|
||||
echo $VERSION
|
||||
echo $VERSION
|
||||
else
|
||||
if [ "$1" == '-n' ];
|
||||
then
|
||||
if [ "$1" == '-n' ];
|
||||
then
|
||||
echo $DESKTOP
|
||||
else
|
||||
else
|
||||
echo $DESKTOP $VERSION
|
||||
fi
|
||||
fi
|
||||
fi
|
3630
system-config/keyboard.ids
Normal file
@@ -8,9 +8,9 @@ Restart=always
|
||||
# eg DISPLAY=:0.0
|
||||
#Environment=DISPLAY={displayid}
|
||||
RestartSec=1
|
||||
WorkingDirectory=/home/{username}/.config/kinto
|
||||
ExecStart=/bin/bash -c "/home/{username}/.config/kinto/xactive.sh carrots"
|
||||
ExecStop=/bin/bash /home/{username}/.config/kinto/cleanup.sh
|
||||
WorkingDirectory={homedir}/.config/kinto
|
||||
ExecStart=/bin/bash -c "{homedir}/.config/kinto/xactive.sh carrots"
|
||||
ExecStop=/bin/bash {homedir}/.config/kinto/cleanup.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
|
@@ -2,7 +2,7 @@
|
||||
Name=Kinto
|
||||
GenericName=Kinto
|
||||
Comment=Make Linux Type Like it's a Mac
|
||||
Exec=/bin/sleep 5 /usr/bin/systemctl --user start keyswap
|
||||
Exec=/bin/bash -c "/bin/sleep 5 && /usr/bin/systemctl --user start keyswap"
|
||||
Terminal=false
|
||||
Type=Application
|
||||
X-GNOME-Autostart-enabled=true
|
21
system-config/unipkg.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
if pkgmgr="$( which apt-get )" 2> /dev/null; then
|
||||
echo "Debian"
|
||||
$pkgmgr update
|
||||
$pkgmgr --yes --force-yes install $1
|
||||
elif pkgmgr="$( which dnf )" 2> /dev/null; then
|
||||
echo "dnf"
|
||||
$pkgmgr check-update; $pkgmgr install -y $1
|
||||
elif pkgmgr="$( which pacman )" 2> /dev/null; then
|
||||
echo "Arch-based"
|
||||
$pkgmgr -Syy;yes | $pkgmgr -S $1
|
||||
else
|
||||
echo "Package manager not found, please install $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ 1 -ne $# ]]; then
|
||||
echo "Syntax: $0 PACKAGE"
|
||||
exit 1
|
||||
fi
|
||||
exit $?
|
12
uninstall.sh
@@ -1,5 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Undo Apple keyboard cmd & alt swap
|
||||
if test -f "/sys/module/hid_apple/parameters/swap_opt_cmd" && [ `cat /sys/module/hid_apple/parameters/swap_opt_cmd` == "1" ]; then
|
||||
echo '0' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd
|
||||
echo 'options hid_apple swap_opt_cmd=0' | sudo tee -a /etc/modprobe.d/hid_apple.conf
|
||||
sudo update-initramfs -u -k all
|
||||
fi
|
||||
systemctl --user stop keyswap 2>/dev/null
|
||||
systemctl --user disable keyswap
|
||||
systemctl --user stop keyswap.timer 2>/dev/null
|
||||
@@ -9,5 +14,6 @@ rm ~/.config/systemd/user/keyswap.timer
|
||||
rm -rf ~/.config/autostart/kinto.desktop
|
||||
rm -rf ~/.config/kinto
|
||||
rm -rf ~/.xkb
|
||||
systemctl daemon-reload
|
||||
sed -i '/xkb/d' ~/.Xsession 2>/dev/null
|
||||
sudo systemctl daemon-reload
|
||||
sed -i '/xkb/d' ~/.Xsession 2>/dev/null
|
||||
exit 0
|
@@ -16,13 +16,13 @@
|
||||
"symbols":"",
|
||||
"types":"",
|
||||
"de":[],
|
||||
"appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty" ]
|
||||
"appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty","alacritty","mate-terminal","tilix","xfce4-terminal" ]
|
||||
},
|
||||
{
|
||||
"name": "firefox",
|
||||
"run": "",
|
||||
"run_onInput": "killall xbindkeys > /dev/null 2>&1",
|
||||
"run_offInput": "killall xbindkeys > /dev/null 2>&1;xbindkeys -f $HOME/.config/kinto/.firefox-nw",
|
||||
"run_onInput": "pkill -f ~/.config/kinto/.firefox-nw",
|
||||
"run_offInput": "xbindkeys -f $HOME/.config/kinto/.firefox-nw",
|
||||
"symbols": "",
|
||||
"types": "",
|
||||
"de": [],
|
||||
@@ -73,4 +73,4 @@
|
||||
"run_term":"",
|
||||
"run_gui":""
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
14
windows/NoShell.vbs
Normal file
@@ -0,0 +1,14 @@
|
||||
If WScript.Arguments.Count >= 1 Then
|
||||
ReDim arr(WScript.Arguments.Count-1)
|
||||
prog = WScript.Arguments(0)
|
||||
For i = 1 To WScript.Arguments.Count-1
|
||||
Arg = WScript.Arguments(i)
|
||||
If InStr(Arg, " ") > 1 Then Arg = """" & Arg & """"
|
||||
arr(i) = Arg
|
||||
Next
|
||||
|
||||
RunCmd = Join(arr)
|
||||
' CreateObject("Wscript.Shell").Run RunCmd, 0, True
|
||||
Set oShell = CreateObject("Shell.Application")
|
||||
oShell.ShellExecute prog, RunCmd, , "runas", 0
|
||||
End If
|
@@ -10,3 +10,6 @@ else{
|
||||
if(-not(test-path "C:\Program Files\AutoHotkey\AutoHotkey.exe")){
|
||||
choco install autohotkey.install
|
||||
}
|
||||
if(-not(test-path "C:\Strawberry\")){
|
||||
choco install strawberryperl
|
||||
}
|
||||
|
39
windows/detectUSB.ahk
Normal file
@@ -0,0 +1,39 @@
|
||||
#SingleInstance, force
|
||||
#NoTrayIcon
|
||||
OnMessage(0x219, "notify_change")
|
||||
Return
|
||||
|
||||
lastkb = ""
|
||||
|
||||
DllCall("AllocConsole")
|
||||
WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr")
|
||||
|
||||
notify_change(wParam, lParam, msg, hwnd)
|
||||
{
|
||||
global lastkb
|
||||
; kbtype = % ComObjCreate("WScript.Shell").Exec("cscript /nologo usb.vbs").StdOut.ReadAll()
|
||||
DetectHiddenWindows On
|
||||
Run %ComSpec%,, Hide, pid
|
||||
WinWait ahk_pid %pid%
|
||||
DllCall("AttachConsole", "UInt", pid)
|
||||
WshShell := ComObjCreate("Wscript.Shell")
|
||||
exec := WshShell.Exec("cscript /nologo usb.vbs")
|
||||
kbtype := exec.StdOut.ReadAll()
|
||||
DllCall("FreeConsole")
|
||||
Process Close, %pid%
|
||||
if lastkb != %kbtype%
|
||||
{
|
||||
|
||||
if InStr(kbtype, "Apple")
|
||||
{
|
||||
; MsgBox, Apple
|
||||
Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat mac, %A_ScriptDir%
|
||||
}
|
||||
else{
|
||||
; MsgBox, Windows
|
||||
Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat win, %A_ScriptDir%
|
||||
}
|
||||
; MsgBox % kbtype
|
||||
}
|
||||
lastkb = %kbtype%
|
||||
}
|
7
windows/kinto-start.vbs
Normal file
@@ -0,0 +1,7 @@
|
||||
Set oShell = CreateObject("Shell.Application")
|
||||
Set wShell = WScript.CreateObject("WScript.Shell")
|
||||
Set fso = CreateObject("Scripting.FileSystemObject")
|
||||
|
||||
path = wShell.ExpandEnvironmentStrings("%userprofile%")
|
||||
strFolder = fso.BuildPath(path, "\.kinto\kinto.ahk")
|
||||
oShell.ShellExecute "C:\Program Files\AutoHotkey\AutoHotkey.exe", strFolder, , "runas", 0
|
@@ -1,39 +1,199 @@
|
||||
#SingleInstance force
|
||||
#NoEnv
|
||||
#Persistent
|
||||
|
||||
DetectHiddenWindows, On
|
||||
Run, %A_ScriptDir%\detectUSB.ahk
|
||||
|
||||
Run, C:\Users\%A_UserName%\.keypressosd\KeypressOSD_kinto.ahk
|
||||
|
||||
; I_Icon = %A_ScriptDir%\assets\kinto-white.ico ; MacModifiers
|
||||
; IfExist, %I_Icon% ; MacModifiers
|
||||
; Menu, Tray, Icon, %I_Icon%,, 1 ; MacModifiers
|
||||
; Menu, Tray, Tip, Mac - Kinto ; MacModifiers
|
||||
|
||||
; I_Icon = %A_ScriptDir%\assets\kinto-white-invert.ico ; WinModifiers
|
||||
; IfExist, %I_Icon% ; WinModifiers
|
||||
; Menu, Tray, Icon, %I_Icon%,, 1 ; WinModifiers
|
||||
; Menu, Tray, Tip, Windows - Kinto ; WinModifiers
|
||||
|
||||
; Set Tray menu
|
||||
; Menu, Tray, Standard
|
||||
Menu, Tray, NoStandard ; to remove default menu
|
||||
Menu, Tray, Add, Set Windows Keyboard, winkb
|
||||
Menu, Tray, Add, Set Apple Keyboard, mackb
|
||||
Menu, Tray, Add, Suspend Kinto, tray_suspend
|
||||
Menu, Tray, Add, Returns to Desktop, min
|
||||
Menu, Tray, Add
|
||||
Menu, Tray, Add, Close, Exit
|
||||
Menu, Tray, Click, 1
|
||||
|
||||
winkb(){
|
||||
Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat win, %A_ScriptDir%
|
||||
}
|
||||
|
||||
mackb(){
|
||||
Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat mac, %A_ScriptDir%
|
||||
}
|
||||
|
||||
min(){
|
||||
; Refocus last active Window
|
||||
Send {LAlt down}{tab}{LAlt up}
|
||||
}
|
||||
|
||||
tray_suspend(){
|
||||
suspend toggle
|
||||
if (a_isSuspended = 1){
|
||||
menu, tray, check , Suspend Kinto
|
||||
I_Icon = %A_ScriptDir%\assets\kinto-color-invert.ico
|
||||
Menu, Tray, Icon, %I_Icon%,, 1
|
||||
Menu, Tray, Tip, Suspended - Kinto
|
||||
IfWinExist, detectUSB.ahk
|
||||
WinClose
|
||||
IfWinExist, KeypressOSD_kinto.ahk
|
||||
WinClose
|
||||
Run, C:\Users\%A_UserName%\.keypressosd\KeypressOSD.ahk
|
||||
}
|
||||
else{
|
||||
menu, tray, unCheck, Suspend Kinto
|
||||
; I_Icon = %A_ScriptDir%\assets\kinto-white.ico ; MacModifiers
|
||||
; I_Icon = %A_ScriptDir%\assets\kinto-white-invert.ico ; WinModifiers
|
||||
Menu, Tray, Icon, %I_Icon%,,1
|
||||
Run, %A_ScriptDir%\detectUSB.ahk
|
||||
IfWinExist, KeypressOSD.ahk
|
||||
WinClose
|
||||
Run, C:\Users\%A_UserName%\.keypressosd\KeypressOSD_kinto.ahk
|
||||
}
|
||||
; Refocus last active Window
|
||||
Send {LAlt down}{tab}{LAlt up}
|
||||
}
|
||||
|
||||
Exit() {
|
||||
IfWinExist, detectUSB.ahk
|
||||
WinClose
|
||||
IfWinExist, KeypressOSD.ahk
|
||||
WinClose, C:\Users\%A_UserName%\.keypressosd\KeypressOSD.ahk ahk_class AutoHotkey
|
||||
IfWinExist, KeypressOSD_kinto.ahk
|
||||
WinClose, C:\Users\%A_UserName%\.keypressosd\KeypressOSD_kinto.ahk ahk_class AutoHotkey
|
||||
|
||||
ExitApp
|
||||
}
|
||||
|
||||
SetTitleMatchMode, 2
|
||||
|
||||
GroupAdd, terminals, ahk_exe ubuntu.exe
|
||||
GroupAdd, terminals, ahk_exe ConEmu.exe
|
||||
GroupAdd, terminals, ahk_exe ConEmu64.exe
|
||||
GroupAdd, terminals, ahk_exe powershell.exe
|
||||
GroupAdd, terminals, ahk_exe WindowsTerminal.exe
|
||||
GroupAdd, terminals, ahk_exe Hyper.exe
|
||||
GroupAdd, terminals, ahk_exe Cmd.exe
|
||||
GroupAdd, terminals, ahk_exe Terminus.exe
|
||||
GroupAdd, terminals, Fluent Terminal ahk_class ApplicationFrameWindow
|
||||
|
||||
GroupAdd, posix, ahk_exe ubuntu.exe
|
||||
GroupAdd, posix, ahk_exe ConEmu.exe
|
||||
GroupAdd, posix, ahk_exe ConEmu64.exe
|
||||
GroupAdd, posix, ahk_exe Hyper.exe
|
||||
GroupAdd, posix, ahk_exe mintty.exe
|
||||
GroupAdd, posix, ahk_exe Terminus.exe
|
||||
GroupAdd, posix, Fluent Terminal ahk_class ApplicationFrameWindow
|
||||
|
||||
GroupAdd, ConEmu, ahk_exe ConEmu.exe
|
||||
GroupAdd, ConEmu, ahk_exe ConEmu64.exe
|
||||
GroupAdd, ConEmu, ahk_exe WindowsTerminal.exe
|
||||
|
||||
GroupAdd, editors, ahk_exe sublime_text.exe
|
||||
GroupAdd, editors, ahk_exe VSCodium.exe
|
||||
GroupAdd, editors, ahk_exe Code.exe
|
||||
|
||||
; Cmd+Space Alternative
|
||||
LWin & vk07::return
|
||||
LWin::return
|
||||
RWin & vk07::return
|
||||
RWin::return
|
||||
^Space::Send ^{Esc}
|
||||
; ^Space::run AppName
|
||||
GroupAdd, vscode, ahk_exe VSCodium.exe
|
||||
GroupAdd, vscode, ahk_exe Code.exe
|
||||
|
||||
; Cmd Tab For App Switching
|
||||
LCtrl & Tab::AltTab
|
||||
RCtrl & Tab::AltTab
|
||||
; Ctrl Tab for In-App Tab Switching
|
||||
LWin & Tab::Send ^{Tab}
|
||||
RWin & Tab::Send ^{Tab}
|
||||
GroupAdd, vstudio, ahk_exe devenv.exe
|
||||
|
||||
; Close Apps
|
||||
; New AltTab and CtrlTab fix
|
||||
*tab::
|
||||
{
|
||||
; Tertiary
|
||||
if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) {
|
||||
; Secondary
|
||||
; Send {LCtrl down}{Secondary up}{tab}
|
||||
; Send {LCtrl down}{LWin up}{tab} ; WinModifiers
|
||||
; Send {LCtrl down}{LAlt up}{tab} ; MacModifiers
|
||||
KeyWait, tab
|
||||
; Tertiary
|
||||
} else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) {
|
||||
; Secondary
|
||||
; Send {LCtrl down}{Secondary up}{LShift down}{tab}
|
||||
; Send {LCtrl down}{LWin up}{LShift down}{tab} ; WinModifiers
|
||||
; Send {LCtrl down}{LAlt up}{LShift down}{tab} ; MacModifiers
|
||||
KeyWait, tab
|
||||
; Primary
|
||||
; } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { ; WinModifiers
|
||||
; } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { ; MacModifiers
|
||||
Send {LAlt down}{tab}
|
||||
KeyWait, tab
|
||||
; Primary
|
||||
; } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { ; WinModifiers
|
||||
; } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { ; MacModifiers
|
||||
Send {LAlt down}{LShift down}{tab}
|
||||
KeyWait, tab
|
||||
; Secondary
|
||||
; } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) = false { ; WinModifiers
|
||||
; } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { ; MacModifiers
|
||||
return
|
||||
; Secondary
|
||||
; } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { ; WinModifiers
|
||||
; } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { ; MacModifiers
|
||||
return
|
||||
} else {
|
||||
send {Blind}{tab}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
tab::Send {tab}
|
||||
|
||||
+tab::Send {Shift down}{tab}{Shift up}
|
||||
|
||||
; Basic Remap
|
||||
;
|
||||
; Primary::LCtrl
|
||||
; Secondary::LAlt
|
||||
; Tertiary::LWin
|
||||
|
||||
; $LAlt::LCtrl ; WinModifiers
|
||||
; $RAlt::RCtrl ; WinModifiers
|
||||
; $LWin::LAlt ; WinModifiers
|
||||
; $LCtrl::LWin ; WinModifiers
|
||||
|
||||
; $LWin::LCtrl ; MacModifiers
|
||||
; $RWin::RCtrl ; MacModifiers
|
||||
; $LCtrl::LWin ; MacModifiers
|
||||
|
||||
; Hack to disable start menu on winkey
|
||||
; Static
|
||||
$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up}
|
||||
|
||||
; temporary hack to ensure keys don't get stuck
|
||||
; impacts Alt-Tab fix
|
||||
; Primary
|
||||
; $LAlt up::Send {LWin up}{LAlt up}{LCtrl up} ; WinModifiers
|
||||
; $LWin up::Send {LWin up}{LAlt up}{LCtrl up} ; MacModifiers
|
||||
|
||||
; Close Apps
|
||||
^q::Send !{F4}
|
||||
|
||||
; Emoji Panel
|
||||
#^Space::Send {LWin down};{LWin up}
|
||||
|
||||
; Full Screenshot
|
||||
^+3::Send {PrintScreen}
|
||||
|
||||
; Region Screenshot
|
||||
^+4::Send #+{S}
|
||||
|
||||
; wordwise support
|
||||
$^Left::Send {Home}
|
||||
$^+Left::Send +{Home}
|
||||
@@ -50,79 +210,115 @@ $^+Right::Send +{End}
|
||||
!Right::Send ^{Right}
|
||||
!+Right::Send ^+{Right}
|
||||
|
||||
#IfWinActive ahk_group editors
|
||||
; Remap Ctrl+Shift to behave like macOS Sublimetext
|
||||
; Will extend cursor to multiple lines
|
||||
#+Up::send {shift up}^!{Up}
|
||||
#+Down::send {shift up}^!{Down}
|
||||
; Cmd+Space Alternative
|
||||
^Space::Send ^{Esc}
|
||||
|
||||
; Remap Ctrl+Cmd+G to select all matches
|
||||
#^g::send !{F3}
|
||||
; Sublime Text Remaps for VS Code
|
||||
#IfWinActive ahk_group vscode
|
||||
; Remap Ctrl+Shift to behave like macOS Sublimetext
|
||||
; Will extend cursor to multiple lines
|
||||
; #+Up::send ^!{Up} ; ST2CODE
|
||||
; #+Down::send ^!{Down} ; ST2CODE
|
||||
; Remap Ctrl+Cmd+G to select all matches
|
||||
; #^g::send ^+{L} ; ST2CODE
|
||||
!+g::send ^+{G} ; View source control
|
||||
#If
|
||||
|
||||
#IfWinActive ahk_exe sublime_text.exe
|
||||
; Remap Ctrl+Shift to behave like macOS Sublimetext
|
||||
; Will extend cursor to multiple lines
|
||||
#+Up::send {shift up}^!{Up}
|
||||
#+Down::send {shift up}^!{Down}
|
||||
|
||||
; Remap Ctrl+Cmd+G to select all matches
|
||||
#^g::send !{F3}
|
||||
#If
|
||||
|
||||
#IfWinActive ahk_group terminals
|
||||
; Copy
|
||||
^c::Send {LCtrl down}{LShift down}c{LCtrl Up}{LShift Up}
|
||||
#c::Send {LCtrl down}c{LCtrl Up}
|
||||
#IfWinNotActive ahk_group ConEmu
|
||||
; Paste
|
||||
^v::Send {LCtrl down}{LShift down}v{LCtrl Up}{LShift Up}
|
||||
#If
|
||||
; Copy
|
||||
^c::
|
||||
SetKeyDelay -1
|
||||
Send {Blind}{LShift down}{c DownTemp}
|
||||
return
|
||||
|
||||
^c up::
|
||||
SetKeyDelay -1
|
||||
Send {Blind}{c Up}{LShift Up}
|
||||
return
|
||||
|
||||
; Sigints - interrupt
|
||||
$#c::Send {Ctrl down}c{Ctrl up}
|
||||
|
||||
; Paste
|
||||
^v::
|
||||
If WinActive("ahk_group posix"){
|
||||
Send {Blind}{Shift down}v{Shift up}
|
||||
}
|
||||
else{
|
||||
Send {Blind}v
|
||||
}
|
||||
return
|
||||
#If
|
||||
|
||||
#IfWinActive ahk_group posix
|
||||
; End of Line
|
||||
#e::Send {LCtrl down}e{LCtrl Up}
|
||||
^e::return
|
||||
; Beginning of Line
|
||||
#a::Send {LCtrl down}a{LCtrl Up}
|
||||
^a::return
|
||||
;^l::Send clear{Enter}
|
||||
;#l::return
|
||||
; Clear Terminal and Scroll Buffer
|
||||
^k::Send clear && printf '\e[3J'{Enter}
|
||||
; Nano editor shortcuts
|
||||
#k::Send {LCtrl down}k{LCtrl Up}
|
||||
#x::Send {LCtrl down}x{LCtrl Up}
|
||||
#o::Send {LCtrl down}o{LCtrl Up}
|
||||
#r::Send {LCtrl down}r{LCtrl Up}
|
||||
#w::Send {LCtrl down}w{LCtrl Up}
|
||||
#\::Send {LCtrl down}\{LCtrl Up}
|
||||
#u::Send {LCtrl down}u{LCtrl Up}
|
||||
#j::Send {LCtrl down}j{LCtrl Up}
|
||||
#t::Send {LCtrl down}t{LCtrl Up}
|
||||
#_::Send {LCtrl down}_{LCtrl Up}
|
||||
#z::Send {LCtrl down}z{LCtrl Up}
|
||||
#If
|
||||
; Open/Close Tab for those that support it
|
||||
$^t::
|
||||
If not WinActive("ahk_group ConEmu"){
|
||||
Send {LCtrl down}{LShift down}t{LCtrl Up}{LShift Up}
|
||||
}
|
||||
else{
|
||||
Send ^t
|
||||
}
|
||||
return
|
||||
|
||||
#IfWinActive ahk_group ConEmu
|
||||
; Paste
|
||||
$^v::Send {Shift down}{Insert}{Shift Up}
|
||||
#v::Send {LCtrl down}v{LCtrl Up}
|
||||
#If
|
||||
$^w::
|
||||
If not WinActive("ahk_group ConEmu"){
|
||||
Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up}
|
||||
}
|
||||
else{
|
||||
Send ^w
|
||||
}
|
||||
return
|
||||
|
||||
#IfWinActive ahk_exe mintty.exe
|
||||
; Copy
|
||||
$^c::Send {Control down}{Insert}{Control Up}
|
||||
#c::Send {LCtrl down}c{LCtrl Up}
|
||||
; Paste
|
||||
$^v::Send {Shift down}{Insert}{Shift Up}
|
||||
#v::Send {LCtrl down}v{LCtrl Up}
|
||||
#If
|
||||
; End of Line
|
||||
^e::
|
||||
SetKeyDelay -1
|
||||
Send {Blind}{e DownTemp}
|
||||
return
|
||||
|
||||
;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file)
|
||||
^e up::
|
||||
SetKeyDelay -1
|
||||
Send {Blind}{e Up}
|
||||
return
|
||||
|
||||
; Admin privileges required
|
||||
; Sets Workstation Lock to not occur on Win+L
|
||||
; RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Policies\System, DisableLockWorkstation, 1
|
||||
; Beginning of Line
|
||||
^a::
|
||||
SetKeyDelay -1
|
||||
Send {Blind}{a DownTemp}
|
||||
return
|
||||
|
||||
; Re-enables Workstation lock on Ctrl+Cmd+Q
|
||||
; Need to Remove Quick Assist and reboot
|
||||
; Remove-WindowsCapability -online -name App.Support.QuickAssist~~~~0.0.1.0
|
||||
#^q::
|
||||
; re-enable locking workstation, then lock it
|
||||
; RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Policies\System, DisableLockWorkstation, 0
|
||||
; DllCall("LockWorkStation")
|
||||
; Reload script to relock Workstation Lock
|
||||
; Reload
|
||||
;return
|
||||
^a up::
|
||||
SetKeyDelay -1
|
||||
Send {Blind}{a Up}
|
||||
return
|
||||
|
||||
^l::Send clear{Enter}
|
||||
; #l::return
|
||||
; Clear Terminal and Scroll Buffer
|
||||
^k::Send clear && printf '\e[3J'{Enter}
|
||||
; Nano editor shortcuts
|
||||
#g::Send {LCtrl down}g{LCtrl Up}
|
||||
#k::Send {LCtrl down}k{LCtrl Up}
|
||||
#x::Send {LCtrl down}x{LCtrl Up}
|
||||
#o::Send {LCtrl down}o{LCtrl Up}
|
||||
#r::Send {LCtrl down}r{LCtrl Up}
|
||||
#w::Send {LCtrl down}w{LCtrl Up}
|
||||
#\::Send {LCtrl down}\{LCtrl Up}
|
||||
#u::Send {LCtrl down}u{LCtrl Up}
|
||||
#j::Send {LCtrl down}j{LCtrl Up}
|
||||
#t::Send {LCtrl down}t{LCtrl Up}
|
||||
#_::Send {LCtrl down}_{LCtrl Up}
|
||||
#z::Send {LCtrl down}z{LCtrl Up}
|
||||
#y::Send {LCtrl down}y{LCtrl Up}
|
||||
#v::Send {LCtrl down}v{LCtrl Up}
|
||||
#If
|
22
windows/toggle_kb.bat
Normal file
@@ -0,0 +1,22 @@
|
||||
@echo off
|
||||
|
||||
IF "%1"=="mac" goto mac
|
||||
IF "%1"=="win" goto win
|
||||
|
||||
echo Not found.
|
||||
goto commonexit
|
||||
|
||||
:win
|
||||
perl -pi -e "s/(; )(.*)(; WinModifiers)/$2$3/g" "%userprofile%\.kinto\kinto.ahk"
|
||||
perl -pi -e "s/^(?!;)(.*)(; MacModifiers)/; $1$2/gm" "%userprofile%\.kinto\kinto.ahk"
|
||||
"C:\Program Files\AutoHotkey\AutoHotkey.exe" "%userprofile%\.kinto\kinto.ahk"
|
||||
goto commonexit
|
||||
|
||||
:mac
|
||||
perl -pi -e "s/(; )(.*)(; MacModifiers)/$2$3/g" "%userprofile%\.kinto\kinto.ahk"
|
||||
perl -pi -e "s/^(?!;)(.*)(; WinModifiers)/; $1$2/gm" "%userprofile%\.kinto\kinto.ahk"
|
||||
"C:\Program Files\AutoHotkey\AutoHotkey.exe" "%userprofile%\.kinto\kinto.ahk"
|
||||
goto commonexit
|
||||
|
||||
:commonexit
|
||||
exit
|
71
windows/usb.vbs
Normal file
@@ -0,0 +1,71 @@
|
||||
Option Explicit
|
||||
Dim oWMISrv, collDvcs, iUSBDvc , iDvc, sDvcID, sPID, sVID
|
||||
|
||||
' add item to array
|
||||
Function AddItem(arr, val)
|
||||
ReDim Preserve arr(UBound(arr) + 1)
|
||||
arr(UBound(arr)) = val
|
||||
AddItem = arr
|
||||
End Function
|
||||
|
||||
' returns an array of the unique items in for-each-able collection fex
|
||||
Function uniqFE(fex)
|
||||
Dim dicTemp : Set dicTemp = CreateObject("Scripting.Dictionary")
|
||||
Dim xItem
|
||||
For Each xItem In fex
|
||||
dicTemp(xItem) = 0
|
||||
Next
|
||||
uniqFE = dicTemp.Keys()
|
||||
End Function
|
||||
|
||||
Function ReplaceX(ByVal sValue, ByVal sPattern, ByVal sNValue)
|
||||
Dim oReg : Set oReg = New RegExp
|
||||
oReg.Pattern = sPattern
|
||||
ReplaceX = oReg.Replace(sValue, sNValue)
|
||||
Set oReg = Nothing
|
||||
End Function
|
||||
|
||||
Set oWMISrv = GetObject("winmgmts:\\.\root\cimv2")
|
||||
Set collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity WHERE Service='kbdhid'")
|
||||
|
||||
Dim deviceVID : deviceVID=Array()
|
||||
Dim devicePID : devicePID=Array()
|
||||
Dim deviceDesc : deviceDesc=Array()
|
||||
Dim counter: counter=0
|
||||
|
||||
For Each iUSBDvc In collDvcs
|
||||
sVID = ReplaceX(iUSBDvc.DeviceID, ".*VID_(.{4}).*", "$1")
|
||||
sPID = ReplaceX(iUSBDvc.DeviceID, ".*PID_(.{4}).*", "$1")
|
||||
deviceVID = AddItem(deviceVID, sVID)
|
||||
devicePID = AddItem(devicePID, sPID)
|
||||
deviceDesc = AddItem(deviceDesc, iUSBDvc.Description)
|
||||
counter = counter + 1
|
||||
' Wscript.Echo "Name : "& iUSBDvc.Description &"VID_PID : "& sVID & sPID
|
||||
Next
|
||||
|
||||
Dim uniqueVID: uniqueVID = uniqFE(deviceVID)
|
||||
Dim vcount: vcount = UBound(uniqueVID) + 1
|
||||
Dim nonApple: nonApple = 0
|
||||
Dim i
|
||||
|
||||
If vcount = 1 Then
|
||||
If StrComp(deviceVID(0), "05AC") = 0 Then
|
||||
Wscript.Echo "Apple"
|
||||
Else
|
||||
Wscript.Echo "Windows"
|
||||
End If
|
||||
Else
|
||||
For i = 0 To counter-1
|
||||
If StrComp(deviceVID(i), "05AC") = -1 Then
|
||||
nonApple = 1
|
||||
End If
|
||||
Next
|
||||
If nonApple = 1 Then
|
||||
Wscript.Echo "Windows"
|
||||
Else
|
||||
Wscript.Echo "Apple"
|
||||
End If
|
||||
End If
|
||||
|
||||
Set collDvcs = Nothing
|
||||
Set oWMISrv = Nothing
|
300
xkeysnail-config/kinto.py
Normal file
@@ -0,0 +1,300 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import re
|
||||
from xkeysnail.transform import *
|
||||
|
||||
# Use the following for testing terminal keymaps
|
||||
# terminals = [ "", ... ]
|
||||
# xbindkeys -mk
|
||||
terminals = ["gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty","alacritty","mate-terminal","tilix","xfce4-terminal"]
|
||||
terminals = [term.casefold() for term in terminals]
|
||||
termStr = "|".join(str(x) for x in terminals)
|
||||
|
||||
mscodes = ["code","vscodium"]
|
||||
codeStr = "|".join(str(x) for x in mscodes)
|
||||
|
||||
# [Global modemap] Change modifier keys as in xmodmap
|
||||
define_conditional_modmap(lambda wm_class: wm_class.casefold() not in terminals,{
|
||||
# # Chromebook
|
||||
# Key.LEFT_ALT: Key.RIGHT_CTRL, # Chromebook
|
||||
# Key.LEFT_CTRL: Key.LEFT_ALT, # Chromebook
|
||||
# Key.RIGHT_ALT: Key.RIGHT_CTRL, # Chromebook
|
||||
# Key.RIGHT_CTRL: Key.RIGHT_ALT, # Chromebook
|
||||
|
||||
# # Default Mac/Win
|
||||
# Key.LEFT_ALT: Key.RIGHT_CTRL, # WinMac
|
||||
# Key.LEFT_META: Key.LEFT_ALT, # WinMac
|
||||
# Key.LEFT_CTRL: Key.LEFT_META, # WinMac
|
||||
# Key.RIGHT_ALT: Key.RIGHT_CTRL, # WinMac
|
||||
# Key.RIGHT_META: Key.RIGHT_ALT, # WinMac
|
||||
# Key.RIGHT_CTRL: Key.RIGHT_META, # WinMac
|
||||
|
||||
# # Mac Only
|
||||
# Key.LEFT_META: Key.RIGHT_CTRL, # Mac
|
||||
# Key.LEFT_CTRL: Key.LEFT_META, # Mac
|
||||
# Key.RIGHT_META: Key.RIGHT_CTRL, # Mac
|
||||
# Key.RIGHT_CTRL: Key.RIGHT_META, # Mac
|
||||
})
|
||||
|
||||
# [Conditional modmap] Change modifier keys in certain applications
|
||||
define_conditional_modmap(re.compile(termStr, re.IGNORECASE), {
|
||||
# # Chromebook
|
||||
# Key.LEFT_ALT: Key.RIGHT_CTRL, # Chromebook
|
||||
# # Left Ctrl Stays Left Ctrl
|
||||
# Key.LEFT_META: Key.LEFT_ALT, # Chromebook
|
||||
# Key.RIGHT_ALT: Key.RIGHT_CTRL, # Chromebook - Multi-language (Remove)
|
||||
# Key.RIGHT_CTRL: Key.RIGHT_ALT, # Chromebook
|
||||
# # Right Meta does not exist on chromebooks
|
||||
|
||||
# # Default Mac/Win
|
||||
# Key.LEFT_ALT: Key.RIGHT_CTRL, # WinMac
|
||||
# Key.LEFT_META: Key.LEFT_ALT, # WinMac
|
||||
# Key.LEFT_CTRL: Key.LEFT_CTRL, # WinMac
|
||||
# Key.RIGHT_ALT: Key.RIGHT_CTRL, # WinMac - Multi-language (Remove)
|
||||
# Key.RIGHT_META: Key.RIGHT_ALT, # WinMac
|
||||
# Key.RIGHT_CTRL: Key.LEFT_CTRL, # WinMac
|
||||
|
||||
# # Mac Only
|
||||
# Key.LEFT_META: Key.RIGHT_CTRL, # Mac
|
||||
# # Left Ctrl Stays Left Ctrl
|
||||
# Key.RIGHT_META: Key.RIGHT_CTRL, # Mac
|
||||
# Key.RIGHT_CTRL: Key.LEFT_CTRL, # Mac
|
||||
})
|
||||
|
||||
# Keybindings for Nautilus
|
||||
define_keymap(re.compile("org.gnome.nautilus", re.IGNORECASE),{
|
||||
K("RC-Up"): K("M-Up"), # Go Up dir
|
||||
K("RC-Down"): K("M-Down"), # Go Down dir
|
||||
K("RC-Left"): K("M-Left"), # Go Back
|
||||
K("RC-Right"): K("M-Right"), # Go Forward
|
||||
})
|
||||
|
||||
define_keymap(None,{
|
||||
# Basic App hotkey functions
|
||||
K("RC-Q"): K("Alt-F4"),
|
||||
K("RC-H"): K("Alt-F9"),
|
||||
# Cmd Tab - App Switching Default
|
||||
K("RC-Tab"): K("RC-F13"), # Default not-xfce4
|
||||
K("RC-Shift-Tab"): K("RC-Shift-F13"), # Default not-xfce4
|
||||
K("RC-Grave"): K("M-F6"), # Default not-xfce4
|
||||
K("RC-Shift-Grave"): K("M-Shift-F6"), # Default not-xfce4
|
||||
# K("RC-Tab"): K("RC-backslash"), # xfce4
|
||||
# K("RC-Shift-Tab"): K("RC-Shift-backslash"), # xfce4
|
||||
# K("RC-Grave"): K("RC-Shift-backslash"), # xfce4
|
||||
# In-App Tab switching
|
||||
# K("M-Tab"): K("C-Tab"), # Chromebook - In-App Tab switching
|
||||
# K("M-Shift-Tab"): K("C-Shift-Tab"), # Chromebook - In-App Tab switching
|
||||
# K("M-Grave") : K("C-Shift-Tab"), # Chromebook - In-App Tab switching
|
||||
K("Super-Tab"): K("LC-Tab"), # Default not-chromebook
|
||||
K("Super-Shift-Tab"): K("LC-Shift-Tab"), # Default not-chromebook
|
||||
|
||||
# Wordwise
|
||||
K("RC-Left"): K("Home"), # Beginning of Line
|
||||
K("Super-a"): K("Home"), # Beginning of Line
|
||||
K("RC-Shift-Left"): K("Shift-Home"), # Select all to Beginning of Line
|
||||
K("RC-Right"): K("End"), # End of Line
|
||||
K("Super-e"): K("End"), # End of Line
|
||||
K("RC-Shift-Right"): K("Shift-End"), # Select all to End of Line
|
||||
# K("RC-Left"): K("C-LEFT_BRACE"), # Firefox-nw - Back
|
||||
# K("RC-Right"): K("C-RIGHT_BRACE"), # Firefox-nw - Forward
|
||||
# K("RC-Left"): K("M-LEFT"), # Chrome-nw - Back
|
||||
# K("RC-Right"): K("M-RIGHT"), # Chrome-nw - Forward
|
||||
K("RC-Up"): K("C-Home"), # Beginning of File
|
||||
K("RC-Shift-Up"): K("C-Shift-Home"), # Select all to Beginning of File
|
||||
K("RC-Down"): K("C-End"), # End of File
|
||||
K("RC-Shift-Down"): K("C-Shift-End"), # Select all to End of File
|
||||
# K("M-Backspace"): K("Delete"), # Chromebook - Delete
|
||||
K("Super-Backspace"): K("C-Backspace"), # Default not-chromebook - Delete Left Word of Cursor
|
||||
K("Super-Delete"): K("C-Delete"), # Default not-chromebook - Delete Right Word of Cursor
|
||||
K("Alt-Backspace"): K("C-Backspace"), # Default not-chromebook - Delete Left Word of Cursor
|
||||
K("Alt-Delete"): K("C-Delete"), # Default not-chromebook - Delete Right Word of Cursor
|
||||
# K(""): pass_through_key, # cancel
|
||||
# K(""): K(""), #
|
||||
})
|
||||
|
||||
define_keymap(lambda wm_class: wm_class.casefold() not in mscodes,{
|
||||
# Wordwise remaining - for Everything but VS Code
|
||||
K("M-Left"): K("C-Left"), # Left of Word
|
||||
K("M-Shift-Left"): K("C-Shift-Left"), # Select Left of Word
|
||||
K("M-Right"): K("C-Right"), # Right of Word
|
||||
K("M-Shift-Right"): K("C-Shift-Right"), # Select Right of Word
|
||||
K("M-Shift-g"): K("C-Shift-g"), # View source control
|
||||
# ** VS Code fix **
|
||||
# Electron issue precludes normal keybinding fix.
|
||||
# Alt menu auto-focus/toggle gets in the way.
|
||||
#
|
||||
# refer to ./xkeysnail-config/vscode_keybindings.json
|
||||
# **
|
||||
#
|
||||
# ** Firefox fix **
|
||||
# User will need to set "ui.key.menuAccessKeyFocuses"
|
||||
# under about:config to false.
|
||||
#
|
||||
# https://superuser.com/questions/770301/pentadactyl-how-to-disable-menu-bar-toggle-by-alt
|
||||
# **
|
||||
#
|
||||
})
|
||||
|
||||
# Keybindings for VS Code
|
||||
define_keymap(re.compile(codeStr, re.IGNORECASE),{
|
||||
# Wordwise remaining - for VS Code
|
||||
# Alt-F19 hack fixes Alt menu activation
|
||||
K("M-Left"): [K("M-F19"),K("C-Left")], # Left of Word
|
||||
K("M-Right"): [K("M-F19"),K("C-Right")], # Right of Word
|
||||
K("M-Shift-Left"): [K("M-F19"),K("C-Shift-Left")], # Select Left of Word
|
||||
K("M-Shift-Right"): [K("M-F19"),K("C-Shift-Right")], # Select Right of Word
|
||||
|
||||
# K("C-PAGE_DOWN"): pass_through_key, # cancel next_view
|
||||
# K("C-PAGE_UP"): pass_through_key, # cancel prev_view
|
||||
K("C-M-Left"): K("C-PAGE_UP"), # next_view
|
||||
K("C-M-Right"): K("C-PAGE_DOWN"), # prev_view
|
||||
|
||||
# VS Code Shortcuts
|
||||
K("C-g"): pass_through_key, # cancel Go to Line...
|
||||
K("Super-g"): K("C-g"), # Go to Line...
|
||||
K("F3"): pass_through_key, # cancel Find next
|
||||
K("C-h"): pass_through_key, # cancel replace
|
||||
K("C-M-f"): K("C-h"), # replace
|
||||
K("C-Shift-h"): pass_through_key, # cancel replace_next
|
||||
K("C-M-e"): K("C-Shift-h"), # replace_next
|
||||
K("f3"): pass_through_key, # cancel find_next
|
||||
K("C-g"): K("f3"), # find_next
|
||||
K("Shift-f3"): pass_through_key, # cancel find_prev
|
||||
K("C-Shift-g"): K("Shift-f3"), # find_prev
|
||||
# K("Super-C-g"): K("C-f2"), # Default - Sublime - find_all_under
|
||||
# K("C-M-g"): K("C-f2"), # Chromebook - Sublime - find_all_under
|
||||
# K("Super-Shift-up"): K("M-Shift-up"), # multi-cursor up - Sublime
|
||||
# K("Super-Shift-down"): K("M-Shift-down"), # multi-cursor down - Sublime
|
||||
# K(""): pass_through_key, # cancel
|
||||
# K(""): K(""), #
|
||||
}, "Code")
|
||||
|
||||
# Keybindings for Sublime Text
|
||||
define_keymap(re.compile("Sublime_text", re.IGNORECASE),{
|
||||
K("C-Super-up"): K("M-o"), # Switch file
|
||||
K("Super-RC-f"): K("f11"), # toggle_full_screen
|
||||
K("C-M-v"): [K("C-k"), K("C-v")], # paste_from_history
|
||||
K("C-up"): pass_through_key, # cancel scroll_lines up
|
||||
K("Super-M-up"): K("C-up"), # scroll_lines up
|
||||
K("C-down"): pass_through_key, # cancel scroll_lines down
|
||||
K("Super-M-down"): K("C-down"), # scroll_lines down
|
||||
K("Super-Shift-up"): K("M-Shift-up"), # multi-cursor up
|
||||
K("Super-Shift-down"): K("M-Shift-down"), # multi-cursor down
|
||||
K("C-PAGE_DOWN"): pass_through_key, # cancel next_view
|
||||
K("C-PAGE_UP"): pass_through_key, # cancel prev_view
|
||||
K("C-Shift-left_brace"): K("C-PAGE_DOWN"), # next_view
|
||||
K("C-Shift-right_brace"): K("C-PAGE_UP"), # prev_view
|
||||
K("C-M-right"): K("C-PAGE_DOWN"), # next_view
|
||||
K("C-M-left"): K("C-PAGE_UP"), # prev_view
|
||||
K("insert"): pass_through_key, # cancel toggle_overwrite
|
||||
K("C-M-o"): K("insert"), # toggle_overwrite
|
||||
K("M-c"): pass_through_key, # cancel toggle_case_sensitive
|
||||
K("C-M-c"): K("M-c"), # toggle_case_sensitive
|
||||
K("C-h"): pass_through_key, # cancel replace
|
||||
K("C-M-f"): K("C-h"), # replace
|
||||
K("C-Shift-h"): pass_through_key, # cancel replace_next
|
||||
K("C-M-e"): K("C-Shift-h"), # replace_next
|
||||
K("f3"): pass_through_key, # cancel find_next
|
||||
K("C-g"): K("f3"), # find_next
|
||||
K("Shift-f3"): pass_through_key, # cancel find_prev
|
||||
K("C-Shift-g"): K("Shift-f3"), # find_prev
|
||||
K("C-f3"): pass_through_key, # cancel find_under
|
||||
K("Super-M-g"): K("C-f3"), # find_under
|
||||
K("C-Shift-f3"): pass_through_key, # cancel find_under_prev
|
||||
K("Super-M-Shift-g"): K("C-Shift-f3"), # find_under_prev
|
||||
K("M-f3"): pass_through_key, # Default - cancel find_all_under
|
||||
# K("M-Refresh"): pass_through_key, # Chromebook - cancel find_all_under
|
||||
# K("M-C-g"): K("M-Refresh"), # Chromebook - find_all_under
|
||||
K("Super-C-g"): K("M-f3"), # Default - find_all_under
|
||||
K("C-Shift-up"): pass_through_key, # cancel swap_line_up
|
||||
K("Super-C-up"): K("C-Shift-up"), # swap_line_up
|
||||
K("C-Shift-down"): pass_through_key, # cancel swap_line_down
|
||||
K("Super-C-down"): K("C-Shift-down"), # swap_line_down
|
||||
K("C-Pause"): pass_through_key, # cancel cancel_build
|
||||
K("Super-c"): K("C-Pause"), # cancel_build
|
||||
K("f9"): pass_through_key, # cancel sort_lines case_s false
|
||||
K("f5"): K("f9"), # sort_lines case_s false
|
||||
K("Super-f9"): pass_through_key, # cancel sort_lines case_s true
|
||||
K("Super-f5"): K("Super-f9"), # sort_lines case_s true
|
||||
K("M-Shift-Key_1"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Key_1"): K("M-Shift-Key_1"), # set_layout
|
||||
K("M-Shift-Key_2"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Key_2"): K("M-Shift-Key_2"), # set_layout
|
||||
K("M-Shift-Key_3"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Key_3"): K("M-Shift-Key_3"), # set_layout
|
||||
K("M-Shift-Key_4"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Key_4"): K("M-Shift-Key_4"), # set_layout
|
||||
K("M-Shift-Key_8"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Shift-Key_2"): K("M-Shift-Key_8"), # set_layout
|
||||
K("M-Shift-Key_9"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Shift-Key_3"): K("M-Shift-Key_9"), # set_layout
|
||||
K("M-Shift-Key_5"): pass_through_key, # cancel set_layout
|
||||
K("C-M-Shift-Key_5"): K("M-Shift-Key_5"), # set_layout
|
||||
# K(""): pass_through_key, # cancel
|
||||
# K(""): K(""), #
|
||||
}, "Sublime Text")
|
||||
|
||||
define_keymap(re.compile("konsole", re.IGNORECASE),{
|
||||
# Ctrl Tab - In App Tab Switching
|
||||
K("LC-Tab") : K("Shift-Right"),
|
||||
K("LC-Shift-Tab") : K("Shift-Left"),
|
||||
K("LC-Grave") : K("Shift-Left"),
|
||||
|
||||
}, "Konsole tab switching")
|
||||
|
||||
define_keymap(re.compile("Io.elementary.terminal|kitty", re.IGNORECASE),{
|
||||
# Ctrl Tab - In App Tab Switching
|
||||
K("LC-Tab") : K("LC-Shift-Right"),
|
||||
K("LC-Shift-Tab") : K("LC-Shift-Left"),
|
||||
K("LC-Grave") : K("LC-Shift-Left"),
|
||||
|
||||
}, "Elementary Terminal tab switching")
|
||||
|
||||
define_keymap(re.compile(termStr, re.IGNORECASE),{
|
||||
# Ctrl Tab - In App Tab Switching
|
||||
K("LC-Tab") : K("LC-PAGE_DOWN"),
|
||||
K("LC-Shift-Tab") : K("LC-PAGE_UP"),
|
||||
K("LC-Grave") : K("LC-PAGE_UP"),
|
||||
# Converts Cmd to use Ctrl-Shift
|
||||
K("RC-Tab"): K("RC-F13"),
|
||||
K("RC-Shift-Tab"): K("RC-Shift-F13"),
|
||||
K("RC-V"): K("C-Shift-V"),
|
||||
K("RC-MINUS"): K("C-Shift-MINUS"),
|
||||
K("RC-EQUAL"): K("C-Shift-EQUAL"),
|
||||
K("RC-BACKSPACE"): K("C-Shift-BACKSPACE"),
|
||||
K("RC-W"): K("C-Shift-W"),
|
||||
K("RC-E"): K("C-Shift-E"),
|
||||
K("RC-R"): K("C-Shift-R"),
|
||||
K("RC-T"): K("C-Shift-t"),
|
||||
K("RC-Y"): K("C-Shift-Y"),
|
||||
K("RC-U"): K("C-Shift-U"),
|
||||
K("RC-I"): K("C-Shift-I"),
|
||||
K("RC-O"): K("C-Shift-O"),
|
||||
K("RC-P"): K("C-Shift-P"),
|
||||
K("RC-LEFT_BRACE"): K("C-Shift-LEFT_BRACE"),
|
||||
K("RC-RIGHT_BRACE"): K("C-Shift-RIGHT_BRACE"),
|
||||
K("RC-A"): K("C-Shift-A"),
|
||||
K("RC-S"): K("C-Shift-S"),
|
||||
K("RC-D"): K("C-Shift-D"),
|
||||
K("RC-F"): K("C-Shift-F"),
|
||||
K("RC-G"): K("C-Shift-G"),
|
||||
K("RC-H"): K("C-Shift-H"),
|
||||
K("RC-J"): K("C-Shift-J"),
|
||||
K("RC-K"): K("C-Shift-K"),
|
||||
K("RC-L"): K("C-Shift-L"),
|
||||
K("RC-SEMICOLON"): K("C-Shift-SEMICOLON"),
|
||||
K("RC-APOSTROPHE"): K("C-Shift-APOSTROPHE"),
|
||||
K("RC-GRAVE"): K("C-Shift-GRAVE"),
|
||||
K("RC-BACKSLASH"): K("C-Shift-BACKSLASH"),
|
||||
K("RC-Z"): K("C-Shift-Z"),
|
||||
K("RC-X"): K("C-Shift-X"),
|
||||
K("RC-C"): K("C-Shift-C"),
|
||||
K("RC-V"): K("C-Shift-V"),
|
||||
K("RC-B"): K("C-Shift-B"),
|
||||
K("RC-N"): K("C-Shift-N"),
|
||||
K("RC-M"): K("C-Shift-M"),
|
||||
K("RC-COMMA"): K("C-Shift-COMMA"),
|
||||
K("RC-DOT"): K("C-Shift-DOT"),
|
||||
K("RC-SLASH"): K("C-Shift-SLASH"),
|
||||
K("RC-KPASTERISK"): K("C-Shift-KPASTERISK"),
|
||||
}, "terminals")
|
5
xkeysnail-config/limitedadmins
Normal file
@@ -0,0 +1,5 @@
|
||||
# /etc/sudoers.d/limitedadmins
|
||||
%{username} ALL=NOPASSWD: {systemctl} restart xkeysnail
|
||||
%{username} ALL=NOPASSWD: {systemctl} start xkeysnail
|
||||
%{username} ALL=NOPASSWD: {systemctl} stop xkeysnail
|
||||
%{username} ALL=NOPASSWD: {systemctl} status xkeysnail
|
13
xkeysnail-config/prexk.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
if [ -f {homedir}/.config/systemd/user/keyswap.timer ]; then
|
||||
systemctl --user stop keyswap.timer >/dev/null 2>&1
|
||||
systemctl --user disable keyswap.timer >/dev/null 2>&1
|
||||
fi
|
||||
if [ -f {homedir}/.config/systemd/user/keyswap.service ]; then
|
||||
systemctl --user stop keyswap >/dev/null 2>&1
|
||||
systemctl --user disable keyswap >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
# export DISPLAY={displayid};/usr/bin/xhost +SI:localuser:root
|
||||
mkdir -p /tmp/kinto/xkeysnail
|
||||
cp {homedir}/.config/kinto/kinto.py /tmp/kinto/xkeysnail/kinto.py
|
31
xkeysnail-config/vscode_keybindings.json
Normal file
@@ -0,0 +1,31 @@
|
||||
// Place your key bindings in this file to override the defaultsauto[]
|
||||
[
|
||||
{
|
||||
"key": "alt+left",
|
||||
"command": "-workbench.action.terminal.focusPreviousPane",
|
||||
"when": "terminalFocus"
|
||||
},
|
||||
{
|
||||
"key": "alt+right",
|
||||
"command": "-workbench.action.terminal.focusNextPane",
|
||||
"when": "terminalFocus"
|
||||
},
|
||||
{
|
||||
"key": "alt+right",
|
||||
"command": "cursorWordRight"
|
||||
},
|
||||
{
|
||||
"key": "alt+left",
|
||||
"command": "cursorWordLeft"
|
||||
},
|
||||
{
|
||||
"key": "shift+alt+left",
|
||||
"command": "cursorWordStartLeftSelect",
|
||||
"when": "textInputFocus"
|
||||
},
|
||||
{
|
||||
"key": "shift+alt+right",
|
||||
"command": "cursorWordEndRightSelect",
|
||||
"when": "textInputFocus"
|
||||
}
|
||||
]
|
8
xkeysnail-config/xkeysnail.desktop
Normal file
@@ -0,0 +1,8 @@
|
||||
[Desktop Entry]
|
||||
Name=Kinto_xkey
|
||||
GenericName=Kinto_xkey
|
||||
Comment=Make Linux Type Like it's a Mac
|
||||
Exec=/bin/bash -c "{xhost} +SI:localuser:root && sudo {systemctl} restart xkeysnail"
|
||||
Terminal=false
|
||||
Type=Application
|
||||
X-GNOME-Autostart-enabled=true
|
15
xkeysnail-config/xkeysnail.service
Normal file
@@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=xkeysnail
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
KillMode=process
|
||||
ExecStartPre=/bin/bash -c "{xhost} +SI:localuser:root && /sbin/runuser -l {username} -c {homedir}/.config/kinto/prexk.sh"
|
||||
ExecStart=/usr/bin/sudo /bin/bash -c '{experimental-caret}{homedir}/.config/kinto/xkeystart.sh /tmp/kinto/xkeysnail/kinto.py'
|
||||
ExecStop=/bin/bash -c 'me=$$;ps -ef | grep \'[t]mp/kinto\' | awk -v me=$me \'$2 != me {print $2}\' | xargs kill;/usr/bin/killall dbus-monitor;/usr/bin/killall xkeysnail;{kill-caret}'
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
Environment=DISPLAY={displayid}
|
||||
|
||||
[Install]
|
||||
WantedBy=graphical.target
|
19
xkeysnail-config/xkeystart.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
# >/dev/null 2>&1
|
||||
|
||||
if [ -f /usr/local/bin/xkeysnail ];then
|
||||
xkeyfullpath="/usr/local/bin/xkeysnail"
|
||||
elif [ -f /usr/bin/xkeysnail ];then
|
||||
xkeyfullpath="/usr/bin/xkeysnail"
|
||||
else
|
||||
xkeyfullpath=`which xkeysnail`
|
||||
fi
|
||||
|
||||
"$xkeyfullpath" --quiet --watch "$1" &
|
||||
|
||||
inotifywait -m -e close_write,moved_to,create,modify /tmp/kinto/xkeysnail |
|
||||
|
||||
while read -r path; do
|
||||
/usr/bin/killall xkeysnail
|
||||
"$xkeyfullpath" --quiet --watch "$1" &
|
||||
done
|
401
xkeysnail_service.sh
Executable file
@@ -0,0 +1,401 @@
|
||||
#!/bin/bash
|
||||
|
||||
# set about:config?filter=ui.key.menuAccessKeyFocuses
|
||||
# to false for wordwise to work in Firefox
|
||||
|
||||
typeset -l distro
|
||||
distro=$(awk -F= '$1=="NAME" { print $2 ;}' /etc/os-release)
|
||||
typeset -l dename
|
||||
dename=$(./system-config/dename.sh | cut -d " " -f1)
|
||||
|
||||
function uninstall {
|
||||
|
||||
while true; do
|
||||
read -rep $'\nPress R to restore your original shortcuts.\nPress F to reset to factory shortcuts. (f/r)\n' yn
|
||||
case $yn in
|
||||
[Ff]* ) yn="f"; break;;
|
||||
[Rr]* ) yn="r";break;;
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$yn" == "f" ];then
|
||||
echo "Reset to factory shortcuts"
|
||||
if [ "$dename" == "gnome" ];then
|
||||
echo "Resetting DE hotkeys..."
|
||||
echo "gsettings reset-recursively org.gnome.desktop.wm.keybindings"
|
||||
gsettings reset-recursively org.gnome.desktop.wm.keybindings
|
||||
echo "gsettings reset-recursively org.gnome.mutter.keybindings"
|
||||
gsettings reset-recursively org.gnome.mutter.keybindings
|
||||
echo "gsettings set org.gnome.mutter overlay-key 'super'"
|
||||
gsettings set org.gnome.mutter overlay-key 'super'
|
||||
dconf dump /org/gnome/mutter/ > mutter.conf
|
||||
dconf load /org/gnome/mutter/ < mutter.conf
|
||||
elif [ "$dename" == "kde" ];then
|
||||
echo "Resetting DE hotkeys..."
|
||||
mv ~/.config/kwinrc ~/.config/kwinrc.kinto
|
||||
mv ~/.config/kglobalshortcutsrc ~/.config/kglobalshortcutsrc.kinto
|
||||
elif [ "$dename" == "xfce" ];then
|
||||
echo "Resetting DE hotkeys..."
|
||||
cp /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
|
||||
fi
|
||||
elif [ "$yn" == "r" ]; then
|
||||
echo "Restore original user shortcuts"
|
||||
if [ "$dename" == "gnome" ]; then
|
||||
echo "Restoring DE hotkeys..."
|
||||
wmkeys=$(ls | grep -m1 "keybinding")
|
||||
mutterkeys=$(ls | grep -m1 "mutter_")
|
||||
if [[ ${#wmkeys} > 0 ]]; then
|
||||
echo "dconf load /org/gnome/desktop/wm/keybindings/ < $wmkeys"
|
||||
dconf load /org/gnome/desktop/wm/keybindings/ < "$wmkeys"
|
||||
else
|
||||
echo "Gnome Desktop keybindings backup not found..."
|
||||
fi
|
||||
if [[ ${#mutterkeys} > 0 ]]; then
|
||||
echo "dconf load /org/gnome/mutter/keybindings/ < $mutterkeys"
|
||||
dconf load /org/gnome/mutter/keybindings/ <"$mutterkeys"
|
||||
fi
|
||||
if [[ ${#wmkeys} > 0 ]] || [[ ${#mutterkeys} > 0 ]]; then
|
||||
echo "Gnome hotkeys have been successfully restored."
|
||||
fi
|
||||
elif [ "$dename" == "kde" ]; then
|
||||
echo "Restoring DE hotkeys..."
|
||||
kwinkeys = $(ls | grep -m1 "kwinrc")
|
||||
kdekeys = $(ls | grep -m1 "kglobalshortcutsrc")
|
||||
cp ./"$kdekeys" ~/.config/kglobalshortcutsrc
|
||||
cp ./"$kwinkeys" ~/.config/kwinrc
|
||||
elif [ "$dename" == "xfce" ]; then
|
||||
echo "Restoring DE hotkeys..."
|
||||
xfcekeys = $(ls | grep -m1 "xfce4-keyboard")
|
||||
cp ./"$xfcekeys" ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function removeAppleKB {
|
||||
# Undo Apple keyboard cmd & alt swap
|
||||
if test -f "/sys/module/hid_apple/parameters/swap_opt_cmd" && [ `cat /sys/module/hid_apple/parameters/swap_opt_cmd` == "1" ]; then
|
||||
echo '0' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd
|
||||
echo 'options hid_apple swap_opt_cmd=0' | sudo tee -a /etc/modprobe.d/hid_apple.conf
|
||||
sudo update-initramfs -u -k all
|
||||
fi
|
||||
if test -f "/sys/module/applespi/parameters/swap_opt_cmd" && [ `cat /sys/module/applespi/parameters/swap_opt_cmd` == "1" ]; then
|
||||
echo '0' | sudo tee -a /sys/module/applespi/parameters/swap_opt_cmd
|
||||
echo 'options applespi swap_opt_cmd=0' | sudo tee -a /etc/modprobe.d/applespi.conf
|
||||
sudo update-initramfs -u -k all
|
||||
fi
|
||||
}
|
||||
|
||||
function budgieUninstall {
|
||||
if [ -f /usr/bin/budgie-desktop ];then
|
||||
read -n 1 -s -r -p "Your system may log you off immediately during the restoration of budgie-daemon. Press any key to continue..."
|
||||
bdmd5="$(md5sum /usr/bin/budgie-daemon | awk '{ print $1 }')"
|
||||
oldbdmd5=$(md5sum ./budgie-daemon_10.5.1.bak | awk '{ print $1 }')
|
||||
if [ "$bdmd5" != "$oldbdmd5" ]; then
|
||||
echo -e "\nReplacing budgie-daemon with backup..."
|
||||
sudo pkill budgie-daemon && sudo cp ./budgie-daemon_10.5.1.bak /usr/bin/budgie-daemon
|
||||
else
|
||||
echo -e "\nBudgie-daemon is already an original."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function budgieUpdate {
|
||||
# Check for budgie and install App Switching hack
|
||||
if [ -f /usr/bin/budgie-desktop ];then
|
||||
while true; do
|
||||
read -rep $'Would you like to update Budgie to support proper App Switching? (y/n)\n(Your system will immediately log you out after this runs.)\n' yn
|
||||
case $yn in
|
||||
[Yy]* ) yn="y"; break;;
|
||||
[Nn]* ) yn="n";break;;
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
if [ "$yn" == "y" ]; then
|
||||
budgieVersion="$(/usr/bin/budgie-desktop --version | awk '{ print $2; }' | head -n1)"
|
||||
if [ "$budgieVersion" == "10.5.1" ]; then
|
||||
if ! [ -f ./system-config/budgie-daemon_10.5.1 ]; then
|
||||
wget https://github.com/rbreaves/budgie-desktop/raw/f112e0e349c021c1bbfa7e45c16083eae0d92fac/binaries/budgie-daemon_10.5.1 -O ./system-config/budgie-daemon_10.5.1
|
||||
fi
|
||||
bdmd5=$(md5sum /usr/bin/budgie-daemon | awk '{ print $1 }')
|
||||
newbdmd5=$(md5sum ./system-config/budgie-daemon_10.5.1 | awk '{ print $1 }')
|
||||
if [ "$bdmd5" != "$newbdmd5" ]; then
|
||||
cp /usr/bin/budgie-daemon ./budgie-daemon_"$budgieVersion".bak
|
||||
sudo pkill budgie-daemon && sudo cp ./system-config/budgie-daemon_10.5.1 /usr/bin/budgie-daemon
|
||||
echo "Updated Budgie to use App Switching Patch"
|
||||
else
|
||||
echo "Budgie-daemon already patched, skipping replacement."
|
||||
fi
|
||||
else
|
||||
echo "Your Budgie version was $budgieVersion and the patch is for 10.5.1."
|
||||
while true; do
|
||||
read -rep $'Would you like to replace it any ways? (y/n)\n(A backup will be made)\n' yn
|
||||
case $yn in
|
||||
[Yy]* ) yn="y"; break;;
|
||||
[Nn]* ) yn="n";break;;
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
if [ "$yn" == "y" ]; then
|
||||
if ! [ -f ./system-config/budgie-daemon_10.5.1 ]; then
|
||||
wget https://github.com/rbreaves/budgie-desktop/raw/43d3b44243b0bcaee3262a79818024a651475b58/binaries/budgie-daemon_10.5.1 -O ./system-config/budgie-daemon_10.5.1
|
||||
fi
|
||||
cp /usr/bin/budgie-daemon ./budgie-daemon_"$budgieVersion".bak
|
||||
sudo pkill budgie-daemon && sudo cp ./system-config/budgie-daemon_10.5.1 /usr/bin/budgie-daemon
|
||||
echo "Updated Budgie to use App Switching Patch"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Install Kinto - xkeysnail (udev)"
|
||||
echo " 1) Windows & Mac (HID driver)"
|
||||
echo " 2) Mac Only & VMs on Macbooks"
|
||||
echo " 3) Chromebook"
|
||||
# echo " 5) Uninstall"
|
||||
|
||||
read n
|
||||
|
||||
set "$n"
|
||||
fi
|
||||
|
||||
# multi-language
|
||||
rightalt=false
|
||||
# VS code remap
|
||||
vssublime=false
|
||||
|
||||
if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "winmac" || $1 == "mac" || $1 == "chromebook" ]]; then
|
||||
while true; do
|
||||
read -rep $'\nDo you want multi-language support (the right Alt key will not remap)? (y/N)\n' yn
|
||||
case $yn in
|
||||
[Yy]* ) rightalt=true; break;;
|
||||
* ) break;;
|
||||
esac
|
||||
done
|
||||
while true; do
|
||||
read -rep $'\nWould you like to give VS Code Sublime Text keymaps? (y/N)\n' yn
|
||||
case $yn in
|
||||
[Yy]* ) vssublime=true; break;;
|
||||
* ) break;;
|
||||
esac
|
||||
done
|
||||
branch=$(git rev-parse --abbrev-ref HEAD)
|
||||
if [ "$branch" == "dev" ] || [ "$branch" == "alpha" ];then
|
||||
while true; do
|
||||
read -rep $'\nExperimental Support for Firefox/Chrome Back/Forward hotkeys (Cmd+Left/Right)?\n(Keys could get stuck, switch windows or press ctrl &/or super to release) (y/n)\n' yn
|
||||
case $yn in
|
||||
[Yy]* ) exp='/sbin/runuser -l {username} -c "export DISPLAY={displayid};{homedir}/.config/kinto/caret_status_xkey.sh\&";'; expsh='"{homedir}/.config/kinto/caret_status_xkey.sh"'; break;;
|
||||
[Nn]* ) exp=" "; expsh=" " break;;
|
||||
# * ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
else
|
||||
echo -e "\nSupport for Firefox/Chrome Back/Forward hotkeys (Cmd+Left/Right) disabled on $branch w/ xkeysnail \n"
|
||||
exp=" "
|
||||
expsh=" "
|
||||
fi
|
||||
sudo systemctl enable xkeysnail >/dev/null 2>&1
|
||||
if ! [ -x "$(command -v inotifywait)" ]; then
|
||||
echo "Will need to install inotify-tools to restart key remapper live for config file changes..."
|
||||
sudo ./system-config/unipkg.sh inotify-tools
|
||||
fi
|
||||
if ! [ -x "$(command -v pip3)" ]; then
|
||||
echo "Will need to install python3-pip..."
|
||||
sudo ./system-config/unipkg.sh python3-pip
|
||||
fi
|
||||
if ! [ -x "$(command -v python3-config)" ]; then
|
||||
if [ "$distro" == "ubuntu" ] || [ "$distro" == "debian" ] || [ "$distro" == '"linux mint"' ]; then
|
||||
pydev="python3-dev"
|
||||
elif [ "$distro" == "fedora" ]; then
|
||||
pydev="python3-devel"
|
||||
fi
|
||||
if [ "$distro" == "gnome" ] || [ "$distro" == "fedora" ] || [ "$distro" == "debian" ] || [ "$distro" == '"linux mint"' ]; then
|
||||
echo "Will need to install $pydev..."
|
||||
sudo ./system-config/unipkg.sh "$pydev"
|
||||
fi
|
||||
fi
|
||||
if ! [ -x "$(command -v xhost)" ] || ! [ -x "$(command -v gcc)" ]; then
|
||||
if [ "$distro" == "\"manjaro linux\"" ]; then
|
||||
sudo ./system-config/unipkg.sh "xorg-xhost gcc"
|
||||
fi
|
||||
fi
|
||||
if [ "$distro" == '"linux mint"' ]; then
|
||||
pip3 install setuptools
|
||||
fi
|
||||
|
||||
# echo "Transferring files..."
|
||||
mkdir -p ~/.config/kinto
|
||||
|
||||
# KDE xhost fix
|
||||
mkdir -p ~/.kde/Autostart
|
||||
echo -e '#!/bin/sh\rxhost +SI:localuser:root' > ~/.kde/Autostart/kintohost.sh
|
||||
chmod +x ~/.kde/Autostart/kintohost.sh
|
||||
|
||||
# KDE startup - xhost fix
|
||||
yes | cp -rf ./xkeysnail-config/xkeysnail.desktop ~/.config/autostart/xkeysnail.desktop
|
||||
|
||||
yes | cp -rf ./xkeysnail-config/xkeystart.sh ~/.config/kinto/xkeystart.sh
|
||||
yes | cp -rf ./xkeysnail-config/kinto.py ./xkeysnail-config/kinto.py.new
|
||||
yes | cp -rf ./xkeysnail-config/limitedadmins ./xkeysnail-config/limitedadmins.new
|
||||
yes | cp -rf ./xkeysnail-config/prexk.sh ~/.config/kinto/prexk.sh
|
||||
yes | cp -rf ./system-config/caret_status_xkey.sh ~/.config/kinto/caret_status_xkey.sh
|
||||
yes | cp -rf ./xkeysnail-config/xkeysnail.service ./xkeysnail-config/xkeysnail.service.new
|
||||
# yes | cp -rf ./xkeysnail-config/xkeysnail.timer ~/.config/systemd/user/xkeysnail.timer
|
||||
sed -i "s#{experimental-caret}#$exp#g" ./xkeysnail-config/xkeysnail.service.new
|
||||
if [ "$expsh" != " " ];then
|
||||
sed -i "s#{kill-caret}#/usr/bin/pkill -f $expsh#g" ./xkeysnail-config/xkeysnail.service.new
|
||||
else
|
||||
sed -i "s#{kill-caret}#$expsh#g" ./xkeysnail-config/xkeysnail.service.new
|
||||
fi
|
||||
sed -i "s/{username}/`whoami`/g" ./xkeysnail-config/xkeysnail.service.new
|
||||
sed -i "s#{homedir}#`echo "$HOME"`#g" ./xkeysnail-config/xkeysnail.service.new
|
||||
sed -i "s#{xhost}#`which xhost`#g" ./xkeysnail-config/xkeysnail.service.new
|
||||
sed -i "s/{username}/`whoami`/g" ./xkeysnail-config/limitedadmins.new
|
||||
sed -i "s#{homedir}#`echo "$HOME"`#g" ./xkeysnail-config/limitedadmins.new
|
||||
sed -i "s#{systemctl}#`which systemctl`#g" ./xkeysnail-config/limitedadmins.new
|
||||
sudo chown root:root ./xkeysnail-config/limitedadmins.new
|
||||
sudo mv ./xkeysnail-config/limitedadmins.new /etc/sudoers.d/limitedadmins
|
||||
sed -i "s#{systemctl}#`which systemctl`#g" ~/.config/autostart/xkeysnail.desktop
|
||||
sed -i "s#{xhost}#`which xhost`#g" ~/.config/autostart/xkeysnail.desktop
|
||||
sed -i "s#{homedir}#`echo "$HOME"`#g" ~/.config/kinto/prexk.sh
|
||||
sed -i "s/{displayid}/`echo "$DISPLAY"`/g" ./xkeysnail-config/xkeysnail.service.new
|
||||
sed -i "s/{displayid}/`echo "$DISPLAY"`/g" ~/.config/kinto/prexk.sh
|
||||
|
||||
if $vssublime ; then
|
||||
perl -pi -e "s/(# )(.*)(- Sublime)/\$2\$3/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $1 == "1" || $1 == "winmac" ]]; then
|
||||
if ls /sys/module | grep hid_apple >/dev/null 2>&1 ; then
|
||||
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
|
||||
fi
|
||||
if ls /sys/module | grep applespi >/dev/null 2>&1 ; then
|
||||
echo '1' | sudo tee -a /sys/module/applespi/parameters/swap_opt_cmd;echo 'options applespi swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/applespi.conf;sudo update-initramfs -u -k all
|
||||
fi
|
||||
if ! ls /sys/module | grep apple ; then
|
||||
removeAppleKB
|
||||
fi
|
||||
perl -pi -e "s/(# )(.*)(# WinMac)/\$2\$3/g" ./xkeysnail-config/kinto.py.new
|
||||
if [[ $dename == "xfce" ]]; then
|
||||
perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new
|
||||
perl -pi -e "s/(\w.*)(# Default not-xfce4)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new
|
||||
fi
|
||||
elif [[ $1 == "2" || $1 == "mac" ]]; then
|
||||
removeAppleKB
|
||||
perl -pi -e "s/(# )(.*)(# Mac)/\$2\$3/g" ./xkeysnail-config/kinto.py.new
|
||||
if [[ $dename == "xfce" ]]; then
|
||||
perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new
|
||||
perl -pi -e "s/(\w.*)(# Default not-xfce4)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new
|
||||
fi
|
||||
elif [[ $1 == "3" || $1 == "chromebook" ]]; then
|
||||
perl -pi -e "s/(# )(.*)(# Chromebook)/\$2\$3/g" ./xkeysnail-config/kinto.py.new
|
||||
perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new
|
||||
perl -pi -e "s/(\w.*)(# Default)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new
|
||||
fi
|
||||
|
||||
if $rightalt ; then
|
||||
perl -pi -e "s/(\w.*)(Multi-language)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "winmac" || $1 == "mac" || $1 == "chromebook" ]]; then
|
||||
mv ./xkeysnail-config/kinto.py.new ~/.config/kinto/kinto.py
|
||||
# if [ "$distro" == "fedora" ];then
|
||||
sudo rm /etc/systemd/system/xkeysnail.service
|
||||
if [ -d /usr/lib/systemd/system ];then
|
||||
xkeypath="/usr/lib/systemd/system/"
|
||||
elif [ -d /lib/systemd/system ];then
|
||||
xkeypath="/lib/systemd/system/"
|
||||
fi
|
||||
sudo mv ./xkeysnail-config/xkeysnail.service.new "$xkeypath"xkeysnail.service && echo "Service file added to "$xkeypath"xkeysnail.service"
|
||||
sudo chown -R root:root "$xkeypath"xkeysnail.service && echo "Ownership set for root..." || echo "Failed to set ownership..."
|
||||
sudo chmod 644 "$xkeypath"xkeysnail.service && echo "Permissions set to 644..." || echo "Failed to set permissions..."
|
||||
sudo ln -s "$xkeypath"xkeysnail.service /etc/systemd/system/xkeysnail.service && echo "Created soft symlink..." || echo "Failed to create soft symlink..."
|
||||
sudo ln -s "$xkeypath"xkeysnail.service /etc/systemd/system/graphical.target.wants/xkeysnail.service && echo "Created soft symlink for graphical target..." || echo "Failed to create soft symlink for graphical target..."
|
||||
xhost +SI:localuser:root
|
||||
git clone --depth 10 https://github.com/rbreaves/xkeysnail.git || git pull --depth 10
|
||||
cd xkeysnail
|
||||
git checkout 51c369084e0045a8410d227bab52411bf84fb65b
|
||||
giturl=$(git ls-remote --get-url)
|
||||
if [ "$giturl" != "https://github.com/rbreaves/xkeysnail.git" ];then
|
||||
echo -e "\nreplacing xkeysnail with fork...\n"
|
||||
cd ..
|
||||
rm -rf ./xkeysnail
|
||||
git clone --depth 10 https://github.com/rbreaves/xkeysnail.git
|
||||
cd xkeysnail
|
||||
git checkout 51c369084e0045a8410d227bab52411bf84fb65b
|
||||
fi
|
||||
sudo pip3 install --upgrade .
|
||||
cd ..
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl --state=not-found --all | grep xkeysnail
|
||||
if [ "$distro" == "fedora" ];then
|
||||
systemctl enable xkeysnail.service
|
||||
else
|
||||
sudo systemctl enable xkeysnail.service
|
||||
fi
|
||||
sudo systemctl restart xkeysnail
|
||||
|
||||
echo -e "Adding xhost fix...\n"
|
||||
|
||||
LINE='xhost +SI:localuser:root'
|
||||
|
||||
if [ ! -e "~/.xprofile" ]; then
|
||||
# Ubuntu xhost fix
|
||||
echo "$LINE" > ~/.xprofile
|
||||
# echo "$LINE" > ~/.xinitrc
|
||||
fi
|
||||
# Ubuntu xhost fix
|
||||
grep -qF -- "$LINE" ~/.xprofile || echo "$LINE" >> ~/.xprofile
|
||||
# KDE xhost fix
|
||||
# grep -qF -- "$LINE" ~/.bashrc || echo "$LINE" >> ~/.bashrc
|
||||
# grep -qF -- "$LINE" ~/.xinitrc || echo "$LINE" >> ~/.xinitrc
|
||||
|
||||
# remove kintox11 login startup
|
||||
if test -f "~/.config/autostart/kinto.desktop"; then
|
||||
rm ~/.config/autostart/kinto.desktop
|
||||
fi
|
||||
|
||||
echo -e "Kinto install is \e[1m\e[32mcomplete\e[0m.\n"
|
||||
if `sudo systemctl is-active --quiet xkeysnail`;then
|
||||
echo -e "Kinto \e[1m\e[32mxkeysnail service is running\e[0m.\n"
|
||||
echo "Commands for controlling Kinto's xkeysnail service"
|
||||
echo "sudo systemctl restart xkeysnail"
|
||||
echo "sudo systemctl stop xkeysnail"
|
||||
echo "sudo systemctl start xkeysnail"
|
||||
echo "sudo systemctl status xkeysnail"
|
||||
else
|
||||
echo -e "Kinto \e[1m\e[91mxkeysnail service has failed.\e[0m"
|
||||
echo "You can run 'sudo systemctl status xkeysnail' for more info"
|
||||
echo "You can also run 'sudo journalctl -u xkeysnail'"
|
||||
fi
|
||||
echo ""
|
||||
if $vssublime ; then
|
||||
echo -e "\e[1m\e[32mEnabled\e[0m VS Code Sublime Text remap."
|
||||
fi
|
||||
if $rightalt ; then
|
||||
echo -e "\e[1m\e[32mEnabled\e[0m mutli-language support."
|
||||
fi
|
||||
elif [[ $1 == "5" || $1 == "uninstall" || $1 == "Uninstall" ]]; then
|
||||
echo "Uninstalling Kinto - xkeysnail (udev)"
|
||||
uninstall
|
||||
removeAppleKB
|
||||
sudo systemctl stop xkeysnail
|
||||
sudo systemctl disable xkeysnail
|
||||
sudo rm /etc/sudoers.d/limitedadmins
|
||||
rm ~/.config/autostart/xkeysnail.desktop
|
||||
rm -rf ~/.config/kinto
|
||||
sudo rm /etc/systemd/system/xkeysnail.service
|
||||
sudo rm /etc/systemd/system/graphical.target.wants/xkeysnail.service
|
||||
sudo rm /usr/lib/systemd/system/xkeysnail.service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl --state=not-found --all | grep xkeysnail
|
||||
budgieUninstall
|
||||
exit 0
|
||||
elif [[ $1 == "5" || $1 == "budgieUpdate" ]]; then
|
||||
budgieUpdate
|
||||
else
|
||||
echo "Expected argument was not provided"
|
||||
fi
|