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 'xwininfo': if (preg_match('/Window id: .+? "(.+?)"/', $match[2], $m)) { $this->windowTitle = $m[1]; } break; 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 $this->windowTitle; } public function sendKeys($keys, $forceFocus=false) { if ($forceFocus) { $this->focus(); $cmdl = sprintf("xdotool key %s", $keys); } else { $cmdl = sprintf("xdotool key --delay 100 --window %d %s", $this->windowId, $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; } public function setWindowSize($width, $height) { exec("xdotool windowsize {$this->windowId} {$width} {$height}"); 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 ); } }