From 8b7714707e87d73b90ca8772f379c1ab1751433c Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Thu, 6 Jan 2022 12:08:16 +0100 Subject: [PATCH] add search for mpv/mplayer binary --- application/main.c | 4 +++ application/main.h | 8 ++++-- application/settings.c | 77 ++++++++++++++++++++++++++++++++++++++++++-------- application/settings.h | 5 ++++ 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/application/main.c b/application/main.c index 29f6ba9..6dcca3b 100644 --- a/application/main.c +++ b/application/main.c @@ -89,3 +89,7 @@ XtAppContext* GetAppContext(void) { void ApplicationExit(void) { XtAppSetExitFlag(app); } + +void AppAddTimeOut(unsigned long interval, XtTimerCallbackProc proc, XtPointer data) { + XtAppAddTimeOut(app, interval, proc, data); +} diff --git a/application/main.h b/application/main.h index b16f5ec..7a233c2 100644 --- a/application/main.h +++ b/application/main.h @@ -20,8 +20,8 @@ * DEALINGS IN THE SOFTWARE. */ -#ifndef MAIN_H -#define MAIN_H +#ifndef UWP_MAIN_H +#define UWP_MAIN_H #include @@ -36,10 +36,12 @@ XtAppContext* GetAppContext(void); void ApplicationExit(void); +void AppAddTimeOut(unsigned long interval, XtTimerCallbackProc proc, XtPointer data); + #ifdef __cplusplus } #endif -#endif /* MAIN_H */ +#endif /* UWPMAIN_H */ diff --git a/application/settings.c b/application/settings.c index d651a81..22793b4 100644 --- a/application/settings.c +++ b/application/settings.c @@ -31,10 +31,13 @@ #include #include +#include "main.h" #include "utils.h" #include #include +#include +#include #define CONFIG_BASE_DIR ".config" #define UWP_CONFIG_DIR "uwplayer" @@ -84,18 +87,20 @@ int load_settings(void) { char *cfgfile_path = util_concat_path(uwp_config_dir, UWP_CONFIG_FILE); FILE *cfgfile = fopen(cfgfile_path, "r"); free(cfgfile_path); - if(!cfgfile) return 0; int ret = 0; - if(ucx_properties_load(uwp_settings, cfgfile)) { - fprintf(stderr, "Error: Cannot read uwplayer settings\n"); - ret = 1; - } - fclose(cfgfile); - - if(ret) { - return ret; + if(cfgfile) { + if(ucx_properties_load(uwp_settings, cfgfile)) { + fprintf(stderr, "Error: Cannot read uwplayer settings\n"); + ret = 1; + } + fclose(cfgfile); + + if(ret) { + return ret; + } } + // check if mpv or mplayer binaries are configured char *player_bin = ucx_map_cstr_get(uwp_settings, UWP_PLAYER_BIN); @@ -112,9 +117,59 @@ int load_settings(void) { return 0; } +static char* get_which_output(FILE *f, UcxBuffer *buf) { + buf->pos = 0; + buf->size = 0; + ucx_stream_copy(f, buf, (read_func)fread, (write_func)ucx_buffer_write); + if(!pclose(f)) { + ucx_buffer_putc(buf, 0); + size_t i; + for(i=0;ipos;i++) { + if(buf->space[i] == '\n') { + buf->space[i] = 0; + break; + } + } + return buf->space; + } + return NULL; +} + +static void finish_bin_search(XtPointer data, XtIntervalId *id) { + PlayerInfo *playerInfo = data; + ucx_map_cstr_put(uwp_settings, UWP_PLAYER_BIN, playerInfo->bin); + ucx_map_cstr_put(uwp_settings, UWP_PLAYER_TYPE, playerInfo->type); + free(playerInfo); +} + static void* player_bin_search_thread(void *data) { - // TODO: - //printf("search\n"); + UcxBuffer *buf = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND); + + FILE *f = popen("which mpv", "r"); + if(f) { + char *bin = get_which_output(f, buf); + if(bin) { + PlayerInfo *playerInfo = malloc(sizeof(PlayerInfo)); + playerInfo->bin = strdup(bin); + playerInfo->type = strdup("mpv"); + AppAddTimeOut(0, finish_bin_search, playerInfo); + + ucx_buffer_free(buf); + return NULL; + } + } + + f = popen("which mplayer", "r"); + if(f) { + char *bin = get_which_output(f, buf); + if(bin) { + PlayerInfo *playerInfo = malloc(sizeof(PlayerInfo)); + playerInfo->bin = strdup(bin); + playerInfo->type = strdup("mplayer"); + AppAddTimeOut(0, finish_bin_search, playerInfo); + } + } + ucx_buffer_free(buf); return NULL; } diff --git a/application/settings.h b/application/settings.h index b7ada4e..57be624 100644 --- a/application/settings.h +++ b/application/settings.h @@ -29,6 +29,11 @@ extern "C" { #define UWP_PLAYER_BIN "player" #define UWP_PLAYER_TYPE "player_type" + +typedef struct PlayerInfo { + char *bin; + char *type; +} PlayerInfo; int load_settings(void); -- 1.8.3.1