diff -r b34bd1557c6c -r 77254bd6dccb ui/gtk/image.c --- a/ui/gtk/image.c Sat Apr 05 17:57:04 2025 +0200 +++ b/ui/gtk/image.c Sun Jul 20 22:04:39 2025 +0200 @@ -63,7 +63,7 @@ #endif -UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) { +UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args) { UiObject *current = uic_current_obj(obj); GtkWidget *drawingarea = gtk_drawing_area_new(); @@ -78,10 +78,10 @@ widget = eventbox; #endif - if(args.scrollarea) { + if(args->scrollarea) { toplevel = SCROLLEDWINDOW_NEW(); SCROLLEDWINDOW_SET_CHILD(toplevel, widget); - args.adjustwidgetsize = TRUE; + args->adjustwidgetsize = TRUE; } else { toplevel = widget; } @@ -89,29 +89,29 @@ UiImageViewer *imgviewer = malloc(sizeof(UiImageViewer)); memset(imgviewer, 0, sizeof(UiImageViewer)); imgviewer->obj = obj; - imgviewer->onbuttonpress = args.onbuttonpress; - imgviewer->onbuttonpressdata = args.onbuttonpressdata; - imgviewer->onbuttonrelease = args.onbuttonrelease; - imgviewer->onbuttonreleasedata = args.onbuttonreleasedata; - if(args.image_padding > 0) { - imgviewer->padding_left = args.image_padding; - imgviewer->padding_right = args.image_padding; - imgviewer->padding_top = args.image_padding; - imgviewer->padding_bottom = args.image_padding; + imgviewer->onbuttonpress = args->onbuttonpress; + imgviewer->onbuttonpressdata = args->onbuttonpressdata; + imgviewer->onbuttonrelease = args->onbuttonrelease; + imgviewer->onbuttonreleasedata = args->onbuttonreleasedata; + if(args->image_padding > 0) { + imgviewer->padding_left = args->image_padding; + imgviewer->padding_right = args->image_padding; + imgviewer->padding_top = args->image_padding; + imgviewer->padding_bottom = args->image_padding; } else { - imgviewer->padding_left = args.image_padding_left; - imgviewer->padding_right = args.image_padding_right; - imgviewer->padding_top = args.image_padding_top; - imgviewer->padding_bottom = args.image_padding_bottom; + imgviewer->padding_left = args->image_padding_left; + imgviewer->padding_right = args->image_padding_right; + imgviewer->padding_top = args->image_padding_top; + imgviewer->padding_bottom = args->image_padding_bottom; } - imgviewer->adjustwidgetsize = args.adjustwidgetsize; - imgviewer->autoscale = args.autoscale; - imgviewer->useradjustable = args.useradjustable; + imgviewer->adjustwidgetsize = args->adjustwidgetsize; + imgviewer->autoscale = args->autoscale; + imgviewer->useradjustable = args->useradjustable; imgviewer->zoom_scale = 20; g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy); - UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC); + UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_GENERIC); imgviewer->var = var; imgviewer->widget = drawingarea; @@ -136,7 +136,7 @@ imgviewer, NULL); - if(args.useradjustable) { + if(args->useradjustable) { gtk_widget_set_focusable(drawingarea, TRUE); } @@ -182,13 +182,13 @@ #endif - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, widget); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, widget); ui_widget_set_contextmenu(widget, menu); } - UI_APPLY_LAYOUT1(current, args); - current->container->add(current->container, toplevel, TRUE); + UI_APPLY_LAYOUT2(current, args); + current->container->add(current->container, toplevel); return toplevel; } @@ -336,6 +336,28 @@ g_object_unref(pixbuf); } else { obj->value = pixbuf; + obj->type = UI_IMAGE_OBJECT_TYPE; + } + + return 0; +} + +UIEXPORT int ui_image_load_data(UiGeneric *obj, const void *imgdata, size_t size) { + GBytes *bytes = g_bytes_new_static(imgdata, size); + GInputStream *in = g_memory_input_stream_new_from_bytes(bytes); + GError *error = NULL; + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_stream(in, NULL, &error); + g_object_unref(in); + if(!pixbuf) { + return 1; + } + + if(obj->set) { + obj->set(obj, pixbuf, UI_IMAGE_OBJECT_TYPE); + g_object_unref(pixbuf); + } else { + obj->value = pixbuf; + obj->type = UI_IMAGE_OBJECT_TYPE; } return 0; @@ -416,6 +438,7 @@ event.window = event.obj->window; event.document = event.obj->ctx->document; event.eventdata = NULL; + event.eventdatatype = 0; event.intval = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture)); event.set = 0; callback(&event, userdata);