// compilation: // g++ polybar-xwindow-icon.cpp -o polybar-xwindow-icon -I/usr/include/opencv4/ -lopencv_core -lopencv_videoio -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lX11 // // Code is mostly copied from // https://stackoverflow.com/questions/54513419/putting-image-into-a-window-in-x11 // Some parts are taken from // https://stackoverflow.com/questions/57078155/draw-border-frame-using-xlib #include // FOR OpenCV #include // Basic OpenCV structures (cv::Mat) #include #include #include #include #include // Every Xlib program must include this #include // I include this to test return values the lazy way #include // So we got the profile for 10 seconds #include #include #include // Every Xlib program must include this #include #include #include #include #define NIL (0) // A name for the void pointer using namespace cv; using namespace std; int main(int argc, char** argv) { XGCValues gr_values; //GC gc; XColor color, dummy; Display *dpy = XOpenDisplay(NIL); //assert(dpy); //int screen = DefaultScreen(dpy); // Get some colors int blackColor = BlackPixel(dpy, DefaultScreen(dpy)); int whiteColor = WhitePixel(dpy, DefaultScreen(dpy)); // Create the window Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 270, 6, 24, 24, 0, whiteColor, blackColor); // We want to get MapNotify events XSelectInput(dpy, w, StructureNotifyMask); // XSelectInput(dpy, w, ExposureMask); long value = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); XChangeProperty(dpy, w, XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False), XA_ATOM, 32, PropModeReplace, (unsigned char *) &value, 1); XClassHint *polybar_xwindow_icon; //my_struct = malloc(sizeof(t_data)); polybar_xwindow_icon = XAllocClassHint(); polybar_xwindow_icon->res_name = "polybar-xwindow-icon"; polybar_xwindow_icon->res_class = "Polybar-xwindow-icon"; XSetClassHint(dpy, w, polybar_xwindow_icon); XFree(polybar_xwindow_icon); XMapWindow(dpy, w); // Wait for the MapNotify event for(;;) { XEvent e; XNextEvent(dpy, &e); if (e.type == MapNotify) break; } Window focal = w; XWindowAttributes gwa; XGetWindowAttributes(dpy, w, &gwa); int wd1 = gwa.width; int ht1 = gwa.height; XImage *image = XGetImage(dpy, w, 0, 0 , wd1, ht1, AllPlanes, ZPixmap); unsigned long rm = image->red_mask; unsigned long gm = image->green_mask; unsigned long bm = image->blue_mask; Mat img(ht1, wd1, CV_8UC3); // OpenCV Mat object is initilaized Mat scrap = imread(argv[1]);//(wid, ht, CV_8UC3); resize(scrap, img, img.size(), cv::INTER_AREA); for (int x = 0; x < wd1; x++) for (int y = 0; y < ht1 ; y++) { unsigned long pixel = XGetPixel(image,x,y); Vec3b color = img.at(Point(x,y)); pixel = 65536 * color[2] + 256 * color[1] + color[0]; XPutPixel(image, x, y, pixel); } // namedWindow("QR", CV_WINDOW_NORMAL); // imshow("QR", img); GC gc = XCreateGC(dpy, w, 0, NIL); XPutImage(dpy, w, gc, image, 0, 0, 0, 0, wd1, ht1); int run = 1; while(run) { XEvent xe; XNextEvent(dpy, &xe); switch (xe.type) { case Expose: XPutImage(dpy, w, gc, image, 0, 0, 0, 0, wd1, ht1); XSetForeground(dpy, gc, color.pixel); XSync(dpy, False); break; default: break; } } XDestroyWindow(dpy, w); XCloseDisplay(dpy); // waitKey(0); return 0; }