Use pthread to load thumbnails
This commit is contained in:
		
							parent
							
								
									26c2179be7
								
							
						
					
					
						commit
						e0d0892065
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -6,7 +6,7 @@ CC?=gcc | ||||
| PREFIX?=/usr/local | ||||
| CFLAGS+= -Wall -pedantic -DVERSION=\"$(VERSION)\" | ||||
| LDFLAGS+=  | ||||
| LIBS+= -lX11 -lImlib2 | ||||
| LIBS+= -lX11 -lImlib2 -lpthread | ||||
| 
 | ||||
| SRCFILES=$(wildcard *.c) | ||||
| OBJFILES=$(SRCFILES:.c=.o) | ||||
|  | ||||
							
								
								
									
										5
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								main.c
									
									
									
									
									
								
							| @ -473,7 +473,7 @@ void run() { | ||||
| 	timeout = 0; | ||||
| 
 | ||||
| 	while (1) { | ||||
| 		if (timeout) { | ||||
| 		if (timeout || (mode == MODE_THUMBS && !tns.loaded)) { | ||||
| 			t.tv_sec = 0; | ||||
| 			t.tv_usec = 250; | ||||
| 			xfd = ConnectionNumber(win.env.dpy); | ||||
| @ -486,6 +486,9 @@ void run() { | ||||
| 					img_render(&img, &win); | ||||
| 				else | ||||
| 					tns_render(&tns, &win); | ||||
| 
 | ||||
| 				if (mode == MODE_THUMBS && !tns.loaded && !XPending(win.env.dpy)) | ||||
| 					continue; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										59
									
								
								thumbs.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								thumbs.c
									
									
									
									
									
								
							| @ -17,6 +17,8 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <pthread.h> | ||||
| 
 | ||||
| #include <Imlib2.h> | ||||
| 
 | ||||
| @ -24,23 +26,28 @@ | ||||
| #include "thumbs.h" | ||||
| #include "util.h" | ||||
| 
 | ||||
| typedef struct tload_s { | ||||
| 	const char **filenames; | ||||
| 	tns_t *tns; | ||||
| 	win_t *win; | ||||
| } tload_t; | ||||
| 
 | ||||
| const int thumb_dim = THUMB_SIZE + 10; | ||||
| 
 | ||||
| void tns_load(tns_t *tns, win_t *win, const char **fnames, int fcnt) { | ||||
| pthread_t loader; | ||||
| tload_t tinfo; | ||||
| 
 | ||||
| void* thread_load(void *arg) { | ||||
| 	int i, w, h; | ||||
| 	float z, zw, zh; | ||||
| 	tload_t *tl; | ||||
| 	thumb_t *t; | ||||
| 	Imlib_Image *im; | ||||
| 
 | ||||
| 	if (!tns || !win || !fnames || !fcnt) | ||||
| 		return; | ||||
| 	tl = (tload_t*) arg; | ||||
| 
 | ||||
| 	tns->thumbs = (thumb_t*) s_malloc(fcnt * sizeof(thumb_t)); | ||||
| 	tns->cnt = fcnt; | ||||
| 	tns->loaded = 0; | ||||
| 
 | ||||
| 	for (i = 0; i < fcnt; ++i) { | ||||
| 		if (!(im = imlib_load_image(fnames[i]))) | ||||
| 	for (i = 0; i < tl->tns->cnt; ++i) { | ||||
| 		if (!(im = imlib_load_image(tl->filenames[i]))) | ||||
| 			continue; | ||||
| 
 | ||||
| 		imlib_context_set_image(im); | ||||
| @ -51,16 +58,43 @@ void tns_load(tns_t *tns, win_t *win, const char **fnames, int fcnt) { | ||||
| 		zh = (float) THUMB_SIZE / (float) h; | ||||
| 		z = MIN(zw, zh); | ||||
| 
 | ||||
| 		t = &tns->thumbs[i]; | ||||
| 		t = &tl->tns->thumbs[i]; | ||||
| 		t->w = z * w; | ||||
| 		t->h = z * h; | ||||
| 
 | ||||
| 		t->pm = win_create_pixmap(win, t->w, t->h); | ||||
| 		t->pm = win_create_pixmap(tl->win, t->w, t->h); | ||||
| 		imlib_context_set_drawable(t->pm); | ||||
| 		imlib_render_image_part_on_drawable_at_size(0, 0, w, h, | ||||
| 		                                            0, 0, t->w, t->h); | ||||
| 		t->loaded = 1; | ||||
| 		imlib_free_image(); | ||||
| 	} | ||||
| 
 | ||||
| 	tl->tns->loaded = 1; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void tns_load(tns_t *tns, win_t *win, const char **fnames, int fcnt) { | ||||
| 	pthread_attr_t tattr; | ||||
| 
 | ||||
| 	if (!tns || !win || !fnames || !fcnt) | ||||
| 		return; | ||||
| 	 | ||||
| 	tns->thumbs = (thumb_t*) s_malloc(fcnt * sizeof(thumb_t)); | ||||
| 	memset(tns->thumbs, 0, fcnt * sizeof(thumb_t)); | ||||
| 	tns->cnt = fcnt; | ||||
| 	tns->loaded = 0; | ||||
| 
 | ||||
| 	tinfo.filenames = fnames; | ||||
| 	tinfo.tns = tns; | ||||
| 	tinfo.win = win; | ||||
| 
 | ||||
| 	pthread_attr_init(&tattr); | ||||
| 	pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE); | ||||
| 
 | ||||
| 	if (pthread_create(&loader, &tattr, thread_load, (void*) &tinfo)) | ||||
| 		die("could not create thread"); | ||||
| } | ||||
| 
 | ||||
| void tns_free(tns_t *tns, win_t *win) { | ||||
| @ -96,6 +130,9 @@ void tns_render(tns_t *tns, win_t *win) { | ||||
| 	i = tns->first; | ||||
| 
 | ||||
| 	while (i < cnt) { | ||||
| 		if (!tns->thumbs[i].loaded) | ||||
| 			continue; | ||||
| 
 | ||||
| 		tns->thumbs[i].x = x + (THUMB_SIZE - tns->thumbs[i].w) / 2; | ||||
| 		tns->thumbs[i].y = y + (THUMB_SIZE - tns->thumbs[i].h) / 2; | ||||
| 		win_draw_pixmap(win, tns->thumbs[i].pm, tns->thumbs[i].x, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert