#include #include #include #include #include #include "pickfile.h" #ifndef USE_GTK_PICKFILE char *get_file_path(char *prompt, char *path) { char *argvp[5] = {"yzpickfile", "-p", prompt, "-d", path}; char *argv[5]; char *result; int i; for(i=0;i<5;i++)argv[i] = argvp[i]; result = pickfile_main(5, argv); if(!strcmp(result, "/../cancel"))return 0; return result; } #else /*struct async_dialog_params { FILE *pipe; void (*callback)(char *selection); }; void *async_open_dialog_listener(void *arg) { struct async_dialog_params *par = arg; char result[1024]; fscanf(par->pipe, "%[^\n]", result); pclose(par->pipe); if(!strcmp(result, "/../cancel"))par->callback(0); else par->callback(result); free(par); return 0; } int async_open_dialog(char *prompt, char *path, void (*callback)(char *selection)) { char command[1024]; FILE *pipe; struct async_dialog_params *par; pthread_t pth; sprintf(command, "yzpickfile -p %s -d %s", prompt, path); pipe = popen(command, "r"); if(!pipe) { perror("unable to open a pipe to yzPickFile"); return -1; } par = malloc(sizeof(*par)); par->pipe = pipe; par->callback = callback; pthread_create(&pth, 0, async_open_dialog_listener, par); pthread_detach(pth); return 0; }*/ char *gtk_filesel(char *prompt, char *pattern); char *get_file_path(char *prompt, char *path) { int pid, p[2], len, rc; char *result; pipe(p); if(pid = fork()) { while(waitpid(pid, &rc, WNOHANG) != pid) yzGetUnfilteredEvent(100); if(!WIFEXITED(rc) || WEXITSTATUS(rc) != 0)return 0; result = malloc(1024); len = read(p[0], result, 1023); close(p[0]); close(p[1]); if(len<=0) { free(result); fprintf(stderr, "unexpected error: gtkfile child didn't write to us\n"); return 0; } result[len] = 0; return result; } else { result = gtk_filesel(prompt, path); if(result && result[0]) write(p[1], result, strlen(result)); exit(result?0:-1); } } #endif