Весь файл не буду выкладывать, а только то, что не работает номально (работает но не работает)
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
Display *display;
Drawable drawable;
void init() {
display = XOpenDisplay(NULL);
drawable = RootWindow(display, DefaultScreen(display));
}
int getScreenWidth() {
Screen *screen = DefaultScreenOfDisplay(display);
return screen->width;
}
int getScreenHeight() {
Screen *screen = DefaultScreenOfDisplay(display);
return screen->height;
}
bool findColor(int &varX, int &varY,
int startX, int startY,
int endX, int endY,
int startRed, int endRed, int startGreen, int endGreen, int startBlue, int endBlue) {
XImage *image;
int x, y;
XColor color;
image = XGetImage(display, drawable, startX, startY, endX - startX, endY - startY, AllPlanes, XYPixmap);
for(x = startX; x <= endX; x++) {
for(y = startY; y <= endY; y++) {
color.pixel = XGetPixel(image, x - startX, y - startY);
XQueryColor(display, DefaultColormap(display, DefaultScreen(display)), &color);
if(color.red / 256 >= startRed && color.red / 256 <= endRed &&
color.green / 256 >= startGreen && color.green / 256 <= endGreen &&
color.blue / 256 >= startBlue && color.blue / 256 <= endBlue) {
XFree(image);
varX = x;
varY = y;
return true;
}
}
}
XFree(image);
return false;
}
void cursorMove(int x, int y) {
Window root_window = XRootWindow(display, 0);
XSelectInput(display, root_window, KeyReleaseMask);
XWarpPointer(display, None, root_window, 0, 0, 0, 0, x, y);
XFlush(display);
}
int main(int argc, char *argv[]) {
init();
int width = getScreenWidth() - 1,
height = getScreenHeight() - 1;
int x, y;
if(findColor(x, y, 0, 0, width, height, 0, 0, 0, 10, 0, 100)) {
printf("Found at %d:%d\n", x, y);
cursorMove(x, y);
}
return 0;
}
В main() у меня просто всякие фишки для тестов
Проблема в том, что если я сканирую небольшой участок (например половину экрана, горизонтальную или вертикальную полосу) то все хорошо. Находит пиксель или не находит. Но если сканировать на большом участке (например мой целый экран 1366*768) то вылетает с ошибкой адресации
У меня есть еще спрощенная функция, где не диапазон цветов, а конкретный цвет. Но это ничего не меняет и там такая же картина
P.S. Я знаю, что нумерация пикселей начинается с нуля, именно по этому у меня
int width = getScreenWidth() - 1,
height = getScreenHeight() - 1;