From 1d088b2e1d98e5c3bfb0c336a3e2723740506791 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Wed, 20 May 2020 01:29:14 -0500 Subject: [PATCH 01/35] Typo correction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2002b0a..40d06ac 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Kinto works for standard Windows, Apple and Chromebook keyboards. The following - Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts. -Does Kinto have to have specific keyamps for individual apps? +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! From 8dc05e7acecd8ff7e57a585f2159bc5767b41251 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Wed, 27 May 2020 15:08:37 -0500 Subject: [PATCH 02/35] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 40d06ac..0ab60fb 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ Other programs that will be installed when you run ./setup.py - Chocolatey - Autohotkey +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. + 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. ## How to install From 06180c3517b48b3cecd8e578c4830e35bdccc3f9 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 29 May 2020 16:15:02 -0500 Subject: [PATCH 03/35] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 97fac0c..0c11dcf 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -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. From 0275669be1dcdb20ac8bcaac9e1b4373fa47606b Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Mon, 1 Jun 2020 17:00:32 -0500 Subject: [PATCH 04/35] - Fixed pasting & various shortcut issues under Windows 10 --- windows/kinto.ahk | 48 +++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/windows/kinto.ahk b/windows/kinto.ahk index f402188..5f75127 100644 --- a/windows/kinto.ahk +++ b/windows/kinto.ahk @@ -106,25 +106,41 @@ return #^g::send !{F3} #If -; Not sure why this fix is needed -#IfWinActive ahk_exe Firefox.exe - ^v::send ^v -#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 + ; Paste + $^v:: + If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ + Send {LCtrl down}{LShift down}v{LCtrl Up}{LShift Up} + } + else{ + Send ^v + } + return #If #IfWinActive ahk_group posix ; Open/Close Tab for those that support it - ^t::Send {LCtrl down}{LShift down}t{LCtrl Up}{LShift Up} - ^w::Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} + $^t:: + If not WinActive("ahk_group ConEmu"){ + Send {LCtrl down}{LShift down}t{LCtrl Up}{LShift Up} + } + else{ + Send ^t + } + return + + $^w:: + If not WinActive("ahk_group ConEmu"){ + Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} + } + else{ + Send ^w + } + return + ; End of Line #e::Send {LCtrl down}e{LCtrl Up} ^e::return @@ -149,11 +165,11 @@ return #z::Send {LCtrl down}z{LCtrl Up} #If -#IfWinActive ahk_group ConEmu - ; Paste - $^v::Send {Shift down}{Insert}{Shift Up} - #v::Send {LCtrl down}v{LCtrl Up} -#If +; #IfWinActive ahk_group ConEmu +; ; Paste +; $^v::Send {Shift down}{Insert}{Shift Up} +; #v::Send {LCtrl down}v{LCtrl Up} +; #If #IfWinActive ahk_exe mintty.exe ; Copy From cbb60668e3a33af90fe3c31d701e80cb6bf439da Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 6 Jun 2020 03:29:47 -0500 Subject: [PATCH 05/35] - Proof of concept cheatsheet feature --- references/overlay.py | 138 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 references/overlay.py diff --git a/references/overlay.py b/references/overlay.py new file mode 100644 index 0000000..542a60c --- /dev/null +++ b/references/overlay.py @@ -0,0 +1,138 @@ +import wx +# import wx.richtext as rt +# import images +# http://www.ccp4.ac.uk/dist/checkout/wxPython-src-3.0.2.0/wxPython/demo/RichTextCtrl.py +# https://stackoverflow.com/questions/40257359/how-to-dynamically-update-multiple-wxpython-static-text + +def GetRoundBitmap( w, h, r ): + maskColor = wx.Colour(0,0,0) + shownColor = wx.Colour(5,5,5) + b = wx.EmptyBitmap(w,h) + dc = wx.MemoryDC(b) + dc.SetBrush(wx.Brush(maskColor)) + dc.DrawRectangle(0,0,w,h) + dc.SetBrush(wx.Brush(shownColor)) + dc.SetPen(wx.Pen(shownColor)) + dc.DrawRoundedRectangle(0,0,w,h,r) + dc.SelectObject(wx.NullBitmap) + b.SetMaskColour(maskColor) + return b + +def GetRoundShape( w, h, r ): + return wx.Region( GetRoundBitmap(w,h,r) ) + +class PanelOne(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent) + self.Bind(wx.EVT_KEY_UP, self.OnKeyDown) + wx.StaticText(self, label = "'^⌘G - Select All (Ctrl-Cmd-G) ^⌘G - Select All (Ctrl-Cmd-G)\n^⌘G - Select All (Ctrl-Cmd-G) ^⌘G - Select All (Ctrl-Cmd-G)") + self.SetTransparent( 220 ) + + def OnKeyDown(self, event): + self.Destroy() + +class FancyFrame(wx.Frame): + def __init__(self): + sizer = wx.GridBagSizer() + style = ( wx.CLIP_CHILDREN | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR | + wx.NO_BORDER | wx.FRAME_SHAPED ) + wx.Frame.__init__(self, None, title='Fancy', style = style) + + # self.rtc = rt.RichTextCtrl(self, style=wx.VSCROLL|wx.TE_READONLY|wx.HSCROLL|wx.NO_BORDER); + # self.rtc.Disable() + boldstatic = wx.Font(pointSize = 24, family = wx.DEFAULT, + style = wx.BOLD, weight = wx.BOLD, + faceName = 'Consolas') + normalstatic = wx.Font(pointSize = 10, family = wx.DEFAULT, + style = wx.NORMAL, weight = wx.NORMAL, + faceName = 'Consolas') + # font = wx.Font(pointSize = 18, family = wx.DEFAULT, + # style = wx.NORMAL, weight = wx.NORMAL, + # faceName = 'Consolas') + self.SetFont(boldstatic) + self.SetBackgroundColour((211,211,211)) + self.label = wx.StaticText(self, label = "^⌘G", pos = (100,50)) + self.SetFont(normalstatic) + self.label2 = wx.StaticText(self, label = " - Select All (Ctrl-Cmd-G)", pos = (200,50)) + # sizer.Add(self.label, (4, 0), (1, 5), wx.EXPAND) + # sizer.Add(self.label2, (5, 0), (1, 5), wx.EXPAND) + # wx.StaticText(self, label = "^⌘G - Select All (Ctrl-Cmd-G) || ^⌘G - Select All (Ctrl-Cmd-G)\n^⌘G - Select All (Ctrl-Cmd-G) ^⌘G - Select All (Ctrl-Cmd-G)") + # self.rtc.Bind(wx.EVT_SET_FOCUS,self.OnInput) + # self.rtc.Bind(wx.EVT_KILL_FOCUS,self.OnInput) + # self.rtc.Bind(wx.EVT_KEY_UP, self.OnKeyDown) + # self.rtc.BeginFontSize(14) + # self.rtc.BeginBold() + # self.rtc.WriteText("^⌘G") + # self.rtc.EndBold() + # self.rtc.BeginFontSize(10) + # self.rtc.WriteText(" - Select All (Ctrl-Cmd-G)\n") + # self.rtc.BeginFontSize(14) + # self.rtc.WriteText("Different font sizes on the same line is allowed, too.") + # self.rtc.EndFontSize() + + # self.rtc.WriteText(" Next we'll show an indented paragraph.") + + # self.rtc.BeginLeftIndent(60) + # self.rtc.Newline() + + # self.rtc.WriteText("It was in January, the most down-trodden month of an Edinburgh winter. An attractive woman came into the cafe, which is nothing remarkable.") + # self.rtc.EndLeftIndent() + # self.SetFont(wx.Font(20, wx.SWISS, wx.NORMAL, wx.BOLD)) + # font = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.NORMAL) + # wx.text.SetFont(font) + # self.panelOne = PanelOne(self) + # self.SetFocus() + w, h = wx.GetDisplaySize() + self.SetSize((w/2, h/2)) + self.SetPosition( ((w-w/2)/2,(h-h/2)/2) ) + self.SetTransparent( 220 ) + + self.Bind(wx.EVT_KEY_UP, self.OnKeyDown) + self.Bind(wx.EVT_MOTION, self.OnMouse) + self.Bind(wx.EVT_PAINT, self.OnPaint) + if wx.Platform == '__WXGTK__': + self.Bind(wx.EVT_WINDOW_CREATE, self.SetRoundShape) + else: + self.SetRoundShape() + + self.SetSizer(sizer) + self.Show(True) + + + def OnInput(self, e): + self.Destroy() + # e.Skip() + + def SetRoundShape(self, event=None): + w, h = self.GetSizeTuple() + self.SetShape(GetRoundShape( w,h, 10 ) ) + + def OnPaint(self, event): + dc = wx.PaintDC(self) + dc = wx.GCDC(dc) + w, h = self.GetSizeTuple() + r = 10 + dc.SetPen( wx.Pen("#D3D3D3dth = 2")) + dc.SetBrush( wx.Brush("#D3D3D3")) + dc.DrawRoundedRectangle( 0,0,w,h,r ) + + def OnKeyDown(self, event): + # self.Close(force=True) + self.Destroy() + + def OnMouse(self, event): + """implement dragging""" + if not event.Dragging(): + self._dragPos = None + return + self.CaptureMouse() + if not self._dragPos: + self._dragPos = event.GetPosition() + else: + pos = event.GetPosition() + displacement = self._dragPos - pos + self.SetPosition( self.GetPosition() - displacement ) + +app = wx.App() +f = FancyFrame() +app.MainLoop() \ No newline at end of file From a00998b1e30faaf045488ad3c68e5fc4deb9eb38 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 6 Jun 2020 21:29:33 -0500 Subject: [PATCH 06/35] - WIP autohotkey update negates need for logoff/reg modification --- windows/new_kinto.ahk | 241 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 windows/new_kinto.ahk diff --git a/windows/new_kinto.ahk b/windows/new_kinto.ahk new file mode 100644 index 0000000..f558ee7 --- /dev/null +++ b/windows/new_kinto.ahk @@ -0,0 +1,241 @@ +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, 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, 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 + +GroupAdd, vscode, ahk_exe VSCodium.exe +GroupAdd, vscode, ahk_exe Code.exe + +; New AltTab and CtrlTab fix +*tab:: +{ + if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { + Send {LAlt up}{LCtrl down}{tab} + KeyWait, tab + } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { + Send {LAlt up}{LShift down}{LCtrl down}{tab} + KeyWait, tab + ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { + Send {LAlt down}{tab} + KeyWait, tab + ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { + Send {LShift down}{LAlt down}{tab} + KeyWait, tab + } else { + send {Blind}{tab} + } + return +} + +; Basic Remap +; +; Primary::LCtrl +; Secondary::LAlt +; Tertiary::LWin + +$LCtrl::LWin +$LWin::LCtrl + +; Hack to disable start menu on winkey +; $LCtrl up::Send {Ctrl down}{Primary up}{Ctrl up} +$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} + +; temporary hack to ensure keys don't get stuck +; impacts Alt-Tab fix +; Primary up::Send {LAlt up}{LCtrl up} +$LWin up::Send {LWin up}{LAlt up}{LCtrl up} + +; 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} +$^Right::Send {End} +$^+Right::Send +{End} +^Up::Send ^{Home} +^+Up::Send ^+{Home} +^Down::Send ^{End} +^+Down::Send ^+{End} +^Backspace::Send +{Home}{Delete} +!Backspace::Send ^{Backspace} +!Left::Send ^{Left} +!+Left::Send ^+{Left} +!Right::Send ^{Right} +!+Right::Send ^+{Right} + +; Cmd+Space Alternative +^Space::Send ^{Esc} + +; ; Sublime Text Remaps for VS Code +#IfWinActive ahk_group vscode ; ST2CODE + ; 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 +#If ; ST2CODE + +#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:: + SetKeyDelay -1 + Send {Blind}{LShift down}{c DownTemp} + return + + ^c up:: + SetKeyDelay -1 + Send {Blind}{c Up}{LShift Up} + return + + ; Paste + ^v:: + If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ + SetKeyDelay -1 + Send {Blind}{LShift down}{v DownTemp} + } + else{ + Send {Blind}v + } + return + + ^v up:: + SetKeyDelay -1 + Send {Blind}{v Up}{LShift Up} + return +#If + +#IfWinActive ahk_group posix + ; 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 + + $^w:: + If not WinActive("ahk_group ConEmu"){ + Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} + } + else{ + Send ^w + } + return + + ; End of Line + ^e:: + SetKeyDelay -1 + Send {Blind}{e DownTemp} + return + + ^e up:: + SetKeyDelay -1 + Send {Blind}{e Up} + return + + ; Beginning of Line + ^a:: + SetKeyDelay -1 + Send {Blind}{a DownTemp} + 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 + #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 + +; #IfWinActive ahk_group ConEmu +; ; Paste +; $^v::Send {Shift down}{Insert}{Shift Up} +; #v::Send {LCtrl down}v{LCtrl Up} +; #If + +; #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 + +;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) + +; 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 + +; 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 \ No newline at end of file From ba1471e397ac8cd6bbf65978b5852701b2c3f518 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 7 Jun 2020 15:28:29 -0500 Subject: [PATCH 07/35] - Additional refinements for Apple and Win keyboards for ahk --- windows/kinto.ahk | 270 +++++++++++++++++++++++------------------- windows/new_kinto.ahk | 16 ++- windows/win_kinto.ahk | 268 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 431 insertions(+), 123 deletions(-) create mode 100644 windows/win_kinto.ahk diff --git a/windows/kinto.ahk b/windows/kinto.ahk index 5f75127..e3e9ac7 100644 --- a/windows/kinto.ahk +++ b/windows/kinto.ahk @@ -1,3 +1,43 @@ +; Cmd Tab For App Switching +; LWin & Tab::AltTab +; RWin & Tab::AltTab + +; New AltTab and CtrlTab fix +*tab:: +{ + if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { + Send {LAlt up}{LCtrl down}{tab} + KeyWait, tab + } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { + Send {LAlt up}{LShift down}{LCtrl down}{tab} + KeyWait, tab + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { + Send {LAlt down}{tab} + KeyWait, tab + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { + Send {LShift down}{LAlt down}{tab} + KeyWait, tab + } else { + send {tab} + } + return +} + +; Basic Remap +; +; Primary::LCtrl +; Secondary::LAlt +; Tertiary::LWin + +$LCtrl::LWin +$LWin::LCtrl +; Hack to disable start menu on winkey +$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} + +; temporary hack to ensure keys don't get stuck +; impacts Alt-Tab fix +$LWin up::Send {LAlt up}{LCtrl up} + SetTitleMatchMode, 2 GroupAdd, terminals, ahk_exe ubuntu.exe @@ -56,45 +96,37 @@ $^+Right::Send +{End} !+Right::Send ^+{Right} ; Cmd+Space Alternative -LWin & vk07::return -LWin::return -RWin & vk07::return -RWin::return ^Space::Send ^{Esc} ; ^Space::run AppName -; Cmd Tab For App Switching -LCtrl & Tab::AltTab -RCtrl & Tab::AltTab +; ; Ctrl Tab for In-App Tab Switching +; ; https://autohotkey.com/board/topic/72433-controltab/ +; #if GetKeyState("LWin") +; *Tab:: +; if(!GetKeyState("LControl")) +; Send {LControl Down} +; Send {Tab} +; SetTimer, WaitForWinUp, 10 +; ToolTip trigger +; return -; Ctrl Tab for In-App Tab Switching -; https://autohotkey.com/board/topic/72433-controltab/ -#if GetKeyState("LWin") -*Tab:: -if(!GetKeyState("LControl")) - Send {LControl Down} -Send {Tab} -SetTimer, WaitForWinUp, 10 -ToolTip trigger -return +; WaitForWinUp: +; if(!GetKeyState("LWin", "P")) +; { +; Send {LControl Up} +; SetTimer, WaitForWinUp, Off +; } +; return -WaitForWinUp: -if(!GetKeyState("LWin", "P")) -{ - Send {LControl Up} - SetTimer, WaitForWinUp, Off -} -return - -; Sublime Text Remaps for VS Code -#IfWinActive ahk_group vscode ; ST2CODE - ; 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 -#If ; ST2CODE +; ; Sublime Text Remaps for VS Code +; #IfWinActive ahk_group vscode ; ST2CODE +; ; 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 +; #If ; ST2CODE #IfWinActive ahk_exe sublime_text.exe ; Remap Ctrl+Shift to behave like macOS Sublimetext @@ -106,93 +138,93 @@ return #^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} - ; Paste - $^v:: - If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ - Send {LCtrl down}{LShift down}v{LCtrl Up}{LShift Up} - } - else{ - Send ^v - } - return -#If - -#IfWinActive ahk_group posix - ; 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 - - $^w:: - If not WinActive("ahk_group ConEmu"){ - Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} - } - else{ - Send ^w - } - return - - ; 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 - -; #IfWinActive ahk_group ConEmu -; ; Paste -; $^v::Send {Shift down}{Insert}{Shift Up} -; #v::Send {LCtrl down}v{LCtrl Up} +; #IfWinActive ahk_group terminals +; ; Copy +; ^c::Send {LCtrl down}{LShift down}c{LCtrl Up}{LShift Up} +; #c::Send {LCtrl down}c{LCtrl Up} +; ; Paste +; $^v:: +; If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ +; Send {LCtrl down}{LShift down}v{LCtrl Up}{LShift Up} +; } +; else{ +; Send ^v +; } +; return ; #If -#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 +; #IfWinActive ahk_group posix +; ; 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 -;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) +; $^w:: +; If not WinActive("ahk_group ConEmu"){ +; Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} +; } +; else{ +; Send ^w +; } +; 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 +; ; 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 -; 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 \ No newline at end of file +; ; #IfWinActive ahk_group ConEmu +; ; ; Paste +; ; $^v::Send {Shift down}{Insert}{Shift Up} +; ; #v::Send {LCtrl down}v{LCtrl Up} +; ; #If + +; #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 + +; ;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) + +; ; 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 + +; ; 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 \ No newline at end of file diff --git a/windows/new_kinto.ahk b/windows/new_kinto.ahk index f558ee7..6cd6cf5 100644 --- a/windows/new_kinto.ahk +++ b/windows/new_kinto.ahk @@ -31,10 +31,10 @@ GroupAdd, vscode, ahk_exe Code.exe *tab:: { if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { - Send {LAlt up}{LCtrl down}{tab} + Send {LCtrl down}{LAlt up}{tab} KeyWait, tab } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { - Send {LAlt up}{LShift down}{LCtrl down}{tab} + Send {LCtrl down}{LAlt up}{LShift down}{tab} KeyWait, tab ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { @@ -42,14 +42,22 @@ GroupAdd, vscode, ahk_exe Code.exe KeyWait, tab ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { - Send {LShift down}{LAlt down}{tab} + Send {LAlt down}{LShift down}{tab} KeyWait, tab + ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P") = false) { + } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { + return + ; ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { + return } else { send {Blind}{tab} } return } +tab::Send {tab} + ; Basic Remap ; ; Primary::LCtrl @@ -68,7 +76,7 @@ $LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} ; Primary up::Send {LAlt up}{LCtrl up} $LWin up::Send {LWin up}{LAlt up}{LCtrl up} -; Close Apps +; Close Apps ^q::Send !{F4} ; Emoji Panel diff --git a/windows/win_kinto.ahk b/windows/win_kinto.ahk new file mode 100644 index 0000000..d64d96d --- /dev/null +++ b/windows/win_kinto.ahk @@ -0,0 +1,268 @@ +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, 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, 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 + +GroupAdd, vscode, ahk_exe VSCodium.exe +GroupAdd, vscode, ahk_exe Code.exe + +; New AltTab and CtrlTab fix +*tab:: +{ + ; if (GetKeyState("Tertiary", "P") AND GetKeyState("LShift", "P") = false) { + if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { + ; Send {LCtrl down}{Secondary up}{tab} + Send {LCtrl down}{LWin up}{tab} + KeyWait, tab + ; } else if (GetKeyState("Tertiary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { + ; Send {LCtrl down}{Secondary up}{LShift down}{tab} + Send {LCtrl down}{LWin up}{LShift down}{tab} + KeyWait, tab + ; return + ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { + } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { + Send {LAlt down}{tab} + KeyWait, tab + ; ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { + Send {LAlt down}{LShift down}{tab} + KeyWait, tab + ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) = false { + return + ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { + return + } else { + send {Blind}{tab} + } + return +} + +tab::Send {tab} + +; Basic Remap +; +; Primary::LCtrl +; Secondary::LAlt +; Tertiary::LWin + +$LAlt::LCtrl +$LWin::LAlt +$LCtrl::LWin + +; Hack to disable start menu on winkey +; $LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} +$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} + +; temporary hack to ensure keys don't get stuck +; impacts Alt-Tab fix +; Primary up::Send {LAlt up}{LCtrl up} +$LAlt up::Send {LWin up}{LAlt up}{LCtrl up} +; $LWin up::Send {LWin down}{LAlt up}{LCtrl up}{LWin up} + +; 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} +$^Right::Send {End} +$^+Right::Send +{End} +^Up::Send ^{Home} +^+Up::Send ^+{Home} +^Down::Send ^{End} +^+Down::Send ^+{End} +^Backspace::Send +{Home}{Delete} +!Backspace::Send ^{Backspace} +!Left::Send ^{Left} +!+Left::Send ^+{Left} +!Right::Send ^{Right} +!+Right::Send ^+{Right} + +; Cmd+Space Alternative +^Space::Send ^{Esc} + +; ; Sublime Text Remaps for VS Code +#IfWinActive ahk_group vscode ; ST2CODE + ; 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 +#If ; ST2CODE + +#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 + ; Sigint Interrupt + ; $#c::Send {Ctrl down}c{Ctrl up} + + ; $#c up::Send {c up}{Ctrl up} + + ; #c up:: + ; SetKeyDelay -1 + ; Send {c Up}{Ctrl up} + ; return + + ; Copy + ^c:: + SetKeyDelay -1 + Send {Ctrl down}{Shift down}{c DownTemp} + ; return + + ^c up:: + SetKeyDelay -1 + Send {c Up}{Ctrl up}{Shift up} + ; return + + ; Paste + *v:: + if (GetKeyState("LCtrl")){ + If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ + SetKeyDelay -1 + Send {Blind}{LShift down}{v DownTemp} + } + else{ + Send {Blind}v + } + } + return + + ^v up:: + SetKeyDelay -1 + Send {Blind}{v Up}{LShift Up} + return +#If + +#IfWinActive ahk_group posix + ; 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 + + $^w:: + If not WinActive("ahk_group ConEmu"){ + Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} + } + else{ + Send ^w + } + return + + ; End of Line + ^e:: + SetKeyDelay -1 + Send {Blind}{e DownTemp} + return + + ^e up:: + SetKeyDelay -1 + Send {Blind}{e Up} + return + + ; Beginning of Line + ^a:: + SetKeyDelay -1 + Send {Blind}{a DownTemp} + 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 + #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 + +; #IfWinActive ahk_group ConEmu +; ; Paste +; $^v::Send {Shift down}{Insert}{Shift Up} +; #v::Send {LCtrl down}v{LCtrl Up} +; #If + +; #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 + +;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) + +; 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 + +; 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 \ No newline at end of file From 520ea7683b07325f0e086381fe64cf4a9d091435 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 7 Jun 2020 15:35:49 -0500 Subject: [PATCH 08/35] - Fixed a mismapped fullscreen toggle for st3 --- xkeysnail-config/kinto.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xkeysnail-config/kinto.py b/xkeysnail-config/kinto.py index 75922a1..baee9c3 100644 --- a/xkeysnail-config/kinto.py +++ b/xkeysnail-config/kinto.py @@ -178,7 +178,7 @@ define_keymap(re.compile(codeStr, re.IGNORECASE),{ # Keybindings for Sublime Text define_keymap(re.compile("Sublime_text", re.IGNORECASE),{ K("C-Super-up"): K("M-o"), # Switch file - K("C-M-f"): K("f11"), # toggle_full_screen + 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 From 4f259481f4ed2408e745a344ad359b6b6aed6083 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 7 Jun 2020 16:06:25 -0500 Subject: [PATCH 09/35] - Added back vscode keybindings json file --- xkeysnail-config/vscode_keybindings.json | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 xkeysnail-config/vscode_keybindings.json diff --git a/xkeysnail-config/vscode_keybindings.json b/xkeysnail-config/vscode_keybindings.json new file mode 100644 index 0000000..750f5ac --- /dev/null +++ b/xkeysnail-config/vscode_keybindings.json @@ -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" + } +] \ No newline at end of file From c9f7b81796070bf4bcc68f9cc16e7e732bfeea15 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 7 Jun 2020 19:22:39 -0500 Subject: [PATCH 10/35] - Fixed back tab after new Alt-Tab fix --- windows/new_kinto.ahk | 2 ++ windows/win_kinto.ahk | 2 ++ 2 files changed, 4 insertions(+) diff --git a/windows/new_kinto.ahk b/windows/new_kinto.ahk index 6cd6cf5..11a8ace 100644 --- a/windows/new_kinto.ahk +++ b/windows/new_kinto.ahk @@ -58,6 +58,8 @@ GroupAdd, vscode, ahk_exe Code.exe tab::Send {tab} ++tab::Send {Shift down}{tab}{Shift up} + ; Basic Remap ; ; Primary::LCtrl diff --git a/windows/win_kinto.ahk b/windows/win_kinto.ahk index d64d96d..6812c26 100644 --- a/windows/win_kinto.ahk +++ b/windows/win_kinto.ahk @@ -63,6 +63,8 @@ GroupAdd, vscode, ahk_exe Code.exe tab::Send {tab} ++tab::Send {Shift down}{tab}{Shift up} + ; Basic Remap ; ; Primary::LCtrl From 1ed7fa5f73121a93a0db73e664e09b4dff2c704d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Mon, 8 Jun 2020 02:01:17 -0500 Subject: [PATCH 11/35] - renamed file and added shortcuts --- windows/{new_kinto.ahk => mac_kinto.ahk} | 508 ++++++++++++----------- windows/win_kinto.ahk | 10 +- 2 files changed, 266 insertions(+), 252 deletions(-) rename windows/{new_kinto.ahk => mac_kinto.ahk} (92%) diff --git a/windows/new_kinto.ahk b/windows/mac_kinto.ahk similarity index 92% rename from windows/new_kinto.ahk rename to windows/mac_kinto.ahk index 11a8ace..5dfaecb 100644 --- a/windows/new_kinto.ahk +++ b/windows/mac_kinto.ahk @@ -1,251 +1,259 @@ -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, 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, 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 - -GroupAdd, vscode, ahk_exe VSCodium.exe -GroupAdd, vscode, ahk_exe Code.exe - -; New AltTab and CtrlTab fix -*tab:: -{ - if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { - Send {LCtrl down}{LAlt up}{tab} - KeyWait, tab - } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { - Send {LCtrl down}{LAlt up}{LShift down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { - Send {LAlt down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { - Send {LAlt down}{LShift down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P") = false) { - } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { - return - ; ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { - return - } else { - send {Blind}{tab} - } - return -} - -tab::Send {tab} - -+tab::Send {Shift down}{tab}{Shift up} - -; Basic Remap -; -; Primary::LCtrl -; Secondary::LAlt -; Tertiary::LWin - -$LCtrl::LWin -$LWin::LCtrl - -; Hack to disable start menu on winkey -; $LCtrl up::Send {Ctrl down}{Primary up}{Ctrl up} -$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} - -; temporary hack to ensure keys don't get stuck -; impacts Alt-Tab fix -; Primary up::Send {LAlt up}{LCtrl up} -$LWin up::Send {LWin up}{LAlt up}{LCtrl up} - -; 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} -$^Right::Send {End} -$^+Right::Send +{End} -^Up::Send ^{Home} -^+Up::Send ^+{Home} -^Down::Send ^{End} -^+Down::Send ^+{End} -^Backspace::Send +{Home}{Delete} -!Backspace::Send ^{Backspace} -!Left::Send ^{Left} -!+Left::Send ^+{Left} -!Right::Send ^{Right} -!+Right::Send ^+{Right} - -; Cmd+Space Alternative -^Space::Send ^{Esc} - -; ; Sublime Text Remaps for VS Code -#IfWinActive ahk_group vscode ; ST2CODE - ; 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 -#If ; ST2CODE - -#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:: - SetKeyDelay -1 - Send {Blind}{LShift down}{c DownTemp} - return - - ^c up:: - SetKeyDelay -1 - Send {Blind}{c Up}{LShift Up} - return - - ; Paste - ^v:: - If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ - SetKeyDelay -1 - Send {Blind}{LShift down}{v DownTemp} - } - else{ - Send {Blind}v - } - return - - ^v up:: - SetKeyDelay -1 - Send {Blind}{v Up}{LShift Up} - return -#If - -#IfWinActive ahk_group posix - ; 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 - - $^w:: - If not WinActive("ahk_group ConEmu"){ - Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} - } - else{ - Send ^w - } - return - - ; End of Line - ^e:: - SetKeyDelay -1 - Send {Blind}{e DownTemp} - return - - ^e up:: - SetKeyDelay -1 - Send {Blind}{e Up} - return - - ; Beginning of Line - ^a:: - SetKeyDelay -1 - Send {Blind}{a DownTemp} - 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 - #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 - -; #IfWinActive ahk_group ConEmu -; ; Paste -; $^v::Send {Shift down}{Insert}{Shift Up} -; #v::Send {LCtrl down}v{LCtrl Up} -; #If - -; #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 - -;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) - -; 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 - -; 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 +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 + +GroupAdd, vscode, ahk_exe VSCodium.exe +GroupAdd, vscode, ahk_exe Code.exe + +; New AltTab and CtrlTab fix +*tab:: +{ + if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { + Send {LCtrl down}{LAlt up}{tab} + KeyWait, tab + } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { + Send {LCtrl down}{LAlt up}{LShift down}{tab} + KeyWait, tab + ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { + Send {LAlt down}{tab} + KeyWait, tab + ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { + Send {LAlt down}{LShift down}{tab} + KeyWait, tab + ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P") = false) { + } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { + return + ; ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { + } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { + return + } else { + send {Blind}{tab} + } + return +} + +tab::Send {tab} + ++tab::Send {Shift down}{tab}{Shift up} + +; Basic Remap +; +; Primary::LCtrl +; Secondary::LAlt +; Tertiary::LWin + +$LCtrl::LWin +$LWin::LCtrl + +; Hack to disable start menu on winkey +; $LCtrl up::Send {Ctrl down}{Primary up}{Ctrl up} +$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} + +; temporary hack to ensure keys don't get stuck +; impacts Alt-Tab fix +; Primary up::Send {LAlt up}{LCtrl up} +$LWin up::Send {LWin up}{LAlt up}{LCtrl up} + +; 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} +$^Right::Send {End} +$^+Right::Send +{End} +^Up::Send ^{Home} +^+Up::Send ^+{Home} +^Down::Send ^{End} +^+Down::Send ^+{End} +^Backspace::Send +{Home}{Delete} +!Backspace::Send ^{Backspace} +!Left::Send ^{Left} +!+Left::Send ^+{Left} +!Right::Send ^{Right} +!+Right::Send ^+{Right} + +; Cmd+Space Alternative +^Space::Send ^{Esc} + +; ; Sublime Text Remaps for VS Code +#IfWinActive ahk_group vscode ; ST2CODE + ; 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 +#If ; ST2CODE + +#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:: + 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 not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ + SetKeyDelay -1 + Send {Blind}{LShift down}{v DownTemp} + } + else{ + Send {Blind}v + } + return + + ^v up:: + SetKeyDelay -1 + Send {Blind}{v Up}{LShift Up} + return +#If + +#IfWinActive ahk_group posix + ; 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 + + $^w:: + If not WinActive("ahk_group ConEmu"){ + Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} + } + else{ + Send ^w + } + return + + ; End of Line + ^e:: + SetKeyDelay -1 + Send {Blind}{e DownTemp} + return + + ^e up:: + SetKeyDelay -1 + Send {Blind}{e Up} + return + + ; Beginning of Line + ^a:: + SetKeyDelay -1 + Send {Blind}{a DownTemp} + 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 + +; #IfWinActive ahk_group ConEmu +; ; Paste +; $^v::Send {Shift down}{Insert}{Shift Up} +; #v::Send {LCtrl down}v{LCtrl Up} +; #If + +; #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 + +;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) + +; 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 + +; 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 \ No newline at end of file diff --git a/windows/win_kinto.ahk b/windows/win_kinto.ahk index 6812c26..c690358 100644 --- a/windows/win_kinto.ahk +++ b/windows/win_kinto.ahk @@ -151,12 +151,15 @@ $^+Right::Send +{End} ^c:: SetKeyDelay -1 Send {Ctrl down}{Shift down}{c DownTemp} - ; return + return ^c up:: SetKeyDelay -1 Send {c Up}{Ctrl up}{Shift up} - ; return + return + + ; Sigints - interrupt + $#c::Send {Ctrl down}c{Ctrl up} ; Paste *v:: @@ -224,6 +227,7 @@ $^+Right::Send +{End} ; 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} @@ -235,6 +239,8 @@ $^+Right::Send +{End} #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 ; #IfWinActive ahk_group ConEmu From 8f22bc63ff9b183c07d36a0703822866da29eb1d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Mon, 8 Jun 2020 12:23:50 -0500 Subject: [PATCH 12/35] - Fixes on paste in terminals for windows --- windows/mac_kinto.ahk | 9 ++------- windows/win_kinto.ahk | 30 ++++++------------------------ 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/windows/mac_kinto.ahk b/windows/mac_kinto.ahk index 5dfaecb..4443889 100644 --- a/windows/mac_kinto.ahk +++ b/windows/mac_kinto.ahk @@ -148,19 +148,14 @@ $^+Right::Send +{End} ; Paste ^v:: - If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ - SetKeyDelay -1 - Send {Blind}{LShift down}{v DownTemp} + If WinActive("ahk_group posix"){ + Send {Blind}{Shift down}v{Shift up} } else{ Send {Blind}v } return - ^v up:: - SetKeyDelay -1 - Send {Blind}{v Up}{LShift Up} - return #If #IfWinActive ahk_group posix diff --git a/windows/win_kinto.ahk b/windows/win_kinto.ahk index c690358..8a7ce58 100644 --- a/windows/win_kinto.ahk +++ b/windows/win_kinto.ahk @@ -137,16 +137,6 @@ $^+Right::Send +{End} #If #IfWinActive ahk_group terminals - ; Sigint Interrupt - ; $#c::Send {Ctrl down}c{Ctrl up} - - ; $#c up::Send {c up}{Ctrl up} - - ; #c up:: - ; SetKeyDelay -1 - ; Send {c Up}{Ctrl up} - ; return - ; Copy ^c:: SetKeyDelay -1 @@ -162,21 +152,13 @@ $^+Right::Send +{End} $#c::Send {Ctrl down}c{Ctrl up} ; Paste - *v:: - if (GetKeyState("LCtrl")){ - If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ - SetKeyDelay -1 - Send {Blind}{LShift down}{v DownTemp} - } - else{ - Send {Blind}v - } + ^v:: + If WinActive("ahk_group posix"){ + Send {Blind}{Shift down}v{Shift up} + } + else{ + Send {Blind}v } - return - - ^v up:: - SetKeyDelay -1 - Send {Blind}{v Up}{LShift Up} return #If From 6578065024993058fef0d3fd5b0256325f012cb5 Mon Sep 17 00:00:00 2001 From: Janis Peukert Date: Tue, 9 Jun 2020 13:01:54 -0700 Subject: [PATCH 13/35] Allow non-canonical homedirs in setup. --- system-config/keyswap.service | 6 +++--- xkeysnail-config/prexk.sh | 7 +++---- xkeysnail-config/xkeysnail.service | 6 +++--- xkeysnail_service.sh | 10 ++++++---- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/system-config/keyswap.service b/system-config/keyswap.service index cfc5896..38a1fce 100755 --- a/system-config/keyswap.service +++ b/system-config/keyswap.service @@ -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 diff --git a/xkeysnail-config/prexk.sh b/xkeysnail-config/prexk.sh index 1b4053a..61df280 100755 --- a/xkeysnail-config/prexk.sh +++ b/xkeysnail-config/prexk.sh @@ -1,14 +1,13 @@ #!/bin/bash - -if [ -f /home/{username}/.config/systemd/user/keyswap.timer ]; then +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 /home/{username}/.config/systemd/user/keyswap.service ]; then +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 /home/{username}/.config/kinto/kinto.py /tmp/kinto/xkeysnail/kinto.py \ No newline at end of file +cp {homedir}/.config/kinto/kinto.py /tmp/kinto/xkeysnail/kinto.py diff --git a/xkeysnail-config/xkeysnail.service b/xkeysnail-config/xkeysnail.service index c817db8..c7c6276 100644 --- a/xkeysnail-config/xkeysnail.service +++ b/xkeysnail-config/xkeysnail.service @@ -4,12 +4,12 @@ Description=xkeysnail [Service] Type=simple KillMode=process -ExecStartPre=/bin/bash -c "{xhost} +SI:localuser:root && /sbin/runuser -l {username} -c /home/{username}/.config/kinto/prexk.sh" -ExecStart=/usr/bin/sudo /bin/bash -c '{experimental-caret}/home/{username}/.config/kinto/xkeystart.sh /tmp/kinto/xkeysnail/kinto.py' +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 \ No newline at end of file +WantedBy=graphical.target diff --git a/xkeysnail_service.sh b/xkeysnail_service.sh index 944d8f5..2e34a09 100755 --- a/xkeysnail_service.sh +++ b/xkeysnail_service.sh @@ -173,7 +173,7 @@ if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "4" || $1 == "kintowin" || $1 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};/home/{username}/.config/kinto/caret_status_xkey.sh\&";'; expsh='"/home/{username}/.config/kinto/caret_status_xkey.sh"'; break;; + [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 @@ -214,7 +214,7 @@ if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "4" || $1 == "kintowin" || $1 # 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 @@ -237,14 +237,16 @@ if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "4" || $1 == "kintowin" || $1 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/{username}/`whoami`/g" ~/.config/kinto/prexk.sh + 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 @@ -381,4 +383,4 @@ elif [[ $1 == "5" || $1 == "budgieUpdate" ]]; then budgieUpdate else echo "Expected argument was not provided" -fi \ No newline at end of file +fi From ea78de79096509cd8d1aea284bb64a1146641571 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Tue, 9 Jun 2020 22:13:39 -0500 Subject: [PATCH 14/35] Updated readme with new logo --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 0ab60fb..f9983ce 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # Kinto -![kinto_carrot](https://user-images.githubusercontent.com/10969616/77842401-4744b500-7157-11ea-854a-d7dec6f9a250.gif) - -![alt text](https://raw.githubusercontent.com/rbreaves/kinto/master/Kinto.png) +![kinto-color-128](https://user-images.githubusercontent.com/10969616/84222805-1d383900-aa9e-11ea-9d95-11849706c511.png) [![GitHub release](https://img.shields.io/github/release/rbreaves/kinto.svg)](https://github.com/rbreaves/kinto/releases/latest) From 1b2e7ab57b06c283ba409a152892c2eaf3231e5f Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Thu, 11 Jun 2020 03:04:43 -0500 Subject: [PATCH 15/35] Updated readme with cleaner logo --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f9983ce..a5e27ad 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Kinto -![kinto-color-128](https://user-images.githubusercontent.com/10969616/84222805-1d383900-aa9e-11ea-9d95-11849706c511.png) +![kinto-color-131](https://user-images.githubusercontent.com/10969616/84360699-20abed00-ab90-11ea-9c26-391c030226f7.png) + [![GitHub release](https://img.shields.io/github/release/rbreaves/kinto.svg)](https://github.com/rbreaves/kinto/releases/latest) From 7c0a431472a36142ea5d9f35bed92d884c8bac7f Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Thu, 11 Jun 2020 03:13:57 -0500 Subject: [PATCH 16/35] Updated readme with logo revision --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a5e27ad..96dc278 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Kinto -![kinto-color-131](https://user-images.githubusercontent.com/10969616/84360699-20abed00-ab90-11ea-9c26-391c030226f7.png) +![kinto-color-132](https://user-images.githubusercontent.com/10969616/84361571-7d5bd780-ab91-11ea-81bc-4d3a2ca51c4e.png) [![GitHub release](https://img.shields.io/github/release/rbreaves/kinto.svg)](https://github.com/rbreaves/kinto/releases/latest) From 046eaa05cde0f65cfe4c2ca5dfe60d81a4e768e7 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 01:16:52 -0500 Subject: [PATCH 17/35] Revert "- Proof of concept cheatsheet feature" This reverts commit cbb60668e3a33af90fe3c31d701e80cb6bf439da. --- references/overlay.py | 138 ------------------------------------------ 1 file changed, 138 deletions(-) delete mode 100644 references/overlay.py diff --git a/references/overlay.py b/references/overlay.py deleted file mode 100644 index 542a60c..0000000 --- a/references/overlay.py +++ /dev/null @@ -1,138 +0,0 @@ -import wx -# import wx.richtext as rt -# import images -# http://www.ccp4.ac.uk/dist/checkout/wxPython-src-3.0.2.0/wxPython/demo/RichTextCtrl.py -# https://stackoverflow.com/questions/40257359/how-to-dynamically-update-multiple-wxpython-static-text - -def GetRoundBitmap( w, h, r ): - maskColor = wx.Colour(0,0,0) - shownColor = wx.Colour(5,5,5) - b = wx.EmptyBitmap(w,h) - dc = wx.MemoryDC(b) - dc.SetBrush(wx.Brush(maskColor)) - dc.DrawRectangle(0,0,w,h) - dc.SetBrush(wx.Brush(shownColor)) - dc.SetPen(wx.Pen(shownColor)) - dc.DrawRoundedRectangle(0,0,w,h,r) - dc.SelectObject(wx.NullBitmap) - b.SetMaskColour(maskColor) - return b - -def GetRoundShape( w, h, r ): - return wx.Region( GetRoundBitmap(w,h,r) ) - -class PanelOne(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent) - self.Bind(wx.EVT_KEY_UP, self.OnKeyDown) - wx.StaticText(self, label = "'^⌘G - Select All (Ctrl-Cmd-G) ^⌘G - Select All (Ctrl-Cmd-G)\n^⌘G - Select All (Ctrl-Cmd-G) ^⌘G - Select All (Ctrl-Cmd-G)") - self.SetTransparent( 220 ) - - def OnKeyDown(self, event): - self.Destroy() - -class FancyFrame(wx.Frame): - def __init__(self): - sizer = wx.GridBagSizer() - style = ( wx.CLIP_CHILDREN | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR | - wx.NO_BORDER | wx.FRAME_SHAPED ) - wx.Frame.__init__(self, None, title='Fancy', style = style) - - # self.rtc = rt.RichTextCtrl(self, style=wx.VSCROLL|wx.TE_READONLY|wx.HSCROLL|wx.NO_BORDER); - # self.rtc.Disable() - boldstatic = wx.Font(pointSize = 24, family = wx.DEFAULT, - style = wx.BOLD, weight = wx.BOLD, - faceName = 'Consolas') - normalstatic = wx.Font(pointSize = 10, family = wx.DEFAULT, - style = wx.NORMAL, weight = wx.NORMAL, - faceName = 'Consolas') - # font = wx.Font(pointSize = 18, family = wx.DEFAULT, - # style = wx.NORMAL, weight = wx.NORMAL, - # faceName = 'Consolas') - self.SetFont(boldstatic) - self.SetBackgroundColour((211,211,211)) - self.label = wx.StaticText(self, label = "^⌘G", pos = (100,50)) - self.SetFont(normalstatic) - self.label2 = wx.StaticText(self, label = " - Select All (Ctrl-Cmd-G)", pos = (200,50)) - # sizer.Add(self.label, (4, 0), (1, 5), wx.EXPAND) - # sizer.Add(self.label2, (5, 0), (1, 5), wx.EXPAND) - # wx.StaticText(self, label = "^⌘G - Select All (Ctrl-Cmd-G) || ^⌘G - Select All (Ctrl-Cmd-G)\n^⌘G - Select All (Ctrl-Cmd-G) ^⌘G - Select All (Ctrl-Cmd-G)") - # self.rtc.Bind(wx.EVT_SET_FOCUS,self.OnInput) - # self.rtc.Bind(wx.EVT_KILL_FOCUS,self.OnInput) - # self.rtc.Bind(wx.EVT_KEY_UP, self.OnKeyDown) - # self.rtc.BeginFontSize(14) - # self.rtc.BeginBold() - # self.rtc.WriteText("^⌘G") - # self.rtc.EndBold() - # self.rtc.BeginFontSize(10) - # self.rtc.WriteText(" - Select All (Ctrl-Cmd-G)\n") - # self.rtc.BeginFontSize(14) - # self.rtc.WriteText("Different font sizes on the same line is allowed, too.") - # self.rtc.EndFontSize() - - # self.rtc.WriteText(" Next we'll show an indented paragraph.") - - # self.rtc.BeginLeftIndent(60) - # self.rtc.Newline() - - # self.rtc.WriteText("It was in January, the most down-trodden month of an Edinburgh winter. An attractive woman came into the cafe, which is nothing remarkable.") - # self.rtc.EndLeftIndent() - # self.SetFont(wx.Font(20, wx.SWISS, wx.NORMAL, wx.BOLD)) - # font = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.NORMAL) - # wx.text.SetFont(font) - # self.panelOne = PanelOne(self) - # self.SetFocus() - w, h = wx.GetDisplaySize() - self.SetSize((w/2, h/2)) - self.SetPosition( ((w-w/2)/2,(h-h/2)/2) ) - self.SetTransparent( 220 ) - - self.Bind(wx.EVT_KEY_UP, self.OnKeyDown) - self.Bind(wx.EVT_MOTION, self.OnMouse) - self.Bind(wx.EVT_PAINT, self.OnPaint) - if wx.Platform == '__WXGTK__': - self.Bind(wx.EVT_WINDOW_CREATE, self.SetRoundShape) - else: - self.SetRoundShape() - - self.SetSizer(sizer) - self.Show(True) - - - def OnInput(self, e): - self.Destroy() - # e.Skip() - - def SetRoundShape(self, event=None): - w, h = self.GetSizeTuple() - self.SetShape(GetRoundShape( w,h, 10 ) ) - - def OnPaint(self, event): - dc = wx.PaintDC(self) - dc = wx.GCDC(dc) - w, h = self.GetSizeTuple() - r = 10 - dc.SetPen( wx.Pen("#D3D3D3dth = 2")) - dc.SetBrush( wx.Brush("#D3D3D3")) - dc.DrawRoundedRectangle( 0,0,w,h,r ) - - def OnKeyDown(self, event): - # self.Close(force=True) - self.Destroy() - - def OnMouse(self, event): - """implement dragging""" - if not event.Dragging(): - self._dragPos = None - return - self.CaptureMouse() - if not self._dragPos: - self._dragPos = event.GetPosition() - else: - pos = event.GetPosition() - displacement = self._dragPos - pos - self.SetPosition( self.GetPosition() - displacement ) - -app = wx.App() -f = FancyFrame() -app.MainLoop() \ No newline at end of file From 329e8214403d2137a1823417078f7f0dd90e15d0 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 01:18:40 -0500 Subject: [PATCH 18/35] - Improved Windows UX, Added System Tray, Kinto icon assets --- assets/kinto-black.ico | Bin 0 -> 104530 bytes assets/kinto-color-black.ico | Bin 0 -> 108337 bytes assets/kinto-color.ico | Bin 0 -> 108440 bytes assets/kinto-white.ico | Bin 0 -> 104724 bytes setup.py | 31 +-- windows/NoShell.vbs | 14 ++ windows/kinto-start.vbs | 7 + windows/kinto.ahk | 363 ++++++++++++++++++++--------------- windows/mac_kinto.ahk | 254 ------------------------ windows/toggle_kb.bat | 22 +++ windows/win_kinto.ahk | 258 ------------------------- 11 files changed, 274 insertions(+), 675 deletions(-) create mode 100644 assets/kinto-black.ico create mode 100644 assets/kinto-color-black.ico create mode 100644 assets/kinto-color.ico create mode 100644 assets/kinto-white.ico create mode 100644 windows/NoShell.vbs create mode 100644 windows/kinto-start.vbs delete mode 100644 windows/mac_kinto.ahk create mode 100644 windows/toggle_kb.bat delete mode 100644 windows/win_kinto.ahk diff --git a/assets/kinto-black.ico b/assets/kinto-black.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d3a1f9e805cceb4aaca20123d7eba4e1eae8072 GIT binary patch literal 104530 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 QU{Q$EppgTQ445AAf37#lVgLXD literal 0 HcmV?d00001 diff --git a/assets/kinto-color.ico b/assets/kinto-color.ico new file mode 100644 index 0000000000000000000000000000000000000000..c4f9023724f93a25c7296d4f1ba13b91d880dc7b GIT binary patch literal 108440 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 WCd@N04LXQxPvqqk<~ztLo%uh{qDmV8 literal 0 HcmV?d00001 diff --git a/assets/kinto-white.ico b/assets/kinto-white.ico new file mode 100644 index 0000000000000000000000000000000000000000..1bf3848dd78245b223dc37bc740c1bdd67052e1c GIT binary patch literal 104724 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 0 and default < 5: + 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 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 " + path + "\\windows\\kinto-new.ahk") if(stvscode): os.system('perl -pi -e "s/(; )(.*)(; ST2CODE)/$2$3/g" ./windows/kinto-new.ahk') - os.system("copy /Y " + path + "\\windows\\kinto-new.ahk \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\"") + os.system('copy /Y ' + path + '\\windows\\kinto-start.vbs "%userprofile%\\.kinto\\kinto-start.vbs"') + os.system('mklink "%userprofile%\\Start Menu\\Programs\\Startup\\kinto-start.vbs" "%userprofile%\\.kinto\\kinto-start.vbs"') + os.system('cp '+ path + '\\windows\\NoShell.vbs "%userprofile%\\.kinto\\NoShell.vbs"') + os.system('cp '+ path + '\\windows\\toggle_kb.bat "%userprofile%\\.kinto\\toggle_kb.bat"') + os.system('cp '+ path + '\\windows\\kinto-new.ahk "%userprofile%\\.kinto\\kinto.ahk"') + os.system('robocopy '+ path + '\\assets "%userprofile%\\.kinto\\assets" /E') os.system("del /f .\\windows\\kinto-new.ahk") - print("\nPlease log off and back on for changes to take full effect.") + 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\"") diff --git a/windows/NoShell.vbs b/windows/NoShell.vbs new file mode 100644 index 0000000..bb05151 --- /dev/null +++ b/windows/NoShell.vbs @@ -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 \ No newline at end of file diff --git a/windows/kinto-start.vbs b/windows/kinto-start.vbs new file mode 100644 index 0000000..fbe1078 --- /dev/null +++ b/windows/kinto-start.vbs @@ -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 \ No newline at end of file diff --git a/windows/kinto.ahk b/windows/kinto.ahk index e3e9ac7..00f4029 100644 --- a/windows/kinto.ahk +++ b/windows/kinto.ahk @@ -1,42 +1,51 @@ -; Cmd Tab For App Switching -; LWin & Tab::AltTab -; RWin & Tab::AltTab +#SingleInstance force +#NoEnv +#Persistent -; New AltTab and CtrlTab fix -*tab:: -{ - if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { - Send {LAlt up}{LCtrl down}{tab} - KeyWait, tab - } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { - Send {LAlt up}{LShift down}{LCtrl down}{tab} - KeyWait, tab - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { - Send {LAlt down}{tab} - KeyWait, tab - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { - Send {LShift down}{LAlt down}{tab} - KeyWait, tab - } else { - send {tab} - } - return +I_Icon = %A_ScriptDir%\assets\kinto-white.ico +IfExist, %I_Icon% +Menu, Tray, Icon, %I_Icon% + +; 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 +Menu, Tray, Tip, Kinto + +winkb(){ + Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat win, %A_ScriptDir% } -; Basic Remap -; -; Primary::LCtrl -; Secondary::LAlt -; Tertiary::LWin +mackb(){ + Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat mac, %A_ScriptDir% +} -$LCtrl::LWin -$LWin::LCtrl -; Hack to disable start menu on winkey -$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} +min(){ +; Refocus last active Window +Send {LAlt down}{tab}{LAlt up} +} -; temporary hack to ensure keys don't get stuck -; impacts Alt-Tab fix -$LWin up::Send {LAlt up}{LCtrl up} +tray_suspend(){ + suspend toggle + if (a_isSuspended = 1){ + menu, tray, check , Suspend Kinto + } + else{ + menu, tray, unCheck, Suspend Kinto + } + ; Refocus last active Window + Send {LAlt down}{tab}{LAlt up} +} + +Exit() { + ExitApp +} SetTitleMatchMode, 2 @@ -47,6 +56,7 @@ 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 @@ -54,6 +64,7 @@ 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, terminals, ahk_exe Terminus.exe GroupAdd, posix, Fluent Terminal ahk_class ApplicationFrameWindow GroupAdd, ConEmu, ahk_exe ConEmu.exe @@ -67,7 +78,79 @@ GroupAdd, editors, ahk_exe Code.exe GroupAdd, vscode, ahk_exe VSCodium.exe GroupAdd, vscode, ahk_exe Code.exe -; Close Apps +GroupAdd, vstudio, ahk_exe devenv.exe + +; 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 @@ -97,134 +180,112 @@ $^+Right::Send +{End} ; Cmd+Space Alternative ^Space::Send ^{Esc} -; ^Space::run AppName - -; ; Ctrl Tab for In-App Tab Switching -; ; https://autohotkey.com/board/topic/72433-controltab/ -; #if GetKeyState("LWin") -; *Tab:: -; if(!GetKeyState("LControl")) -; Send {LControl Down} -; Send {Tab} -; SetTimer, WaitForWinUp, 10 -; ToolTip trigger -; return - -; WaitForWinUp: -; if(!GetKeyState("LWin", "P")) -; { -; Send {LControl Up} -; SetTimer, WaitForWinUp, Off -; } -; return ; ; Sublime Text Remaps for VS Code -; #IfWinActive ahk_group vscode ; ST2CODE -; ; 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 -; #If ; ST2CODE +#IfWinActive ahk_group vscode ; ST2CODE + ; 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 +#If ; ST2CODE #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+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} + ; 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} -; ; Paste -; $^v:: -; If not WinActive("ahk_group ConEmu") && not WinActive("ahk_exe cmd.exe"){ -; Send {LCtrl down}{LShift down}v{LCtrl Up}{LShift Up} -; } -; else{ -; Send ^v -; } -; return -; #If +#IfWinActive ahk_group terminals + ; Copy + ^c:: + SetKeyDelay -1 + Send {Blind}{LShift down}{c DownTemp} + return -; #IfWinActive ahk_group posix -; ; 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 + ^c up:: + SetKeyDelay -1 + Send {Blind}{c Up}{LShift Up} + return -; $^w:: -; If not WinActive("ahk_group ConEmu"){ -; Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} -; } -; else{ -; Send ^w -; } -; return + ; Sigints - interrupt + $#c::Send {Ctrl down}c{Ctrl up} -; ; 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 + ; Paste + ^v:: + If WinActive("ahk_group posix"){ + Send {Blind}{Shift down}v{Shift up} + } + else{ + Send {Blind}v + } + return +#If -; ; #IfWinActive ahk_group ConEmu -; ; ; Paste -; ; $^v::Send {Shift down}{Insert}{Shift Up} -; ; #v::Send {LCtrl down}v{LCtrl Up} -; ; #If +#IfWinActive ahk_group posix + ; 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_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 + $^w:: + If not WinActive("ahk_group ConEmu"){ + Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} + } + else{ + Send ^w + } + return -; ;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) + ; End of Line + ^e:: + SetKeyDelay -1 + Send {Blind}{e DownTemp} + 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 + ^e up:: + SetKeyDelay -1 + Send {Blind}{e Up} + 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 \ No newline at end of file + ; Beginning of Line + ^a:: + SetKeyDelay -1 + Send {Blind}{a DownTemp} + 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 \ No newline at end of file diff --git a/windows/mac_kinto.ahk b/windows/mac_kinto.ahk deleted file mode 100644 index 4443889..0000000 --- a/windows/mac_kinto.ahk +++ /dev/null @@ -1,254 +0,0 @@ -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 - -GroupAdd, vscode, ahk_exe VSCodium.exe -GroupAdd, vscode, ahk_exe Code.exe - -; New AltTab and CtrlTab fix -*tab:: -{ - if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { - Send {LCtrl down}{LAlt up}{tab} - KeyWait, tab - } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { - Send {LCtrl down}{LAlt up}{LShift down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P") = false) { - Send {LAlt down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { - Send {LAlt down}{LShift down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P") = false) { - } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { - return - ; ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { - return - } else { - send {Blind}{tab} - } - return -} - -tab::Send {tab} - -+tab::Send {Shift down}{tab}{Shift up} - -; Basic Remap -; -; Primary::LCtrl -; Secondary::LAlt -; Tertiary::LWin - -$LCtrl::LWin -$LWin::LCtrl - -; Hack to disable start menu on winkey -; $LCtrl up::Send {Ctrl down}{Primary up}{Ctrl up} -$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} - -; temporary hack to ensure keys don't get stuck -; impacts Alt-Tab fix -; Primary up::Send {LAlt up}{LCtrl up} -$LWin up::Send {LWin up}{LAlt up}{LCtrl up} - -; 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} -$^Right::Send {End} -$^+Right::Send +{End} -^Up::Send ^{Home} -^+Up::Send ^+{Home} -^Down::Send ^{End} -^+Down::Send ^+{End} -^Backspace::Send +{Home}{Delete} -!Backspace::Send ^{Backspace} -!Left::Send ^{Left} -!+Left::Send ^+{Left} -!Right::Send ^{Right} -!+Right::Send ^+{Right} - -; Cmd+Space Alternative -^Space::Send ^{Esc} - -; ; Sublime Text Remaps for VS Code -#IfWinActive ahk_group vscode ; ST2CODE - ; 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 -#If ; ST2CODE - -#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:: - 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 - ; 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 - - $^w:: - If not WinActive("ahk_group ConEmu"){ - Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} - } - else{ - Send ^w - } - return - - ; End of Line - ^e:: - SetKeyDelay -1 - Send {Blind}{e DownTemp} - return - - ^e up:: - SetKeyDelay -1 - Send {Blind}{e Up} - return - - ; Beginning of Line - ^a:: - SetKeyDelay -1 - Send {Blind}{a DownTemp} - 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 - -; #IfWinActive ahk_group ConEmu -; ; Paste -; $^v::Send {Shift down}{Insert}{Shift Up} -; #v::Send {LCtrl down}v{LCtrl Up} -; #If - -; #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 - -;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) - -; 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 - -; 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 \ No newline at end of file diff --git a/windows/toggle_kb.bat b/windows/toggle_kb.bat new file mode 100644 index 0000000..8cd118e --- /dev/null +++ b/windows/toggle_kb.bat @@ -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 \ No newline at end of file diff --git a/windows/win_kinto.ahk b/windows/win_kinto.ahk deleted file mode 100644 index 8a7ce58..0000000 --- a/windows/win_kinto.ahk +++ /dev/null @@ -1,258 +0,0 @@ -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, 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, 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 - -GroupAdd, vscode, ahk_exe VSCodium.exe -GroupAdd, vscode, ahk_exe Code.exe - -; New AltTab and CtrlTab fix -*tab:: -{ - ; if (GetKeyState("Tertiary", "P") AND GetKeyState("LShift", "P") = false) { - if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P") = false) { - ; Send {LCtrl down}{Secondary up}{tab} - Send {LCtrl down}{LWin up}{tab} - KeyWait, tab - ; } else if (GetKeyState("Tertiary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LCtrl", "P") AND GetKeyState("LShift", "P")) { - ; Send {LCtrl down}{Secondary up}{LShift down}{tab} - Send {LCtrl down}{LWin up}{LShift down}{tab} - KeyWait, tab - ; return - ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P") = false) { - } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P") = false) { - Send {LAlt down}{tab} - KeyWait, tab - ; ; } else if (GetKeyState("Primary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LAlt", "P") AND GetKeyState("LShift", "P")) { - Send {LAlt down}{LShift down}{tab} - KeyWait, tab - ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) = false { - return - ; } else if (GetKeyState("Secondary", "P") AND GetKeyState("LShift", "P")) { - } else if (GetKeyState("LWin", "P") AND GetKeyState("LShift", "P")) { - 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 -$LWin::LAlt -$LCtrl::LWin - -; Hack to disable start menu on winkey -; $LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} -$LCtrl up::Send {Ctrl down}{LWin up}{Ctrl up} - -; temporary hack to ensure keys don't get stuck -; impacts Alt-Tab fix -; Primary up::Send {LAlt up}{LCtrl up} -$LAlt up::Send {LWin up}{LAlt up}{LCtrl up} -; $LWin up::Send {LWin down}{LAlt up}{LCtrl up}{LWin up} - -; 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} -$^Right::Send {End} -$^+Right::Send +{End} -^Up::Send ^{Home} -^+Up::Send ^+{Home} -^Down::Send ^{End} -^+Down::Send ^+{End} -^Backspace::Send +{Home}{Delete} -!Backspace::Send ^{Backspace} -!Left::Send ^{Left} -!+Left::Send ^+{Left} -!Right::Send ^{Right} -!+Right::Send ^+{Right} - -; Cmd+Space Alternative -^Space::Send ^{Esc} - -; ; Sublime Text Remaps for VS Code -#IfWinActive ahk_group vscode ; ST2CODE - ; 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 -#If ; ST2CODE - -#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:: - SetKeyDelay -1 - Send {Ctrl down}{Shift down}{c DownTemp} - return - - ^c up:: - SetKeyDelay -1 - Send {c Up}{Ctrl up}{Shift 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 - ; 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 - - $^w:: - If not WinActive("ahk_group ConEmu"){ - Send {LCtrl down}{LShift down}w{LCtrl Up}{LShift Up} - } - else{ - Send ^w - } - return - - ; End of Line - ^e:: - SetKeyDelay -1 - Send {Blind}{e DownTemp} - return - - ^e up:: - SetKeyDelay -1 - Send {Blind}{e Up} - return - - ; Beginning of Line - ^a:: - SetKeyDelay -1 - Send {Blind}{a DownTemp} - 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 - -; #IfWinActive ahk_group ConEmu -; ; Paste -; $^v::Send {Shift down}{Insert}{Shift Up} -; #v::Send {LCtrl down}v{LCtrl Up} -; #If - -; #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 - -;Disable win + l key locking (This line must come before any hotkey assignments in the .ahk file) - -; 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 - -; 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 \ No newline at end of file From 7c1f92db5b49bba5303fab73e27afd42c078e450 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 01:29:13 -0500 Subject: [PATCH 19/35] - Kinto system tray preview added to readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2002b0a..7df2705 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,10 @@ Other programs that will be installed when you run ./setup.py 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. + + + + ## How to install 1. clone this repo From 57d430ae36bea091d9662f43ce2709be8ed2863b Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 01:38:17 -0500 Subject: [PATCH 20/35] Updated readme --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 38818d6..76f55ef 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,9 @@ Other programs that will be installed when you run ./setup.py 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. -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. +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). @@ -351,11 +353,6 @@ sudo systemctl start xkeysnail sudo systemctl status xkeysnail ``` -## 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. - -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. - ## 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. From ffab720b502d7d9fece0106535ef0e0f317261fa Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 02:18:59 -0500 Subject: [PATCH 21/35] Update README.md --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 76f55ef..ab7b67a 100644 --- a/README.md +++ b/README.md @@ -39,11 +39,17 @@ Seamless copy and paste with all apps and terminals. Also the only linux remappe ## 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) +Kinto works for standard Windows, Apple and Chromebook keyboards. The following however describes the dynamic rebinding based on a standard Windows/Mac keyboard. -- Normal apps - Alt → Ctrl, Win/Super → Alt, Ctrl → Win/Super +**GUI** +| Ctrl | Win/Alt | Alt/Cmd | Spacebar| +|---|---|---|---| +| Win/Super | Alt | RCtrl |Spacebar| -- Terminal apps - Alt → Ctrl+Shift, Win/Super → Alt, Ctrl → Ctrl +**Terminal** +| Ctrl | Win/Alt | Alt/Cmd | Spacebar| +|---|---|---|---| +| LCtrl | Alt | RCtrl |Spacebar| - Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts. From bcabd5d65b8b0219089571de3b73afc8af37bf94 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 02:20:43 -0500 Subject: [PATCH 22/35] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ab7b67a..9b6a50e 100644 --- a/README.md +++ b/README.md @@ -42,14 +42,14 @@ Seamless copy and paste with all apps and terminals. Also the only linux remappe Kinto works for standard Windows, Apple and Chromebook keyboards. The following however describes the dynamic rebinding based on a standard Windows/Mac keyboard. **GUI** -| Ctrl | Win/Alt | Alt/Cmd | Spacebar| -|---|---|---|---| -| Win/Super | Alt | RCtrl |Spacebar| +|**Physical**| Ctrl | Win/Alt | Alt/Cmd | Spacebar| +|---|---|---|---|---| +|**Virtual**| Win/Super | Alt | RCtrl |Spacebar| **Terminal** -| Ctrl | Win/Alt | Alt/Cmd | Spacebar| -|---|---|---|---| -| LCtrl | Alt | RCtrl |Spacebar| +|**Physical**| Ctrl | Win/Alt | Alt/Cmd | Spacebar| +|---|---|---|---|---| +|**Virtual**| LCtrl | Alt | RCtrl |Spacebar| - Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts. From 894c7b7a69b4c3ac5ca588151c362735bed75e1d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 02:23:35 -0500 Subject: [PATCH 23/35] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b6a50e..2049f58 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,9 @@ Kinto works for standard Windows, Apple and Chromebook keyboards. The following **GUI** |**Physical**| Ctrl | Win/Alt | Alt/Cmd | Spacebar| |---|---|---|---|---| -|**Virtual**| Win/Super | Alt | RCtrl |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| From f0404299acafc2a9b6f66de267896bc3293fc3a3 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Fri, 12 Jun 2020 03:10:27 -0500 Subject: [PATCH 24/35] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2049f58..6e759f3 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ Seamless copy and paste with all apps and terminals. Also the only linux remappe 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| |---|---|---|---|---| @@ -53,8 +55,6 @@ Kinto works for standard Windows, Apple and Chromebook keyboards. The following |---|---|---|---|---| |**Virtual**| LCtrl | Alt | RCtrl |Spacebar| -- Cursor/word-wise shortcut keys have been added to align with macOS keyboard shortcuts. - 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! From 87a4c6934d04a2490ba6fa615d688ffbc550bff4 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 01:36:36 -0500 Subject: [PATCH 25/35] - Updated Budgie patch to use the proper fork for Ubuntu Budgie 20.04 --- xkeysnail_service.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xkeysnail_service.sh b/xkeysnail_service.sh index 2e34a09..5848462 100755 --- a/xkeysnail_service.sh +++ b/xkeysnail_service.sh @@ -101,7 +101,7 @@ function budgieUpdate { 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/43d3b44243b0bcaee3262a79818024a651475b58/binaries/budgie-daemon_10.5.1 -O ./system-config/budgie-daemon_10.5.1 + 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 }') From d68ca6226c4a46542ac9f4909048c13bbfff522d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 16:10:11 -0500 Subject: [PATCH 26/35] - Removed the Windows based Linux VM install option. No longer needed with registry keyswap removal. --- xkeysnail-config/kinto.py | 3 --- xkeysnail_service.sh | 7 ++----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/xkeysnail-config/kinto.py b/xkeysnail-config/kinto.py index baee9c3..b322a15 100644 --- a/xkeysnail-config/kinto.py +++ b/xkeysnail-config/kinto.py @@ -29,9 +29,6 @@ define_conditional_modmap(lambda wm_class: wm_class.casefold() not in terminals, # Key.RIGHT_META: Key.RIGHT_ALT, # WinMac # Key.RIGHT_CTRL: Key.RIGHT_META, # WinMac - # # KintoWin - # Key.LEFT_CTRL: Key.RIGHT_CTRL, # KintoWin - # # Mac Only # Key.LEFT_META: Key.RIGHT_CTRL, # Mac # Key.LEFT_CTRL: Key.LEFT_META, # Mac diff --git a/xkeysnail_service.sh b/xkeysnail_service.sh index 5848462..460dc05 100755 --- a/xkeysnail_service.sh +++ b/xkeysnail_service.sh @@ -140,7 +140,6 @@ if [ $# -eq 0 ]; then echo " 1) Windows & Mac (HID driver)" echo " 2) Mac Only & VMs on Macbooks" echo " 3) Chromebook" - echo " 4) Windows w/ Kinto - aka Linux VM" # echo " 5) Uninstall" read n @@ -153,7 +152,7 @@ rightalt=false # VS code remap vssublime=false -if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "4" || $1 == "kintowin" || $1 == "winmac" || $1 == "mac" || $1 == "chromebook" ]]; then +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 @@ -272,15 +271,13 @@ 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 -elif [[ $1 == "4" || $1 == "kintowin" ]]; then - perl -pi -e "s/(# )(.*)(# KintoWin)/\$2\$3/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 == "4" || $1 == "kintowin" || $1 == "winmac" || $1 == "mac" || $1 == "chromebook" ]]; then +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 From a82632fc63b24986be8ddb986f33047053d44981 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 16:16:15 -0500 Subject: [PATCH 27/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e759f3..1c043f7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ \- 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. (xkeysnail implementation of Kinto has caret checking disabled in master for now.) +Seamless copy and paste with all apps and terminals. The zero effort solution. ## Table of Contents From 3622eeb279e43b9a071299983091e354430406ef Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 16:22:54 -0500 Subject: [PATCH 28/35] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c043f7..cc28d16 100644 --- a/README.md +++ b/README.md @@ -474,7 +474,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. @@ -483,6 +483,10 @@ 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 From 7c360216428da6109dac59919bf056d0809a922c Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 17:00:29 -0500 Subject: [PATCH 29/35] - Removed another reference to old KintoWin VM Linux --- xkeysnail-config/kinto.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/xkeysnail-config/kinto.py b/xkeysnail-config/kinto.py index b322a15..3be7d6b 100644 --- a/xkeysnail-config/kinto.py +++ b/xkeysnail-config/kinto.py @@ -54,10 +54,6 @@ define_conditional_modmap(re.compile(termStr, re.IGNORECASE), { # Key.RIGHT_META: Key.RIGHT_ALT, # WinMac # Key.RIGHT_CTRL: Key.LEFT_CTRL, # WinMac - # # KintoWin - # Key.LEFT_CTRL: Key.RIGHT_CTRL, # KintoWin - # Key.LEFT_META: Key.LEFT_CTRL, # KintoWin - # # Mac Only # Key.LEFT_META: Key.RIGHT_CTRL, # Mac # # Left Ctrl Stays Left Ctrl From 6cb66a6b72e91105aa0d423e9148eb105f425137 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 17:22:12 -0500 Subject: [PATCH 30/35] Updated resources to include Win10 touchpad driver --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index cc28d16..f37e963 100644 --- a/README.md +++ b/README.md @@ -373,6 +373,10 @@ https://superuser.com/questions/385748/binding-superc-superv-to-copy-and-paste 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 From 4c8d8412b804509880599c2d8ff46740f91c263d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 18:08:55 -0500 Subject: [PATCH 31/35] - converted dename.sh to tabs only --- system-config/dename.sh | 198 ++++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/system-config/dename.sh b/system-config/dename.sh index ae2392c..eed7b3a 100755 --- a/system-config/dename.sh +++ b/system-config/dename.sh @@ -2,166 +2,166 @@ 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_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 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 \ No newline at end of file From 1fc62a54da91a0003f1b3a7cd96da35d4395d0af Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 19:25:06 -0500 Subject: [PATCH 32/35] - Proper Budgie detection, improved mac kb support (hid/spi), installs faster. --- setup.py | 15 ++++++++++++--- system-config/dename.sh | 27 +++++++++++++++++++++------ xkeysnail_service.sh | 32 +++++++++++++++++++++++++------- 3 files changed, 58 insertions(+), 16 deletions(-) diff --git a/setup.py b/setup.py index 0357728..bf57496 100755 --- a/setup.py +++ b/setup.py @@ -119,7 +119,7 @@ def setShortcuts(): addhotkeys = yn_choice("\nDo you want to apply system level shortcuts?") if(addhotkeys): distro = distro.lower() - if dename == "gnome" or dename == "mate": + 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): @@ -129,11 +129,19 @@ def setShortcuts(): cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['F13','F13','Tab']\"") cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['F14','F14','Tab']\"") cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['h','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 \"['Space','Space']\"") + # else: + # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['F1']\"") + # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-run-dialog \"['Space','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 == "linux" and dename == "mate") or (distro == "ubuntu" and dename == "mate"): + 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 \"['Up','Left']\"") cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down \"['Down','Right']\"") cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left ['']") @@ -232,7 +240,8 @@ def setShortcuts(): 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') diff --git a/system-config/dename.sh b/system-config/dename.sh index eed7b3a..4c5dfbe 100755 --- a/system-config/dename.sh +++ b/system-config/dename.sh @@ -1,5 +1,17 @@ #!/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 @@ -133,17 +145,20 @@ then then if detect_kde4; then - if detect_gnome; + if detect_budgie; then - if detect_xfce; + if detect_gnome; then - if detect_cinnamon; + if detect_xfce; then - if detect_mate; + if detect_cinnamon; then - if detect_lxde; + if detect_mate; then - detect_sugar + if detect_lxde; + then + detect_sugar + fi fi fi fi diff --git a/xkeysnail_service.sh b/xkeysnail_service.sh index 460dc05..ecaac7b 100755 --- a/xkeysnail_service.sh +++ b/xkeysnail_service.sh @@ -72,6 +72,20 @@ function uninstall { 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..." @@ -255,13 +269,22 @@ if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "winmac" || $1 == "mac" || $1 fi if [[ $1 == "1" || $1 == "winmac" ]]; 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 + 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 @@ -358,12 +381,7 @@ if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "winmac" || $1 == "mac" || $1 elif [[ $1 == "5" || $1 == "uninstall" || $1 == "Uninstall" ]]; then echo "Uninstalling Kinto - xkeysnail (udev)" uninstall - # 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 + removeAppleKB sudo systemctl stop xkeysnail sudo systemctl disable xkeysnail sudo rm /etc/sudoers.d/limitedadmins From 5b4269fc1f9dca6f38286138195780cc5b787755 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 13 Jun 2020 19:27:17 -0500 Subject: [PATCH 33/35] - Allowing galliumOS shortcut keys to apply to any XFCE DE --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index bf57496..1cb6016 100755 --- a/setup.py +++ b/setup.py @@ -175,8 +175,8 @@ def setShortcuts(): cmdline('perl -pi -e "s/(\w.*)(\/\/ Default cmdtab)/\/\/ \$1\$2/g" ~/.xkb/symbols/mac_gui') # elif distro == "budgie" and dename == "gnome": # print("Apply budgie shortcuts here") - elif (distro == "galliumos" and dename == "xfce") or (distro == "ubuntu" and dename == "xfce"): - print("Applying GalliumOS (xfce) shortcuts...") + 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/d" --reset') From d29579e0a54527e0f598682fdbea9b73af7e3647 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 14 Jun 2020 00:58:00 -0500 Subject: [PATCH 34/35] - Fixed posix grouping for Terminus --- windows/kinto.ahk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/kinto.ahk b/windows/kinto.ahk index 00f4029..c75f2cd 100644 --- a/windows/kinto.ahk +++ b/windows/kinto.ahk @@ -64,7 +64,7 @@ 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, terminals, ahk_exe Terminus.exe +GroupAdd, posix, ahk_exe Terminus.exe GroupAdd, posix, Fluent Terminal ahk_class ApplicationFrameWindow GroupAdd, ConEmu, ahk_exe ConEmu.exe From 28e5141079047e261c07196af2db7d191afdfa7d Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sun, 14 Jun 2020 01:15:27 -0500 Subject: [PATCH 35/35] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f37e963..e2c0b75 100644 --- a/README.md +++ b/README.md @@ -381,8 +381,13 @@ Windows 10 touchpad to precision touchpad driver 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