diff options
Diffstat (limited to 'src/libui_sdl/libui/unix')
-rw-r--r-- | src/libui_sdl/libui/unix/button.c | 2 | ||||
-rw-r--r-- | src/libui_sdl/libui/unix/window.c | 75 |
2 files changed, 73 insertions, 4 deletions
diff --git a/src/libui_sdl/libui/unix/button.c b/src/libui_sdl/libui/unix/button.c index 00a87f4..b0500e3 100644 --- a/src/libui_sdl/libui/unix/button.c +++ b/src/libui_sdl/libui/unix/button.c @@ -50,6 +50,8 @@ uiButton *uiNewButton(const char *text) g_signal_connect(b->widget, "clicked", G_CALLBACK(onClicked), b); uiButtonOnClicked(b, defaultOnClicked, NULL); + + gtk_widget_set_size_request(b->widget, 64, 1); return b; } diff --git a/src/libui_sdl/libui/unix/window.c b/src/libui_sdl/libui/unix/window.c index a908f88..a3dde76 100644 --- a/src/libui_sdl/libui/unix/window.c +++ b/src/libui_sdl/libui/unix/window.c @@ -19,6 +19,8 @@ struct uiWindow { uiControl *child; int margined; + + int width, height; int (*onClosing)(uiWindow *, void *); void *onClosingData; @@ -127,6 +129,20 @@ static void uiWindowShow(uiControl *c) // don't use gtk_widget_show(); that doesn't bring to front or give keyboard focus // (gtk_window_present() does call gtk_widget_show() though) gtk_window_present(w->window); + + // set the size properly + int width = w->width; + int height = w->height; + if (w->menubar) + { + GtkRequisition min, nat; + int menuheight; + gtk_widget_get_preferred_size(w->menubar, &min, &nat); + menuheight = min.height; + if (nat.height > menuheight) menuheight = nat.height; + height += menuheight; + } + gtk_window_resize(w->window, width, height); } uiUnixControlDefaultHide(uiWindow) @@ -134,6 +150,7 @@ uiUnixControlDefaultEnabled(uiWindow) uiUnixControlDefaultEnable(uiWindow) uiUnixControlDefaultDisable(uiWindow) uiUnixControlDefaultSetFocus(uiWindow) +uiUnixControlDefaultSetMinSize(uiWindow) // TODO? uiUnixControlDefaultSetContainer(uiWindow) @@ -269,9 +286,57 @@ void uiWindowSetMargined(uiWindow *w, int margined) setMargined(w->childHolderContainer, w->margined); } +static void onDragDataReceived(GtkWidget* widget, GdkDragContext* ctx, gint x, gint y, GtkSelectionData* data, guint info, guint time, gpointer userdata) +{ + uiWindow* w = (uiWindow*)userdata; + + if (gtk_selection_data_get_length(data) > 0 && gtk_selection_data_get_format(data) == 8) + { + gchar** files = gtk_selection_data_get_uris(data); + if (files != NULL && files[0] != NULL) + { + // TODO: multi file support? + + gboolean success = FALSE; + + gchar* file = g_filename_from_uri(files[0], NULL, NULL); + if (file) + { + if (w->onDropFile) + w->onDropFile(w, file, w->onDropFileData); + + success = TRUE; + g_free(file); + } + + + g_strfreev(files); + gtk_drag_finish(ctx, success, FALSE, time); + return; + } + + if (files != NULL) g_strfreev(files); + gtk_drag_finish(ctx, FALSE, FALSE, time); + } +} + void uiWindowSetDropTarget(uiWindow* w, int drop) { - printf("DRAG DROP TODO!!!!!\n"); + if (!drop) + { + gtk_drag_dest_unset(w->widget); + return; + } + + GtkTargetEntry entry; + entry.target = "text/uri-list"; + entry.flags = GTK_TARGET_OTHER_APP; + entry.info = 1; + + // CHECKME: action copy? + gtk_drag_dest_set(w->widget, GTK_DEST_DEFAULT_ALL, &entry, 1, GDK_ACTION_COPY|GDK_ACTION_MOVE); + + g_signal_connect(w->widget, "drag-data-received", G_CALLBACK(onDragDataReceived), w); } uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, int resizable) @@ -298,6 +363,8 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, w->menubar = makeMenubar(uiWindow(w)); gtk_container_add(w->vboxContainer, w->menubar); } + else + w->menubar = NULL; w->childHolderWidget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); w->childHolderContainer = GTK_CONTAINER(w->childHolderWidget); @@ -307,9 +374,6 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, gtk_widget_set_valign(w->childHolderWidget, GTK_ALIGN_FILL); gtk_box_set_homogeneous(GTK_BOX(w->childHolderWidget), TRUE); gtk_container_add(w->vboxContainer, w->childHolderWidget); - - // set client size proper - gtk_widget_set_size_request(w->childHolderWidget, width, height); // show everything in the vbox, but not the GtkWindow itself gtk_widget_show_all(w->vboxWidget); @@ -332,6 +396,9 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, g_object_ref(w->widget); gtk_window_set_resizable(w->window, resizable?TRUE:FALSE); + + w->width = width; + w->height = height; return w; } |