diff --git a/examples/alt_geometry.php b/examples/alt_geometry.php new file mode 100644 index 0000000..de6da19 --- /dev/null +++ b/examples/alt_geometry.php @@ -0,0 +1,9 @@ +getWindowGeometry(true)); diff --git a/src/Window.php b/src/Window.php index 29b3953..28a9f01 100644 --- a/src/Window.php +++ b/src/Window.php @@ -99,13 +99,46 @@ class Window return false; } - public function getWindowGeometry() + /** + * + * + * @param bool $alternative If true, xwininfo will be used instead of xdotool + */ + public function getWindowGeometry($alternative=false) { - exec("xdotool getwindowgeometry --shell {$this->windowId}", $output, $status); - $ret = []; - foreach ($output as $line) { - list($k,$v) = explode("=",$line,2); - $ret[strtolower($k)]=$v; + if ($alternative==true) { + exec("LANG=C xwininfo -id {$this->windowId} -int", $output, $status); + foreach ($output as $line) { + if (preg_match('/Window id:\s+([0-9]+)/', $line, $m)) { + $win_id = $m[1]; + } elseif (preg_match('/Absolute upper-left ([XY]):\s+([0-9]+)/', $line, $m)) { + if ($m[1] == 'X') { + $win_x = $m[2]; + } else { + $win_y = $m[2]; + } + } elseif (preg_match('/Width:\s+([0-9]+)/', $line, $m)) { + $win_width = $m[1]; + } elseif (preg_match('/Height:\s+([0-9]+)/', $line, $m)) { + $win_height = $m[1]; + } + } + // return WINDOW, X, Y, WIDTH, HEIGHT, SCREEN + $ret = [ + 'window' => $win_id, + 'x' => $win_x, + 'y' => $win_y, + 'width' => $win_width, + 'height' => $win_height, + 'screen' => 0 // don't seem to get this from xwininfo + ]; + } else { + exec("xdotool getwindowgeometry --shell {$this->windowId}", $output, $status); + $ret = []; + foreach ($output as $line) { + list($k,$v) = explode("=",$line,2); + $ret[strtolower($k)]=$v; + } } return (object)$ret; }