Задать вопрос

Найти ошибку в коде (C++ X11)

Весь файл не буду выкладывать, а только то, что не работает номально (работает но не работает)
#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;
  • Вопрос задан
  • 3203 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
А у меня всё работает нормально, 1600x900.
Может у вас памяти не хватает и XGetImage возвращает NULL?
Кроме того, XGetImage у вас возвращает прямоугольник, который на 1 пиксел меньше размеров экрана, и по x и по y, а XGetPixel вы зовёте по полной ширине и высоте экрана.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы