removed xdotool

This commit is contained in:
Radek Davidek 2025-12-19 21:54:56 +01:00
parent 85764fed2d
commit 162aa6d7ab
4 changed files with 280 additions and 60 deletions

View File

@ -1,12 +1,12 @@
#Pokémon GO Automatizace - Nastavení
#Sun Dec 14 20:04:32 CET 2025
#Fri Dec 19 21:53:30 CET 2025
autoklik.count=500
window.width=807
transfer.delay=0
window.height=743
autoklik.x=2380
autoklik.y=1124
transfer.count=48
window.x=866
transfer.count=3
window.x=1127
autoklik.interval=100
window.y=237
window.y=697

View File

@ -3,9 +3,11 @@ package com.pokemongo;
import java.awt.AWTException;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
@ -38,6 +40,23 @@ public class PokemonGoAutomation {
loadButtonTemplates();
}
/**
* Zjistí insets displeje (offset zp ůsobený OS - panel, taskbar, apod.)
* Důležité pro Ubuntu s GNOME panelem na horní straně
*/
private Insets getScreenInsets() {
try {
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration());
System.out.println("Zjištěny OS insets: top=" + insets.top + ", left=" + insets.left +
", bottom=" + insets.bottom + ", right=" + insets.right);
return insets;
} catch (Exception e) {
System.out.println("Chyba při zjištění insets: " + e.getMessage());
return new Insets(0, 0, 0, 0);
}
}
/**
* Vrátí počet dosud transfernutých pokémonů
*/
@ -382,65 +401,21 @@ public class PokemonGoAutomation {
*/
public boolean findPokemonGoWindow() {
try {
// Pro Linux - hledání okna pomocí xdotool
// Nejdříve najít ID okna, pak získat jeho geometrii
Process searchProcess = Runtime.getRuntime().exec(
new String[] { "bash", "-c", "xdotool search --name \"Lenovo|L78032\" | head -1" });
Rectangle bounds = WindowFinder.findWindowByName("Lenovo");
java.io.BufferedReader searchReader = new java.io.BufferedReader(
new java.io.InputStreamReader(searchProcess.getInputStream()));
String windowId = searchReader.readLine();
searchProcess.waitFor();
if (windowId != null && !windowId.trim().isEmpty()) {
System.out.println("Nalezeno okno s ID: " + windowId);
// Získat geometrii okna
Process geomProcess = Runtime.getRuntime().exec(
new String[] { "bash", "-c", "xdotool getwindowgeometry " + windowId.trim() });
java.io.BufferedReader geomReader = new java.io.BufferedReader(
new java.io.InputStreamReader(geomProcess.getInputStream()));
String line;
int x = 0, y = 0, width = 0, height = 0;
while ((line = geomReader.readLine()) != null) {
System.out.println("xdotool výstup: " + line);
if (line.contains("Position:")) {
String[] parts = line.split("Position: ")[1].split(",");
x = Integer.parseInt(parts[0].trim());
y = Integer.parseInt(parts[1].trim().split(" ")[0]);
} else if (line.contains("Geometry:")) {
String[] parts = line.split("Geometry: ")[1].split("x");
width = Integer.parseInt(parts[0].trim());
height = Integer.parseInt(parts[1].trim());
}
}
geomProcess.waitFor();
if (width > 0 && height > 0) {
windowBounds = new Rectangle(x, y, width, height);
if (bounds != null && bounds.width > 0 && bounds.height > 0) {
windowBounds = bounds;
System.out.println("Nalezeno okno: " + windowBounds);
return true;
}
}
// Fallback - použití celé obrazovky
System.out.println("Okno nenalezeno, použiji celou obrazovku");
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
windowBounds = gd.getDefaultConfiguration().getBounds();
return true;
System.out.println("Okno Pokémon GO nebylo nalezeno.");
return false;
} catch (Exception e) {
System.err.println("Chyba při hledání okna: " + e.getMessage());
e.printStackTrace();
// Použití celé obrazovky jako záložní varianta
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
windowBounds = gd.getDefaultConfiguration().getBounds();
return true;
return false;
}
}
@ -687,8 +662,10 @@ public class PokemonGoAutomation {
* @return Absolutní pozice na obrazovce
*/
private Point getAbsolutePoint(int relativeX, int relativeY) {
int absoluteX = windowBounds.x + relativeX;
int absoluteY = windowBounds.y + relativeY;
int xCorrection = 20;
int yCorrection = 100;
int absoluteX = windowBounds.x + relativeX + xCorrection;
int absoluteY = windowBounds.y + relativeY + yCorrection;
return new Point(absoluteX, absoluteY);
}

View File

@ -20,7 +20,19 @@ public class PositionPicker extends JWindow {
public PositionPicker(PositionPickerListener listener) {
this.listener = listener;
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
Rectangle bounds = gd.getDefaultConfiguration().getBounds();
Rectangle screenBounds = gd.getDefaultConfiguration().getBounds();
// Zjistit insets - offset zp ůsobený OS panelem/dashboardem
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration());
System.out.println("PositionPicker insets: top=" + insets.top + ", left=" + insets.left);
// Aplikovat insets na bounds
Rectangle bounds = new Rectangle(
screenBounds.x + insets.left,
screenBounds.y + insets.top,
screenBounds.width - insets.left - insets.right,
screenBounds.height - insets.top - insets.bottom
);
setBounds(bounds);
System.out.println("PositionPicker vytvořen: " + bounds);

View File

@ -0,0 +1,231 @@
package com.pokemongo;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import java.awt.Rectangle;
import java.util.Arrays;
import java.util.List;
/**
* Pomocná třída pro hledání oken v Linux/X11 prostředí.
* Používá X11 API přes JNA bindings.
*/
public class WindowFinder {
/**
* X11 native library interface
*/
public interface X11 extends Library {
X11 INSTANCE = Native.load("X11", X11.class);
/**
* X11 Window Attributes struktura
*/
class XWindowAttributes extends Structure {
public int x;
public int y;
public int width;
public int height;
public int border_width;
public int depth;
public Pointer visual;
public Pointer root;
public int class_;
public int bit_gravity;
public int win_gravity;
public int backing_pixel;
public int backing_planes;
public int backing_store;
public long backing_pixel_unused;
public int save_under;
public Pointer colormap;
public int map_installed;
public int map_state;
public long all_event_masks;
public long your_event_mask;
public long do_not_propagate_mask;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("x", "y", "width", "height", "border_width", "depth",
"visual", "root", "class_", "bit_gravity", "win_gravity",
"backing_pixel", "backing_planes", "backing_store",
"backing_pixel_unused", "save_under", "colormap",
"map_installed", "map_state", "all_event_masks",
"your_event_mask", "do_not_propagate_mask");
}
}
// X11 funkce
// Display je Pointer (nije Structure)
Pointer XOpenDisplay(String displayName);
int XCloseDisplay(Pointer display);
long XDefaultRootWindow(Pointer display);
int XGetWindowAttributes(Pointer display, long window, XWindowAttributes attrs);
long XInternAtom(Pointer display, String atomName, boolean onlyIfExists);
int XQueryTree(Pointer display, long window,
PointerByReference root_return, PointerByReference parent_return,
PointerByReference children_return, IntByReference nchildren_return);
int XFetchName(Pointer display, long window, PointerByReference window_name_return);
Pointer XFree(Pointer ptr);
}
/**
* Najde okno podle jeho názvu a vrátí jeho bounds
* @param searchPattern Pattern pro hledání (substring názvu okna)
* @return Rectangle s pozicí a velikostí okna, nebo null pokud nenalezeno
*/
public static Rectangle findWindowByName(String searchPattern) {
Pointer display = null;
try {
display = X11.INSTANCE.XOpenDisplay(null);
if (display == null) {
System.out.println("WindowFinder: Nelze se připojit k X11 displei");
return null;
}
System.out.println("WindowFinder: Připojen k X11 displayu");
long rootWindow = X11.INSTANCE.XDefaultRootWindow(display);
long[] foundWindow = new long[1];
foundWindow[0] = 0;
searchWindowRecursive(display, rootWindow, searchPattern, foundWindow);
if (foundWindow[0] != 0) {
Rectangle bounds = getWindowBounds(display, foundWindow[0]);
if (bounds != null) {
System.out.println("WindowFinder: Okno nalezeno: " + bounds);
return bounds;
}
}
System.out.println("WindowFinder: Okno s názvem '" + searchPattern + "' nenalezeno");
return null;
} catch (Exception e) {
System.err.println("WindowFinder - Chyba: " + e.getMessage());
e.printStackTrace();
return null;
} finally {
if (display != null) {
try {
X11.INSTANCE.XCloseDisplay(display);
} catch (Exception e) {
System.err.println("WindowFinder - Chyba při zavírání displeje: " + e.getMessage());
}
}
}
}
/**
* Rekurzivně hledá okno v stromě oken
*/
private static void searchWindowRecursive(Pointer display, long window,
String searchPattern, long[] result) {
if (result[0] != 0) {
return; // Okno již nalezeno
}
try {
String windowName = getWindowNameString(display, window);
if (windowName != null && windowName.contains(searchPattern)) {
result[0] = window;
System.out.println("WindowFinder: Nalezeno okno: '" + windowName + "' (XID: " + window + ")");
return;
}
} catch (Exception e) {
// Ignorovat chyby při čtení jména okna
}
// Hledat v potomcích
try {
PointerByReference root_return = new PointerByReference();
PointerByReference parent_return = new PointerByReference();
PointerByReference children_return = new PointerByReference();
IntByReference nchildren_return = new IntByReference();
int status = X11.INSTANCE.XQueryTree(display, window, root_return, parent_return,
children_return, nchildren_return);
if (status != 0 && nchildren_return.getValue() > 0) {
Pointer childrenPtr = children_return.getValue();
int numChildren = nchildren_return.getValue();
if (childrenPtr != null) {
// Čtení window IDs z pole
for (int i = 0; i < numChildren && result[0] == 0; i++) {
long childWindow = childrenPtr.getLong((long) i * 8); // 64-bit window IDs
if (childWindow != 0) {
searchWindowRecursive(display, childWindow, searchPattern, result);
}
}
// Uvolnit paměť
X11.INSTANCE.XFree(childrenPtr);
}
}
} catch (Exception e) {
// Ignorovat chyby při hledání v potomcích
}
}
/**
* Získá jméno okna jako String
*/
private static String getWindowNameString(Pointer display, long window) {
try {
PointerByReference namePtr = new PointerByReference();
int status = X11.INSTANCE.XFetchName(display, window, namePtr);
if (status != 0 && namePtr.getValue() != null) {
String name = namePtr.getValue().getString(0);
if (name != null && !name.isEmpty()) {
X11.INSTANCE.XFree(namePtr.getValue());
return name;
}
X11.INSTANCE.XFree(namePtr.getValue());
}
} catch (Exception e) {
// Ignorovat chyby
}
return null;
}
/**
* Získá bounds okna (pozici a velikost)
*/
private static Rectangle getWindowBounds(Pointer display, long window) {
try {
X11.XWindowAttributes attrs = new X11.XWindowAttributes();
int status = X11.INSTANCE.XGetWindowAttributes(display, window, attrs);
if (status == 0) {
System.err.println("WindowFinder - Chyba při získávání window attributes");
return null;
}
System.out.println("WindowFinder: Window bounds - x:" + attrs.x + " y:" + attrs.y +
" w:" + attrs.width + " h:" + attrs.height);
return new Rectangle(attrs.x, attrs.y, attrs.width, attrs.height);
} catch (Exception e) {
System.err.println("WindowFinder - Chyba při získávání bounds: " + e.getMessage());
e.printStackTrace();
}
return null;
}
}