Возьмите цвет пикселя с Xcb вместо Xlib
Я использую несколько оконных менеджеров, и если я правильно понимаю, они используют xlib. (Удивительный, Openbox, Fluxbox...)
Я использую следующий код для определения количества "КРАСНОГО" в пикселе:
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
using namespace std;
int main(int argc, char *argv[]){
XColor c;
Display *d = XOpenDisplay((char *) NULL);
int RED;
int x=atoi(argv[1]);
int y=atoi(argv[2]);
XImage *image;
image = XGetImage (d, RootWindow (d, DefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
c.pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), &c);
RED=c.red/256;
cout << RED;
}
Но он всегда возвращает 0 с моим i3-gaps
оконный менеджер. (работает с другими wm)
Я думаю, это потому, что i3
не использует Xlib
но Xcb
вместо.
Если так, как я могу достичь того же самого с Xcb
? (Что-то обратно совместимое с синтаксисом Xlib?)
2 ответа
Я только что заменил #include <X11/Xlib.h>
от #include <xcb/xcb.h>
,
Удивительно...
Вот пример на чистом C, но его также можно использовать и на C++. Обратите внимание: я не проверял ошибки, но это определенно следует добавить для чего-то большего, чем демонстрация.
#include <stdio.h>
#include <xcb/xcb.h>
#include <xcb/xcb_image.h>
#include <inttypes.h>
// https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Desktop-generic/LSB-Desktop-generic.html
#define AllPlanes ((unsigned long)~0L)
#define XYPixmap 1
int main() {
// Location of pixel to check
int16_t x = 0, y = 0;
// Open the connection to the X server. Use the DISPLAY environment variable
int screen_idx;
xcb_connection_t *conn = xcb_connect(NULL, &screen_idx);
// Get the screen whose number is screen_idx
const xcb_setup_t *setup = xcb_get_setup(conn);
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
// We want the screen at index screen_idx of the iterator
for (int i = 0; i < screen_idx; ++i)
xcb_screen_next(&iter);
xcb_screen_t *screen = iter.data;
// Get pixel
uint32_t pixel = xcb_image_get_pixel(xcb_image_get(conn, screen->root, x, y, 1, 1, AllPlanes, XYPixmap), 0, 0);
printf("%d", pixel);
return 0;
}