diff options
| -rw-r--r-- | src/rmd.c | 2 | ||||
| -rw-r--r-- | src/rmd_error.c | 15 | ||||
| -rw-r--r-- | src/rmd_error.h | 3 | ||||
| -rw-r--r-- | src/rmd_parseargs.c | 5 | ||||
| -rw-r--r-- | src/rmd_types.h | 1 | 
5 files changed, 23 insertions, 3 deletions
| @@ -76,7 +76,7 @@ int main(int argc, char **argv)  	if (pdata.args.display != NULL) {  		pdata.dpy = XOpenDisplay(pdata.args.display); -		XSetErrorHandler(rmdErrorHandler); +		XSetErrorHandler(pdata.args.need_shortcuts ? rmdGrabErrorsFatalErrorHandler : rmdErrorHandler);  	} else {  		fprintf(stderr, "No display specified for connection!\n");  		exit(8); diff --git a/src/rmd_error.c b/src/rmd_error.c index aaef20a..f8c137e 100644 --- a/src/rmd_error.c +++ b/src/rmd_error.c @@ -35,7 +35,7 @@ -int rmdErrorHandler(Display *dpy, XErrorEvent *e) +static int rmdSharedErrorHandler(Display *dpy, XErrorEvent *e, boolean grabsfatal)  {  	char	error_desc[1024]; @@ -49,8 +49,19 @@ int rmdErrorHandler(Display *dpy, XErrorEvent *e)  	if ((e->error_code == BadAccess) && (e->request_code == X_GrabKey)) {  		fprintf(stderr, "Bad Access on XGrabKey.\n" "Shortcut already assigned.\n"); -		return 0; +		if (!grabsfatal) +			return 0;  	}  	exit(1);  } + +int rmdErrorHandler(Display *dpy, XErrorEvent *e) +{ +	return rmdSharedErrorHandler(dpy, e, FALSE /* grabsfatal */); +} + +int rmdGrabErrorsFatalErrorHandler(Display *dpy, XErrorEvent *e) +{ +	return rmdSharedErrorHandler(dpy, e, TRUE /* grabsfatal */); +} diff --git a/src/rmd_error.h b/src/rmd_error.h index 4d27264..de5c7b0 100644 --- a/src/rmd_error.h +++ b/src/rmd_error.h @@ -45,5 +45,8 @@   */  int rmdErrorHandler(Display *dpy,XErrorEvent *e); +/* identical to rmdErrorHandler, but exits on grab errors (--needs-shortcuts) */ +int rmdGrabErrorsFatalErrorHandler(Display *dpy, XErrorEvent *e); +  #endif diff --git a/src/rmd_parseargs.c b/src/rmd_parseargs.c index 272d43e..8ee4328 100644 --- a/src/rmd_parseargs.c +++ b/src/rmd_parseargs.c @@ -257,6 +257,11 @@ boolean rmdParseArgs(int argc, char **argv, ProgArgs *arg_return)  		  "Shortcut that will be used to stop the recording (default Control+Mod1+s).",  		  "MOD+KEY" }, +		{ "need-shortcuts", '\0', +		  POPT_ARG_NONE, &arg_return->need_shortcuts, 0, +		  "Treat shorcut installation failures as fatal.", +		  NULL }, +  		{ "compress-cache", '\0',  		  POPT_ARG_NONE, &compress_cache, 0,  		  "Image data are cached with light compression.", diff --git a/src/rmd_types.h b/src/rmd_types.h index f70efac..b503da8 100644 --- a/src/rmd_types.h +++ b/src/rmd_types.h @@ -151,6 +151,7 @@ typedef struct _ProgArgs{  	char *workdir;	  //directory to be used for cache files(default $HOME)  	char *pause_shortcut;   //pause/unpause shortcut sequence(Control+Alt+p)  	char *stop_shortcut;	//stop shortcut sequence(Control+Alt+s) +	int need_shortcuts;	//exit fatally when shortcuts can't be installed  	int noframe;			//don't draw a frame around the recording area  	int zerocompression;	//image data are always flushed uncompressed  	unsigned periodic_datasync_ms; //interval between background async fdatasync calls while writing cache files, when zero no periodic fdatasync is performed | 
