diff -r 9a5f47fbc5c3 -r 458831c574f4 ui/gtk/toolkit.c --- a/ui/gtk/toolkit.c Sat Apr 12 13:44:53 2014 +0200 +++ b/ui/gtk/toolkit.c Sat May 10 15:43:22 2014 +0200 @@ -32,14 +32,20 @@ #include "toolkit.h" #include "toolbar.h" +#include "model.h" +#include "image.h" #include "../common/document.h" #include "../common/properties.h" +#include + static char *application_name; static ui_callback appclose_fnc; static void *appclose_udata; +static UiObject *active_window; + void ui_init(char *appname, int argc, char **argv) { gtk_init(&argc, &argv); application_name = appname; @@ -48,7 +54,9 @@ ui_toolbar_init(); // init custom types - //ui_list_init(); + ui_list_init(); + + ui_image_init(); uic_load_app_properties(); } @@ -57,9 +65,9 @@ return application_name; } -void ui_exitfunc(ui_callback f, void *udata) { +void ui_exitfunc(ui_callback f, void *userdata) { appclose_fnc = f; - appclose_udata = udata; + appclose_udata = userdata; } void ui_openfilefunc(ui_callback f, void *userdata) { @@ -79,10 +87,62 @@ gtk_widget_show_all(obj->widget); } +void ui_close(UiObject *obj) { + gtk_widget_destroy(obj->widget); +} + + +static gboolean ui_job_finished(void *data) { + UiJob *job = data; + + UiEvent event; + event.obj = job->obj; + event.window = job->obj->window; + event.document = job->obj->document; + event.intval = 0; + event.eventdata = NULL; + + job->finish_callback(&event, job->finish_data); + free(job); + return FALSE; +} + +static void* ui_jobthread(void *data) { + UiJob *job = data; + int result = job->job_func(job->job_data); + if(!result) { + g_idle_add(ui_job_finished, job); + } +} + +void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd) { + UiJob *job = malloc(sizeof(UiJob)); + job->obj = obj; + job->job_func = tf; + job->job_data = td; + job->finish_callback = f; + job->finish_data = fd; + pthread_t pid; + pthread_create(&pid, NULL, ui_jobthread, job); +} + void ui_set_enabled(UIWIDGET widget, int enabled) { gtk_widget_set_sensitive(widget, enabled); } +void ui_set_show_all(UIWIDGET widget, int value) { + gtk_widget_set_no_show_all(widget, !value); +} + +void ui_set_visible(UIWIDGET widget, int visible) { + if(visible) { + gtk_widget_set_no_show_all(widget, FALSE); + gtk_widget_show_all(widget); + } else { + gtk_widget_hide(widget); + } +} + void ui_clipboard_set(char *str) { GtkClipboard *cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text(cb, str, strlen(str)); @@ -103,3 +163,11 @@ void ui_destroy_userdata(GtkWidget *object, void *userdata) { free(userdata); } + +void ui_set_active_window(UiObject *obj) { + active_window = obj; +} + +UiObject *ui_get_active_window() { + return active_window; +}