windowId = $id; $this->readWindowInfo(); } private function readWindowInfo() { exec("xwininfo -id {$this->windowId} -all -children", $output, $status); foreach ($output as $line) { if (preg_match('/^(.+?): (.+?)$/', trim($line), $match)) { switch ($match[1]) { case 'Map State': $this->isVisible = ($match[2]=='IsViewable'); break; default: //printf("[%s]->'%s'\n", $match[1], $match[2]); } } } //printf("---\n"); } public function getId() { return hexdec($this->windowId); } public function isVisible() { return $this->isVisible; } public function getWindowTitle() { return trim(exec("xdotool getwindowname {$this->windowId}")); } public function setWindowTitle($title) { exec("xdotool set_window --name ".escapeshellarg($title)." {$this->windowId}"); } public function sendKeys($keys, $forceWindow=false) { if ($forceWindow) { $cmdl = sprintf("xdotool key --delay 100 --window %d %s", $this->windowId, $keys); } else { $cmdl = sprintf("xdotool key %s", $keys); } echo "$ {$cmdl}\n"; exec($cmdl); return $this; } public function focus() { $cmdl = sprintf("xdotool windowfocus %d", $this->windowId); echo "$ {$cmdl}\n"; exec($cmdl); return $this; } public function activate() { $cmdl = sprintf("xdotool windowactivate %d", $this->windowId); echo "$ {$cmdl}\n"; exec($cmdl); return $this; } public function getWindowSize() { exec("xdotool getwindowgeometry {$this->windowId}", $output, $status); $str = join("\n",$output); if (preg_match('/Geometry: ([0-9]+?)x([0-9]+?)$/i', $str, $match)) { return (object)[ 'width' => intval($match[1]), 'height' => intval($match[2]) ]; } return false; } /** * * * @param bool $alternative If true, xwininfo will be used instead of xdotool */ public function getWindowGeometry($alternative=false) { 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; } public function setWindowSize($width, $height) { exec("xdotool windowsize {$this->windowId} {$width} {$height}"); return $this; } public function windowMinimize() { exec("xdotool windowminimize {$this->windowId}"); return $this; } public function windowRestore() { exec("xdotool windowmap {$this->windowId} windowraise {$this->windowId}"); return $this; } public function dump() { $size = $this->getWindowSize(); printf("Window: (id=0x%08x)\n Title: %s\n Visible: %s\n Size: %dx%d\n", $this->windowId, $this->windowTitle, $this->isVisible?'true':'false', $size->width, $size->height ); } }