Made run_command() a normal key/button handler
This commit is contained in:
		
							parent
							
								
									75e36939a1
								
							
						
					
					
						commit
						d86c95d795
					
				
							
								
								
									
										129
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								config.h
									
									
									
									
									
								
							| @ -1,9 +1,3 @@ | |||||||
| #ifdef _GENERAL_CONFIG |  | ||||||
| 
 |  | ||||||
| /* enable external commands (defined below)? 0 = off, 1 = on:  */ |  | ||||||
| enum { EXT_COMMANDS = 0 }; |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
| #ifdef _WINDOW_CONFIG | #ifdef _WINDOW_CONFIG | ||||||
| 
 | 
 | ||||||
| /* default window dimensions (overwritten via -g option):      */ | /* default window dimensions (overwritten via -g option):      */ | ||||||
| @ -42,79 +36,80 @@ enum { THUMB_SIZE = 60 }; | |||||||
| 
 | 
 | ||||||
| /* keyboard mappings for image and thumbnail mode:             */ | /* keyboard mappings for image and thumbnail mode:             */ | ||||||
| static const keymap_t keys[] = { | static const keymap_t keys[] = { | ||||||
| 	/* key              function            argument */ | 	/* ctrl    key              function           argument      */ | ||||||
| 	{ XK_q,             quit,               None }, | 	{ False,   XK_q,            quit,              (arg_t) None }, | ||||||
| 	{ XK_r,             reload,             None }, | 	{ False,   XK_r,            reload,            (arg_t) None }, | ||||||
| 	{ XK_f,             toggle_fullscreen,  None }, | 	{ False,   XK_f,            toggle_fullscreen, (arg_t) None }, | ||||||
| 	{ XK_a,             toggle_antialias,   None }, | 	{ False,   XK_a,            toggle_antialias,  (arg_t) None }, | ||||||
| 	{ XK_A,             toggle_alpha,       None }, | 	{ False,   XK_A,            toggle_alpha,      (arg_t) None }, | ||||||
| 	{ XK_Return,        switch_mode,        None }, | 	{ False,   XK_Return,       switch_mode,       (arg_t) None }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_g,             first,              None }, | 	{ False,   XK_g,            first,             (arg_t) None }, | ||||||
| 	{ XK_G,             last,               None }, | 	{ False,   XK_G,            last,              (arg_t) None }, | ||||||
| 	{ XK_n,             navigate,           +1 }, | 	{ False,   XK_n,            navigate,          (arg_t) +1 }, | ||||||
| 	{ XK_space,         navigate,           +1 }, | 	{ False,   XK_space,        navigate,          (arg_t) +1 }, | ||||||
| 	{ XK_p,             navigate,           -1 }, | 	{ False,   XK_p,            navigate,          (arg_t) -1 }, | ||||||
| 	{ XK_BackSpace,     navigate,           -1 }, | 	{ False,   XK_BackSpace,    navigate,          (arg_t) -1 }, | ||||||
| 	{ XK_bracketright,  navigate,           +10 }, | 	{ False,   XK_bracketright, navigate,          (arg_t) +10 }, | ||||||
| 	{ XK_bracketleft,   navigate,           -10 }, | 	{ False,   XK_bracketleft,  navigate,          (arg_t) -10 }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_D,             remove_image,       None }, | 	{ False,   XK_D,            remove_image,      (arg_t) None }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_h,             move,               DIR_LEFT }, | 	{ False,   XK_h,            move,              (arg_t) DIR_LEFT }, | ||||||
| 	{ XK_Left,          move,               DIR_LEFT }, | 	{ False,   XK_Left,         move,              (arg_t) DIR_LEFT }, | ||||||
| 	{ XK_j,             move,               DIR_DOWN }, | 	{ False,   XK_j,            move,              (arg_t) DIR_DOWN }, | ||||||
| 	{ XK_Down,          move,               DIR_DOWN }, | 	{ False,   XK_Down,         move,              (arg_t) DIR_DOWN }, | ||||||
| 	{ XK_k,             move,               DIR_UP }, | 	{ False,   XK_k,            move,              (arg_t) DIR_UP }, | ||||||
| 	{ XK_Up,            move,               DIR_UP }, | 	{ False,   XK_Up,           move,              (arg_t) DIR_UP }, | ||||||
| 	{ XK_l,             move,               DIR_RIGHT }, | 	{ False,   XK_l,            move,              (arg_t) DIR_RIGHT }, | ||||||
| 	{ XK_Right,         move,               DIR_RIGHT }, | 	{ False,   XK_Right,        move,              (arg_t) DIR_RIGHT }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_braceleft,     pan_screen,         DIR_LEFT }, | 	{ False,   XK_braceleft,    pan_screen,        (arg_t) DIR_LEFT }, | ||||||
| 	{ XK_Next,          pan_screen,         DIR_DOWN }, | 	{ False,   XK_Next,         pan_screen,        (arg_t) DIR_DOWN }, | ||||||
| 	{ XK_Prior,         pan_screen,         DIR_UP }, | 	{ False,   XK_Prior,        pan_screen,        (arg_t) DIR_UP }, | ||||||
| 	{ XK_braceright,    pan_screen,         DIR_RIGHT }, | 	{ False,   XK_braceright,   pan_screen,        (arg_t) DIR_RIGHT }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_H,             pan_edge,           DIR_LEFT }, | 	{ False,   XK_H,            pan_edge,          (arg_t) DIR_LEFT }, | ||||||
| 	{ XK_J,             pan_edge,           DIR_DOWN }, | 	{ False,   XK_J,            pan_edge,          (arg_t) DIR_DOWN }, | ||||||
| 	{ XK_K,             pan_edge,           DIR_UP }, | 	{ False,   XK_K,            pan_edge,          (arg_t) DIR_UP }, | ||||||
| 	{ XK_L,             pan_edge,           DIR_RIGHT }, | 	{ False,   XK_L,            pan_edge,          (arg_t) DIR_RIGHT }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_plus,          zoom,               +1 }, | 	{ False,   XK_plus,         zoom,              (arg_t) +1 }, | ||||||
| 	{ XK_equal,         zoom,               +1 }, | 	{ False,   XK_equal,        zoom,              (arg_t) +1 }, | ||||||
| 	{ XK_KP_Add,        zoom,               +1 }, | 	{ False,   XK_KP_Add,       zoom,              (arg_t) +1 }, | ||||||
| 	{ XK_minus,         zoom,               -1 }, | 	{ False,   XK_minus,        zoom,              (arg_t) -1 }, | ||||||
| 	{ XK_KP_Subtract,   zoom,               -1 }, | 	{ False,   XK_KP_Subtract,  zoom,              (arg_t) -1 }, | ||||||
| 	{ XK_0,             zoom,               0 }, | 	{ False,   XK_0,            zoom,              (arg_t) None }, | ||||||
| 	{ XK_KP_0,          zoom,               0 }, | 	{ False,   XK_KP_0,         zoom,              (arg_t) None }, | ||||||
| 	{ XK_w,             fit_to_win,         None }, | 	{ False,   XK_w,            fit_to_win,        (arg_t) None }, | ||||||
| 	{ XK_W,             fit_to_img,         None }, | 	{ False,   XK_W,            fit_to_img,        (arg_t) None }, | ||||||
| 
 | 
 | ||||||
| 	{ XK_less,          rotate,             DIR_LEFT }, | 	{ False,   XK_less,         rotate,            (arg_t) DIR_LEFT }, | ||||||
| 	{ XK_greater,       rotate,             DIR_RIGHT }, | 	{ False,   XK_greater,      rotate,            (arg_t) DIR_RIGHT }, | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| /* external commands and corresponding key mappings:           */ | 	                            /* open the current image with given program:  */ | ||||||
| static const command_t commands[] = { | 	{ True,    XK_g,            open_with,         (arg_t) "gimp" }, | ||||||
| 	/* ctrl-...    reload?  command, '#' is replaced by filename */ | 
 | ||||||
| 	{ XK_comma,    True,    "jpegtran -rotate 270 -copy all -outfile # #" }, | 	                            /* run shell command line on the current file,
 | ||||||
| 	{ XK_period,   True,    "jpegtran -rotate 90 -copy all -outfile # #" }, | 	                             * '#' is replaced by filename:                */ | ||||||
| 	{ XK_less,     True,    "mogrify -rotate -90 #" }, | 	{ True,    XK_less,         run_command,       (arg_t) "mogrify -rotate -90 #" }, | ||||||
| 	{ XK_greater,  True,    "mogrify -rotate +90 #" } | 	{ True,    XK_greater,      run_command,       (arg_t) "mogrify -rotate +90 #" }, | ||||||
|  | 	{ True,    XK_comma,        run_command,       (arg_t) "jpegtran -rotate 270 -copy all -outfile # #" }, | ||||||
|  | 	{ True,    XK_period,       run_command,       (arg_t) "jpegtran -rotate 90 -copy all -outfile # #" }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* mouse button mappings for image mode:                       */ | /* mouse button mappings for image mode:                       */ | ||||||
| static const button_t buttons[] = { | static const button_t buttons[] = { | ||||||
| 	/* modifier     button       function    argument            */ | 	/* ctrl    shift    button       function      argument      */ | ||||||
| 	{ None,         Button1,     navigate,   +1 }, | 	{ False,   False,   Button1,     navigate,     (arg_t) +1 }, | ||||||
| 	{ None,         Button3,     navigate,   -1 }, | 	{ False,   False,   Button3,     navigate,     (arg_t) -1 }, | ||||||
| 	{ None,         Button2,     drag,       None }, | 	{ False,   False,   Button2,     drag,         (arg_t) None }, | ||||||
| 	{ None,         Button4,     move,       DIR_UP }, | 	{ False,   False,   Button4,     move,         (arg_t) DIR_UP }, | ||||||
| 	{ None,         Button5,     move,       DIR_DOWN }, | 	{ False,   False,   Button5,     move,         (arg_t) DIR_DOWN }, | ||||||
| 	{ ShiftMask,    Button4,     move,       DIR_LEFT }, | 	{ False,   True,    Button4,     move,         (arg_t) DIR_LEFT }, | ||||||
| 	{ ShiftMask,    Button5,     move,       DIR_RIGHT }, | 	{ False,   True,    Button5,     move,         (arg_t) DIR_RIGHT }, | ||||||
| 	{ ControlMask,  Button4,     zoom,       +1 }, | 	{ True,    False,   Button4,     zoom,         (arg_t) +1 }, | ||||||
| 	{ ControlMask,  Button5,     zoom,       -1 }, | 	{ True,    False,   Button5,     zoom,         (arg_t) -1 }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
							
								
								
									
										233
									
								
								events.c
									
									
									
									
									
								
							
							
						
						
									
										233
									
								
								events.c
									
									
									
									
									
								
							| @ -58,62 +58,6 @@ extern int filecnt, fileidx; | |||||||
| int timo_cursor; | int timo_cursor; | ||||||
| int timo_redraw; | int timo_redraw; | ||||||
| 
 | 
 | ||||||
| int run_command(const char *cline, Bool reload) { |  | ||||||
| 	int fncnt, fnlen; |  | ||||||
| 	char *cn, *cmdline; |  | ||||||
| 	const char *co, *fname; |  | ||||||
| 	pid_t pid; |  | ||||||
| 	int ret, status; |  | ||||||
| 
 |  | ||||||
| 	if (!cline || !*cline) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	fncnt = 0; |  | ||||||
| 	co = cline - 1; |  | ||||||
| 	while ((co = strchr(co + 1, '#'))) |  | ||||||
| 		fncnt++; |  | ||||||
| 
 |  | ||||||
| 	if (!fncnt) |  | ||||||
| 		return 0; |  | ||||||
| 
 |  | ||||||
| 	ret = 0; |  | ||||||
| 	fname = filenames[mode == MODE_NORMAL ? fileidx : tns.sel]; |  | ||||||
| 	fnlen = strlen(fname); |  | ||||||
| 	cn = cmdline = (char*) s_malloc((strlen(cline) + fncnt * (fnlen + 2)) * |  | ||||||
| 	                                sizeof(char)); |  | ||||||
| 
 |  | ||||||
| 	/* replace all '#' with filename */ |  | ||||||
| 	for (co = cline; *co; co++) { |  | ||||||
| 		if (*co == '#') { |  | ||||||
| 			*cn++ = '"'; |  | ||||||
| 			strcpy(cn, fname); |  | ||||||
| 			cn += fnlen; |  | ||||||
| 			*cn++ = '"'; |  | ||||||
| 		} else { |  | ||||||
| 			*cn++ = *co; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	*cn = '\0'; |  | ||||||
| 
 |  | ||||||
| 	if ((pid = fork()) == 0) { |  | ||||||
| 		execlp("/bin/sh", "/bin/sh", "-c", cmdline, NULL); |  | ||||||
| 		warn("could not exec: /bin/sh"); |  | ||||||
| 		exit(1); |  | ||||||
| 	} else if (pid < 0) { |  | ||||||
| 		warn("could not fork. command line was: %s", cmdline); |  | ||||||
| 	} else if (reload) { |  | ||||||
| 		waitpid(pid, &status, 0); |  | ||||||
| 		if (WIFEXITED(status) && WEXITSTATUS(status) == 0) |  | ||||||
| 			ret = 1; |  | ||||||
| 		else |  | ||||||
| 			warn("child exited with non-zero return value: %d. command line was: %s", |  | ||||||
| 			     WEXITSTATUS(status), cmdline); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	free(cmdline); |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void redraw() { | void redraw() { | ||||||
| 	if (mode == MODE_NORMAL) { | 	if (mode == MODE_NORMAL) { | ||||||
| 		img_render(&img, &win); | 		img_render(&img, &win); | ||||||
| @ -128,6 +72,15 @@ void redraw() { | |||||||
| 	timo_redraw = 0; | 	timo_redraw = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Bool keymask(const keymap_t *k, unsigned int state) { | ||||||
|  | 	return (k->ctrl ? ControlMask : 0) == (state & ControlMask); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Bool buttonmask(const button_t *b, unsigned int state) { | ||||||
|  | 	return ((b->ctrl ? ControlMask : 0) | (b->shift ? ShiftMask : 0)) == | ||||||
|  | 	       (state & (ControlMask | ShiftMask)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void on_keypress(XKeyEvent *kev) { | void on_keypress(XKeyEvent *kev) { | ||||||
| 	int i; | 	int i; | ||||||
| 	KeySym ksym; | 	KeySym ksym; | ||||||
| @ -138,38 +91,9 @@ void on_keypress(XKeyEvent *kev) { | |||||||
| 
 | 
 | ||||||
| 	XLookupString(kev, &key, 1, &ksym, NULL); | 	XLookupString(kev, &key, 1, &ksym, NULL); | ||||||
| 
 | 
 | ||||||
| 	if (EXT_COMMANDS && (CLEANMASK(kev->state) & ControlMask)) { |  | ||||||
| 		for (i = 0; i < LEN(commands); i++) { |  | ||||||
| 			if (commands[i].ksym == ksym) { |  | ||||||
| 				win_set_cursor(&win, CURSOR_WATCH); |  | ||||||
| 				if (run_command(commands[i].cmdline, commands[i].reload)) { |  | ||||||
| 					if (mode == MODE_NORMAL) { |  | ||||||
| 						if (fileidx < tns.cnt) |  | ||||||
| 							tns_load(&tns, fileidx, filenames[fileidx], 1); |  | ||||||
| 						img_close(&img, 1); |  | ||||||
| 						load_image(fileidx); |  | ||||||
| 					} else { |  | ||||||
| 						if (!tns_load(&tns, tns.sel, filenames[tns.sel], 0)) { |  | ||||||
| 							remove_file(tns.sel, 0); |  | ||||||
| 							tns.dirty = 1; |  | ||||||
| 							if (tns.sel >= tns.cnt) |  | ||||||
| 								tns.sel = tns.cnt - 1; |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 					redraw(); |  | ||||||
| 				} |  | ||||||
| 				if (mode == MODE_THUMBS) |  | ||||||
| 					win_set_cursor(&win, CURSOR_ARROW); |  | ||||||
| 				else if (!timo_cursor) |  | ||||||
| 					win_set_cursor(&win, CURSOR_NONE); |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; i < LEN(keys); i++) { | 	for (i = 0; i < LEN(keys); i++) { | ||||||
| 		if (ksym == keys[i].ksym && keys[i].handler) { | 		if (keymask(&keys[i], kev->state) && ksym == keys[i].ksym) { | ||||||
| 			if (keys[i].handler(keys[i].arg)) | 			if (keys[i].handler && keys[i].handler(keys[i].arg)) | ||||||
| 				redraw(); | 				redraw(); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| @ -187,10 +111,10 @@ void on_buttonpress(XButtonEvent *bev) { | |||||||
| 		timo_cursor = TO_CURSOR_HIDE; | 		timo_cursor = TO_CURSOR_HIDE; | ||||||
| 
 | 
 | ||||||
| 		for (i = 0; i < LEN(buttons); i++) { | 		for (i = 0; i < LEN(buttons); i++) { | ||||||
| 			if (CLEANMASK(bev->state) == CLEANMASK(buttons[i].mod) && | 			if (buttonmask(&buttons[i], bev->state) && | ||||||
| 			    bev->button == buttons[i].button && buttons[i].handler) | 			    bev->button == buttons[i].button) | ||||||
| 			{ | 			{ | ||||||
| 				if (buttons[i].handler(buttons[i].arg)) | 				if (buttons[i].handler && buttons[i].handler(buttons[i].arg)) | ||||||
| 					redraw(); | 					redraw(); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| @ -379,7 +303,9 @@ int switch_mode(arg_t a) { | |||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int navigate(arg_t n) { | int navigate(arg_t a) { | ||||||
|  | 	int n = (int) a; | ||||||
|  | 
 | ||||||
| 	if (mode == MODE_NORMAL) { | 	if (mode == MODE_NORMAL) { | ||||||
| 		n += fileidx; | 		n += fileidx; | ||||||
| 		if (n < 0) | 		if (n < 0) | ||||||
| @ -437,21 +363,27 @@ int remove_image(arg_t a) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int move(arg_t dir) { | int move(arg_t a) { | ||||||
|  | 	direction_t dir = (direction_t) a; | ||||||
|  | 
 | ||||||
| 	if (mode == MODE_NORMAL) | 	if (mode == MODE_NORMAL) | ||||||
| 		return img_pan(&img, &win, dir, 0); | 		return img_pan(&img, &win, dir, 0); | ||||||
| 	else | 	else | ||||||
| 		return tns_move_selection(&tns, &win, dir); | 		return tns_move_selection(&tns, &win, dir); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int pan_screen(arg_t dir) { | int pan_screen(arg_t a) { | ||||||
|  | 	direction_t dir = (direction_t) a; | ||||||
|  | 
 | ||||||
| 	if (mode == MODE_NORMAL) | 	if (mode == MODE_NORMAL) | ||||||
| 		return img_pan(&img, &win, dir, 1); | 		return img_pan(&img, &win, dir, 1); | ||||||
| 	else | 	else | ||||||
| 		return 0; | 		return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int pan_edge(arg_t dir) { | int pan_edge(arg_t a) { | ||||||
|  | 	direction_t dir = (direction_t) a; | ||||||
|  | 
 | ||||||
| 	if (mode == MODE_NORMAL) | 	if (mode == MODE_NORMAL) | ||||||
| 		return img_pan_edge(&img, &win, dir); | 		return img_pan_edge(&img, &win, dir); | ||||||
| 	else | 	else | ||||||
| @ -459,7 +391,7 @@ int pan_edge(arg_t dir) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Xlib helper function for drag() */ | /* Xlib helper function for drag() */ | ||||||
| Bool ismnotify(Display *d, XEvent *e, XPointer a) { | Bool is_motionnotify(Display *d, XEvent *e, XPointer a) { | ||||||
| 	return e != NULL && e->type == MotionNotify; | 	return e != NULL && e->type == MotionNotify; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -498,7 +430,7 @@ int drag(arg_t a) { | |||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
| 		if (dragging) | 		if (dragging) | ||||||
| 			next = XCheckIfEvent(win.env.dpy, &e, ismnotify, None); | 			next = XCheckIfEvent(win.env.dpy, &e, is_motionnotify, None); | ||||||
| 		if ((!dragging || !next) && (dx != 0 || dy != 0)) { | 		if ((!dragging || !next) && (dx != 0 || dy != 0)) { | ||||||
| 			if (img_move(&img, &win, dx, dy)) | 			if (img_move(&img, &win, dx, dy)) | ||||||
| 				img_render(&img, &win); | 				img_render(&img, &win); | ||||||
| @ -513,7 +445,9 @@ int drag(arg_t a) { | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int rotate(arg_t dir) { | int rotate(arg_t a) { | ||||||
|  | 	direction_t dir = (direction_t) a; | ||||||
|  | 
 | ||||||
| 	if (mode == MODE_NORMAL) { | 	if (mode == MODE_NORMAL) { | ||||||
| 		if (dir == DIR_LEFT) { | 		if (dir == DIR_LEFT) { | ||||||
| 			img_rotate_left(&img, &win); | 			img_rotate_left(&img, &win); | ||||||
| @ -526,7 +460,9 @@ int rotate(arg_t dir) { | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int zoom(arg_t scale) { | int zoom(arg_t a) { | ||||||
|  | 	int scale = (int) a; | ||||||
|  | 
 | ||||||
| 	if (mode != MODE_NORMAL) | 	if (mode != MODE_NORMAL) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	if (scale > 0) | 	if (scale > 0) | ||||||
| @ -537,7 +473,9 @@ int zoom(arg_t scale) { | |||||||
| 		return img_zoom(&img, &win, 1.0); | 		return img_zoom(&img, &win, 1.0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int fit_to_win(arg_t ret) { | int fit_to_win(arg_t a) { | ||||||
|  | 	int ret; | ||||||
|  | 
 | ||||||
| 	if (mode == MODE_NORMAL) { | 	if (mode == MODE_NORMAL) { | ||||||
| 		if ((ret = img_fit_win(&img, &win))) | 		if ((ret = img_fit_win(&img, &win))) | ||||||
| 			img_center(&img, &win); | 			img_center(&img, &win); | ||||||
| @ -547,8 +485,8 @@ int fit_to_win(arg_t ret) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int fit_to_img(arg_t ret) { | int fit_to_img(arg_t a) { | ||||||
| 	int x, y; | 	int ret, x, y; | ||||||
| 	unsigned int w, h; | 	unsigned int w, h; | ||||||
| 
 | 
 | ||||||
| 	if (mode == MODE_NORMAL) { | 	if (mode == MODE_NORMAL) { | ||||||
| @ -565,3 +503,96 @@ int fit_to_img(arg_t ret) { | |||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | int open_with(arg_t a) { | ||||||
|  | 	const char *prog = (const char*) a; | ||||||
|  | 	pid_t pid; | ||||||
|  | 
 | ||||||
|  | 	if (!prog || !*prog) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	if((pid = fork()) == 0) { | ||||||
|  | 		execlp(prog, prog, | ||||||
|  | 		       filenames[mode == MODE_NORMAL ? fileidx : tns.sel], NULL); | ||||||
|  | 		warn("could not exec: %s", prog); | ||||||
|  | 		exit(1); | ||||||
|  | 	} else if (pid < 0) { | ||||||
|  | 		warn("could not for. program was: %s", prog); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int run_command(arg_t a) { | ||||||
|  | 	const char *cline = (const char*) a; | ||||||
|  | 	char *cn, *cmdline; | ||||||
|  | 	const char *co, *fname; | ||||||
|  | 	int fncnt, fnlen, status; | ||||||
|  | 	pid_t pid; | ||||||
|  | 
 | ||||||
|  | 	if (!cline || !*cline) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	/* build command line: */ | ||||||
|  | 	fncnt = 0; | ||||||
|  | 	co = cline - 1; | ||||||
|  | 	while ((co = strchr(co + 1, '#'))) | ||||||
|  | 		fncnt++; | ||||||
|  | 	if (!fncnt) | ||||||
|  | 		return 0; | ||||||
|  | 	fname = filenames[mode == MODE_NORMAL ? fileidx : tns.sel]; | ||||||
|  | 	fnlen = strlen(fname); | ||||||
|  | 	cn = cmdline = (char*) s_malloc((strlen(cline) + fncnt * (fnlen + 2)) * | ||||||
|  | 	                                sizeof(char)); | ||||||
|  | 	/* replace all '#' with filename: */ | ||||||
|  | 	for (co = cline; *co; co++) { | ||||||
|  | 		if (*co == '#') { | ||||||
|  | 			*cn++ = '"'; | ||||||
|  | 			strcpy(cn, fname); | ||||||
|  | 			cn += fnlen; | ||||||
|  | 			*cn++ = '"'; | ||||||
|  | 		} else { | ||||||
|  | 			*cn++ = *co; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	*cn = '\0'; | ||||||
|  | 
 | ||||||
|  | 	win_set_cursor(&win, CURSOR_WATCH); | ||||||
|  | 
 | ||||||
|  | 	if ((pid = fork()) == 0) { | ||||||
|  | 		execl("/bin/sh", "/bin/sh", "-c", cmdline, NULL); | ||||||
|  | 		warn("could not exec: /bin/sh"); | ||||||
|  | 		exit(1); | ||||||
|  | 	} else if (pid < 0) { | ||||||
|  | 		warn("could not fork. command line was: %s", cmdline); | ||||||
|  | 		goto end; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	waitpid(pid, &status, 0); | ||||||
|  | 	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) | ||||||
|  | 		warn("child exited with non-zero return value: %d. command line was: %s", | ||||||
|  | 		     WEXITSTATUS(status), cmdline); | ||||||
|  | 	 | ||||||
|  | 	if (mode == MODE_NORMAL) { | ||||||
|  | 		if (fileidx < tns.cnt) | ||||||
|  | 			tns_load(&tns, fileidx, filenames[fileidx], 1); | ||||||
|  | 		img_close(&img, 1); | ||||||
|  | 		load_image(fileidx); | ||||||
|  | 	} else { | ||||||
|  | 		if (!tns_load(&tns, tns.sel, filenames[tns.sel], 0)) { | ||||||
|  | 			remove_file(tns.sel, 0); | ||||||
|  | 			tns.dirty = 1; | ||||||
|  | 			if (tns.sel >= tns.cnt) | ||||||
|  | 				tns.sel = tns.cnt - 1; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | end: | ||||||
|  | 	if (mode == MODE_THUMBS) | ||||||
|  | 		win_set_cursor(&win, CURSOR_ARROW); | ||||||
|  | 	/* else: cursor is reset in redraw() */ | ||||||
|  | 
 | ||||||
|  | 	free(cmdline); | ||||||
|  | 
 | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								events.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								events.h
									
									
									
									
									
								
							| @ -21,22 +21,18 @@ | |||||||
| 
 | 
 | ||||||
| #include <X11/Xlib.h> | #include <X11/Xlib.h> | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef void* arg_t; | ||||||
| 	KeySym ksym; |  | ||||||
| 	Bool reload; |  | ||||||
| 	const char *cmdline; |  | ||||||
| } command_t; |  | ||||||
| 
 |  | ||||||
| typedef int arg_t; |  | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  | 	Bool ctrl; | ||||||
| 	KeySym ksym; | 	KeySym ksym; | ||||||
| 	int (*handler)(arg_t); | 	int (*handler)(arg_t); | ||||||
| 	arg_t arg; | 	arg_t arg; | ||||||
| } keymap_t; | } keymap_t; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| 	unsigned int mod; | 	Bool ctrl; | ||||||
|  | 	Bool shift; | ||||||
| 	unsigned int button; | 	unsigned int button; | ||||||
| 	int (*handler)(arg_t); | 	int (*handler)(arg_t); | ||||||
| 	arg_t arg; | 	arg_t arg; | ||||||
| @ -63,5 +59,7 @@ int rotate(arg_t); | |||||||
| int zoom(arg_t); | int zoom(arg_t); | ||||||
| int fit_to_win(arg_t); | int fit_to_win(arg_t); | ||||||
| int fit_to_img(arg_t); | int fit_to_img(arg_t); | ||||||
|  | int open_with(arg_t); | ||||||
|  | int run_command(arg_t); | ||||||
| 
 | 
 | ||||||
| #endif /* EVENTS_H */ | #endif /* EVENTS_H */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert