Search code examples
c++colorsx11xlibfltk

Get pixel RGB color with XGetPixel on focused window in C++


When i click on my window i get correct x y values from another function. With those values I wan't to get the RGB color value on the window that is currently active and not the whole screen. Right now I think it's reading the whole screen. How can I edit this code to get it work? (the window itself is a Fl_Double_Window using FLTK library).

Image to explain the problem: clicking on territory color

int getRGB(int x, int y)
{

    XColor c;
    Display *d = XOpenDisplay((char *) NULL);

    XImage *image;
    image = XGetImage(d, RootWindow (d, DefaultScreen(d)), x, y, 1, 1, AllPlanes, XYPixmap);
    c.pixel = XGetPixel (image, x, y);
    XFree (image);
    XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), &c);
    cout << c.red/256 << " " << c.green/256 << " " << c.blue/256 << "\n" ;

}

Solution

  • I found a way using Fl_BMP_image (gInterface.carte):

    void  GetPixelColor(int x, int y,char *r,char *g, char *b) //get RGB color from clicked pixel x,y and returns rgb
    {
    
    
        const char*  buf = gInterface.carte->data()[0];
        long index = (y * gInterface.carte->w() * gInterface.carte->d()) + (x * gInterface.carte->d()); // X/Y -> buf index
    
         if (gInterface.carte->count()==1) { // RGB
    
                *r = *(buf+index+0);
                *g = *(buf+index+1);
                *b = *(buf+index+2);
    
                printf("%d, %d : %2d, %d, %d \n", x,y,                                 // hex dump r/g/b
                    (unsigned char) *r,
                    (unsigned char) *g ,
                    (unsigned char) *b );
    
    }
    
        }