// x-run: make run #include #include #include #include #include #include #include "screenshot.h" #include "windowtree.h" int main(int argc, char **argv) { (void)argc; (void)argv; xcb_connection_t *xcb = xcb_connect(NULL, NULL); xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data; printf("root: 0x%08x\n", screen->root); size_t n_windows; struct window_info *windows = get_windows_list(xcb, &n_windows); SetConfigFlags(FLAG_WINDOW_TRANSPARENT | FLAG_WINDOW_RESIZABLE); InitWindow(0, 0, "img/scrall"); Font font = LoadFontEx("/usr/share/fonts/Unifont/Unifont.ttf", 16, 0, 8192); struct window_display { Vector2 offset; Texture2D texture; } *windows_snaps = calloc(n_windows, sizeof(struct window_display)); for (size_t i = 0; i < n_windows; i++) { Image screenshot = get_screenshot(xcb, windows[i].wid); if (screenshot.data) { windows_snaps[i].texture = LoadTextureFromImage(screenshot); ExportImage(screenshot, TextFormat("screen_%08x.png", windows[i].wid)); UnloadImage(screenshot); } else { windows_snaps[i].texture.id = -1; } windows_snaps[i].offset.x = windows[i].rect.x; windows_snaps[i].offset.y = windows[i].rect.y; } for (int frame = 0; !WindowShouldClose(); frame++) { BeginDrawing(); ClearBackground(Fade(BLACK, 0.9)); BeginBlendMode(BLEND_ALPHA); for (size_t i = 0; i < n_windows; i++) { if (windows_snaps[i].texture.id != (unsigned int)-1 && ((frame / 10) % n_windows) == i) { DrawTextureV(windows_snaps[i].texture, windows_snaps[i].offset, WHITE); } } for (size_t i = 0; i < n_windows; i++) { DrawTextEx(font, TextFormat("0x%08x %dx%d+%d+%d %s\n", windows[i].wid, windows[i].rect.width, windows[i].rect.height, windows[i].rect.x, windows[i].rect.y, windows[i].title), (Vector2) { 8, 8 + 18 * i }, 16, 0, windows_snaps[i].texture.id == (unsigned int)-1 ? RED :WHITE); } EndBlendMode(); EndDrawing(); } UnloadFont(font); }