#endif
}
+ /*
// toplevel window
n = 0;
XtSetArg(args[n], XmNtitle, APP_NAME); n++;
XtAddEventHandler(window->player_widget, PointerMotionMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask |
EnterWindowMask | KeyPressMask | KeyReleaseMask |
LeaveWindowMask, FALSE, playerEH, window);
+ */
// get F keycode
- keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F"));
+ keycodeF = XKeysymToKeycode(XtDisplay(obj->widget), XStringToKeysym("F"));
PlayListInit(window);
}
void WindowShow(MainWindow *win) {
- XtRealizeWidget(win->window);
+ //XtRealizeWidget(win->window);
ui_show(win->obj);
}
#import "button.h"
#import "EventData.h"
#import "Container.h"
+#import "image.h"
#import <objc/runtime.h>
#import <cx/buffer.h>
NSString *label = [[NSString alloc] initWithUTF8String:args->label];
button.title = label;
}
+ if(args->icon) {
+ button.image = ui_cocoa_named_icon(args->icon);;
+ }
if(args->onclick) {
EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
NSString *label = [[NSString alloc] initWithUTF8String:args->label];
button.title = label;
}
+ if(args->icon) {
+ button.image = ui_cocoa_named_icon(args->icon);
+ }
UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
if(var) {
static NSDictionary *standardIconNames;
+#define UI_ICON_ENTRY(x) @#x : x
+
void ui_icon_init(void) {
standardIconNames = @{
- @"NSImageNameActionTemplate": NSImageNameActionTemplate,
- @"NSImageNameAddTemplate": NSImageNameAddTemplate,
- @"NSImageNameAdvanced": NSImageNameAdvanced,
- @"NSImageNameApplicationIcon": NSImageNameApplicationIcon,
- @"NSImageNameBluetoothTemplate": NSImageNameBluetoothTemplate,
- @"NSImageNameBonjour": NSImageNameBonjour,
- @"NSImageNameBookmarksTemplate": NSImageNameBookmarksTemplate,
- @"NSImageNameCaution": NSImageNameCaution,
- // TODO
- @"NSImageNameRefreshTemplate": NSImageNameRefreshTemplate,
- @"NSImageNameFolder": NSImageNameFolder,
- @"NSImageNameGoForwardTemplate": NSImageNameGoForwardTemplate,
- @"NSImageNameGoBackTemplate": NSImageNameGoBackTemplate
+ UI_ICON_ENTRY(NSImageNameAddTemplate),
+ UI_ICON_ENTRY(NSImageNameBluetoothTemplate),
+ UI_ICON_ENTRY(NSImageNameBonjour),
+ UI_ICON_ENTRY(NSImageNameBookmarksTemplate),
+ UI_ICON_ENTRY(NSImageNameCaution),
+ UI_ICON_ENTRY(NSImageNameComputer),
+ UI_ICON_ENTRY(NSImageNameEnterFullScreenTemplate),
+ UI_ICON_ENTRY(NSImageNameExitFullScreenTemplate),
+ UI_ICON_ENTRY(NSImageNameFolder),
+ UI_ICON_ENTRY(NSImageNameFolderBurnable),
+ UI_ICON_ENTRY(NSImageNameFolderSmart),
+ UI_ICON_ENTRY(NSImageNameFollowLinkFreestandingTemplate),
+ UI_ICON_ENTRY(NSImageNameHomeTemplate),
+ UI_ICON_ENTRY(NSImageNameIChatTheaterTemplate),
+ UI_ICON_ENTRY(NSImageNameLockLockedTemplate),
+ UI_ICON_ENTRY(NSImageNameLockUnlockedTemplate),
+ UI_ICON_ENTRY(NSImageNameNetwork),
+ UI_ICON_ENTRY(NSImageNamePathTemplate),
+ UI_ICON_ENTRY(NSImageNameQuickLookTemplate),
+ UI_ICON_ENTRY(NSImageNameRefreshFreestandingTemplate),
+ UI_ICON_ENTRY(NSImageNameRefreshTemplate),
+ UI_ICON_ENTRY(NSImageNameRemoveTemplate),
+ UI_ICON_ENTRY(NSImageNameRevealFreestandingTemplate),
+ UI_ICON_ENTRY(NSImageNameShareTemplate),
+ UI_ICON_ENTRY(NSImageNameSlideshowTemplate),
+ UI_ICON_ENTRY(NSImageNameStatusAvailable),
+ UI_ICON_ENTRY(NSImageNameStatusNone),
+ UI_ICON_ENTRY(NSImageNameStatusPartiallyAvailable),
+ UI_ICON_ENTRY(NSImageNameStatusUnavailable),
+ UI_ICON_ENTRY(NSImageNameStopProgressFreestandingTemplate),
+ UI_ICON_ENTRY(NSImageNameStopProgressTemplate),
+ UI_ICON_ENTRY(NSImageNameTrashEmpty),
+ UI_ICON_ENTRY(NSImageNameTrashFull),
+ UI_ICON_ENTRY(NSImageNameActionTemplate),
+ UI_ICON_ENTRY(NSImageNameSmartBadgeTemplate),
+ UI_ICON_ENTRY(NSImageNameIconViewTemplate),
+ UI_ICON_ENTRY(NSImageNameListViewTemplate),
+ UI_ICON_ENTRY(NSImageNameColumnViewTemplate),
+ UI_ICON_ENTRY(NSImageNameFlowViewTemplate),
+ UI_ICON_ENTRY(NSImageNameInvalidDataFreestandingTemplate),
+ UI_ICON_ENTRY(NSImageNameGoForwardTemplate),
+ UI_ICON_ENTRY(NSImageNameGoBackTemplate),
+ UI_ICON_ENTRY(NSImageNameGoRightTemplate),
+ UI_ICON_ENTRY(NSImageNameGoLeftTemplate),
+ UI_ICON_ENTRY(NSImageNameRightFacingTriangleTemplate),
+ UI_ICON_ENTRY(NSImageNameLeftFacingTriangleTemplate),
+ UI_ICON_ENTRY(NSImageNameMobileMe),
+ UI_ICON_ENTRY(NSImageNameMultipleDocuments),
+ UI_ICON_ENTRY(NSImageNameUserAccounts),
+ UI_ICON_ENTRY(NSImageNamePreferencesGeneral),
+ UI_ICON_ENTRY(NSImageNameAdvanced),
+ UI_ICON_ENTRY(NSImageNameInfo),
+ UI_ICON_ENTRY(NSImageNameFontPanel),
+ UI_ICON_ENTRY(NSImageNameColorPanel),
+ UI_ICON_ENTRY(NSImageNameUser),
+ UI_ICON_ENTRY(NSImageNameUserGroup),
+ UI_ICON_ENTRY(NSImageNameEveryone),
+ UI_ICON_ENTRY(NSImageNameUserGuest),
+ UI_ICON_ENTRY(NSImageNameMenuOnStateTemplate),
+ UI_ICON_ENTRY(NSImageNameMenuMixedStateTemplate),
+ UI_ICON_ENTRY(NSImageNameApplicationIcon)
};
}
} else {
toplevel->container_begin = NULL;
}
+
+ // TODO: free container?
+}
+
+/*
+ * This might look like a weird function, but in case a container creates a
+ * sub-container, 2 container objects are added to the list, however we want
+ * only one container, otherwise ui_container_finish() would not work
+ */
+void uic_object_remove_second_last_container(UiObject *toplevel) {
+ if(toplevel->container_end && toplevel->container_end->prev) {
+ UiContainerX *end = toplevel->container_end;
+ UiContainerX *rm = toplevel->container_end->prev;
+
+ end->prev = rm->prev;
+ if(rm->prev) {
+ rm->prev->next = end;
+ } else {
+ toplevel->container_begin = end;
+ }
+
+ // TODO: free container?
+ } else {
+ fprintf(stderr, "Error: uic_object_remove_second_last_container expected at least 2 containers\n");
+ }
}
void uic_object_push_container(UiObject *toplevel, UiContainerX *newcontainer);
void uic_object_pop_container(UiObject *toplevel);
+void uic_object_remove_second_last_container(UiObject *toplevel);
grid->container.container.newline = FALSE;
}
+/* -------------------------- Frame Container -------------------------- */
+
+UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) {
+ Arg xargs[16];
+ int n = 0;
+
+ UiContainerPrivate *ctn = ui_obj_container(obj);
+ UiLayout layout = UI_ARGS2LAYOUT(args);
+
+ Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
+
+ char *name = args->name ? (char*)args->name : "frame";
+ Widget frame = XmCreateFrame(parent, name, xargs, 6);
+ XtManageChild(frame);
+ ui_container_add(ctn, frame);
+
+ if(args->label) {
+ XmString s = XmStringCreateLocalized((char*)args->label);
+ n = 0;
+ XtSetArg(xargs[n], XmNlabelString, s); n++;
+ XtSetArg(xargs[n], XmNchildType, XmFRAME_TITLE_CHILD); n++;
+ Widget label = XmCreateLabel(frame, "frame_label", xargs, n);
+ XtManageChild(label);
+ XmStringFree(s);
+ }
+
+ UiContainerX *container = ui_frame_container(obj, frame);
+ uic_object_push_container(obj, container);
+
+ UiContainerArgs sub_args = {
+ .spacing = args->spacing,
+ .columnspacing = args->columnspacing,
+ .rowspacing = args->rowspacing
+ };
+ switch(args->subcontainer) {
+ default: break;
+ case UI_CONTAINER_VBOX: {
+ ui_vbox_create(obj, &sub_args);
+ uic_object_remove_second_last_container(obj);
+ break;
+ }
+ case UI_CONTAINER_HBOX: {
+ ui_hbox_create(obj, &sub_args);
+ uic_object_remove_second_last_container(obj);
+ break;
+ }
+ case UI_CONTAINER_GRID: {
+ ui_grid_create(obj, &sub_args);
+ uic_object_remove_second_last_container(obj);
+ break;
+ }
+ }
+
+
+ return frame;
+}
+
+UiContainerX* ui_frame_container(UiObject *obj, Widget frame) {
+ UiContainerPrivate *ctn = ui_malloc(obj->ctx, sizeof(UiContainerPrivate));
+ memset(ctn, 0, sizeof(UiContainerPrivate));
+ ctn->prepare = ui_frame_container_prepare;
+ ctn->add = ui_frame_container_add;
+ ctn->widget = frame;
+ return (UiContainerX*)ctn;
+}
+
+Widget ui_frame_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n) {
+ int a = *n;
+ XtSetArg(args[a], XmNchildType, XmFRAME_WORKAREA_CHILD);
+ *n = a+1;
+ return ctn->widget;
+}
+
+void ui_frame_container_add(UiContainerPrivate *ctn, Widget widget) {
+ // NOOP
+}
+
+/* -------------------------- SplitPane -------------------------- */
+
+UIWIDGET ui_splitpane_create(UiObject *obj, UiSplitPaneArgs *args, int orientation) {
+ return NULL; // TODO
+}
+
+UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) {
+ return ui_splitpane_create(obj, args, XmHORIZONTAL);
+}
+
+UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) {
+ return ui_splitpane_create(obj, args, XmVERTICAL);
+}
/* -------------------------- TabView Container -------------------------- */
Widget ui_grid_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
void ui_grid_container_add(UiContainerPrivate *ctn, Widget widget);
+UiContainerX* ui_frame_container(UiObject *obj, Widget frame);
+Widget ui_frame_container_prepare(UiContainerPrivate *ctn, UiLayout *layout, Arg *args, int *n);
+void ui_frame_container_add(UiContainerPrivate *ctn, Widget widget);
+
#ifdef __cplusplus
}
#endif
#include "graphics.h"
#include "container.h"
+
+UIWIDGET ui_drawingarea_create(UiObject *obj, UiDrawingAreaArgs *args) {
+ Arg xargs[16];
+ int n = 0;
+
+ UiContainerPrivate *ctn = ui_obj_container(obj);
+ UiLayout layout = UI_ARGS2LAYOUT(args);
+
+ Widget parent = ui_container_prepare(ctn, &layout, xargs, &n);
+ char *name = args->name ? (char*)args->name : "drawingarea";
+
+ Widget widget = XmCreateDrawingArea(parent, name, xargs, n);
+ XtManageChild(widget);
+ ui_container_add(ctn, widget);
+
+ UiDrawingArea *drawingarea = malloc(sizeof(UiDrawingArea));
+ drawingarea->obj = obj;
+ drawingarea->draw = args->draw;
+ drawingarea->drawdata = args->drawdata;
+ drawingarea->onclick = args->onclick;
+ drawingarea->onclickdata = args->onclickdata;
+ drawingarea->onmotion = args->onmotion;
+ drawingarea->onmotiondata = args->onmotiondata;
+ drawingarea->gc = NULL;
+
+ XtAddCallback(
+ widget,
+ XmNdestroyCallback,
+ (XtCallbackProc)ui_drawingarea_destroy,
+ drawingarea);
+ XtAddCallback(
+ widget,
+ XmNexposeCallback,
+ (XtCallbackProc)ui_drawingarea_expose,
+ drawingarea);
+
+ return widget;
+}
+
+void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d) {
+ if(drawingarea->gc) {
+ XFreeGC(XtDisplay(w), drawingarea->gc);
+ }
+ free(drawingarea);
+}
+
+void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d) {
+ Display *dp = XtDisplay(w);
+
+ if(!drawingarea->gc) {
+ XGCValues gcvals;
+ gcvals.foreground = BlackPixelOfScreen(XtScreen(w));
+ drawingarea->gc = XCreateGC(dp, XtWindow(w), (GCForeground), &gcvals);
+ }
+
+ if(drawingarea->draw) {
+ UiEvent event;
+ event.obj = drawingarea->obj;
+ event.window = event.obj->window;
+ event.document = event.obj->ctx->document;
+ event.eventdata = NULL;
+ event.eventdatatype = 0;
+ event.intval = 0;
+ event.set = 0;
+
+ UiXlibGraphics g;
+ g.g.width = w->core.width;
+ g.g.height = w->core.height;
+ g.widget = w;
+ g.display = dp;
+ g.colormap = w->core.colormap;
+ g.gc = drawingarea->gc;
+
+ drawingarea->draw(&event, (UiGraphics*)&g, drawingarea->drawdata);
+ }
+}
+
+void ui_drawingarea_getsize(UIWIDGET drawingarea, int *width, int *height) {
+
+}
+
+void ui_drawingarea_redraw(UIWIDGET drawingarea) {
+
+}
#ifdef __cplusplus
extern "C" {
#endif
+
+typedef struct UiDrawingArea {
+ UiObject *obj;
+ ui_drawfunc draw;
+ void *drawdata;
+ ui_callback onclick;
+ void *onclickdata;
+ ui_callback onmotion;
+ void *onmotiondata;
+
+ GC gc;
+} UiDrawingArea;
+typedef struct UiXlibGraphics {
+ UiGraphics g;
+ Display *display;
+ Widget widget;
+ Colormap colormap;
+ GC gc;
+} UiXlibGraphics;
+
+void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d);
+
+void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d);
#ifdef __cplusplus
XtSetArg(xargs[n], XmNalignment, align); n++;
XmString label = NULL;
- if(args->label) {
- label = XmStringCreateLocalized((char*)args->label);
- XtSetArg(xargs[n], XmNlabelString, label); n++;
+ char *lbl = (char*)args->label;
+ UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
+ if(var) {
+ UiString *s = var->value;
+ lbl = s->value.ptr;
+ }
+
+ if(lbl) {
+ label = XmStringCreateLocalized(lbl);
+ } else {
+ label = XmStringCreateLocalized("");
}
+ XtSetArg(xargs[n], XmNlabelString, label); n++;
char *name = args->name ? (char*)args->name : "label";
Widget w = XmCreateLabel(parent, name, xargs, n);
XtManageChild(w);
ui_container_add(ctn, w);
XmStringFree(label);
+
+ if(var) {
+ UiString *s = var->value;
+ s->obj = w;
+ s->get = ui_label_get;
+ s->set = ui_label_set;
+ }
+
return w;
}
return label_create(obj, args, XmALIGNMENT_END);
}
+char* ui_label_get(UiString *s) {
+ if(s->value.free) {
+ s->value.free(s->value.ptr);
+ s->value.free = NULL;
+ s->value.ptr = NULL;
+ }
+ Widget w = s->obj;
+ XmString s1 = NULL;
+ XtVaGetValues(w, XmNlabelString, &s1, NULL);
+ if(s1) {
+ char *value;
+ if(XmStringGetLtoR(s1, XmFONTLIST_DEFAULT_TAG, &value)) {
+ s->value.ptr = value;
+ s->value.free = (cx_destructor_func)XtFree;
+ }
+ }
+ return s->value.ptr;
+}
+
+void ui_label_set(UiString *s, const char *str) {
+ if(s->value.free) {
+ s->value.free(s->value.ptr);
+ s->value.free = NULL;
+ s->value.ptr = NULL;
+ }
+ Widget w = s->obj;
+ XmString s1 = XmStringCreateLocalized(str ? (char*)str : "");
+ XtVaSetValues(w, XmNlabelString, s1, NULL);
+ XmStringFree(s1);
+}
/* -------------------------- progressbar/spiner -------------------------- */
Pixel color;
} UiProgressBar;
+char* ui_label_get(UiString *s);
+void ui_label_set(UiString *s, const char *str);
double ui_progressbar_get(UiDouble *d);
void ui_progressbar_set(UiDouble *d, double value);