@@ -2,19 +2,39 @@ package main
2
2
3
3
import (
4
4
"bytes"
5
+ "encoding/json"
5
6
"fmt"
6
7
"image"
7
8
"image/png"
9
+ "os"
8
10
"os/exec"
9
11
"path/filepath"
10
12
"syscall"
11
13
"unsafe"
12
14
13
15
"github.com/JamesHovious/w32"
14
16
"github.com/manifoldco/promptui"
17
+ hook "github.com/robotn/gohook"
15
18
"golang.design/x/clipboard"
16
19
)
17
20
21
+ func setConfig (key string , value any ) {
22
+ data := make (map [string ]any )
23
+ content , err := os .ReadFile (configFilePath )
24
+ if err == nil {
25
+ _ = json .Unmarshal (content , & data )
26
+ }
27
+
28
+ data [key ] = value
29
+
30
+ updData , err := json .MarshalIndent (data , "" , " " )
31
+ if err != nil {
32
+ panic (err )
33
+ }
34
+ os .WriteFile (configFilePath , updData , 0644 )
35
+ initConfig ()
36
+ }
37
+
18
38
var (
19
39
user32 = syscall .NewLazyDLL ("user32.dll" )
20
40
procEnumWindows = user32 .NewProc ("EnumWindows" )
@@ -47,7 +67,7 @@ func CopyImgToClipboard(img image.Image) {
47
67
return
48
68
}
49
69
clipboard .Write (clipboard .FmtImage , buf .Bytes ())
50
- fmt .Println ("Image copied to clipboard" )
70
+ fmt .Println ("\n Screenshot copied to clipboard" )
51
71
}
52
72
53
73
func SetProcessDPIAware () error {
@@ -426,3 +446,94 @@ func getFfmpegPath() string {
426
446
427
447
return filepath .Join (appdataDir , "bin" , "ffmpeg.exe" )
428
448
}
449
+
450
+ func ternary [T any ](cond bool , a , b T ) T {
451
+ if cond {
452
+ return a
453
+ }
454
+ return b
455
+ }
456
+
457
+ func RegisterHotkey () ([]string , string ) {
458
+ var (
459
+ modKeys = map [uint16 ]string {
460
+ 29 : "ctrl" , // LCtrl
461
+ 3613 : "ctrl" , // RCtrl
462
+ 56 : "alt" , // LAlt
463
+ 3640 : "alt" , // RAlt
464
+ 42 : "shift" , // LShift
465
+ 54 : "shift" , // RShift
466
+ }
467
+
468
+ keyOrder = []string {"ctrl" , "alt" , "shift" }
469
+
470
+ keyMap = map [uint16 ]string {
471
+ 2 : "1" , 3 : "2" , 4 : "3" , 5 : "4" , 6 : "5" ,
472
+ 7 : "6" , 8 : "7" , 9 : "8" , 10 : "9" , 11 : "0" ,
473
+ 16 : "q" , 17 : "w" , 18 : "e" , 19 : "r" , 20 : "t" ,
474
+ 21 : "y" , 22 : "u" , 23 : "i" , 24 : "o" , 25 : "p" ,
475
+ 30 : "a" , 31 : "s" , 32 : "d" , 33 : "f" , 34 : "g" ,
476
+ 35 : "h" , 36 : "j" , 37 : "k" , 38 : "l" ,
477
+ 44 : "z" , 45 : "x" , 46 : "c" , 47 : "v" , 48 : "b" ,
478
+ 49 : "n" , 50 : "m" ,
479
+ }
480
+ )
481
+ fmt .Println ("Press your hotkey combo (e.g. ctrl+alt+z)..." )
482
+
483
+ pressedMods := map [string ]bool {}
484
+ var mainKey string
485
+
486
+ evChan := hook .Start ()
487
+ defer hook .End ()
488
+
489
+ for ev := range evChan {
490
+ if ev .Kind != hook .KeyDown {
491
+ continue
492
+ }
493
+
494
+ if mod , ok := modKeys [ev .Keycode ]; ok {
495
+ pressedMods [mod ] = true
496
+ continue
497
+ }
498
+
499
+ if k , ok := keyMap [ev .Keycode ]; ok {
500
+ mainKey = k
501
+ break
502
+ } else {
503
+ fmt .Println ("Invalid key. Only A-Z or 0-9 accepted." )
504
+ os .Exit (1 )
505
+ }
506
+ }
507
+
508
+ var mods []string
509
+ for _ , mod := range keyOrder {
510
+ if pressedMods [mod ] {
511
+ mods = append (mods , mod )
512
+ }
513
+ }
514
+ return mods , mainKey
515
+
516
+ // mods := []hotkey.Modifier{}
517
+ // var finalKey rune
518
+ // for _, mod := range combo {
519
+ // switch mod {
520
+ // case "ctrl":
521
+ // mods = append(mods, hotkey.ModCtrl)
522
+ // case "alt":
523
+ // mods = append(mods, hotkey.ModAlt)
524
+ // case "shift":
525
+ // mods = append(mods, hotkey.ModShift)
526
+ // default:
527
+ // finalKey = []rune(mod)[0]
528
+ // }
529
+ // }
530
+
531
+ // hk := hotkey.New(mods, hotkey.Key(finalKey))
532
+ // hk.Register()
533
+ // defer hk.Unregister()
534
+ // keyChan := hk.Keydown()
535
+ // for range keyChan {
536
+ // fmt.Println("Combo pressed!")
537
+ // os.Exit(0)
538
+ // }
539
+ }
0 commit comments