From 72ea4b5f479d566dc8d34c11dbdfcda1ce73df0c Mon Sep 17 00:00:00 2001 From: Richard Grenville Date: Wed, 10 Oct 2012 21:12:46 +0800 Subject: [PATCH] Misc: Code clean-up - Fix a memory leak in register_cm(). - Print a warning message if argument of --vsync is invalid. - Known bug: compton will probably freeze X if another compositing window manager is running and --vsync opengl is enabled, with nvidia-drivers-304.51. Probably an issue on the driver. I could see no workaround. --- Makefile | 1 + src/compton.c | 26 ++++++++++++++++++++------ src/compton.h | 1 - 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 4b8937c..6dbdf36 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,7 @@ ifeq "$(NO_VSYNC_OPENGL)" "" LIBS += -lGL endif +CFLAGS ?= -DNDEBUG CFLAGS += $(CFG) LIBS += $(shell pkg-config --libs $(PACKAGES)) diff --git a/src/compton.c b/src/compton.c index 81199cd..9f14488 100755 --- a/src/compton.c +++ b/src/compton.c @@ -35,7 +35,7 @@ const char *WINTYPES[NUM_WINTYPES] = { struct timeval time_start = { 0, 0 }; win *list; -Display *dpy; +Display *dpy = NULL; int scr; Window root; @@ -3138,10 +3138,12 @@ register_cm(Bool want_glxct) { #ifdef CONFIG_VSYNC_OPENGL // Create a window with the wanted GLX visual if (want_glxct) { + XVisualInfo *pvi = NULL; Bool ret = False; // Get visual for the window int attribs[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None }; - XVisualInfo *pvi = glXChooseVisual(dpy, scr, attribs); + pvi = glXChooseVisual(dpy, scr, attribs); + if (!pvi) { fprintf(stderr, "register_cm(): Failed to choose visual required " "by fake OpenGL VSync window. OpenGL VSync turned off.\n"); @@ -3156,6 +3158,7 @@ register_cm(Bool want_glxct) { pvi->screen = scr; reg_win = XCreateWindow(dpy, root, 0, 0, 1, 1, 0, pvi->depth, InputOutput, pvi->visual, CWBorderPixel | CWColormap, &swa); + if (!reg_win) fprintf(stderr, "register_cm(): Failed to create window required " "by fake OpenGL VSync. OpenGL VSync turned off.\n"); @@ -3175,6 +3178,9 @@ register_cm(Bool want_glxct) { } } } + if (pvi) + XFree(pvi); + if (!ret) opts.vsync = VSYNC_NONE; } @@ -3650,11 +3656,17 @@ get_cfg(int argc, char *const *argv) { break; case 270: // --vsync - for (vsync_t i = 0; i < sizeof(vsync_str) / sizeof(vsync_str[0]); ++i) - if (!strcasecmp(optarg, vsync_str[i])) { - opts.vsync = i; - break; + { + vsync_t i; + for (i = 0; i < (sizeof(vsync_str) / sizeof(vsync_str[0])); ++i) + if (!strcasecmp(optarg, vsync_str[i])) { + opts.vsync = i; + break; + } + if ((sizeof(vsync_str) / sizeof(vsync_str[0])) == i) { + fputs("Invalid --vsync argument. Ignored.\n", stderr); } + } break; default: usage(); @@ -4011,6 +4023,8 @@ vsync_wait(Display *dpy, struct pollfd *fd, int timeout) { #endif // This place should not reached! + assert(0); + return 0; } diff --git a/src/compton.h b/src/compton.h index 0f2f35e..d28018b 100644 --- a/src/compton.h +++ b/src/compton.h @@ -31,7 +31,6 @@ // Whether to enable OpenGL VSync support // #define CONFIG_VSYNC_OPENGL 1 -#define NDEBUG 1 // === Includes === // For some special functions