From a8eeb4b63a46f15df107f31a187b6a3379d187ff Mon Sep 17 00:00:00 2001 From: Jaroslav Jacjuk Date: Thu, 29 Aug 2024 20:23:17 +0200 Subject: [PATCH 1/6] Modified RobotGo to avoid github.com/kbinani/screenshot with deprecated CGDisplayCreateImageForRect on macOS 15 --- go.mod | 11 +++++----- go.sum | 22 +++++++++----------- screen.go | 62 ------------------------------------------------------- 3 files changed, 15 insertions(+), 80 deletions(-) delete mode 100644 screen.go diff --git a/go.mod b/go.mod index 1b14579..0ce13a8 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/go-vgo/robotgo go 1.17 require ( - github.com/otiai10/gosseract/v2 v2.4.1 // github.com/robotn/gohook v0.31.3 github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 @@ -14,14 +13,13 @@ require ( github.com/vcaesar/tt v0.20.1 ) +require github.com/otiai10/gosseract v2.2.1+incompatible + require ( github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 // indirect - github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/jezek/xgb v1.1.0 // indirect - github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect - github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect + github.com/otiai10/mint v1.6.3 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/shirou/gopsutil/v4 v4.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect @@ -29,7 +27,8 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/image v0.18.0 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.23.0 // indirect ) // replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190109145017-48ac38b7c8cb diff --git a/go.sum b/go.sum index 5edcf14..357a8ad 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,6 @@ 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/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 h1:FBMro26TLQwBk+n4fbTSmSf3QUKb09pvW4fz49lxpl0= github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34/go.mod h1:6NCrWM5jRefaG7iN0iMShPalLsljHWBh9v1zxM2f8Xs= -github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 h1:VLEKvjGJYAMCXw0/32r9io61tEXnMWDRxMk+peyRVFc= -github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo= 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -15,17 +13,11 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= -github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= -github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 h1:YOp8St+CM/AQ9Vp4XYm4272E77MptJDHkwypQHIRl9Q= -github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237/go.mod h1:e7qQlOY68wOz4b82D7n+DdaptZAi+SHW0+yKiWZzEYE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -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/otiai10/gosseract/v2 v2.4.1 h1:G8AyBpXEeSlcq8TI85LH/pM5SXk8Djy2GEXisgyblRw= -github.com/otiai10/gosseract/v2 v2.4.1/go.mod h1:1gNWP4Hgr2o7yqWfs6r5bZxAatjOIdqWxJLWsTsembk= +github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= +github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -75,6 +67,7 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20230127140709-cafedaf64729 h1:H2kBA039yqxDv2DScpuC0knhZXO6Evfmt7mN8sGMh/4= golang.org/x/exp v0.0.0-20230127140709-cafedaf64729/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= @@ -96,15 +89,17 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -117,8 +112,9 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -129,6 +125,7 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -139,6 +136,7 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/screen.go b/screen.go deleted file mode 100644 index 9f8b28a..0000000 --- a/screen.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// https://github.com/go-vgo/robotgo/blob/master/LICENSE -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -package robotgo - -import ( - "image" - - "github.com/kbinani/screenshot" -) - -// GetDisplayBounds gets the display screen bounds -func GetDisplayBounds(i int) (x, y, w, h int) { - bs := screenshot.GetDisplayBounds(i) - return bs.Min.X, bs.Min.Y, bs.Dx(), bs.Dy() -} - -// GetDisplayRect gets the display rect -func GetDisplayRect(i int) Rect { - x, y, w, h := GetDisplayBounds(i) - return Rect{ - Point{X: x, Y: y}, - Size{W: w, H: h}} -} - -// Capture capture the screenshot -func Capture(args ...int) (*image.RGBA, error) { - displayId := 0 - if DisplayID != -1 { - displayId = DisplayID - } - - if len(args) > 4 { - displayId = args[4] - } - - var x, y, w, h int - if len(args) > 3 { - x, y, w, h = args[0], args[1], args[2], args[3] - } else { - x, y, w, h = GetDisplayBounds(displayId) - } - - return screenshot.Capture(x, y, w, h) -} - -// SaveCapture capture screen and save the screenshot to image -func SaveCapture(path string, args ...int) error { - img, err := Capture(args...) - if err != nil { - return err - } - - return Save(img, path) -} From cbdb19a69bc3f01e7d937d5ae1080c7fbbd1ed93 Mon Sep 17 00:00:00 2001 From: Jaroslav Jacjuk Date: Thu, 29 Aug 2024 21:09:19 +0200 Subject: [PATCH 2/6] Modified RobotGo to avoid github.com/kbinani/screenshot with deprecated CGDisplayCreateImageForRect macOS15 --- go.mod | 8 +++++--- go.sum | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0ce13a8..a802086 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,11 @@ -module github.com/go-vgo/robotgo +module github.com/yarda7/robotgo go 1.17 +require github.com/go-vgo/robotgo v0.110.2 + +replace github.com/go-vgo/robotgo => github.com/yarda7/robotgo v0.110.3 + require ( // github.com/robotn/gohook v0.31.3 github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 @@ -19,7 +23,6 @@ require ( github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect - github.com/otiai10/mint v1.6.3 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/shirou/gopsutil/v4 v4.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect @@ -27,7 +30,6 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/image v0.18.0 // indirect - golang.org/x/net v0.28.0 // indirect golang.org/x/sys v0.23.0 // indirect ) diff --git a/go.sum b/go.sum index 357a8ad..5394647 100644 --- a/go.sum +++ b/go.sum @@ -58,6 +58,8 @@ github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUH github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= 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/yarda7/robotgo v0.110.3 h1:u1LaxnTx4BTw5STpU3vf05np0dTWPhK7C38jv30Y+IA= +github.com/yarda7/robotgo v0.110.3/go.mod h1:B6zSZD7WXZXbo7TIwkGYLDwHyQrrsZr3J0kHmtjwZyw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= From a299ce776dd54d89514f7de3d3e910692ec712f1 Mon Sep 17 00:00:00 2001 From: Jaroslav Jacjuk Date: Thu, 29 Aug 2024 21:16:01 +0200 Subject: [PATCH 3/6] fix --- go.mod | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a802086..4571702 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,7 @@ module github.com/yarda7/robotgo go 1.17 -require github.com/go-vgo/robotgo v0.110.2 - -replace github.com/go-vgo/robotgo => github.com/yarda7/robotgo v0.110.3 +require github.com/yarda7/robotgo v0.110.4 require ( // github.com/robotn/gohook v0.31.3 @@ -35,4 +33,3 @@ require ( // replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190109145017-48ac38b7c8cb -// go 1.13 From 0ff21b8cab15b23676aa7c772dcbba563dd77730 Mon Sep 17 00:00:00 2001 From: Jaroslav Jacjuk Date: Thu, 29 Aug 2024 21:22:07 +0200 Subject: [PATCH 4/6] Modified RobotGo to avoid github.com/kbinani/screenshot with deprecated CGDisplayCreateImageForRect macOS15 --- go.mod | 14 +++-- go.sum | 14 ++++- screen/goScreen.h | 121 ------------------------------------- screen/screen.go | 1 - screen/screen_c.h | 73 ----------------------- screen/screengrab_c.h | 135 ------------------------------------------ 6 files changed, 22 insertions(+), 336 deletions(-) delete mode 100644 screen/goScreen.h delete mode 100644 screen/screen.go delete mode 100644 screen/screen_c.h delete mode 100644 screen/screengrab_c.h diff --git a/go.mod b/go.mod index 4571702..abe2364 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/yarda7/robotgo go 1.17 -require github.com/yarda7/robotgo v0.110.4 - require ( // github.com/robotn/gohook v0.31.3 github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 @@ -15,12 +13,20 @@ require ( github.com/vcaesar/tt v0.20.1 ) -require github.com/otiai10/gosseract v2.2.1+incompatible +require ( + github.com/go-vgo/robotgo v0.110.2 + github.com/otiai10/gosseract v2.2.1+incompatible +) require ( github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 // indirect + github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 // indirect github.com/go-ole/go-ole v1.3.0 // indirect + github.com/jezek/xgb v1.1.0 // indirect + github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 // indirect github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect + github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect + github.com/otiai10/mint v1.6.3 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/shirou/gopsutil/v4 v4.24.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect @@ -28,8 +34,8 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/image v0.18.0 // indirect + golang.org/x/net v0.28.0 // indirect golang.org/x/sys v0.23.0 // indirect ) // replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190109145017-48ac38b7c8cb - diff --git a/go.sum b/go.sum index 5394647..c2d4c6c 100644 --- a/go.sum +++ b/go.sum @@ -5,19 +5,30 @@ 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/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 h1:FBMro26TLQwBk+n4fbTSmSf3QUKb09pvW4fz49lxpl0= github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34/go.mod h1:6NCrWM5jRefaG7iN0iMShPalLsljHWBh9v1zxM2f8Xs= +github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 h1:VLEKvjGJYAMCXw0/32r9io61tEXnMWDRxMk+peyRVFc= +github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo= 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-vgo/robotgo v0.110.2 h1:7uCrK5DSztrtwM1T6LAp6b6gVhl+XUD8Tpwzoy1SclU= +github.com/go-vgo/robotgo v0.110.2/go.mod h1:ERKRRTIWCsypcrxWrUt/0ZXl5nVsUQkutYARvW22q98= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= +github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= +github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 h1:YOp8St+CM/AQ9Vp4XYm4272E77MptJDHkwypQHIRl9Q= +github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237/go.mod h1:e7qQlOY68wOz4b82D7n+DdaptZAi+SHW0+yKiWZzEYE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +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/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= +github.com/otiai10/gosseract/v2 v2.4.1/go.mod h1:1gNWP4Hgr2o7yqWfs6r5bZxAatjOIdqWxJLWsTsembk= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -58,8 +69,6 @@ github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUH github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= 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/yarda7/robotgo v0.110.3 h1:u1LaxnTx4BTw5STpU3vf05np0dTWPhK7C38jv30Y+IA= -github.com/yarda7/robotgo v0.110.3/go.mod h1:B6zSZD7WXZXbo7TIwkGYLDwHyQrrsZr3J0kHmtjwZyw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -102,6 +111,7 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/screen/goScreen.h b/screen/goScreen.h deleted file mode 100644 index 24321bf..0000000 --- a/screen/goScreen.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// https://github.com/go-vgo/robotgo/blob/master/LICENSE -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#include "../base/types.h" -#include "../base/pubs.h" -#include "../base/rgb.h" -#include "screengrab_c.h" -#include "screen_c.h" -#include - -void padHex(MMRGBHex color, char* hex) { - // Length needs to be 7 because snprintf includes a terminating null. - snprintf(hex, 7, "%06x", color); -} - -char* pad_hex(MMRGBHex color) { - char hex[7]; - padHex(color, hex); - // destroyMMBitmap(bitmap); - - char* str = (char*)calloc(100, sizeof(char*)); - if (str) { strcpy(str, hex); } - return str; -} - -static uint8_t rgb[3]; - -uint8_t* color_hex_to_rgb(uint32_t h) { - rgb[0] = RED_FROM_HEX(h); - rgb[1] = GREEN_FROM_HEX(h); - rgb[2] = BLUE_FROM_HEX(h); - return rgb; -} - -uint32_t color_rgb_to_hex(uint8_t r, uint8_t g, uint8_t b) { - return RGB_TO_HEX(r, g, b); -} - -MMRGBHex get_px_color(int32_t x, int32_t y, int32_t display_id) { - MMBitmapRef bitmap; - MMRGBHex color; - - if (!pointVisibleOnMainDisplay(MMPointInt32Make(x, y))) { - return color; - } - - bitmap = copyMMBitmapFromDisplayInRect(MMRectInt32Make(x, y, 1, 1), display_id, 0); - color = MMRGBHexAtPoint(bitmap, 0, 0); - destroyMMBitmap(bitmap); - - return color; -} - -char* set_XDisplay_name(char* name) { - #if defined(USE_X11) - setXDisplay(name); - return ""; - #else - return "SetXDisplayName is only supported on Linux"; - #endif -} - -char* get_XDisplay_name() { - #if defined(USE_X11) - const char* display = getXDisplay(); - - char* sd = (char*)calloc(100, sizeof(char*)); - if (sd) { strcpy(sd, display); } - return sd; - #else - return "GetXDisplayName is only supported on Linux"; - #endif -} - -uint32_t get_num_displays() { - #if defined(IS_MACOSX) - uint32_t count = 0; - if (CGGetActiveDisplayList(0, nil, &count) == kCGErrorSuccess) { - return count; - } - return 0; - #elif defined(USE_X11) - return 0; - #elif defined(IS_WINDOWS) - uint32_t count = 0; - if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&count)) { - return count; - } - return 0; - #endif -} - -uintptr get_hwnd_by_pid(uintptr pid) { - #if defined(IS_WINDOWS) - HWND hwnd = GetHwndByPid(pid); - return (uintptr)hwnd; - #else - return 0; - #endif -} - -void bitmap_dealloc(MMBitmapRef bitmap) { - if (bitmap != NULL) { - destroyMMBitmap(bitmap); - bitmap = NULL; - } -} - -// capture_screen capture screen -MMBitmapRef capture_screen(int32_t x, int32_t y, int32_t w, int32_t h, int32_t display_id, int8_t isPid) { - MMBitmapRef bitmap = copyMMBitmapFromDisplayInRect(MMRectInt32Make(x, y, w, h), display_id, isPid); - return bitmap; -} - diff --git a/screen/screen.go b/screen/screen.go deleted file mode 100644 index 7424d9d..0000000 --- a/screen/screen.go +++ /dev/null @@ -1 +0,0 @@ -package screen diff --git a/screen/screen_c.h b/screen/screen_c.h deleted file mode 100644 index 88dcd83..0000000 --- a/screen/screen_c.h +++ /dev/null @@ -1,73 +0,0 @@ -//#include "../base/os.h" - -#if defined(IS_MACOSX) - #include -#elif defined(USE_X11) - #include - // #include "../base/xdisplay_c.h" -#endif - -MMSizeInt32 getMainDisplaySize(void) { -#if defined(IS_MACOSX) - CGDirectDisplayID displayID = CGMainDisplayID(); - CGRect displayRect = CGDisplayBounds(displayID); - - CGSize size = displayRect.size; - return MMSizeInt32Make((int32_t)size.width, (int32_t)size.height); -#elif defined(USE_X11) - Display *display = XGetMainDisplay(); - const int screen = DefaultScreen(display); - - return MMSizeInt32Make( - (int32_t)DisplayWidth(display, screen), - (int32_t)DisplayHeight(display, screen)); -#elif defined(IS_WINDOWS) - return MMSizeInt32Make( - (int32_t)GetSystemMetrics(SM_CXSCREEN), - (int32_t)GetSystemMetrics(SM_CYSCREEN)); -#endif -} - -MMRectInt32 getScreenRect(int32_t display_id) { -#if defined(IS_MACOSX) - CGDirectDisplayID displayID = (CGDirectDisplayID) display_id; - if (display_id == -1) { - displayID = CGMainDisplayID(); - } - CGRect displayRect = CGDisplayBounds(displayID); - - CGPoint point = displayRect.origin; - CGSize size = displayRect.size; - return MMRectInt32Make( - (int32_t)point.x, (int32_t)point.y, - (int32_t)size.width, (int32_t)size.height); -#elif defined(USE_X11) - Display *display = XGetMainDisplay(); - const int screen = DefaultScreen(display); - - return MMRectInt32Make( - (int32_t)0, (int32_t)0, - (int32_t)DisplayWidth(display, screen), - (int32_t)DisplayHeight(display, screen)); -#elif defined(IS_WINDOWS) - if (GetSystemMetrics(SM_CMONITORS) == 1 - || display_id == -1 || display_id == 0) { - return MMRectInt32Make( - (int32_t)0, - (int32_t)0, - (int32_t)GetSystemMetrics(SM_CXSCREEN), - (int32_t)GetSystemMetrics(SM_CYSCREEN)); - } else { - return MMRectInt32Make( - (int32_t)GetSystemMetrics(SM_XVIRTUALSCREEN), - (int32_t)GetSystemMetrics(SM_YVIRTUALSCREEN), - (int32_t)GetSystemMetrics(SM_CXVIRTUALSCREEN), - (int32_t)GetSystemMetrics(SM_CYVIRTUALSCREEN)); - } -#endif -} - -bool pointVisibleOnMainDisplay(MMPointInt32 point){ - MMSizeInt32 displaySize = getMainDisplaySize(); - return point.x < displaySize.w && point.y < displaySize.h; -} diff --git a/screen/screengrab_c.h b/screen/screengrab_c.h deleted file mode 100644 index 9af7302..0000000 --- a/screen/screengrab_c.h +++ /dev/null @@ -1,135 +0,0 @@ -#include "../base/bitmap_free_c.h" -#include /* malloc() */ - -#if defined(IS_MACOSX) - #include - #include - #include -#elif defined(USE_X11) - #include - #include - #include "../base/xdisplay_c.h" -#elif defined(IS_WINDOWS) - #include -#endif - -MMBitmapRef copyMMBitmapFromDisplayInRect(MMRectInt32 rect, int32_t display_id, int8_t isPid) { -#if defined(IS_MACOSX) - MMBitmapRef bitmap = NULL; - uint8_t *buffer = NULL; - size_t bufferSize = 0; - - CGDirectDisplayID displayID = (CGDirectDisplayID) display_id; - if (displayID == -1 || displayID == 0) { - displayID = CGMainDisplayID(); - } - - MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size; - CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(o.x, o.y, s.w, s.h)); - if (!image) { return NULL; } - - CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image)); - if (!imageData) { return NULL; } - - bufferSize = CFDataGetLength(imageData); - buffer = malloc(bufferSize); - CFDataGetBytes(imageData, CFRangeMake(0, bufferSize), buffer); - - bitmap = createMMBitmap_c(buffer, - CGImageGetWidth(image), CGImageGetHeight(image), CGImageGetBytesPerRow(image), - CGImageGetBitsPerPixel(image), CGImageGetBitsPerPixel(image) / 8); - - CFRelease(imageData); - CGImageRelease(image); - - return bitmap; -#elif defined(USE_X11) - MMBitmapRef bitmap; - Display *display; - if (display_id == -1) { - display = XOpenDisplay(NULL); - } else { - display = XGetMainDisplay(); - } - - MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size; - XImage *image = XGetImage(display, XDefaultRootWindow(display), - (int)o.x, (int)o.y, (unsigned int)s.w, (unsigned int)s.h, - AllPlanes, ZPixmap); - XCloseDisplay(display); - if (image == NULL) { return NULL; } - - bitmap = createMMBitmap_c((uint8_t *)image->data, - s.w, s.h, (size_t)image->bytes_per_line, - (uint8_t)image->bits_per_pixel, (uint8_t)image->bits_per_pixel / 8); - image->data = NULL; /* Steal ownership of bitmap data so we don't have to copy it. */ - XDestroyImage(image); - - return bitmap; -#elif defined(IS_WINDOWS) - MMBitmapRef bitmap; - void *data; - HDC screen = NULL, screenMem = NULL; - HBITMAP dib; - BITMAPINFO bi; - - int32_t x = rect.origin.x, y = rect.origin.y; - int32_t w = rect.size.w, h = rect.size.h; - - /* Initialize bitmap info. */ - bi.bmiHeader.biSize = sizeof(bi.bmiHeader); - bi.bmiHeader.biWidth = (long) w; - bi.bmiHeader.biHeight = -(long) h; /* Non-cartesian, please */ - bi.bmiHeader.biPlanes = 1; - bi.bmiHeader.biBitCount = 32; - bi.bmiHeader.biCompression = BI_RGB; - bi.bmiHeader.biSizeImage = (DWORD)(4 * w * h); - bi.bmiHeader.biXPelsPerMeter = 0; - bi.bmiHeader.biYPelsPerMeter = 0; - bi.bmiHeader.biClrUsed = 0; - bi.bmiHeader.biClrImportant = 0; - - HWND hwnd; - if (display_id == -1 || isPid == 0) { - // screen = GetDC(NULL); /* Get entire screen */ - hwnd = GetDesktopWindow(); - } else { - hwnd = (HWND) (uintptr) display_id; - } - screen = GetDC(hwnd); - - if (screen == NULL) { return NULL; } - - // Todo: Use DXGI - screenMem = CreateCompatibleDC(screen); - /* Get screen data in display device context. */ - dib = CreateDIBSection(screen, &bi, DIB_RGB_COLORS, &data, NULL, 0); - - /* Copy the data into a bitmap struct. */ - BOOL b = (screenMem == NULL) || - SelectObject(screenMem, dib) == NULL || - !BitBlt(screenMem, (int)0, (int)0, (int)w, (int)h, screen, x, y, SRCCOPY); - if (b) { - /* Error copying data. */ - ReleaseDC(hwnd, screen); - DeleteObject(dib); - if (screenMem != NULL) { DeleteDC(screenMem); } - - return NULL; - } - - bitmap = createMMBitmap_c(NULL, w, h, 4 * w, (uint8_t)bi.bmiHeader.biBitCount, 4); - - /* Copy the data to our pixel buffer. */ - if (bitmap != NULL) { - bitmap->imageBuffer = malloc(bitmap->bytewidth * bitmap->height); - memcpy(bitmap->imageBuffer, data, bitmap->bytewidth * bitmap->height); - } - - ReleaseDC(hwnd, screen); - DeleteObject(dib); - DeleteDC(screenMem); - - return bitmap; -#endif -} From 7da731df3077f6b9b47ba2c7ab0934872c8414eb Mon Sep 17 00:00:00 2001 From: Jaroslav Jacjuk Date: Thu, 29 Aug 2024 21:25:31 +0200 Subject: [PATCH 5/6] Modified RobotGo to avoid github.com/kbinani/screenshot with deprecated CGDisplayCreateImageForRect macOS15 --- robotgo.go | 1 - 1 file changed, 1 deletion(-) diff --git a/robotgo.go b/robotgo.go index f4660ac..13e3958 100644 --- a/robotgo.go +++ b/robotgo.go @@ -39,7 +39,6 @@ package robotgo #cgo windows LDFLAGS: -lgdi32 -luser32 // -#include "screen/goScreen.h" #include "mouse/mouse_c.h" #include "window/goWindow.h" */ From fc03362e0ca03a8d37b00701290d0c878e0b7814 Mon Sep 17 00:00:00 2001 From: Jaroslav Jacjuk Date: Thu, 29 Aug 2024 21:54:53 +0200 Subject: [PATCH 6/6] Modified RobotGo to avoid github.com/kbinani/screenshot with deprecated CGDisplayCreateImageForRect on macOS 15 --- go.mod | 13 ++-- go.sum | 107 ++++----------------------------- screen.go | 62 +++++++++++++++++++ screen/goScreen.h | 121 +++++++++++++++++++++++++++++++++++++ screen/screen.go | 1 + screen/screen_c.h | 73 +++++++++++++++++++++++ screen/screengrab_c.h | 135 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 410 insertions(+), 102 deletions(-) create mode 100644 screen.go create mode 100644 screen/goScreen.h create mode 100644 screen/screen.go create mode 100644 screen/screen_c.h create mode 100644 screen/screengrab_c.h diff --git a/go.mod b/go.mod index abe2364..21818b6 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/yarda7/robotgo -go 1.17 +go 1.21 + +toolchain go1.21.0 require ( // github.com/robotn/gohook v0.31.3 @@ -15,15 +17,16 @@ require ( require ( github.com/go-vgo/robotgo v0.110.2 + github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 github.com/otiai10/gosseract v2.2.1+incompatible ) require ( github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 // indirect - github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 // indirect + github.com/gen2brain/shm v0.1.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/jezek/xgb v1.1.0 // indirect - github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/jezek/xgb v1.1.1 // indirect github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect github.com/otiai10/mint v1.6.3 // indirect @@ -35,7 +38,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/image v0.18.0 // indirect golang.org/x/net v0.28.0 // indirect - golang.org/x/sys v0.23.0 // indirect + golang.org/x/sys v0.24.0 // indirect ) // replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190109145017-48ac38b7c8cb diff --git a/go.sum b/go.sum index c2d4c6c..3c41a6d 100644 --- a/go.sum +++ b/go.sum @@ -1,39 +1,35 @@ github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34 h1:FBMro26TLQwBk+n4fbTSmSf3QUKb09pvW4fz49lxpl0= github.com/dblohm7/wingoes v0.0.0-20231019175336-f6e33aa7cc34/go.mod h1:6NCrWM5jRefaG7iN0iMShPalLsljHWBh9v1zxM2f8Xs= -github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 h1:VLEKvjGJYAMCXw0/32r9io61tEXnMWDRxMk+peyRVFc= -github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo= +github.com/gen2brain/shm v0.1.0 h1:MwPeg+zJQXN0RM9o+HqaSFypNoNEcNpeoGp0BTSx2YY= +github.com/gen2brain/shm v0.1.0/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.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-vgo/robotgo v0.110.2 h1:7uCrK5DSztrtwM1T6LAp6b6gVhl+XUD8Tpwzoy1SclU= github.com/go-vgo/robotgo v0.110.2/go.mod h1:ERKRRTIWCsypcrxWrUt/0ZXl5nVsUQkutYARvW22q98= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= -github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= -github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 h1:YOp8St+CM/AQ9Vp4XYm4272E77MptJDHkwypQHIRl9Q= -github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237/go.mod h1:e7qQlOY68wOz4b82D7n+DdaptZAi+SHW0+yKiWZzEYE= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= +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/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= 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/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= -github.com/otiai10/gosseract/v2 v2.4.1/go.mod h1:1gNWP4Hgr2o7yqWfs6r5bZxAatjOIdqWxJLWsTsembk= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 h1:2lhSR8N3T6I30q096DT7/5AKEIcf1vvnnWAmS0wfnNY= @@ -46,13 +42,6 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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-20240403170916-6580b55d49ca h1:oYYp7AvemDkWtxmsgVSpcFxcHMv/2jjbOk5ZC16e77Y= @@ -69,97 +58,21 @@ github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUH github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= 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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20230127140709-cafedaf64729 h1:H2kBA039yqxDv2DScpuC0knhZXO6Evfmt7mN8sGMh/4= golang.org/x/exp v0.0.0-20230127140709-cafedaf64729/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/screen.go b/screen.go new file mode 100644 index 0000000..9f8b28a --- /dev/null +++ b/screen.go @@ -0,0 +1,62 @@ +// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// https://github.com/go-vgo/robotgo/blob/master/LICENSE +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +package robotgo + +import ( + "image" + + "github.com/kbinani/screenshot" +) + +// GetDisplayBounds gets the display screen bounds +func GetDisplayBounds(i int) (x, y, w, h int) { + bs := screenshot.GetDisplayBounds(i) + return bs.Min.X, bs.Min.Y, bs.Dx(), bs.Dy() +} + +// GetDisplayRect gets the display rect +func GetDisplayRect(i int) Rect { + x, y, w, h := GetDisplayBounds(i) + return Rect{ + Point{X: x, Y: y}, + Size{W: w, H: h}} +} + +// Capture capture the screenshot +func Capture(args ...int) (*image.RGBA, error) { + displayId := 0 + if DisplayID != -1 { + displayId = DisplayID + } + + if len(args) > 4 { + displayId = args[4] + } + + var x, y, w, h int + if len(args) > 3 { + x, y, w, h = args[0], args[1], args[2], args[3] + } else { + x, y, w, h = GetDisplayBounds(displayId) + } + + return screenshot.Capture(x, y, w, h) +} + +// SaveCapture capture screen and save the screenshot to image +func SaveCapture(path string, args ...int) error { + img, err := Capture(args...) + if err != nil { + return err + } + + return Save(img, path) +} diff --git a/screen/goScreen.h b/screen/goScreen.h new file mode 100644 index 0000000..24321bf --- /dev/null +++ b/screen/goScreen.h @@ -0,0 +1,121 @@ +// Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// https://github.com/go-vgo/robotgo/blob/master/LICENSE +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#include "../base/types.h" +#include "../base/pubs.h" +#include "../base/rgb.h" +#include "screengrab_c.h" +#include "screen_c.h" +#include + +void padHex(MMRGBHex color, char* hex) { + // Length needs to be 7 because snprintf includes a terminating null. + snprintf(hex, 7, "%06x", color); +} + +char* pad_hex(MMRGBHex color) { + char hex[7]; + padHex(color, hex); + // destroyMMBitmap(bitmap); + + char* str = (char*)calloc(100, sizeof(char*)); + if (str) { strcpy(str, hex); } + return str; +} + +static uint8_t rgb[3]; + +uint8_t* color_hex_to_rgb(uint32_t h) { + rgb[0] = RED_FROM_HEX(h); + rgb[1] = GREEN_FROM_HEX(h); + rgb[2] = BLUE_FROM_HEX(h); + return rgb; +} + +uint32_t color_rgb_to_hex(uint8_t r, uint8_t g, uint8_t b) { + return RGB_TO_HEX(r, g, b); +} + +MMRGBHex get_px_color(int32_t x, int32_t y, int32_t display_id) { + MMBitmapRef bitmap; + MMRGBHex color; + + if (!pointVisibleOnMainDisplay(MMPointInt32Make(x, y))) { + return color; + } + + bitmap = copyMMBitmapFromDisplayInRect(MMRectInt32Make(x, y, 1, 1), display_id, 0); + color = MMRGBHexAtPoint(bitmap, 0, 0); + destroyMMBitmap(bitmap); + + return color; +} + +char* set_XDisplay_name(char* name) { + #if defined(USE_X11) + setXDisplay(name); + return ""; + #else + return "SetXDisplayName is only supported on Linux"; + #endif +} + +char* get_XDisplay_name() { + #if defined(USE_X11) + const char* display = getXDisplay(); + + char* sd = (char*)calloc(100, sizeof(char*)); + if (sd) { strcpy(sd, display); } + return sd; + #else + return "GetXDisplayName is only supported on Linux"; + #endif +} + +uint32_t get_num_displays() { + #if defined(IS_MACOSX) + uint32_t count = 0; + if (CGGetActiveDisplayList(0, nil, &count) == kCGErrorSuccess) { + return count; + } + return 0; + #elif defined(USE_X11) + return 0; + #elif defined(IS_WINDOWS) + uint32_t count = 0; + if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&count)) { + return count; + } + return 0; + #endif +} + +uintptr get_hwnd_by_pid(uintptr pid) { + #if defined(IS_WINDOWS) + HWND hwnd = GetHwndByPid(pid); + return (uintptr)hwnd; + #else + return 0; + #endif +} + +void bitmap_dealloc(MMBitmapRef bitmap) { + if (bitmap != NULL) { + destroyMMBitmap(bitmap); + bitmap = NULL; + } +} + +// capture_screen capture screen +MMBitmapRef capture_screen(int32_t x, int32_t y, int32_t w, int32_t h, int32_t display_id, int8_t isPid) { + MMBitmapRef bitmap = copyMMBitmapFromDisplayInRect(MMRectInt32Make(x, y, w, h), display_id, isPid); + return bitmap; +} + diff --git a/screen/screen.go b/screen/screen.go new file mode 100644 index 0000000..7424d9d --- /dev/null +++ b/screen/screen.go @@ -0,0 +1 @@ +package screen diff --git a/screen/screen_c.h b/screen/screen_c.h new file mode 100644 index 0000000..88dcd83 --- /dev/null +++ b/screen/screen_c.h @@ -0,0 +1,73 @@ +//#include "../base/os.h" + +#if defined(IS_MACOSX) + #include +#elif defined(USE_X11) + #include + // #include "../base/xdisplay_c.h" +#endif + +MMSizeInt32 getMainDisplaySize(void) { +#if defined(IS_MACOSX) + CGDirectDisplayID displayID = CGMainDisplayID(); + CGRect displayRect = CGDisplayBounds(displayID); + + CGSize size = displayRect.size; + return MMSizeInt32Make((int32_t)size.width, (int32_t)size.height); +#elif defined(USE_X11) + Display *display = XGetMainDisplay(); + const int screen = DefaultScreen(display); + + return MMSizeInt32Make( + (int32_t)DisplayWidth(display, screen), + (int32_t)DisplayHeight(display, screen)); +#elif defined(IS_WINDOWS) + return MMSizeInt32Make( + (int32_t)GetSystemMetrics(SM_CXSCREEN), + (int32_t)GetSystemMetrics(SM_CYSCREEN)); +#endif +} + +MMRectInt32 getScreenRect(int32_t display_id) { +#if defined(IS_MACOSX) + CGDirectDisplayID displayID = (CGDirectDisplayID) display_id; + if (display_id == -1) { + displayID = CGMainDisplayID(); + } + CGRect displayRect = CGDisplayBounds(displayID); + + CGPoint point = displayRect.origin; + CGSize size = displayRect.size; + return MMRectInt32Make( + (int32_t)point.x, (int32_t)point.y, + (int32_t)size.width, (int32_t)size.height); +#elif defined(USE_X11) + Display *display = XGetMainDisplay(); + const int screen = DefaultScreen(display); + + return MMRectInt32Make( + (int32_t)0, (int32_t)0, + (int32_t)DisplayWidth(display, screen), + (int32_t)DisplayHeight(display, screen)); +#elif defined(IS_WINDOWS) + if (GetSystemMetrics(SM_CMONITORS) == 1 + || display_id == -1 || display_id == 0) { + return MMRectInt32Make( + (int32_t)0, + (int32_t)0, + (int32_t)GetSystemMetrics(SM_CXSCREEN), + (int32_t)GetSystemMetrics(SM_CYSCREEN)); + } else { + return MMRectInt32Make( + (int32_t)GetSystemMetrics(SM_XVIRTUALSCREEN), + (int32_t)GetSystemMetrics(SM_YVIRTUALSCREEN), + (int32_t)GetSystemMetrics(SM_CXVIRTUALSCREEN), + (int32_t)GetSystemMetrics(SM_CYVIRTUALSCREEN)); + } +#endif +} + +bool pointVisibleOnMainDisplay(MMPointInt32 point){ + MMSizeInt32 displaySize = getMainDisplaySize(); + return point.x < displaySize.w && point.y < displaySize.h; +} diff --git a/screen/screengrab_c.h b/screen/screengrab_c.h new file mode 100644 index 0000000..9af7302 --- /dev/null +++ b/screen/screengrab_c.h @@ -0,0 +1,135 @@ +#include "../base/bitmap_free_c.h" +#include /* malloc() */ + +#if defined(IS_MACOSX) + #include + #include + #include +#elif defined(USE_X11) + #include + #include + #include "../base/xdisplay_c.h" +#elif defined(IS_WINDOWS) + #include +#endif + +MMBitmapRef copyMMBitmapFromDisplayInRect(MMRectInt32 rect, int32_t display_id, int8_t isPid) { +#if defined(IS_MACOSX) + MMBitmapRef bitmap = NULL; + uint8_t *buffer = NULL; + size_t bufferSize = 0; + + CGDirectDisplayID displayID = (CGDirectDisplayID) display_id; + if (displayID == -1 || displayID == 0) { + displayID = CGMainDisplayID(); + } + + MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size; + CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(o.x, o.y, s.w, s.h)); + if (!image) { return NULL; } + + CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image)); + if (!imageData) { return NULL; } + + bufferSize = CFDataGetLength(imageData); + buffer = malloc(bufferSize); + CFDataGetBytes(imageData, CFRangeMake(0, bufferSize), buffer); + + bitmap = createMMBitmap_c(buffer, + CGImageGetWidth(image), CGImageGetHeight(image), CGImageGetBytesPerRow(image), + CGImageGetBitsPerPixel(image), CGImageGetBitsPerPixel(image) / 8); + + CFRelease(imageData); + CGImageRelease(image); + + return bitmap; +#elif defined(USE_X11) + MMBitmapRef bitmap; + Display *display; + if (display_id == -1) { + display = XOpenDisplay(NULL); + } else { + display = XGetMainDisplay(); + } + + MMPointInt32 o = rect.origin; MMSizeInt32 s = rect.size; + XImage *image = XGetImage(display, XDefaultRootWindow(display), + (int)o.x, (int)o.y, (unsigned int)s.w, (unsigned int)s.h, + AllPlanes, ZPixmap); + XCloseDisplay(display); + if (image == NULL) { return NULL; } + + bitmap = createMMBitmap_c((uint8_t *)image->data, + s.w, s.h, (size_t)image->bytes_per_line, + (uint8_t)image->bits_per_pixel, (uint8_t)image->bits_per_pixel / 8); + image->data = NULL; /* Steal ownership of bitmap data so we don't have to copy it. */ + XDestroyImage(image); + + return bitmap; +#elif defined(IS_WINDOWS) + MMBitmapRef bitmap; + void *data; + HDC screen = NULL, screenMem = NULL; + HBITMAP dib; + BITMAPINFO bi; + + int32_t x = rect.origin.x, y = rect.origin.y; + int32_t w = rect.size.w, h = rect.size.h; + + /* Initialize bitmap info. */ + bi.bmiHeader.biSize = sizeof(bi.bmiHeader); + bi.bmiHeader.biWidth = (long) w; + bi.bmiHeader.biHeight = -(long) h; /* Non-cartesian, please */ + bi.bmiHeader.biPlanes = 1; + bi.bmiHeader.biBitCount = 32; + bi.bmiHeader.biCompression = BI_RGB; + bi.bmiHeader.biSizeImage = (DWORD)(4 * w * h); + bi.bmiHeader.biXPelsPerMeter = 0; + bi.bmiHeader.biYPelsPerMeter = 0; + bi.bmiHeader.biClrUsed = 0; + bi.bmiHeader.biClrImportant = 0; + + HWND hwnd; + if (display_id == -1 || isPid == 0) { + // screen = GetDC(NULL); /* Get entire screen */ + hwnd = GetDesktopWindow(); + } else { + hwnd = (HWND) (uintptr) display_id; + } + screen = GetDC(hwnd); + + if (screen == NULL) { return NULL; } + + // Todo: Use DXGI + screenMem = CreateCompatibleDC(screen); + /* Get screen data in display device context. */ + dib = CreateDIBSection(screen, &bi, DIB_RGB_COLORS, &data, NULL, 0); + + /* Copy the data into a bitmap struct. */ + BOOL b = (screenMem == NULL) || + SelectObject(screenMem, dib) == NULL || + !BitBlt(screenMem, (int)0, (int)0, (int)w, (int)h, screen, x, y, SRCCOPY); + if (b) { + /* Error copying data. */ + ReleaseDC(hwnd, screen); + DeleteObject(dib); + if (screenMem != NULL) { DeleteDC(screenMem); } + + return NULL; + } + + bitmap = createMMBitmap_c(NULL, w, h, 4 * w, (uint8_t)bi.bmiHeader.biBitCount, 4); + + /* Copy the data to our pixel buffer. */ + if (bitmap != NULL) { + bitmap->imageBuffer = malloc(bitmap->bytewidth * bitmap->height); + memcpy(bitmap->imageBuffer, data, bitmap->bytewidth * bitmap->height); + } + + ReleaseDC(hwnd, screen); + DeleteObject(dib); + DeleteDC(screenMem); + + return bitmap; +#endif +}