From 283afaaaca205bf3d10392f1b62e10ff24ca6bac Mon Sep 17 00:00:00 2001 From: Jarcode Date: Sun, 18 Mar 2018 12:20:20 -0700 Subject: [PATCH] Cleanup & implementation of #32 --- glava.c | 4 ++-- glfw_wcb.c | 2 +- glx_wcb.c | 22 +++++++++++++++++++--- render.c | 5 ++--- render.h | 2 +- xwin.c | 18 ++++++++++-------- xwin.h | 2 +- 7 files changed, 36 insertions(+), 19 deletions(-) diff --git a/glava.c b/glava.c index 920f2f9..9f304f2 100644 --- a/glava.c +++ b/glava.c @@ -199,7 +199,7 @@ int main(int argc, char** argv) { bool verbose = false; bool copy_mode = false; - int c, idx, n = 0; + int c, idx; while ((c = getopt_long(argc, argv, opt_str, p_opts, &idx)) != -1) { switch (c) { case 'v': verbose = true; break; @@ -259,7 +259,7 @@ int main(int argc, char** argv) { } pthread_t thread; - int thread_id = pthread_create(&thread, NULL, input_pulse, (void*) &audio); + pthread_create(&thread, NULL, input_pulse, (void*) &audio); float lb[r->bufsize_request], rb[r->bufsize_request]; while (r->alive) { diff --git a/glfw_wcb.c b/glfw_wcb.c index 9d74a21..6fe001a 100644 --- a/glfw_wcb.c +++ b/glfw_wcb.c @@ -119,7 +119,7 @@ static void set_visible(GLFWwindow* w, bool visible) { else glfwHideWindow(w); } -static bool swap_buffers(GLFWwindow* w) { +static void swap_buffers(GLFWwindow* w) { glfwSwapBuffers(w); glfwPollEvents(); } diff --git a/glx_wcb.c b/glx_wcb.c index fa69dea..9876acd 100644 --- a/glx_wcb.c +++ b/glx_wcb.c @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -126,7 +127,7 @@ static void* create_and_bind(const char* name, const char* class, if (!fmt || (transparent ? fmt->direct.alphaMask == 0 : fmt->direct.alphaMask != 0)) continue; - if (best < 0 || samp_buf && samples > samp) { + if (best < 0 || (samp_buf && samples > samp)) { best = t; samp = samples; } @@ -157,9 +158,11 @@ static void* create_and_bind(const char* name, const char* class, fprintf(stderr, "XCreateWindow(): failed\n"); abort(); } + + bool desktop = false; if (type) - xwin_settype(&wcb_glx, w, type); + desktop = xwin_settype(&wcb_glx, w, type); for (size_t t = 0; t < states_sz; ++t) xwin_addstate(&wcb_glx, w, states[t]); @@ -180,6 +183,20 @@ static void* create_and_bind(const char* name, const char* class, Atom dwin = XInternAtom(display, "WM_DELETE_WINDOW", false); XSetWMProtocols(display, w->w, &dwin, 1); + + // XReparentWindow(display, w->w, DefaultRootWindow(display), 0, 0); + + /* Eliminate the window's effective region */ + if (desktop){ + int ignored; + if (XShapeQueryExtension(display, &ignored, &ignored)) { + Region region; + if ((region = XCreateRegion())) { + XShapeCombineRegion(display, w->w, ShapeInput, 0, 0, region, ShapeSet); + XDestroyRegion(region); + } + } + } glXCreateContextAttribsARBProc glXCreateContextAttribsARB = NULL; glXSwapIntervalEXTProc glXSwapIntervalEXT = NULL; @@ -255,7 +272,6 @@ static void get_fbsize(struct glxwin* w, int* d, int* h) { } static void get_pos(struct glxwin* w, int* x, int* y) { - XWindowAttributes a; Window _ignored; XTranslateCoordinates(display, w->w, DefaultRootWindow(display), 0, 0, x, y, &_ignored); } diff --git a/render.c b/render.c index 9d2fdc1..e2a1711 100644 --- a/render.c +++ b/render.c @@ -506,7 +506,6 @@ void transform_smooth(struct gl_data* d, void** udaa, void* data) { for (int t = 0; t < asz; ++t) { float db = log(t), /* buffer index on log scale */ - v = b[t], /* value at this position */ avg = 0; /* adj value averages (weighted) */ /* Calculate real indexes for sampling at this position, since the distance is specified in scalar values */ @@ -592,7 +591,7 @@ void transform_wrange(struct gl_data* d, void** _, void* data) { void transform_window(struct gl_data* d, void** _, void* data) { struct gl_sampler_data* s = (struct gl_sampler_data*) data; - float* b = s->buf, w; + float* b = s->buf; size_t sz = s->sz, t; for (t = 0; t < sz; ++t) { @@ -765,7 +764,7 @@ struct renderer* rd_new(const char** paths, const char* entry, }; if (!gl->wcb) { - fprintf(stderr, "Invalid window creation backend selected: '%s'\n", gl->wcb); + fprintf(stderr, "Invalid window creation backend selected: '%s'\n", backend); abort(); } diff --git a/render.h b/render.h index 25f03c2..14e70ba 100644 --- a/render.h +++ b/render.h @@ -31,7 +31,7 @@ struct gl_wcb { int x, int y, int version_major, int version_minor); bool (*should_close) (void* ptr); - bool (*swap_buffers) (void* ptr); + void (*swap_buffers) (void* ptr); void (*get_pos) (void* ptr, int* x, int* y); void (*get_fbsize) (void* ptr, int* w, int* h); void (*set_geometry) (void* ptr, int x, int y, int w, int h); diff --git a/xwin.c b/xwin.c index 4346e0b..d51f2ec 100644 --- a/xwin.c +++ b/xwin.c @@ -100,9 +100,7 @@ bool xwin_should_render(struct renderer* rd) { return ret; } -/* Set window types defined by the EWMH standard, possible values: - -> "desktop", "dock", "toolbar", "menu", "utility", "splash", "dialog", "normal" */ -static void xwin_changeatom(struct gl_wcb* wcb, void* impl, const char* type, +static bool xwin_changeatom(struct gl_wcb* wcb, void* impl, const char* type, const char* atom, const char* fmt, int mode) { Window w = wcb->get_x11_window(impl); Display* d = wcb->get_x11_display(); @@ -116,14 +114,19 @@ static void xwin_changeatom(struct gl_wcb* wcb, void* impl, const char* type, default: formatted[t] = c; } } + bool ret = !strcmp(type, "DESKTOP"); char buf[256]; snprintf(buf, sizeof(buf), fmt, formatted); Atom desk = XInternAtom(d, buf, false); XChangeProperty(d, w, wtype, XA_ATOM, 32, mode, (unsigned char*) &desk, 1); + return ret; } -void xwin_settype(struct gl_wcb* wcb, void* impl, const char* type) { - xwin_changeatom(wcb, impl, type, "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_%s", PropModeReplace); +/* Set window types defined by the EWMH standard, possible values: + -> "desktop", "dock", "toolbar", "menu", "utility", "splash", "dialog", "normal" */ +bool xwin_settype(struct gl_wcb* wcb, void* impl, const char* type) { + return xwin_changeatom(wcb, impl, type, "_NET_WM_WINDOW_TYPE", + "_NET_WM_WINDOW_TYPE_%s", PropModeReplace); } void xwin_addstate(struct gl_wcb* wcb, void* impl, const char* state) { @@ -160,14 +163,13 @@ unsigned int xwin_copyglbg(struct renderer* rd, unsigned int tex) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - bool use_shm = true; - int x, y, w, h; rd_get_wcb(rd)->get_fbsize(rd_get_impl_window(rd), &w, &h); rd_get_wcb(rd)->get_pos(rd_get_impl_window(rd), &x, &y); XColor c; Display* d = rd_get_wcb(rd)->get_x11_display(); Drawable src = get_drawable(d, find_desktop(rd)); + bool use_shm = XShmQueryExtension(d); /* Obtain section of root pixmap */ @@ -191,7 +193,7 @@ unsigned int xwin_copyglbg(struct renderer* rd, unsigned int tex) { XShmGetImage(d, src, image, x, y, AllPlanes); } else { image = XGetImage(d, src, x, y, (unsigned int) w, (unsigned int) h, - ZPixmap, AllPlanes); + AllPlanes, ZPixmap); } /* Try to convert pixel bit depth to OpenGL storage format. The following formats\ diff --git a/xwin.h b/xwin.h index 250c8de..3f697cc 100644 --- a/xwin.h +++ b/xwin.h @@ -1,5 +1,5 @@ bool xwin_should_render(struct renderer* rd); -void xwin_settype(struct gl_wcb* wcb, void* impl, const char* type); +bool xwin_settype(struct gl_wcb* wcb, void* impl, const char* type); void xwin_addstate(struct gl_wcb* wcb, void* impl, const char* state); unsigned int xwin_copyglbg(struct renderer* rd, unsigned int texture);