mirror of
https://github.com/go-vgo/robotgo.git
synced 2025-06-17 13:33:55 +00:00
Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dd208c6dd1 | ||
![]() |
ae4390f607 | ||
![]() |
48706562fc | ||
![]() |
023426ab13 | ||
![]() |
d34a1491cb | ||
![]() |
c431c8f974 | ||
![]() |
a183783e9c | ||
![]() |
c1115cebc7 | ||
![]() |
a8c387a070 | ||
![]() |
3eef3b5879 | ||
![]() |
b731094f61 | ||
![]() |
8d4679db07 | ||
![]() |
02c668a946 | ||
![]() |
5c2864485d | ||
![]() |
f101b10497 | ||
![]() |
73c07dc991 | ||
![]() |
fc47bc8216 | ||
![]() |
912ddcbfe4 | ||
![]() |
57b5e5bca2 | ||
![]() |
8031f7f526 | ||
![]() |
36bc85ad19 | ||
![]() |
5fc2bd4c73 | ||
![]() |
47abfac5ee | ||
![]() |
df0731c4df | ||
![]() |
03432155c1 | ||
![]() |
6a1f060a8c | ||
![]() |
e924f25fe1 | ||
![]() |
d300eedf54 | ||
![]() |
c07f3f0171 | ||
![]() |
0b18fa5058 | ||
![]() |
471f7ba05f | ||
![]() |
a84a195c4c | ||
![]() |
c8df366f89 | ||
![]() |
70f811ce53 | ||
![]() |
ecc260ea31 | ||
![]() |
78d01703b8 | ||
![]() |
47cde13dab | ||
![]() |
8db59aac2d | ||
![]() |
217d6cf1f1 | ||
![]() |
75fd24ea0a | ||
![]() |
bed6776ca2 | ||
![]() |
1923d7bb48 | ||
![]() |
ead43d062e | ||
![]() |
3258566802 |
@ -1,5 +1,5 @@
|
|||||||
# FROM golang:1.10.1
|
# FROM golang:1.10.1
|
||||||
FROM golang:1.22.3-stretch AS build
|
FROM golang:1.24.2-stretch AS build
|
||||||
# FROM govgo/go:1.11.1
|
# FROM govgo/go:1.11.1
|
||||||
|
|
||||||
RUN apt update && apt install -y --no-install-recommends \
|
RUN apt update && apt install -y --no-install-recommends \
|
||||||
|
4
.github/workflows/go.yml
vendored
4
.github/workflows/go.yml
vendored
@ -10,10 +10,10 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Go 1.23.0
|
- name: Set up Go 1.24.0
|
||||||
uses: actions/setup-go@v1
|
uses: actions/setup-go@v1
|
||||||
with:
|
with:
|
||||||
go-version: 1.23.0
|
go-version: 1.24.0
|
||||||
id: go
|
id: go
|
||||||
|
|
||||||
- name: Check out code into the Go module directory
|
- name: Check out code into the Go module directory
|
||||||
|
@ -30,20 +30,18 @@ Before sending code out for review, run all the tests for the whole tree to make
|
|||||||
|
|
||||||
In addition to the owner, Changes to Robotgo must be reviewed before they are accepted, no matter who makes the change even if it is a maintainer. We use GitHub's pull request workflow to do that and we also use [LGTM](http://lgtm.co) to ensure every PR is reviewed by vz or least 2 maintainers.
|
In addition to the owner, Changes to Robotgo must be reviewed before they are accepted, no matter who makes the change even if it is a maintainer. We use GitHub's pull request workflow to do that and we also use [LGTM](http://lgtm.co) to ensure every PR is reviewed by vz or least 2 maintainers.
|
||||||
|
|
||||||
|
|
||||||
## Sign your work
|
## Sign your work
|
||||||
|
|
||||||
The sign-off is a simple line at the end of the explanation for the patch. Your signature certifies that you wrote the patch or otherwise have the right to pass it on as an open-source patch.
|
The sign-off is a simple line at the end of the explanation for the patch. Your signature certifies that you wrote the patch or otherwise have the right to pass it on as an open-source patch.
|
||||||
|
|
||||||
## Maintainers
|
## Maintainers
|
||||||
|
|
||||||
To make sure every PR is checked, we got team maintainers. A maintainer should be a contributor of Robotgo and contributed at least 4 accepted PRs.
|
To make sure every PR is checked, we got team maintainers. A maintainer should be a contributor of Robotgo and contributed at least 4 accepted PRs.
|
||||||
|
|
||||||
## Owners
|
## Owners
|
||||||
|
|
||||||
Since Robotgo is a pure community organization without any company support, Copyright 2016 The go-vgo Project Developers.
|
Since Robotgo is a pure community organization without any company support, Copyright 2016 The go-vgo Project Developers.
|
||||||
|
|
||||||
|
|
||||||
## Versions
|
## Versions
|
||||||
|
|
||||||
Robotgo has the `master` branch as a tip branch and has version branches such as `v0.30.0`. `v0.40.0` is a release branch and we will tag `v0.40.0` for binary download. If `v0.40.0` has bugs, we will accept pull requests on the `v0.40.0` branch and publish a `v0.40.1` tag, after bringing the bug fix also to the master branch.
|
Robotgo has the `master` branch as a tip branch and has version branches such as `v0.30.0`. `v0.40.0` is a release branch and we will tag `v0.40.0` for binary download. If `v0.40.0` has bugs, we will accept pull requests on the `v0.40.0` branch and publish a `v0.40.1` tag, after bringing the bug fix also to the master branch.
|
||||||
@ -60,9 +58,9 @@ Code that you contribute should use the standard copyright header:
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
44
README.md
44
README.md
@ -62,6 +62,10 @@ GCC
|
|||||||
|
|
||||||
#### For MacOS:
|
#### For MacOS:
|
||||||
|
|
||||||
|
```
|
||||||
|
brew install go
|
||||||
|
```
|
||||||
|
|
||||||
Xcode Command Line Tools (And Privacy setting: [#277](https://github.com/go-vgo/robotgo/issues/277))
|
Xcode Command Line Tools (And Privacy setting: [#277](https://github.com/go-vgo/robotgo/issues/277))
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -70,7 +74,15 @@ xcode-select --install
|
|||||||
|
|
||||||
#### For Windows:
|
#### For Windows:
|
||||||
|
|
||||||
[MinGW-w64](https://sourceforge.net/projects/mingw-w64/files) (Use recommended) or others Mingw [llvm-mingw](https://github.com/mstorsjo/llvm-mingw);
|
```
|
||||||
|
winget install Golang.go
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
winget install MartinStorsjo.LLVM-MinGW.UCRT
|
||||||
|
```
|
||||||
|
|
||||||
|
Or [MinGW-w64](https://sourceforge.net/projects/mingw-w64/files) (Use recommended) or others Mingw [llvm-mingw](https://github.com/mstorsjo/llvm-mingw);
|
||||||
|
|
||||||
Download the Mingw, then set system environment variables `C:\mingw64\bin` to the Path.
|
Download the Mingw, then set system environment variables `C:\mingw64\bin` to the Path.
|
||||||
[Set environment variables to run GCC from command line](https://www.youtube.com/results?search_query=Set+environment+variables+to+run+GCC+from+command+line).
|
[Set environment variables to run GCC from command line](https://www.youtube.com/results?search_query=Set+environment+variables+to+run+GCC+from+command+line).
|
||||||
@ -96,6 +108,9 @@ X11 with the XTest extension (the Xtst library)
|
|||||||
##### Ubuntu:
|
##### Ubuntu:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
|
# sudo apt install golang
|
||||||
|
sudo snap install go --classic
|
||||||
|
|
||||||
# gcc
|
# gcc
|
||||||
sudo apt install gcc libc6-dev
|
sudo apt install gcc libc6-dev
|
||||||
|
|
||||||
@ -165,11 +180,18 @@ Note go1.10.x C file compilation cache problem, [golang #24355](https://github.c
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/go-vgo/robotgo"
|
"github.com/go-vgo/robotgo"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
robotgo.MouseSleep = 100
|
robotgo.MouseSleep = 300
|
||||||
|
|
||||||
|
robotgo.Move(100, 100)
|
||||||
|
fmt.Println(robotgo.Location())
|
||||||
|
robotgo.Move(100, -200) // multi screen supported
|
||||||
|
robotgo.MoveSmooth(120, -150)
|
||||||
|
fmt.Println(robotgo.Location())
|
||||||
|
|
||||||
robotgo.ScrollDir(10, "up")
|
robotgo.ScrollDir(10, "up")
|
||||||
robotgo.ScrollDir(20, "right")
|
robotgo.ScrollDir(20, "right")
|
||||||
@ -244,6 +266,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/go-vgo/robotgo"
|
"github.com/go-vgo/robotgo"
|
||||||
"github.com/vcaesar/imgo"
|
"github.com/vcaesar/imgo"
|
||||||
@ -268,13 +291,18 @@ func main() {
|
|||||||
num := robotgo.DisplaysNum()
|
num := robotgo.DisplaysNum()
|
||||||
for i := 0; i < num; i++ {
|
for i := 0; i < num; i++ {
|
||||||
robotgo.DisplayID = i
|
robotgo.DisplayID = i
|
||||||
img1 := robotgo.CaptureImg()
|
img1, _ := robotgo.CaptureImg()
|
||||||
path1 := "save_" + strconv.Itoa(i)
|
path1 := "save_" + strconv.Itoa(i)
|
||||||
robotgo.Save(img1, path1+".png")
|
robotgo.Save(img1, path1+".png")
|
||||||
robotgo.SaveJpeg(img1, path1+".jpeg", 50)
|
robotgo.SaveJpeg(img1, path1+".jpeg", 50)
|
||||||
|
|
||||||
img2 := robotgo.CaptureImg(10, 10, 20, 20)
|
img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
|
||||||
robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")
|
robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")
|
||||||
|
|
||||||
|
x, y, w, h := robotgo.GetDisplayBounds(i)
|
||||||
|
img3, err := robotgo.CaptureImg(x, y, w, h)
|
||||||
|
fmt.Println("Capture error: ", err)
|
||||||
|
robotgo.Save(img3, path1+"_1.png")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -354,8 +382,8 @@ func opencv() {
|
|||||||
// bit1 := robotgo.CaptureScreen(10, 10, 30, 30)
|
// bit1 := robotgo.CaptureScreen(10, 10, 30, 30)
|
||||||
// img1 := robotgo.ToImage(bit1)
|
// img1 := robotgo.ToImage(bit1)
|
||||||
// defer robotgo.FreeBitmapArr(bit0, bit1)
|
// defer robotgo.FreeBitmapArr(bit0, bit1)
|
||||||
img := robotgo.CaptureImg()
|
img, _ := robotgo.CaptureImg()
|
||||||
img1 := robotgo.CaptureImg(10, 10, 30, 30)
|
img1, _ := robotgo.CaptureImg(10, 10, 30, 30)
|
||||||
|
|
||||||
fmt.Print("gcv find image: ")
|
fmt.Print("gcv find image: ")
|
||||||
fmt.Println(gcv.FindImg(img1, img))
|
fmt.Println(gcv.FindImg(img1, img))
|
||||||
@ -509,6 +537,6 @@ func main() {
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Robotgo is primarily distributed under the terms of "both the MIT license and the Apache License (Version 2.0)", with portions covered by various BSD-like licenses.
|
Robotgo is primarily distributed under the terms of "the Apache License (Version 2.0)", with portions covered by various BSD-like licenses.
|
||||||
|
|
||||||
See [LICENSE-APACHE](http://www.apache.org/licenses/LICENSE-2.0), [LICENSE-MIT](https://github.com/go-vgo/robotgo/blob/master/LICENSE).
|
See [LICENSE-APACHE](http://www.apache.org/licenses/LICENSE-2.0), [LICENSE](https://github.com/go-vgo/robotgo/blob/master/LICENSE).
|
||||||
|
6
doc.go
6
doc.go
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo
|
package robotgo
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package main
|
package main
|
||||||
@ -29,23 +29,29 @@ func bitmap() {
|
|||||||
gbitMap := robotgo.CaptureGo()
|
gbitMap := robotgo.CaptureGo()
|
||||||
fmt.Println("Go CaptureScreen...", gbitMap.Width)
|
fmt.Println("Go CaptureScreen...", gbitMap.Width)
|
||||||
// fmt.Println("...", gbitmap.Width, gbitmap.BytesPerPixel)
|
// fmt.Println("...", gbitmap.Width, gbitmap.BytesPerPixel)
|
||||||
// robotgo.SaveCapture("saveCapture.png", 10, 20, 100, 100)
|
robotgo.SaveCapture("saveCapture.png", 10, 20, 100, 100)
|
||||||
|
|
||||||
img := robotgo.CaptureImg()
|
img, err := robotgo.CaptureImg()
|
||||||
|
fmt.Println("error: ", err)
|
||||||
robotgo.Save(img, "save.png")
|
robotgo.Save(img, "save.png")
|
||||||
|
|
||||||
num := robotgo.DisplaysNum()
|
num := robotgo.DisplaysNum()
|
||||||
for i := 0; i < num; i++ {
|
for i := 0; i < num; i++ {
|
||||||
robotgo.DisplayID = i
|
robotgo.DisplayID = i
|
||||||
img1 := robotgo.CaptureImg()
|
img1, _ := robotgo.CaptureImg()
|
||||||
path1 := "save_" + strconv.Itoa(i)
|
path1 := "save_" + strconv.Itoa(i)
|
||||||
robotgo.Save(img1, path1+".png")
|
robotgo.Save(img1, path1+".png")
|
||||||
robotgo.SaveJpeg(img1, path1+".jpeg", 50)
|
robotgo.SaveJpeg(img1, path1+".jpeg", 50)
|
||||||
|
|
||||||
img2 := robotgo.CaptureImg(10, 10, 20, 20)
|
img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
|
||||||
path2 := "test_" + strconv.Itoa(i)
|
path2 := "test_" + strconv.Itoa(i)
|
||||||
robotgo.Save(img2, path2+".png")
|
robotgo.Save(img2, path2+".png")
|
||||||
robotgo.SaveJpeg(img2, path2+".jpeg", 50)
|
robotgo.SaveJpeg(img2, path2+".jpeg", 50)
|
||||||
|
|
||||||
|
x, y, w, h := robotgo.GetDisplayBounds(i)
|
||||||
|
img3, err := robotgo.CaptureImg(x, y, w, h)
|
||||||
|
fmt.Println("Capture error: ", err)
|
||||||
|
robotgo.Save(img3, path2+"_1.png")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
31
go.mod
31
go.mod
@ -1,39 +1,38 @@
|
|||||||
module github.com/go-vgo/robotgo
|
module github.com/go-vgo/robotgo
|
||||||
|
|
||||||
go 1.22
|
go 1.23.0
|
||||||
|
|
||||||
toolchain go1.23.0
|
toolchain go1.23.6
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/otiai10/gosseract/v2 v2.4.1
|
github.com/otiai10/gosseract/v2 v2.4.1
|
||||||
// github.com/robotn/gohook v0.31.3
|
// github.com/robotn/gohook v0.31.3
|
||||||
github.com/robotn/xgb v0.10.0
|
github.com/robotn/xgb v0.10.0
|
||||||
github.com/robotn/xgbutil v0.10.0
|
github.com/robotn/xgbutil v0.10.0
|
||||||
github.com/tailscale/win v0.0.0-20240830200727-2d6766fe9b74
|
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35
|
||||||
github.com/vcaesar/gops v0.40.0
|
github.com/vcaesar/gops v0.41.0
|
||||||
github.com/vcaesar/imgo v0.40.2
|
github.com/vcaesar/imgo v0.41.0
|
||||||
github.com/vcaesar/keycode v0.10.1
|
github.com/vcaesar/keycode v0.10.1
|
||||||
github.com/vcaesar/tt v0.20.1
|
github.com/vcaesar/tt v0.20.1
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
|
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
|
||||||
github.com/gen2brain/shm v0.1.0 // indirect
|
github.com/ebitengine/purego v0.8.3 // indirect
|
||||||
|
github.com/gen2brain/shm v0.1.1 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
github.com/jezek/xgb v1.1.1 // indirect
|
github.com/jezek/xgb v1.1.1 // indirect
|
||||||
github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191
|
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect
|
||||||
github.com/lufia/plan9stats v0.0.0-20240819163618-b1d8f4d146e7 // indirect
|
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
|
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||||
github.com/shirou/gopsutil/v4 v4.24.8 // indirect
|
github.com/shirou/gopsutil/v4 v4.25.4 // indirect
|
||||||
github.com/shoenig/go-m1cpu v0.1.6 // indirect
|
github.com/tklauser/go-sysconf v0.3.15 // indirect
|
||||||
github.com/tklauser/go-sysconf v0.3.14 // indirect
|
github.com/tklauser/numcpus v0.10.0 // indirect
|
||||||
github.com/tklauser/numcpus v0.8.0 // indirect
|
github.com/vcaesar/screenshot v0.11.1
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
|
||||||
golang.org/x/image v0.20.0 // indirect
|
golang.org/x/image v0.27.0 // indirect
|
||||||
golang.org/x/sys v0.25.0 // indirect
|
golang.org/x/sys v0.33.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
// replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190109145017-48ac38b7c8cb
|
// replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190109145017-48ac38b7c8cb
|
||||||
|
65
go.sum
65
go.sum
@ -4,23 +4,21 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
|||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
|
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
|
||||||
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
|
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
|
||||||
github.com/gen2brain/shm v0.1.0 h1:MwPeg+zJQXN0RM9o+HqaSFypNoNEcNpeoGp0BTSx2YY=
|
github.com/ebitengine/purego v0.8.3 h1:K+0AjQp63JEZTEMZiwsI9g0+hAMNohwUOtY0RPGexmc=
|
||||||
github.com/gen2brain/shm v0.1.0/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA=
|
github.com/ebitengine/purego v0.8.3/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
||||||
|
github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ=
|
||||||
|
github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA=
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
|
github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
|
||||||
github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
|
github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
|
||||||
github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 h1:5UHVWNX1qrIbNw7OpKbxe5bHkhHRk3xRKztMjERuCsU=
|
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc=
|
||||||
github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ=
|
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
|
||||||
github.com/lufia/plan9stats v0.0.0-20240819163618-b1d8f4d146e7 h1:5RK988zAqB3/AN3opGfRpoQgAVqr6/A5+qRTi67VUZY=
|
|
||||||
github.com/lufia/plan9stats v0.0.0-20240819163618-b1d8f4d146e7/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
|
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
|
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
github.com/otiai10/gosseract/v2 v2.4.1 h1:G8AyBpXEeSlcq8TI85LH/pM5SXk8Djy2GEXisgyblRw=
|
github.com/otiai10/gosseract/v2 v2.4.1 h1:G8AyBpXEeSlcq8TI85LH/pM5SXk8Djy2GEXisgyblRw=
|
||||||
@ -36,41 +34,38 @@ github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM=
|
|||||||
github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
|
github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
|
||||||
github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw=
|
github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw=
|
||||||
github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
|
github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
|
||||||
github.com/shirou/gopsutil/v4 v4.24.8 h1:pVQjIenQkIhqO81mwTaXjTzOMT7d3TZkf43PlVFHENI=
|
github.com/shirou/gopsutil/v4 v4.25.4 h1:cdtFO363VEOOFrUCjZRh4XVJkb548lyF0q0uTeMqYPw=
|
||||||
github.com/shirou/gopsutil/v4 v4.24.8/go.mod h1:wE0OrJtj4dG+hYkxqDH3QiBICdKSf04/npcvLLc/oRg=
|
github.com/shirou/gopsutil/v4 v4.25.4/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA=
|
||||||
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
|
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 h1:wAZbkTZkqDzWsqxPh2qkBd3KvFU7tcxV0BP0Rnhkxog=
|
||||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
|
||||||
github.com/tailscale/win v0.0.0-20240830200727-2d6766fe9b74 h1:a6itf7Z0Ahy5z5RVTkasDAbcOIJ/GwWRjkWVgaUhWuo=
|
|
||||||
github.com/tailscale/win v0.0.0-20240830200727-2d6766fe9b74/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
|
|
||||||
github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA=
|
github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA=
|
||||||
github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk=
|
github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk=
|
||||||
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=
|
||||||
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=
|
||||||
github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
|
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
|
||||||
github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
|
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
|
||||||
github.com/vcaesar/gops v0.40.0 h1:I+1RCGiV+LkZJUYNzAd373xs0uM2UyeFdZBmow8HfCM=
|
github.com/vcaesar/gops v0.41.0 h1:FG748Jyw3FOuZnbzSgB+CQSx2e5LbLCPWV2JU1brFdc=
|
||||||
github.com/vcaesar/gops v0.40.0/go.mod h1:3u/USW7JovqUK6i13VOD3qWfvXXd2TIIKE4PYIv4TOM=
|
github.com/vcaesar/gops v0.41.0/go.mod h1:/3048L7Rj7QjQKTSB+kKc7hDm63YhTWy5QJ10TCP37A=
|
||||||
github.com/vcaesar/imgo v0.40.2 h1:5GWScRLdBCMtO1v2I1bs+ZmDLZFINxYSMZ+mtUw5qPM=
|
github.com/vcaesar/imgo v0.41.0 h1:kNLYGrThXhB9Dd6IwFmfPnxq9P6yat2g7dpPjr7OWO8=
|
||||||
github.com/vcaesar/imgo v0.40.2/go.mod h1:MVCl+FxHI2gTgmiHoi0n5xNCbYcfv9SVtdEOUC92+eo=
|
github.com/vcaesar/imgo v0.41.0/go.mod h1:/LGOge8etlzaVu/7l+UfhJxR6QqaoX5yeuzGIMfWb4I=
|
||||||
github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw=
|
github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw=
|
||||||
github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ=
|
github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ=
|
||||||
|
github.com/vcaesar/screenshot v0.11.1 h1:GgPuN89XC4Yh38dLx4quPlSo3YiWWhwIria/j3LtrqU=
|
||||||
|
github.com/vcaesar/screenshot v0.11.1/go.mod h1:gJNwHBiP1v1v7i8TQ4yV1XJtcyn2I/OJL7OziVQkwjs=
|
||||||
github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4=
|
github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4=
|
||||||
github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU=
|
github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
|
||||||
golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw=
|
golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=
|
||||||
golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM=
|
golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
6
img.go
6
img.go
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo
|
package robotgo
|
||||||
|
85
key.go
85
key.go
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo
|
package robotgo
|
||||||
@ -416,7 +416,7 @@ func keyTaps(k string, keyArr []string, pid int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func keyToggles(k string, keyArr []string, pid int, args ...interface{}) error {
|
func getKeyDown(keyArr []string) (bool, []string) {
|
||||||
if len(keyArr) <= 0 {
|
if len(keyArr) <= 0 {
|
||||||
keyArr = append(keyArr, "down")
|
keyArr = append(keyArr, "down")
|
||||||
}
|
}
|
||||||
@ -429,20 +429,26 @@ func keyToggles(k string, keyArr []string, pid int, args ...interface{}) error {
|
|||||||
if keyArr[0] == "up" || keyArr[0] == "down" {
|
if keyArr[0] == "up" || keyArr[0] == "down" {
|
||||||
keyArr = keyArr[1:]
|
keyArr = keyArr[1:]
|
||||||
}
|
}
|
||||||
flags := getFlagsFromValue(keyArr)
|
return down, keyArr
|
||||||
|
}
|
||||||
|
|
||||||
|
func keyTogglesB(k string, down bool, keyArr []string, pid int) error {
|
||||||
|
flags := getFlagsFromValue(keyArr)
|
||||||
key, err := checkKeyCodes(k)
|
key, err := checkKeyCodes(k)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
C.toggleKeyCode(key, C.bool(down), flags, C.uintptr(pid))
|
C.toggleKeyCode(key, C.bool(down), flags, C.uintptr(pid))
|
||||||
if len(args) > 0 {
|
MilliSleep(KeySleep)
|
||||||
MilliSleep(KeySleep)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func keyToggles(k string, keyArr []string, pid int) error {
|
||||||
|
down, keyArr1 := getKeyDown(keyArr)
|
||||||
|
return keyTogglesB(k, down, keyArr1, pid)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
__ ___ ___________ ____ .______ ______ ___ .______ _______
|
__ ___ ___________ ____ .______ ______ ___ .______ _______
|
||||||
| |/ / | ____\ \ / / | _ \ / __ \ / \ | _ \ | \
|
| |/ / | ____\ \ / / | _ \ / __ \ / \ | _ \ | \
|
||||||
@ -480,6 +486,22 @@ func toErr(str *C.char) error {
|
|||||||
return errors.New(gstr)
|
return errors.New(gstr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func appendShift(key string, len1 int, args ...interface{}) (string, []interface{}) {
|
||||||
|
if len(key) > 0 && unicode.IsUpper([]rune(key)[0]) {
|
||||||
|
args = append(args, "shift")
|
||||||
|
}
|
||||||
|
|
||||||
|
key = strings.ToLower(key)
|
||||||
|
if _, ok := Special[key]; ok {
|
||||||
|
key = Special[key]
|
||||||
|
if len(args) <= len1 {
|
||||||
|
args = append(args, "shift")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return key, args
|
||||||
|
}
|
||||||
|
|
||||||
// KeyTap taps the keyboard code;
|
// KeyTap taps the keyboard code;
|
||||||
//
|
//
|
||||||
// See keys supported:
|
// See keys supported:
|
||||||
@ -498,18 +520,7 @@ func toErr(str *C.char) error {
|
|||||||
// robotgo.KeyTap("k", pid int)
|
// robotgo.KeyTap("k", pid int)
|
||||||
func KeyTap(key string, args ...interface{}) error {
|
func KeyTap(key string, args ...interface{}) error {
|
||||||
var keyArr []string
|
var keyArr []string
|
||||||
|
key, args = appendShift(key, 0, args...)
|
||||||
if len(key) > 0 && unicode.IsUpper([]rune(key)[0]) {
|
|
||||||
args = append(args, "shift")
|
|
||||||
}
|
|
||||||
|
|
||||||
key = strings.ToLower(key)
|
|
||||||
if _, ok := Special[key]; ok {
|
|
||||||
key = Special[key]
|
|
||||||
if len(args) <= 0 {
|
|
||||||
args = append(args, "shift")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pid := 0
|
pid := 0
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
@ -528,6 +539,16 @@ func KeyTap(key string, args ...interface{}) error {
|
|||||||
return keyTaps(key, keyArr, pid)
|
return keyTaps(key, keyArr, pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getToggleArgs(args ...interface{}) (pid int, keyArr []string) {
|
||||||
|
if len(args) > 0 && reflect.TypeOf(args[0]) == reflect.TypeOf(pid) {
|
||||||
|
pid = args[0].(int)
|
||||||
|
keyArr = ToStrings(args[1:])
|
||||||
|
} else {
|
||||||
|
keyArr = ToStrings(args)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// KeyToggle toggles the keyboard, if there not have args default is "down"
|
// KeyToggle toggles the keyboard, if there not have args default is "down"
|
||||||
//
|
//
|
||||||
// See keys:
|
// See keys:
|
||||||
@ -542,28 +563,8 @@ func KeyTap(key string, args ...interface{}) error {
|
|||||||
// robotgo.KeyToggle("a", "up", "alt", "cmd")
|
// robotgo.KeyToggle("a", "up", "alt", "cmd")
|
||||||
// robotgo.KeyToggle("k", pid int)
|
// robotgo.KeyToggle("k", pid int)
|
||||||
func KeyToggle(key string, args ...interface{}) error {
|
func KeyToggle(key string, args ...interface{}) error {
|
||||||
|
key, args = appendShift(key, 1, args...)
|
||||||
if len(key) > 0 && unicode.IsUpper([]rune(key)[0]) {
|
pid, keyArr := getToggleArgs(args...)
|
||||||
args = append(args, "shift")
|
|
||||||
}
|
|
||||||
|
|
||||||
key = strings.ToLower(key)
|
|
||||||
if _, ok := Special[key]; ok {
|
|
||||||
key = Special[key]
|
|
||||||
if len(args) <= 1 {
|
|
||||||
args = append(args, "shift")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pid := 0
|
|
||||||
var keyArr []string
|
|
||||||
if len(args) > 0 && reflect.TypeOf(args[0]) == reflect.TypeOf(pid) {
|
|
||||||
pid = args[0].(int)
|
|
||||||
keyArr = ToStrings(args[1:])
|
|
||||||
} else {
|
|
||||||
keyArr = ToStrings(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
return keyToggles(key, keyArr, pid)
|
return keyToggles(key, keyArr, pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package key
|
package key
|
||||||
|
@ -90,7 +90,8 @@ MMKeyCode keyCodeForChar(const char c) {
|
|||||||
|
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
CFStringRef createStringForKey(CGKeyCode keyCode){
|
CFStringRef createStringForKey(CGKeyCode keyCode){
|
||||||
TISInputSourceRef currentKeyboard = TISCopyCurrentASCIICapableKeyboardInputSource();
|
// TISInputSourceRef currentKeyboard = TISCopyCurrentASCIICapableKeyboardInputSource();
|
||||||
|
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardLayoutInputSource();
|
||||||
CFDataRef layoutData = (CFDataRef) TISGetInputSourceProperty(
|
CFDataRef layoutData = (CFDataRef) TISGetInputSourceProperty(
|
||||||
currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
|
currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#include "../base/deadbeef_rand_c.h"
|
#include "../base/deadbeef_rand_c.h"
|
||||||
@ -58,7 +58,7 @@
|
|||||||
if (pid != 0) {
|
if (pid != 0) {
|
||||||
CGEventPostToPid(pid, event);
|
CGEventPostToPid(pid, event);
|
||||||
} else {
|
} else {
|
||||||
CGEventPost(kCGSessionEventTap, event);
|
CGEventPost(kCGHIDEventTap, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
CFRelease(event);
|
CFRelease(event);
|
||||||
@ -179,7 +179,8 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags, uintptr pi
|
|||||||
NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE);
|
NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE);
|
||||||
assert(KERN_SUCCESS == kr);
|
assert(KERN_SUCCESS == kr);
|
||||||
} else {
|
} else {
|
||||||
CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)code, down);
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
CGEventRef keyEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)code, down);
|
||||||
assert(keyEvent != NULL);
|
assert(keyEvent != NULL);
|
||||||
|
|
||||||
CGEventSetType(keyEvent, down ? kCGEventKeyDown : kCGEventKeyUp);
|
CGEventSetType(keyEvent, down ? kCGEventKeyDown : kCGEventKeyUp);
|
||||||
@ -188,6 +189,7 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags, uintptr pi
|
|||||||
}
|
}
|
||||||
|
|
||||||
SendTo(pid, keyEvent);
|
SendTo(pid, keyEvent);
|
||||||
|
CFRelease(source);
|
||||||
}
|
}
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP;
|
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP;
|
||||||
@ -273,7 +275,8 @@ void toggleKey(char c, const bool down, MMKeyFlags flags, uintptr pid) {
|
|||||||
convert characters to a keycode, but does not support adding modifier flags.
|
convert characters to a keycode, but does not support adding modifier flags.
|
||||||
It is only used in typeString().
|
It is only used in typeString().
|
||||||
-- if you need modifier keys, use the above functions instead. */
|
-- if you need modifier keys, use the above functions instead. */
|
||||||
CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, 0, down);
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
CGEventRef keyEvent = CGEventCreateKeyboardEvent(source, 0, down);
|
||||||
if (keyEvent == NULL) {
|
if (keyEvent == NULL) {
|
||||||
fputs("Could not create keyboard event.\n", stderr);
|
fputs("Could not create keyboard event.\n", stderr);
|
||||||
return;
|
return;
|
||||||
@ -282,6 +285,7 @@ void toggleKey(char c, const bool down, MMKeyFlags flags, uintptr pid) {
|
|||||||
CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
CGEventKeyboardSetUnicodeString(keyEvent, 1, &ch);
|
||||||
|
|
||||||
SendTo(pid, keyEvent);
|
SendTo(pid, keyEvent);
|
||||||
|
CFRelease(source);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define toggleUniKey(c, down) toggleKey(c, down, MOD_NONE, 0)
|
#define toggleUniKey(c, down) toggleKey(c, down, MOD_NONE, 0)
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo
|
package robotgo
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package mouse
|
package mouse
|
||||||
|
@ -83,51 +83,37 @@
|
|||||||
/* Move the mouse to a specific point. */
|
/* Move the mouse to a specific point. */
|
||||||
void moveMouse(MMPointInt32 point){
|
void moveMouse(MMPointInt32 point){
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
CGEventRef move = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved,
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
CGEventRef move = CGEventCreateMouseEvent(source, kCGEventMouseMoved,
|
||||||
CGPointFromMMPointInt32(point), kCGMouseButtonLeft);
|
CGPointFromMMPointInt32(point), kCGMouseButtonLeft);
|
||||||
|
|
||||||
calculateDeltas(&move, point);
|
calculateDeltas(&move, point);
|
||||||
|
|
||||||
CGEventPost(kCGSessionEventTap, move);
|
CGEventPost(kCGHIDEventTap, move);
|
||||||
CFRelease(move);
|
CFRelease(move);
|
||||||
|
CFRelease(source);
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
Display *display = XGetMainDisplay();
|
Display *display = XGetMainDisplay();
|
||||||
XWarpPointer(display, None, DefaultRootWindow(display), 0, 0, 0, 0, point.x, point.y);
|
XWarpPointer(display, None, DefaultRootWindow(display), 0, 0, 0, 0, point.x, point.y);
|
||||||
|
|
||||||
XSync(display, false);
|
XSync(display, false);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
// Mouse motion is now done using SendInput with MOUSEINPUT.
|
SetCursorPos(point.x, point.y);
|
||||||
// We use Absolute mouse positioning
|
|
||||||
#define MOUSE_COORD_TO_ABS(coord, width_or_height) ( \
|
|
||||||
((65536 * coord) / width_or_height) + (coord < 0 ? -1 : 1))
|
|
||||||
|
|
||||||
MMRectInt32 rect = getScreenRect(1);
|
|
||||||
int32_t x = MOUSE_COORD_TO_ABS(point.x - rect.origin.x, rect.size.w);
|
|
||||||
int32_t y = MOUSE_COORD_TO_ABS(point.y - rect.origin.y, rect.size.h);
|
|
||||||
|
|
||||||
INPUT mouseInput;
|
|
||||||
mouseInput.type = INPUT_MOUSE;
|
|
||||||
mouseInput.mi.dx = x;
|
|
||||||
mouseInput.mi.dy = y;
|
|
||||||
mouseInput.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_VIRTUALDESK;
|
|
||||||
mouseInput.mi.time = 0; // System will provide the timestamp
|
|
||||||
|
|
||||||
mouseInput.mi.dwExtraInfo = 0;
|
|
||||||
mouseInput.mi.mouseData = 0;
|
|
||||||
SendInput(1, &mouseInput, sizeof(mouseInput));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void dragMouse(MMPointInt32 point, const MMMouseButton button){
|
void dragMouse(MMPointInt32 point, const MMMouseButton button){
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
const CGEventType dragType = MMMouseDragToCGEventType(button);
|
const CGEventType dragType = MMMouseDragToCGEventType(button);
|
||||||
CGEventRef drag = CGEventCreateMouseEvent(NULL, dragType,
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
CGEventRef drag = CGEventCreateMouseEvent(source, dragType,
|
||||||
CGPointFromMMPointInt32(point), (CGMouseButton)button);
|
CGPointFromMMPointInt32(point), (CGMouseButton)button);
|
||||||
|
|
||||||
calculateDeltas(&drag, point);
|
calculateDeltas(&drag, point);
|
||||||
|
|
||||||
CGEventPost(kCGSessionEventTap, drag);
|
CGEventPost(kCGHIDEventTap, drag);
|
||||||
CFRelease(drag);
|
CFRelease(drag);
|
||||||
|
CFRelease(source);
|
||||||
#else
|
#else
|
||||||
moveMouse(point);
|
moveMouse(point);
|
||||||
#endif
|
#endif
|
||||||
@ -163,10 +149,12 @@ void toggleMouse(bool down, MMMouseButton button) {
|
|||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
const CGPoint currentPos = CGPointFromMMPointInt32(location());
|
const CGPoint currentPos = CGPointFromMMPointInt32(location());
|
||||||
const CGEventType mouseType = MMMouseToCGEventType(down, button);
|
const CGEventType mouseType = MMMouseToCGEventType(down, button);
|
||||||
CGEventRef event = CGEventCreateMouseEvent(NULL, mouseType, currentPos, (CGMouseButton)button);
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
CGEventRef event = CGEventCreateMouseEvent(source, mouseType, currentPos, (CGMouseButton)button);
|
||||||
|
|
||||||
CGEventPost(kCGSessionEventTap, event);
|
CGEventPost(kCGHIDEventTap, event);
|
||||||
CFRelease(event);
|
CFRelease(event);
|
||||||
|
CFRelease(source);
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
Display *display = XGetMainDisplay();
|
Display *display = XGetMainDisplay();
|
||||||
XTestFakeButtonEvent(display, button, down ? True : False, CurrentTime);
|
XTestFakeButtonEvent(display, button, down ? True : False, CurrentTime);
|
||||||
@ -200,7 +188,8 @@ void doubleClick(MMMouseButton button){
|
|||||||
const CGEventType mouseTypeDown = MMMouseToCGEventType(true, button);
|
const CGEventType mouseTypeDown = MMMouseToCGEventType(true, button);
|
||||||
const CGEventType mouseTypeUP = MMMouseToCGEventType(false, button);
|
const CGEventType mouseTypeUP = MMMouseToCGEventType(false, button);
|
||||||
|
|
||||||
CGEventRef event = CGEventCreateMouseEvent(NULL, mouseTypeDown, currentPos, kCGMouseButtonLeft);
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
|
CGEventRef event = CGEventCreateMouseEvent(source, mouseTypeDown, currentPos, kCGMouseButtonLeft);
|
||||||
|
|
||||||
/* Set event to double click. */
|
/* Set event to double click. */
|
||||||
CGEventSetIntegerValueField(event, kCGMouseEventClickState, 2);
|
CGEventSetIntegerValueField(event, kCGMouseEventClickState, 2);
|
||||||
@ -210,6 +199,7 @@ void doubleClick(MMMouseButton button){
|
|||||||
CGEventPost(kCGHIDEventTap, event);
|
CGEventPost(kCGHIDEventTap, event);
|
||||||
|
|
||||||
CFRelease(event);
|
CFRelease(event);
|
||||||
|
CFRelease(source);
|
||||||
#else
|
#else
|
||||||
/* Double click for everything else. */
|
/* Double click for everything else. */
|
||||||
clickMouse(button);
|
clickMouse(button);
|
||||||
@ -226,14 +216,13 @@ void scrollMouseXY(int x, int y) {
|
|||||||
INPUT mouseScrollInputV;
|
INPUT mouseScrollInputV;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Direction should only be considered based on the scrollDirection. This Should not interfere. */
|
#if defined(IS_MACOSX)
|
||||||
/* Set up the OS specific solution */
|
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
|
||||||
#if defined(__APPLE__)
|
CGEventRef event = CGEventCreateScrollWheelEvent(source, kCGScrollEventUnitPixel, 2, y, x);
|
||||||
CGEventRef event;
|
|
||||||
event = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 2, y, x);
|
|
||||||
CGEventPost(kCGHIDEventTap, event);
|
CGEventPost(kCGHIDEventTap, event);
|
||||||
|
|
||||||
CFRelease(event);
|
CFRelease(event);
|
||||||
|
CFRelease(source);
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
int ydir = 4; /* Button 4 is up, 5 is down. */
|
int ydir = 4; /* Button 4 is up, 5 is down. */
|
||||||
int xdir = 6;
|
int xdir = 6;
|
||||||
|
6
ps.go
6
ps.go
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo
|
package robotgo
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo_test
|
package robotgo_test
|
||||||
|
28
robotgo.go
28
robotgo.go
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -31,10 +31,10 @@ package robotgo
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
#cgo darwin CFLAGS: -x objective-c -Wno-deprecated-declarations
|
#cgo darwin CFLAGS: -x objective-c -Wno-deprecated-declarations
|
||||||
#cgo darwin LDFLAGS: -framework Cocoa -framework OpenGL -framework IOKit
|
#cgo darwin LDFLAGS: -framework Cocoa -framework CoreFoundation -framework IOKit
|
||||||
#cgo darwin LDFLAGS: -framework Carbon -framework CoreFoundation
|
#cgo darwin LDFLAGS: -framework Carbon -framework OpenGL
|
||||||
//
|
//
|
||||||
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > MAC_OS_VERSION_14_4
|
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 140400
|
||||||
#cgo darwin LDFLAGS: -framework ScreenCaptureKit
|
#cgo darwin LDFLAGS: -framework ScreenCaptureKit
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -50,6 +50,7 @@ package robotgo
|
|||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"image"
|
"image"
|
||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
@ -72,7 +73,7 @@ var (
|
|||||||
// MouseSleep set the mouse default millisecond sleep time
|
// MouseSleep set the mouse default millisecond sleep time
|
||||||
MouseSleep = 0
|
MouseSleep = 0
|
||||||
// KeySleep set the key default millisecond sleep time
|
// KeySleep set the key default millisecond sleep time
|
||||||
KeySleep = 0
|
KeySleep = 10
|
||||||
|
|
||||||
// DisplayID set the screen display id
|
// DisplayID set the screen display id
|
||||||
DisplayID = -1
|
DisplayID = -1
|
||||||
@ -365,12 +366,15 @@ func CaptureGo(args ...int) Bitmap {
|
|||||||
return ToBitmap(bit)
|
return ToBitmap(bit)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CaptureImg capture the screen and return image.Image
|
// CaptureImg capture the screen and return image.Image, error
|
||||||
func CaptureImg(args ...int) image.Image {
|
func CaptureImg(args ...int) (image.Image, error) {
|
||||||
bit := CaptureScreen(args...)
|
bit := CaptureScreen(args...)
|
||||||
|
if bit == nil {
|
||||||
|
return nil, errors.New("Capture image not found.")
|
||||||
|
}
|
||||||
defer FreeBitmap(bit)
|
defer FreeBitmap(bit)
|
||||||
|
|
||||||
return ToImage(bit)
|
return ToImage(bit), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FreeBitmap free and dealloc the C bitmap
|
// FreeBitmap free and dealloc the C bitmap
|
||||||
@ -502,7 +506,7 @@ func CheckMouse(btn string) C.MMMouseButton {
|
|||||||
|
|
||||||
// MoveScale calculate the os scale factor x, y
|
// MoveScale calculate the os scale factor x, y
|
||||||
func MoveScale(x, y int, displayId ...int) (int, int) {
|
func MoveScale(x, y int, displayId ...int) (int, int) {
|
||||||
if Scale && runtime.GOOS == "windows" {
|
if Scale || runtime.GOOS == "windows" {
|
||||||
f := ScaleF()
|
f := ScaleF()
|
||||||
x, y = Scaled1(x, f), Scaled1(y, f)
|
x, y = Scaled1(x, f), Scaled1(y, f)
|
||||||
}
|
}
|
||||||
@ -626,7 +630,7 @@ func Location() (int, int) {
|
|||||||
x := int(pos.x)
|
x := int(pos.x)
|
||||||
y := int(pos.y)
|
y := int(pos.y)
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
if Scale || runtime.GOOS == "windows" {
|
||||||
f := ScaleF()
|
f := ScaleF()
|
||||||
x, y = Scaled0(x, f), Scaled0(y, f)
|
x, y = Scaled0(x, f), Scaled0(y, f)
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build darwin
|
//go:build darwin
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build !windows
|
//go:build !windows
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build darwin || windows
|
//go:build darwin || windows
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build ocr
|
//go:build ocr
|
||||||
@ -14,7 +14,7 @@
|
|||||||
package robotgo
|
package robotgo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/otiai10/gosseract"
|
"github.com/otiai10/gosseract/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetText get the image text by tesseract ocr
|
// GetText get the image text by tesseract ocr
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build darwin || windows
|
//go:build darwin || windows
|
||||||
@ -179,7 +179,8 @@ func TestImage(t *testing.T) {
|
|||||||
err := SavePng(img, "robot_test.png")
|
err := SavePng(img, "robot_test.png")
|
||||||
tt.Nil(t, err)
|
tt.Nil(t, err)
|
||||||
|
|
||||||
img1 := CaptureImg(10, 10, 20, 20)
|
img1, err := CaptureImg(10, 10, 20, 20)
|
||||||
|
tt.Nil(t, err)
|
||||||
e := Save(img1, "robot_img.jpeg", 50)
|
e := Save(img1, "robot_img.jpeg", 50)
|
||||||
tt.Nil(t, e)
|
tt.Nil(t, e)
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build windows
|
//go:build windows
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
//go:build !darwin && !windows
|
//go:build !darwin && !windows
|
||||||
|
13
screen.go
13
screen.go
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
package robotgo
|
package robotgo
|
||||||
@ -13,7 +13,8 @@ package robotgo
|
|||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
||||||
|
|
||||||
"github.com/kbinani/screenshot"
|
// "github.com/kbinani/screenshot"
|
||||||
|
"github.com/vcaesar/screenshot"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetDisplayBounds gets the display screen bounds
|
// GetDisplayBounds gets the display screen bounds
|
||||||
@ -30,7 +31,7 @@ func GetDisplayRect(i int) Rect {
|
|||||||
Size{W: w, H: h}}
|
Size{W: w, H: h}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Capture capture the screenshot
|
// Capture capture the screenshot, use the CaptureImg default
|
||||||
func Capture(args ...int) (*image.RGBA, error) {
|
func Capture(args ...int) (*image.RGBA, error) {
|
||||||
displayId := 0
|
displayId := 0
|
||||||
if DisplayID != -1 {
|
if DisplayID != -1 {
|
||||||
@ -53,7 +54,7 @@ func Capture(args ...int) (*image.RGBA, error) {
|
|||||||
|
|
||||||
// SaveCapture capture screen and save the screenshot to image
|
// SaveCapture capture screen and save the screenshot to image
|
||||||
func SaveCapture(path string, args ...int) error {
|
func SaveCapture(path string, args ...int) error {
|
||||||
img, err := Capture(args...)
|
img, err := CaptureImg(args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -3,16 +3,15 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#include "../base/types.h"
|
#include "../base/types.h"
|
||||||
#include "../base/pubs.h"
|
#include "../base/pubs.h"
|
||||||
#include "../base/rgb.h"
|
#include "../base/rgb.h"
|
||||||
#include "screengrab_c.h"
|
#include "screengrab_c.h"
|
||||||
#include "screen_c.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
void padHex(MMRGBHex color, char* hex) {
|
void padHex(MMRGBHex color, char* hex) {
|
||||||
|
@ -4,9 +4,70 @@
|
|||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xresource.h>
|
||||||
// #include "../base/xdisplay_c.h"
|
// #include "../base/xdisplay_c.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
intptr scaleX();
|
||||||
|
|
||||||
|
double sys_scale(int32_t display_id) {
|
||||||
|
#if defined(IS_MACOSX)
|
||||||
|
CGDirectDisplayID displayID = (CGDirectDisplayID) display_id;
|
||||||
|
if (displayID == -1) {
|
||||||
|
displayID = CGMainDisplayID();
|
||||||
|
}
|
||||||
|
|
||||||
|
CGDisplayModeRef modeRef = CGDisplayCopyDisplayMode(displayID);
|
||||||
|
double pixelWidth = CGDisplayModeGetPixelWidth(modeRef);
|
||||||
|
double targetWidth = CGDisplayModeGetWidth(modeRef);
|
||||||
|
|
||||||
|
return pixelWidth / targetWidth;
|
||||||
|
#elif defined(USE_X11)
|
||||||
|
Display *dpy = XOpenDisplay(NULL);
|
||||||
|
|
||||||
|
int scr = 0; /* Screen number */
|
||||||
|
double xres = ((((double) DisplayWidth(dpy, scr)) * 25.4) /
|
||||||
|
((double) DisplayWidthMM(dpy, scr)));
|
||||||
|
|
||||||
|
char *rms = XResourceManagerString(dpy);
|
||||||
|
if (rms) {
|
||||||
|
XrmDatabase db = XrmGetStringDatabase(rms);
|
||||||
|
if (db) {
|
||||||
|
XrmValue value;
|
||||||
|
char *type = NULL;
|
||||||
|
|
||||||
|
if (XrmGetResource(db, "Xft.dpi", "String", &type, &value)) {
|
||||||
|
if (value.addr) {
|
||||||
|
xres = atof(value.addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
XrmDestroyDatabase(db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XCloseDisplay (dpy);
|
||||||
|
|
||||||
|
return xres / 96.0;
|
||||||
|
#elif defined(IS_WINDOWS)
|
||||||
|
double s = scaleX() / 96.0;
|
||||||
|
return s;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
intptr scaleX(){
|
||||||
|
#if defined(IS_MACOSX)
|
||||||
|
return 0;
|
||||||
|
#elif defined(USE_X11)
|
||||||
|
return 0;
|
||||||
|
#elif defined(IS_WINDOWS)
|
||||||
|
// Get desktop dc
|
||||||
|
HDC desktopDc = GetDC(NULL);
|
||||||
|
// Get native resolution
|
||||||
|
intptr horizontalDPI = GetDeviceCaps(desktopDc, LOGPIXELSX);
|
||||||
|
return horizontalDPI;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
MMSizeInt32 getMainDisplaySize(void) {
|
MMSizeInt32 getMainDisplaySize(void) {
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
CGDirectDisplayID displayID = CGMainDisplayID();
|
CGDirectDisplayID displayID = CGMainDisplayID();
|
||||||
|
@ -13,8 +13,9 @@
|
|||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include "screen_c.h"
|
||||||
|
|
||||||
#if defined(IS_MACOSX) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > MAC_OS_VERSION_14_4
|
#if defined(IS_MACOSX) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 140400
|
||||||
static CGImageRef capture15(CGDirectDisplayID id, CGRect diIntersectDisplayLocal, CGColorSpaceRef colorSpace) {
|
static CGImageRef capture15(CGDirectDisplayID id, CGRect diIntersectDisplayLocal, CGColorSpaceRef colorSpace) {
|
||||||
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
||||||
__block CGImageRef image1 = nil;
|
__block CGImageRef image1 = nil;
|
||||||
@ -39,9 +40,12 @@
|
|||||||
|
|
||||||
SCContentFilter* filter = [[SCContentFilter alloc] initWithDisplay:target excludingWindows:@[]];
|
SCContentFilter* filter = [[SCContentFilter alloc] initWithDisplay:target excludingWindows:@[]];
|
||||||
SCStreamConfiguration* config = [[SCStreamConfiguration alloc] init];
|
SCStreamConfiguration* config = [[SCStreamConfiguration alloc] init];
|
||||||
|
config.queueDepth = 5;
|
||||||
config.sourceRect = diIntersectDisplayLocal;
|
config.sourceRect = diIntersectDisplayLocal;
|
||||||
config.width = diIntersectDisplayLocal.size.width;
|
config.width = diIntersectDisplayLocal.size.width * sys_scale(id);
|
||||||
config.height = diIntersectDisplayLocal.size.height;
|
config.height = diIntersectDisplayLocal.size.height * sys_scale(id);
|
||||||
|
config.scalesToFit = false;
|
||||||
|
config.captureResolution = 1;
|
||||||
|
|
||||||
[SCScreenshotManager captureImageWithFilter:filter
|
[SCScreenshotManager captureImageWithFilter:filter
|
||||||
configuration:config
|
configuration:config
|
||||||
@ -72,7 +76,7 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRectInt32 rect, int32_t display_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size;
|
MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size;
|
||||||
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > MAC_OS_VERSION_14_4
|
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 140400
|
||||||
CGColorSpaceRef color = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
|
CGColorSpaceRef color = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
|
||||||
CGImageRef image = capture15(displayID, CGRectMake(o.x, o.y, s.w, s.h), color);
|
CGImageRef image = capture15(displayID, CGRectMake(o.x, o.y, s.w, s.h), color);
|
||||||
CGColorSpaceRelease(color);
|
CGColorSpaceRelease(color);
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#include "alert_c.h"
|
#include "alert_c.h"
|
||||||
@ -55,11 +55,11 @@ uintptr get_handle(){
|
|||||||
|
|
||||||
uintptr b_get_handle() {
|
uintptr b_get_handle() {
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
return (uintptr)mData.CgID;
|
return (uintptr)pub_mData.CgID;
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
return (uintptr)mData.XWin;
|
return (uintptr)pub_mData.XWin;
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
return (uintptr)mData.HWnd;
|
return (uintptr)pub_mData.HWnd;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// #include "../base/os.h"
|
// #include "../base/os.h"
|
||||||
@ -28,7 +28,7 @@ struct _MData{
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _MData MData;
|
typedef struct _MData MData;
|
||||||
MData mData;
|
MData pub_mData;
|
||||||
|
|
||||||
struct _Bounds {
|
struct _Bounds {
|
||||||
int32_t X; // Top left X coordinate
|
int32_t X; // Top left X coordinate
|
||||||
|
103
window/win_sys.h
103
window/win_sys.h
@ -3,75 +3,16 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#if defined(USE_X11)
|
// #if defined(USE_X11)
|
||||||
#include <X11/Xresource.h>
|
// #include <X11/Xresource.h>
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
Bounds get_client(uintptr pid, int8_t isPid);
|
Bounds get_client(uintptr pid, int8_t isPid);
|
||||||
intptr scaleX();
|
|
||||||
|
|
||||||
double sys_scale(int32_t display_id) {
|
|
||||||
#if defined(IS_MACOSX)
|
|
||||||
CGDirectDisplayID displayID = (CGDirectDisplayID) display_id;
|
|
||||||
if (displayID == -1) {
|
|
||||||
displayID = CGMainDisplayID();
|
|
||||||
}
|
|
||||||
|
|
||||||
CGDisplayModeRef modeRef = CGDisplayCopyDisplayMode(displayID);
|
|
||||||
double pixelWidth = CGDisplayModeGetPixelWidth(modeRef);
|
|
||||||
double targetWidth = CGDisplayModeGetWidth(modeRef);
|
|
||||||
|
|
||||||
return pixelWidth / targetWidth;
|
|
||||||
#elif defined(USE_X11)
|
|
||||||
Display *dpy = XOpenDisplay(NULL);
|
|
||||||
|
|
||||||
int scr = 0; /* Screen number */
|
|
||||||
double xres = ((((double) DisplayWidth(dpy, scr)) * 25.4) /
|
|
||||||
((double) DisplayWidthMM(dpy, scr)));
|
|
||||||
|
|
||||||
char *rms = XResourceManagerString(dpy);
|
|
||||||
if (rms) {
|
|
||||||
XrmDatabase db = XrmGetStringDatabase(rms);
|
|
||||||
if (db) {
|
|
||||||
XrmValue value;
|
|
||||||
char *type = NULL;
|
|
||||||
|
|
||||||
if (XrmGetResource(db, "Xft.dpi", "String", &type, &value)) {
|
|
||||||
if (value.addr) {
|
|
||||||
xres = atof(value.addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XrmDestroyDatabase(db);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XCloseDisplay (dpy);
|
|
||||||
|
|
||||||
return xres / 96.0;
|
|
||||||
#elif defined(IS_WINDOWS)
|
|
||||||
double s = scaleX() / 96.0;
|
|
||||||
return s;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
intptr scaleX(){
|
|
||||||
#if defined(IS_MACOSX)
|
|
||||||
return 0;
|
|
||||||
#elif defined(USE_X11)
|
|
||||||
return 0;
|
|
||||||
#elif defined(IS_WINDOWS)
|
|
||||||
// Get desktop dc
|
|
||||||
HDC desktopDc = GetDC(NULL);
|
|
||||||
// Get native resolution
|
|
||||||
intptr horizontalDPI = GetDeviceCaps(desktopDc, LOGPIXELSX);
|
|
||||||
return horizontalDPI;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
Bounds get_bounds(uintptr pid, int8_t isPid){
|
Bounds get_bounds(uintptr pid, int8_t isPid){
|
||||||
// Check if the window is valid
|
// Check if the window is valid
|
||||||
@ -83,33 +24,45 @@ Bounds get_bounds(uintptr pid, int8_t isPid){
|
|||||||
AXValueRef axp = NULL;
|
AXValueRef axp = NULL;
|
||||||
AXValueRef axs = NULL;
|
AXValueRef axs = NULL;
|
||||||
AXUIElementRef AxID = AXUIElementCreateApplication(pid);
|
AXUIElementRef AxID = AXUIElementCreateApplication(pid);
|
||||||
|
AXUIElementRef AxWin = NULL;
|
||||||
|
|
||||||
|
// Get the window from the application
|
||||||
|
if (AXUIElementCopyAttributeValue(AxID, kAXFocusedWindowAttribute, (CFTypeRef *)&AxWin)
|
||||||
|
!= kAXErrorSuccess || AxWin == NULL) {
|
||||||
|
// If no focused window, try to get the main window
|
||||||
|
if (AXUIElementCopyAttributeValue(AxID, kAXMainWindowAttribute, (CFTypeRef *)&AxWin)
|
||||||
|
!= kAXErrorSuccess || AxWin == NULL) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Determine the current point of the window
|
// Determine the current point of the window
|
||||||
if (AXUIElementCopyAttributeValue(AxID, kAXPositionAttribute, (CFTypeRef*) &axp)
|
if (AXUIElementCopyAttributeValue(AxWin, kAXPositionAttribute, (CFTypeRef*) &axp)
|
||||||
!= kAXErrorSuccess || axp == NULL){
|
!= kAXErrorSuccess || axp == NULL) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine the current size of the window
|
// Determine the current size of the window
|
||||||
if (AXUIElementCopyAttributeValue(AxID, kAXSizeAttribute, (CFTypeRef*) &axs)
|
if (AXUIElementCopyAttributeValue(AxWin, kAXSizeAttribute, (CFTypeRef*) &axs)
|
||||||
!= kAXErrorSuccess || axs == NULL){
|
!= kAXErrorSuccess || axs == NULL) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGPoint p; CGSize s;
|
CGPoint p; CGSize s;
|
||||||
// Attempt to convert both values into atomic types
|
// Attempt to convert both values into atomic types
|
||||||
if (AXValueGetValue(axp, kAXValueCGPointType, &p) &&
|
if (AXValueGetValue(axp, kAXValueCGPointType, &p) &&
|
||||||
AXValueGetValue(axs, kAXValueCGSizeType, &s)){
|
AXValueGetValue(axs, kAXValueCGSizeType, &s)) {
|
||||||
bounds.X = p.x;
|
bounds.X = p.x;
|
||||||
bounds.Y = p.y;
|
bounds.Y = p.y;
|
||||||
bounds.W = s.width;
|
bounds.W = s.width;
|
||||||
bounds.H = s.height;
|
bounds.H = s.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return bounds;
|
|
||||||
exit:
|
exit:
|
||||||
if (axp != NULL) { CFRelease(axp); }
|
if (axp != NULL) { CFRelease(axp); }
|
||||||
if (axs != NULL) { CFRelease(axs); }
|
if (axs != NULL) { CFRelease(axs); }
|
||||||
|
if (AxWin != NULL) { CFRelease(AxWin); }
|
||||||
|
if (AxID != NULL) { CFRelease(AxID); }
|
||||||
|
|
||||||
return bounds;
|
return bounds;
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
@ -185,7 +138,7 @@ Bounds get_client(uintptr pid, int8_t isPid) {
|
|||||||
bounds.W = attr.width;
|
bounds.W = attr.width;
|
||||||
bounds.H = attr.height;
|
bounds.H = attr.height;
|
||||||
XCloseDisplay(rDisplay);
|
XCloseDisplay(rDisplay);
|
||||||
|
|
||||||
return bounds;
|
return bounds;
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
HWND hwnd = getHwnd(pid, isPid);
|
HWND hwnd = getHwnd(pid, isPid);
|
||||||
@ -207,4 +160,4 @@ Bounds get_client(uintptr pid, int8_t isPid) {
|
|||||||
|
|
||||||
return bounds;
|
return bounds;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
// https://github.com/go-vgo/robotgo/blob/master/LICENSE
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
// http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
//
|
||||||
// option. This file may not be copied, modified, or distributed
|
// This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#include "pub.h"
|
#include "pub.h"
|
||||||
@ -24,8 +24,8 @@ uintptr initHandle = 0;
|
|||||||
|
|
||||||
void initWindow(uintptr handle){
|
void initWindow(uintptr handle){
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
mData.CgID = 0;
|
pub_mData.CgID = 0;
|
||||||
mData.AxID = 0;
|
pub_mData.AxID = 0;
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
Display *rDisplay = XOpenDisplay(NULL);
|
Display *rDisplay = XOpenDisplay(NULL);
|
||||||
// If atoms loaded
|
// If atoms loaded
|
||||||
@ -34,10 +34,10 @@ void initWindow(uintptr handle){
|
|||||||
if (rDisplay != NULL) {LoadAtoms();}
|
if (rDisplay != NULL) {LoadAtoms();}
|
||||||
}
|
}
|
||||||
|
|
||||||
mData.XWin = 0;
|
pub_mData.XWin = 0;
|
||||||
XCloseDisplay(rDisplay);
|
XCloseDisplay(rDisplay);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
mData.HWnd = 0;
|
pub_mData.HWnd = 0;
|
||||||
#endif
|
#endif
|
||||||
setHandle(handle);
|
setHandle(handle);
|
||||||
}
|
}
|
||||||
@ -67,33 +67,33 @@ MData set_handle_pid(uintptr pid, int8_t isPid){
|
|||||||
|
|
||||||
void set_handle_pid_mData(uintptr pid, int8_t isPid){
|
void set_handle_pid_mData(uintptr pid, int8_t isPid){
|
||||||
MData win = set_handle_pid(pid, isPid);
|
MData win = set_handle_pid(pid, isPid);
|
||||||
mData = win;
|
pub_mData = win;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_valid() {
|
bool is_valid() {
|
||||||
initWindow(initHandle);
|
initWindow(initHandle);
|
||||||
if (!IsAxEnabled(true)) {
|
if (!IsAxEnabled(true)) {
|
||||||
printf("%s\n", "Window: Accessibility API is disabled!\n"
|
printf("%s\n", "Window: Accessibility API is disabled! "
|
||||||
"Failed to enable access for assistive devices.");
|
"Failed to enable access for assistive devices. \n");
|
||||||
}
|
}
|
||||||
MData actdata = get_active();
|
MData actdata = get_active();
|
||||||
|
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
mData.CgID = actdata.CgID;
|
pub_mData.CgID = actdata.CgID;
|
||||||
mData.AxID = actdata.AxID;
|
pub_mData.AxID = actdata.AxID;
|
||||||
if (mData.CgID == 0 || mData.AxID == 0) { return false; }
|
if (pub_mData.CgID == 0 || pub_mData.AxID == 0) { return false; }
|
||||||
|
|
||||||
CFTypeRef r = NULL;
|
CFTypeRef r = NULL;
|
||||||
// Attempt to get the window role
|
// Attempt to get the window role
|
||||||
if (AXUIElementCopyAttributeValue(mData.AxID, kAXRoleAttribute, &r) == kAXErrorSuccess && r){
|
if (AXUIElementCopyAttributeValue(pub_mData.AxID, kAXRoleAttribute, &r) == kAXErrorSuccess && r){
|
||||||
CFRelease(r);
|
CFRelease(r);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
mData.XWin = actdata.XWin;
|
pub_mData.XWin = actdata.XWin;
|
||||||
if (mData.XWin == 0) { return false; }
|
if (pub_mData.XWin == 0) { return false; }
|
||||||
|
|
||||||
Display *rDisplay = XOpenDisplay(NULL);
|
Display *rDisplay = XOpenDisplay(NULL);
|
||||||
// Check for a valid X-Window display
|
// Check for a valid X-Window display
|
||||||
@ -103,7 +103,7 @@ bool is_valid() {
|
|||||||
XDismissErrors();
|
XDismissErrors();
|
||||||
|
|
||||||
// Get the window PID property
|
// Get the window PID property
|
||||||
void* result = GetWindowProperty(mData, WM_PID,NULL);
|
void* result = GetWindowProperty(pub_mData, WM_PID,NULL);
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
XCloseDisplay(rDisplay);
|
XCloseDisplay(rDisplay);
|
||||||
return false;
|
return false;
|
||||||
@ -115,12 +115,12 @@ bool is_valid() {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
mData.HWnd = actdata.HWnd;
|
pub_mData.HWnd = actdata.HWnd;
|
||||||
if (mData.HWnd == 0) {
|
if (pub_mData.HWnd == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return IsWindow(mData.HWnd) != 0;
|
return IsWindow(pub_mData.HWnd) != 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,13 +175,13 @@ bool IsAxEnabled(bool options){
|
|||||||
bool setHandle(uintptr handle){
|
bool setHandle(uintptr handle){
|
||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
// Release the AX element
|
// Release the AX element
|
||||||
if (mData.AxID != NULL) {
|
if (pub_mData.AxID != NULL) {
|
||||||
CFRelease(mData.AxID);
|
CFRelease(pub_mData.AxID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset both values
|
// Reset both values
|
||||||
mData.CgID = 0;
|
pub_mData.CgID = 0;
|
||||||
mData.AxID = 0;
|
pub_mData.AxID = 0;
|
||||||
|
|
||||||
if (handle == 0) {
|
if (handle == 0) {
|
||||||
// return 0;
|
// return 0;
|
||||||
@ -192,8 +192,8 @@ bool setHandle(uintptr handle){
|
|||||||
CGWindowID cgID = (CGWindowID)handle;
|
CGWindowID cgID = (CGWindowID)handle;
|
||||||
AXUIElementRef axID = GetUIElement(cgID);
|
AXUIElementRef axID = GetUIElement(cgID);
|
||||||
if (axID != NULL){
|
if (axID != NULL){
|
||||||
mData.CgID = cgID;
|
pub_mData.CgID = cgID;
|
||||||
mData.AxID = axID;
|
pub_mData.AxID = axID;
|
||||||
// return 0;
|
// return 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -201,7 +201,7 @@ bool setHandle(uintptr handle){
|
|||||||
// return 1;
|
// return 1;
|
||||||
return false;
|
return false;
|
||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
mData.XWin = (Window)handle;
|
pub_mData.XWin = (Window)handle;
|
||||||
if (handle == 0) {
|
if (handle == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -210,10 +210,10 @@ bool setHandle(uintptr handle){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
mData.XWin = 0;
|
pub_mData.XWin = 0;
|
||||||
return false;
|
return false;
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
mData.HWnd = (HWND)handle;
|
pub_mData.HWnd = (HWND)handle;
|
||||||
if (handle == 0) {
|
if (handle == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -222,7 +222,7 @@ bool setHandle(uintptr handle){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
mData.HWnd = 0;
|
pub_mData.HWnd = 0;
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -237,7 +237,7 @@ bool IsTopMost(void){
|
|||||||
// XDismissErrors ();
|
// XDismissErrors ();
|
||||||
// return GetState (mData.XWin, STATE_TOPMOST);
|
// return GetState (mData.XWin, STATE_TOPMOST);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
return (GetWindowLongPtr(mData.HWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0;
|
return (GetWindowLongPtr(pub_mData.HWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ bool IsMinimized(void){
|
|||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
CFBooleanRef data = NULL;
|
CFBooleanRef data = NULL;
|
||||||
// Determine whether the window is minimized
|
// Determine whether the window is minimized
|
||||||
if (AXUIElementCopyAttributeValue(mData.AxID, kAXMinimizedAttribute,
|
if (AXUIElementCopyAttributeValue(pub_mData.AxID, kAXMinimizedAttribute,
|
||||||
(CFTypeRef*) &data) == kAXErrorSuccess && data != NULL) {
|
(CFTypeRef*) &data) == kAXErrorSuccess && data != NULL) {
|
||||||
// Convert resulting data into a bool
|
// Convert resulting data into a bool
|
||||||
bool result = CFBooleanGetValue(data);
|
bool result = CFBooleanGetValue(data);
|
||||||
@ -261,7 +261,7 @@ bool IsMinimized(void){
|
|||||||
// XDismissErrors();
|
// XDismissErrors();
|
||||||
// return GetState(mData.XWin, STATE_MINIMIZE);
|
// return GetState(mData.XWin, STATE_MINIMIZE);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
return (GetWindowLongPtr(mData.HWnd, GWL_STYLE) & WS_MINIMIZE) != 0;
|
return (GetWindowLongPtr(pub_mData.HWnd, GWL_STYLE) & WS_MINIMIZE) != 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,7 +276,7 @@ bool IsMaximized(void){
|
|||||||
// XDismissErrors();
|
// XDismissErrors();
|
||||||
// return GetState(mData.XWin, STATE_MAXIMIZE);
|
// return GetState(mData.XWin, STATE_MAXIMIZE);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
return (GetWindowLongPtr(mData.HWnd, GWL_STYLE) & WS_MAXIMIZE) != 0;
|
return (GetWindowLongPtr(pub_mData.HWnd, GWL_STYLE) & WS_MAXIMIZE) != 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -453,9 +453,9 @@ void SetTopMost(bool state){
|
|||||||
#elif defined(USE_X11)
|
#elif defined(USE_X11)
|
||||||
// Ignore X errors
|
// Ignore X errors
|
||||||
// XDismissErrors();
|
// XDismissErrors();
|
||||||
// SetState(mData.XWin, STATE_TOPMOST, state);
|
// SetState(pub_mData.XWin, STATE_TOPMOST, state);
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
SetWindowPos(mData.HWnd, state ? HWND_TOPMOST : HWND_NOTOPMOST,
|
SetWindowPos(pub_mData.HWnd, state ? HWND_TOPMOST : HWND_NOTOPMOST,
|
||||||
0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -464,7 +464,7 @@ void close_main_window () {
|
|||||||
// Check if the window is valid
|
// Check if the window is valid
|
||||||
if (!is_valid()) { return; }
|
if (!is_valid()) { return; }
|
||||||
|
|
||||||
close_window_by_Id(mData);
|
close_window_by_Id(pub_mData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void close_window_by_PId(uintptr pid, int8_t isPid){
|
void close_window_by_PId(uintptr pid, int8_t isPid){
|
||||||
@ -502,7 +502,7 @@ char* get_main_title(){
|
|||||||
// Check if the window is valid
|
// Check if the window is valid
|
||||||
if (!is_valid()) { return "is_valid failed."; }
|
if (!is_valid()) { return "is_valid failed."; }
|
||||||
|
|
||||||
return get_title_by_hand(mData);
|
return get_title_by_hand(pub_mData);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* get_title_by_pid(uintptr pid, int8_t isPid){
|
char* get_title_by_pid(uintptr pid, int8_t isPid){
|
||||||
@ -591,7 +591,7 @@ int32_t get_PID(void) {
|
|||||||
#if defined(IS_MACOSX)
|
#if defined(IS_MACOSX)
|
||||||
pid_t pid = 0;
|
pid_t pid = 0;
|
||||||
// Attempt to retrieve the window pid
|
// Attempt to retrieve the window pid
|
||||||
if (AXUIElementGetPid(mData.AxID, &pid)== kAXErrorSuccess) {
|
if (AXUIElementGetPid(pub_mData.AxID, &pid)== kAXErrorSuccess) {
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -600,7 +600,7 @@ int32_t get_PID(void) {
|
|||||||
XDismissErrors();
|
XDismissErrors();
|
||||||
|
|
||||||
// Get the window PID
|
// Get the window PID
|
||||||
long* result = (long*)GetWindowProperty(mData, WM_PID,NULL);
|
long* result = (long*)GetWindowProperty(pub_mData, WM_PID,NULL);
|
||||||
// Check result and convert it
|
// Check result and convert it
|
||||||
if (result == NULL) { return 0; }
|
if (result == NULL) { return 0; }
|
||||||
|
|
||||||
@ -609,7 +609,7 @@ int32_t get_PID(void) {
|
|||||||
return pid;
|
return pid;
|
||||||
#elif defined(IS_WINDOWS)
|
#elif defined(IS_WINDOWS)
|
||||||
DWORD id = 0;
|
DWORD id = 0;
|
||||||
GetWindowThreadProcessId(mData.HWnd, &id);
|
GetWindowThreadProcessId(pub_mData.HWnd, &id);
|
||||||
return id;
|
return id;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user