wmpager: fix memory leaks pointed out by valgrind
This commit is contained in:
		
							parent
							
								
									aca75d2e2d
								
							
						
					
					
						commit
						2f27664839
					
				
					 1 changed files with 38 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -27,8 +27,6 @@
 | 
			
		|||
#define AUTHOR "Bruno Essmann <essmann@users.sourceforge.net>"
 | 
			
		||||
#define APPLICATION "wmpager"
 | 
			
		||||
#define VERSION "1.2"
 | 
			
		||||
#define BUILD_REV "$Revision: 1.4 $"
 | 
			
		||||
#define BUILD_DATE "$Date: 2002/08/16 17:22:26 $"
 | 
			
		||||
 | 
			
		||||
#define XA_NET_NUMBER_OF_DESKTOPS "_NET_NUMBER_OF_DESKTOPS"
 | 
			
		||||
#define XA_NET_CURRENT_DESKTOP "_NET_CURRENT_DESKTOP"
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +157,7 @@ int main (int nArgc, char** szArgv) {
 | 
			
		|||
		} else if (strcmp("-t", szArgv[i]) == 0 || strcmp("--theme", szArgv[i]) == 0) {
 | 
			
		||||
			i+= 1;
 | 
			
		||||
			if (i < nArgc) {
 | 
			
		||||
				szTheme= szArgv[i];
 | 
			
		||||
				szTheme= strdup(szArgv[i]);
 | 
			
		||||
			} else {
 | 
			
		||||
				fprintf(stderr, "%s: theme argument expected for '%s'\n\n", getApplicationName(), szArgv[i-1]);
 | 
			
		||||
				usage(0);
 | 
			
		||||
| 
						 | 
				
			
			@ -254,13 +252,7 @@ void usage (int bVerbose) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void info () {
 | 
			
		||||
	char* szRev= strdup(BUILD_REV);
 | 
			
		||||
	char* szDate= strdup(BUILD_DATE);
 | 
			
		||||
	szRev= &szRev[11];
 | 
			
		||||
	szRev[strlen(szRev) - 2]= '\0';
 | 
			
		||||
	szDate= &szDate[7];
 | 
			
		||||
	szDate[strlen(szDate) - 2]= '\0';
 | 
			
		||||
	fprintf(stdout, "%s %s (build %s, %s)\n\n", APPLICATION, VERSION, szRev, szDate);
 | 
			
		||||
	fprintf(stdout, "%s %s\n\n", APPLICATION, VERSION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -373,8 +365,7 @@ void initWindow (int nArgc, char** szArgv) {
 | 
			
		|||
	XSizeHints *xsizehints;
 | 
			
		||||
	XWMHints* xwmhints;
 | 
			
		||||
	XClassHint* xclasshint;
 | 
			
		||||
	XTextProperty* xtApplication;
 | 
			
		||||
	XGCValues xgcMain;
 | 
			
		||||
	XTextProperty xtApplication;
 | 
			
		||||
	
 | 
			
		||||
	if (isVerbose()) {
 | 
			
		||||
		fprintf(stdout, "[%8ld] initializing application window\n", currentTimeMillis());
 | 
			
		||||
| 
						 | 
				
			
			@ -419,14 +410,18 @@ void initWindow (int nArgc, char** szArgv) {
 | 
			
		|||
 | 
			
		||||
	XSetWMNormalHints(display, _wMain, xsizehints);
 | 
			
		||||
 | 
			
		||||
	xtApplication= (XTextProperty*) malloc(sizeof(XTextProperty));
 | 
			
		||||
	if (XStringListToTextProperty(&szApplicationName, 1, xtApplication) == 0) {
 | 
			
		||||
	XFree(xclasshint);
 | 
			
		||||
	XFree(xwmhints);
 | 
			
		||||
	XFree(xsizehints);
 | 
			
		||||
 | 
			
		||||
	if (XStringListToTextProperty(&szApplicationName, 1, &xtApplication) == 0) {
 | 
			
		||||
		fprintf(stderr, "Cannot set window title.\n");
 | 
			
		||||
		exit(-1);
 | 
			
		||||
	}
 | 
			
		||||
	XSetWMName(display, _wMain, xtApplication);
 | 
			
		||||
	XSetWMName(display, _wMain, &xtApplication);
 | 
			
		||||
	XFree(xtApplication.value);
 | 
			
		||||
	
 | 
			
		||||
	_gcMain= XCreateGC(display, _wMain, (GCForeground | GCBackground), &xgcMain);
 | 
			
		||||
	_gcMain= XCreateGC(display, _wMain, 0L, NULL);
 | 
			
		||||
	if (_gcMain == NULL) {
 | 
			
		||||
		fprintf(stderr, "Cannot create graphics context.\n");
 | 
			
		||||
		exit(-1);
 | 
			
		||||
| 
						 | 
				
			
			@ -453,7 +448,6 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
	Window wRoot= getRootWindow();
 | 
			
		||||
	Window wMain= getMainWindow();
 | 
			
		||||
	Window wIcon= getIconWindow();
 | 
			
		||||
	XGCValues xgc, xgcWindow;
 | 
			
		||||
	Pixmap pOpaque, pTransparent, pMask;
 | 
			
		||||
	char* mask= (char*) malloc(512);
 | 
			
		||||
	int i;
 | 
			
		||||
| 
						 | 
				
			
			@ -484,7 +478,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
		exit(-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gc= XCreateGC(display, pMask, (GCForeground | GCBackground), &xgc);
 | 
			
		||||
	gc= XCreateGC(display, pMask, 0L, NULL);
 | 
			
		||||
	if (gc == NULL) {
 | 
			
		||||
		fprintf(stderr, "%s: couldn't create window mask (mask graphics).\n", getApplicationName());
 | 
			
		||||
		exit(-1);
 | 
			
		||||
| 
						 | 
				
			
			@ -495,6 +489,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
		XCopyArea(display, pOpaque, pMask, gc, nButtonX, nButtonY, getButtonWidth(), getButtonHeight(), nButtonX, nButtonY);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	free(mask);
 | 
			
		||||
	XFreePixmap(display, pOpaque);
 | 
			
		||||
	XFreePixmap(display, pTransparent);
 | 
			
		||||
	XFreeGC(display, gc);
 | 
			
		||||
| 
						 | 
				
			
			@ -522,7 +517,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
		struct stat buf;
 | 
			
		||||
		/* check for absolute button theme pathname */
 | 
			
		||||
		if (stat(szButtonTheme, &buf) == -1) {
 | 
			
		||||
			char* szNewTheme= (char*) malloc(strlen(szButtonTheme) + 4);
 | 
			
		||||
			char* szNewTheme= (char*) malloc(strlen(szButtonTheme) + 5);
 | 
			
		||||
			strcpy(szNewTheme, szButtonTheme);
 | 
			
		||||
			strcat(szNewTheme, ".xpm");
 | 
			
		||||
			if (isVerbose()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -530,6 +525,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
			}
 | 
			
		||||
			/* check for absolute button theme pathname (with .xpm added) */
 | 
			
		||||
			if (stat(szNewTheme, &buf) == 0) {
 | 
			
		||||
				free(szButtonTheme);
 | 
			
		||||
				szButtonTheme= szNewTheme;
 | 
			
		||||
				if (isVerbose()) {
 | 
			
		||||
					fprintf(stdout, "[%8ld] initializing button theme '%s'\n", currentTimeMillis(), szButtonTheme);
 | 
			
		||||
| 
						 | 
				
			
			@ -540,7 +536,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (bCheckAgain && szInstallDir != NULL) {
 | 
			
		||||
			char* szNewTheme= (char*) malloc(strlen(szInstallDir) + strlen(szButtonTheme) + 5);
 | 
			
		||||
			char* szNewTheme= (char*) malloc(strlen(szInstallDir) + strlen(szButtonTheme) + 6);
 | 
			
		||||
			strcpy(szNewTheme, szInstallDir);
 | 
			
		||||
			if (szNewTheme[strlen(szNewTheme) - 1] != '/') {
 | 
			
		||||
				strcat(szNewTheme, "/");
 | 
			
		||||
| 
						 | 
				
			
			@ -548,6 +544,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
			strcat(szNewTheme, szButtonTheme);
 | 
			
		||||
			if (stat(szNewTheme, &buf) == 0) {
 | 
			
		||||
				bCheckAgain= 0;
 | 
			
		||||
				free(szButtonTheme);
 | 
			
		||||
				szButtonTheme= szNewTheme;
 | 
			
		||||
				if (isVerbose()) {
 | 
			
		||||
					fprintf(stdout, "[%8ld] initializing button theme '%s'\n", currentTimeMillis(), szButtonTheme);
 | 
			
		||||
| 
						 | 
				
			
			@ -556,10 +553,13 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
				strcat(szNewTheme, ".xpm");
 | 
			
		||||
				if (stat(szNewTheme, &buf) == 0) {
 | 
			
		||||
					bCheckAgain= 0;
 | 
			
		||||
					free(szButtonTheme);
 | 
			
		||||
					szButtonTheme= szNewTheme;
 | 
			
		||||
					if (isVerbose()) {
 | 
			
		||||
						fprintf(stdout, "[%8ld] initializing button theme '%s'\n", currentTimeMillis(), szButtonTheme);
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					free(szNewTheme);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -568,7 +568,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
			char* szHome= (char*) getenv("HOME");
 | 
			
		||||
			if (szHome) {
 | 
			
		||||
				/* one really shouldn't copy&paste but hey this is a q&d tool */
 | 
			
		||||
				char* szNewTheme= (char*) malloc(strlen(szHome) + strlen(szButtonTheme) + strlen(WMPAGER_USER_DIR) + 5);
 | 
			
		||||
				char* szNewTheme= (char*) malloc(strlen(szHome) + strlen(szButtonTheme) + strlen(WMPAGER_USER_DIR) + 6);
 | 
			
		||||
				strcpy(szNewTheme, szHome);
 | 
			
		||||
				if (szNewTheme[strlen(szNewTheme) - 1] != '/') {
 | 
			
		||||
					strcat(szNewTheme, "/");
 | 
			
		||||
| 
						 | 
				
			
			@ -577,6 +577,7 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
				strcat(szNewTheme, szButtonTheme);
 | 
			
		||||
				if (stat(szNewTheme, &buf) == 0) {
 | 
			
		||||
					bCheckAgain= 0;
 | 
			
		||||
					free(szButtonTheme);
 | 
			
		||||
					szButtonTheme= szNewTheme;
 | 
			
		||||
					if (isVerbose()) {
 | 
			
		||||
						fprintf(stdout, "[%8ld] initializing button theme '%s'\n", currentTimeMillis(), szButtonTheme);
 | 
			
		||||
| 
						 | 
				
			
			@ -585,10 +586,13 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
					strcat(szNewTheme, ".xpm");
 | 
			
		||||
					if (stat(szNewTheme, &buf) == 0) {
 | 
			
		||||
						bCheckAgain= 0;
 | 
			
		||||
						free(szButtonTheme);
 | 
			
		||||
						szButtonTheme= szNewTheme;
 | 
			
		||||
						if (isVerbose()) {
 | 
			
		||||
							fprintf(stdout, "[%8ld] initializing button theme '%s'\n", currentTimeMillis(), szButtonTheme);
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						free(szNewTheme);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -601,6 +605,8 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
			fprintf(stderr, "%s: couldn't read button theme '%s'.\n", getApplicationName(), szButtonTheme);
 | 
			
		||||
			exit(-1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		free(szButtonTheme);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (isVerbose()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -617,8 +623,8 @@ void initWindowMask (char* szInstallDir, char* szButtonTheme) {
 | 
			
		|||
		exit(-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_gcWindow= XCreateGC(_display, _pWindow, (GCForeground | GCBackground), &xgcWindow);
 | 
			
		||||
	if (gc == NULL) {
 | 
			
		||||
	_gcWindow= XCreateGC(_display, _pWindow, 0L, NULL);
 | 
			
		||||
	if (_gcWindow == NULL) {
 | 
			
		||||
		fprintf(stderr, "%s: couldn't create screen buffer graphics.\n", getApplicationName());
 | 
			
		||||
		exit(-1);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -690,6 +696,7 @@ void getWindowOrigin (Window w, int* nX, int* nY) {
 | 
			
		|||
void loop () {
 | 
			
		||||
	Display* display= getDisplay();
 | 
			
		||||
	XEvent event;
 | 
			
		||||
	char* atom_name;
 | 
			
		||||
 | 
			
		||||
	if (isVerbose()) {
 | 
			
		||||
		fprintf(stdout, "[%8ld] starting event loop\n", currentTimeMillis());
 | 
			
		||||
| 
						 | 
				
			
			@ -719,7 +726,10 @@ void loop () {
 | 
			
		|||
					}
 | 
			
		||||
					break;
 | 
			
		||||
				case PropertyNotify:
 | 
			
		||||
					if (strcmp(XA_NET_CURRENT_DESKTOP, XGetAtomName(getDisplay(), event.xproperty.atom)) == 0) {
 | 
			
		||||
					atom_name = XGetAtomName(getDisplay(), event.xproperty.atom);
 | 
			
		||||
					if (atom_name == NULL)
 | 
			
		||||
						break;
 | 
			
		||||
					if (strcmp(XA_NET_CURRENT_DESKTOP, atom_name) == 0) {
 | 
			
		||||
						setCurrentScreen(-1);
 | 
			
		||||
						if (isVerbose()) {
 | 
			
		||||
							fprintf(stdout, "[%8ld] new current workspace (%d= %s)\n", 
 | 
			
		||||
| 
						 | 
				
			
			@ -727,6 +737,7 @@ void loop () {
 | 
			
		|||
						}
 | 
			
		||||
						redrawWindow();
 | 
			
		||||
					}
 | 
			
		||||
					XFree(atom_name);
 | 
			
		||||
					break;
 | 
			
		||||
				case DestroyNotify:
 | 
			
		||||
					if (isVerbose()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -947,9 +958,7 @@ void setCurrentScreen (int nCurrentScreen) {
 | 
			
		|||
		if ((nFormat == 32) && (nItems == 1) && (nBytesAfter == 0)) {
 | 
			
		||||
			nScreen= *(long*) data;
 | 
			
		||||
		}
 | 
			
		||||
		if (xaType != None) {
 | 
			
		||||
			XFree(data);
 | 
			
		||||
		}
 | 
			
		||||
		XFree(data);
 | 
			
		||||
		_nLastScreen= nScreen;
 | 
			
		||||
	} else {
 | 
			
		||||
		_nLastScreen= nCurrentScreen;
 | 
			
		||||
| 
						 | 
				
			
			@ -977,12 +986,11 @@ void initScreens () {
 | 
			
		|||
	if ((nFormat == 32) && (nItems == 1) && (nBytesAfter == 0)) {
 | 
			
		||||
		_nScreens= *(long*) data;
 | 
			
		||||
	}
 | 
			
		||||
	if (xaType != None) {
 | 
			
		||||
		XFree(data);
 | 
			
		||||
	}
 | 
			
		||||
	XFree(data);
 | 
			
		||||
 | 
			
		||||
	XGetTextProperty(getDisplay(), getRootWindow(), &tp, _xaNetDesktopNames);
 | 
			
		||||
	Xutf8TextPropertyToTextList(getDisplay(), &tp, &_szScreenNames, &_nDesktopNames);
 | 
			
		||||
	XFree(tp.value);
 | 
			
		||||
 | 
			
		||||
	_nLastScreen= -1;
 | 
			
		||||
	setCurrentScreen(-1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue