XtAppSetExitFlag(app);
}
-void AppExecProc(XtWorkProc proc, XtPointer data) {
- EventLoopCB cb;
- cb.proc = proc;
- cb.data = data;
- write(event_pipe[1], &cb, sizeof(cb));
-}
-
CxList* GetOpenFileArgs(void) {
return open_file_arg;
}
void ApplicationExit(void);
-void AppExecProc(XtWorkProc proc, XtPointer data);
-
CxList* GetOpenFileArgs(void);
void CleanOpenFileArgs(void);
return 0;
}
-static Boolean update_player_window(XtPointer data) {
+static int update_player_window(void *data) {
MainWindow *win = data;
WindowUpdate(win);
return 0;
win->player = player;
// update main window
- AppExecProc(update_player_window, win);
+ ui_call_mainthread(update_player_window, win);
// IO
player_io(player);
//json_print(v, NULL, 0);
}
-static Boolean player_widget_set_size(XtPointer data) {
+static int player_widget_set_size(void *data) {
Player *player = data;
MainWindow *win = GetMainWindow();
player->height = height;
}
if(player->width > 0 && player->height > 0) {
- AppExecProc(player_widget_set_size, player);
+ ui_call_mainthread(player_widget_set_size, player);
}
}
}
}
-static Boolean get_player_window(XtPointer data) {
+static int get_player_window(void *data) {
Player *p = data;
MainWindow *win = GetMainWindow();
#define CURSOR_AUTOHIDE_THRESHOLD_SEC 4
-static Boolean hide_cursor(XtPointer data) {
+static int hide_cursor(void *data) {
MainWindow *win = data;
WindowHidePlayerCursor(win);
return 0;
if(win->cursorhidden) return;
if(p->playback_time - win->motion_playback_time > CURSOR_AUTOHIDE_THRESHOLD_SEC) {
- AppExecProc(hide_cursor, win);
+ ui_call_mainthread(hide_cursor, win);
}
}
write(p->ipc, cmd, strlen(cmd));
p->isstarted = TRUE;
- AppExecProc(get_player_window, p);
+ ui_call_mainthread(get_player_window, p);
}
}
}
}
-static Boolean play_next(XtPointer data) {
+static int play_next(void *data) {
MainWindow *win = GetMainWindow();
PlayListPlayNext(win, false);
return 0;
cmd = "{ \"command\": [\"set_property\", \"pause\", false] }\n";
write(p->ipc, cmd, strlen(cmd));
} else {
- AppExecProc(play_next, NULL);
+ ui_call_mainthread(play_next, NULL);
}
}
return NULL;
}
-static Boolean finish_bin_search(XtPointer data) {
+static int finish_bin_search(void *data) {
PlayerInfo *playerInfo = data;
cxMapPut(uwp_settings, cx_hash_key_str(UWP_PLAYER_BIN), playerInfo->bin);
cxMapPut(uwp_settings, cx_hash_key_str(UWP_PLAYER_TYPE), playerInfo->type);
PlayerInfo *playerInfo = malloc(sizeof(PlayerInfo));
playerInfo->bin = strdup(bin);
playerInfo->type = strdup("mpv");
- AppExecProc(finish_bin_search, playerInfo);
+ ui_call_mainthread(finish_bin_search, playerInfo);
cxBufferDestroy(&buf);
return NULL;
PlayerInfo *playerInfo = malloc(sizeof(PlayerInfo));
playerInfo->bin = strdup(bin);
playerInfo->type = strdup("mplayer");
- AppExecProc(finish_bin_search, playerInfo);
+ ui_call_mainthread(finish_bin_search, playerInfo);
}
}
static Boolean clearPlaylist = TRUE;
-static Boolean cmd_open(XtPointer data) {
+static int cmd_open(void *data) {
MainWindow *win = GetMainWindow();
char *file = data;
printf("open %s\n", file);
if(cx_strprefix(msg, CX_STR("open "))) {
cxstring file = cx_strsubs(msg, 5);
cxmutstr mfile = cx_strdup(file);
- AppExecProc(cmd_open, mfile.ptr);
+ ui_call_mainthread(cmd_open, mfile.ptr);
} else {
fprintf(stderr, "unknown instance command: {%.*s}\n", (int)msg.length, msg.ptr);
}
return TRUE;
}
+static Boolean ui_mainthread_job(void *data) {
+ UiJob *job = data;
+ if(job->job_func) {
+ job->job_func(job->job_data);
+ }
+ free(job);
+ return TRUE;
+}
+
static void* ui_jobthread(void *data) {
UiJob *job = data;
int result = job->job_func(job->job_data);
return NULL;
}
+void ui_call_mainthread(ui_threadfunc tf, void* td) {
+ UiJob *job = malloc(sizeof(UiJob));
+ memset(job, 0, sizeof(UiJob));
+ job->job_func = tf;
+ job->job_data = td;
+ write(event_pipe[1], &job, sizeof(void*)); // hack
+ XtAppAddWorkProc(app, ui_mainthread_job, job);
+}
+
void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd) {
UiJob *job = malloc(sizeof(UiJob));
job->obj = obj;