1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/veni0-robotgo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
robotgo_unix.go 3.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
vcaesar Отправлено 15.09.2021 18:57 cc45178
// 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//go:build !darwin && !windows
// +build !darwin,!windows
package robotgo
import (
"errors"
"log"
"github.com/robotn/xgb/xproto"
"github.com/robotn/xgbutil"
"github.com/robotn/xgbutil/ewmh"
)
var xu *xgbutil.XUtil
// GetBounds get the window bounds
func GetBounds(pid int32, args ...int) (int, int, int, int) {
var hwnd int
if len(args) > 0 {
hwnd = args[0]
return internalGetBounds(pid, hwnd)
}
xid, err := GetXId(xu, pid)
if err != nil {
log.Println("Get Xid from Pid errors is: ", err)
return 0, 0, 0, 0
}
return internalGetBounds(int32(xid), hwnd)
}
// internalGetTitle get the window title
func internalGetTitle(pid int32, args ...int32) string {
var hwnd int32
if len(args) > 0 {
hwnd = args[0]
return cgetTitle(pid, hwnd)
}
xid, err := GetXId(xu, pid)
if err != nil {
log.Println("Get Xid from Pid errors is: ", err)
return ""
}
return cgetTitle(int32(xid), hwnd)
}
// ActivePIDC active the window by PID,
// If args[0] > 0 on the unix platform via a xid to active
func ActivePIDC(pid int32, args ...int) error {
var hwnd int
if len(args) > 0 {
hwnd = args[0]
internalActive(pid, hwnd)
return nil
}
xid, err := GetXId(xu, pid)
if err != nil {
log.Println("Get Xid from Pid errors is: ", err)
return err
}
internalActive(int32(xid), hwnd)
return nil
}
// ActivePID active the window by PID,
//
// If args[0] > 0 on the Windows platform via a window handle to active,
// If args[0] > 0 on the unix platform via a xid to active
func ActivePID(pid int32, args ...int) error {
if xu == nil {
var err error
xu, err = xgbutil.NewConn()
if err != nil {
return err
}
}
if len(args) > 0 {
err := ewmh.ActiveWindowReq(xu, xproto.Window(pid))
if err != nil {
return err
}
return nil
}
// get the xid from pid
xid, err := GetXidFromPid(xu, pid)
if err != nil {
return err
}
err = ewmh.ActiveWindowReq(xu, xid)
if err != nil {
return err
}
return nil
}
// GetXId get the xid return window and error
func GetXId(xu *xgbutil.XUtil, pid int32) (xproto.Window, error) {
if xu == nil {
var err error
xu, err = xgbutil.NewConn()
if err != nil {
// log.Println("xgbutil.NewConn errors is: ", err)
return 0, err
}
}
xid, err := GetXidFromPid(xu, pid)
return xid, err
}
// GetXidFromPid get the xide from pid
func GetXidFromPid(xu *xgbutil.XUtil, pid int32) (xproto.Window, error) {
windows, err := ewmh.ClientListGet(xu)
if err != nil {
return 0, err
}
for _, window := range windows {
wmPid, err := ewmh.WmPidGet(xu, window)
if err != nil {
return 0, err
}
if uint(pid) == wmPid {
return window, nil
}
}
return 0, errors.New("failed to find a window with a matching pid.")
}
1
https://api.gitlife.ru/oschina-mirror/veni0-robotgo.git
git@api.gitlife.ru:oschina-mirror/veni0-robotgo.git
oschina-mirror
veni0-robotgo
veni0-robotgo
master