aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/unix
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/unix')
-rw-r--r--src/libui_sdl/libui/unix/button.c2
-rw-r--r--src/libui_sdl/libui/unix/window.c75
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;
}