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 | PREFIX?=/usr/local | ||||||
| CFLAGS+= -Wall -pedantic -DVERSION=\"$(VERSION)\" | CFLAGS+= -Wall -pedantic -DVERSION=\"$(VERSION)\" | ||||||
| LDFLAGS+=  | LDFLAGS+=  | ||||||
| LIBS+= -lX11 -lImlib2 | LIBS+= -lX11 -lImlib2 -lpthread | ||||||
| 
 | 
 | ||||||
| SRCFILES=$(wildcard *.c) | SRCFILES=$(wildcard *.c) | ||||||
| OBJFILES=$(SRCFILES:.c=.o) | OBJFILES=$(SRCFILES:.c=.o) | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								main.c
									
									
									
									
									
								
							| @ -473,7 +473,7 @@ void run() { | |||||||
| 	timeout = 0; | 	timeout = 0; | ||||||
| 
 | 
 | ||||||
| 	while (1) { | 	while (1) { | ||||||
| 		if (timeout) { | 		if (timeout || (mode == MODE_THUMBS && !tns.loaded)) { | ||||||
| 			t.tv_sec = 0; | 			t.tv_sec = 0; | ||||||
| 			t.tv_usec = 250; | 			t.tv_usec = 250; | ||||||
| 			xfd = ConnectionNumber(win.env.dpy); | 			xfd = ConnectionNumber(win.env.dpy); | ||||||
| @ -486,6 +486,9 @@ void run() { | |||||||
| 					img_render(&img, &win); | 					img_render(&img, &win); | ||||||
| 				else | 				else | ||||||
| 					tns_render(&tns, &win); | 					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 <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <pthread.h> | ||||||
| 
 | 
 | ||||||
| #include <Imlib2.h> | #include <Imlib2.h> | ||||||
| 
 | 
 | ||||||
| @ -24,23 +26,28 @@ | |||||||
| #include "thumbs.h" | #include "thumbs.h" | ||||||
| #include "util.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; | 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; | 	int i, w, h; | ||||||
| 	float z, zw, zh; | 	float z, zw, zh; | ||||||
|  | 	tload_t *tl; | ||||||
| 	thumb_t *t; | 	thumb_t *t; | ||||||
| 	Imlib_Image *im; | 	Imlib_Image *im; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || !win || !fnames || !fcnt) | 	tl = (tload_t*) arg; | ||||||
| 		return; |  | ||||||
| 
 | 
 | ||||||
| 	tns->thumbs = (thumb_t*) s_malloc(fcnt * sizeof(thumb_t)); | 	for (i = 0; i < tl->tns->cnt; ++i) { | ||||||
| 	tns->cnt = fcnt; | 		if (!(im = imlib_load_image(tl->filenames[i]))) | ||||||
| 	tns->loaded = 0; |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; i < fcnt; ++i) { |  | ||||||
| 		if (!(im = imlib_load_image(fnames[i]))) |  | ||||||
| 			continue; | 			continue; | ||||||
| 
 | 
 | ||||||
| 		imlib_context_set_image(im); | 		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; | 		zh = (float) THUMB_SIZE / (float) h; | ||||||
| 		z = MIN(zw, zh); | 		z = MIN(zw, zh); | ||||||
| 
 | 
 | ||||||
| 		t = &tns->thumbs[i]; | 		t = &tl->tns->thumbs[i]; | ||||||
| 		t->w = z * w; | 		t->w = z * w; | ||||||
| 		t->h = z * h; | 		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_context_set_drawable(t->pm); | ||||||
| 		imlib_render_image_part_on_drawable_at_size(0, 0, w, h, | 		imlib_render_image_part_on_drawable_at_size(0, 0, w, h, | ||||||
| 		                                            0, 0, t->w, t->h); | 		                                            0, 0, t->w, t->h); | ||||||
|  | 		t->loaded = 1; | ||||||
| 		imlib_free_image(); | 		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) { | 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; | 	i = tns->first; | ||||||
| 
 | 
 | ||||||
| 	while (i < cnt) { | 	while (i < cnt) { | ||||||
|  | 		if (!tns->thumbs[i].loaded) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
| 		tns->thumbs[i].x = x + (THUMB_SIZE - tns->thumbs[i].w) / 2; | 		tns->thumbs[i].x = x + (THUMB_SIZE - tns->thumbs[i].w) / 2; | ||||||
| 		tns->thumbs[i].y = y + (THUMB_SIZE - tns->thumbs[i].h) / 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, | 		win_draw_pixmap(win, tns->thumbs[i].pm, tns->thumbs[i].x, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert