typedef struct MainWindow {
UiObject *obj;
- Widget menubar;
Widget player_widget;
Widget sidebar_scrolledwindow;
Widget sidebar;
net_wm_atoms_initialized = 1;
}
- WindowMenubarSetVisible(win, !enableFullscreen);
- if(enableFullscreen && !win->fullscreen) {
- XtUnmanageChild(main_window->menubar);
- main_window->fullscreen = TRUE;
- } else if(!enableFullscreen && win->fullscreen) {
- XtManageChild(main_window->menubar);
- main_window->fullscreen = FALSE;
- }
+ ui_window_menubar_set_visible(win->obj, !enableFullscreen);
+ win->fullscreen = enableFullscreen;
WindowShowSidebar(win, enableFullscreen ? false : win->sidebarvisible);
XSendEvent(dpy, DefaultRootWindow(dpy), False, SubstructureNotifyMask | SubstructureRedirectMask, &ev);
}
-void WindowMenubarSetVisible(MainWindow *win, bool visible) {
- if(visible) {
- XtManageChild(main_window->menubar);
- XtVaSetValues(main_window->player_widget, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, main_window->menubar, NULL);
- } else {
- XtUnmanageChild(main_window->menubar);
- XtVaSetValues(main_window->player_widget, XmNtopAttachment, XmATTACH_FORM, NULL);
- }
-}
-
static void ViewFullscreenCB(Widget w, void *udata, void *cdata) {
if(main_window->fullscreen) {
WindowFullscreen(main_window, FALSE);
#include "context.h"
#include <cx/linked_list.h>
+#include <cx/hash_map.h>
#include "../ui/container.h"
UiObject* uic_object_new_toplevel(void) {
fflush(stdout);
CxMempool *mp = cxMempoolCreateSimple(256);
- UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject));
+ UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObjectPrivate));
fflush(stdout);
obj->ctx = uic_context(obj, mp);
obj->ctx->parent = ui_global_context();
}
UiObject* uic_ctx_object_new(UiContext *ctx, UIWIDGET widget) {
- UiObject *newobj = cxCalloc(ctx->allocator, 1, sizeof(UiObject));
+ UiObject *newobj = cxCalloc(ctx->allocator, 1, sizeof(UiObjectPrivate));
newobj->ctx = ctx;
newobj->widget = widget;
uic_object_created(newobj);
fprintf(stderr, "Error: uic_object_remove_second_last_container expected at least 2 containers\n");
}
}
+
+// public API
+
+void ui_object_set(UiObject *obj, const char *key, void *data) {
+ UiObjectPrivate *p = (UiObjectPrivate*)obj;
+ if(!p->ext) {
+ p->ext = cxHashMapCreate(obj->ctx->mp->allocator, CX_STORE_POINTERS, 4);
+ }
+ if(data) {
+ cxMapPut(p->ext, key, data);
+ } else {
+ cxMapRemove(p->ext, key);
+ }
+}
+
+void* ui_object_get(UiObject *obj, const char *key) {
+ UiObjectPrivate *p = (UiObjectPrivate*)obj;
+ if(p->ext) {
+ return cxMapGet(p->ext, key);
+ }
+}
#define UIC_OBJECT_H
#include "../ui/toolkit.h"
+#include <cx/map.h>
#ifdef __cplusplus
extern "C" {
#endif
+
+typedef struct UiObjectPrivate {
+ UiObject obj;
+ CxMap *ext;
+} UiObjectPrivate;
typedef void (*ui_object_callback)(UiObject *obj, void *userdata);
*/
#include "utils.h"
+#include "properties.h"
#include <cx/string.h>
return elms;
}
+
+void ui_get_window_default_width(int *width, int *height) {
+ const char *width_str = ui_get_property("ui.window.width");
+ const char *height_str = ui_get_property("ui.window.height");
+ if(width_str && height_str) {
+ int w = atoi(width_str);
+ int h = atoi(height_str);
+ if(w > 0 && h > 0) {
+ *width = w;
+ *height = h;
+ }
+ }
+}
UiPathElm* ui_default_pathelm_func(const char* full_path, size_t len, size_t* ret_nelm, void* data);
+/*
+ * overrides width/height with values from
+ * ui.window.width and ui.window.height properties if available
+ */
+void ui_get_window_default_width(int *width, int *height);
+
#ifdef __cplusplus
}
#endif
}
-void ui_set_visible(UIWIDGET widget, int visible) {
+void ui_set_visible(UIWIDGET widget, UiBool visible) {
#if GTK_MAJOR_VERSION >= 4
gtk_widget_set_visible(widget, visible);
#else
#include "../common/context.h"
#include "../common/menu.h"
#include "../common/toolbar.h"
+#include "../common/utils.h"
#include <cx/mempool.h>
int window_width = window_default_width;
int window_height = window_default_height;
if(!simple) {
- const char *width = ui_get_property("ui.window.width");
- const char *height = ui_get_property("ui.window.height");
- if(width && height) {
- int w = atoi(width);
- int h = atoi(height);
- if(w > 0 && h > 0) {
- window_width = w;
- window_height = h;
- }
- }
+ ui_get_window_default_width(&window_width, &window_height);
}
gtk_window_set_default_size(
GTK_WINDOW(obj->widget),
/* UI_MENU_SEPARATOR */ add_menuseparator_widget
};
-void ui_create_menubar(UiObject *obj, Widget window) {
+Widget ui_create_menubar(UiObject *obj, Widget window) {
UiMenu *menus_begin = uic_get_menu_list();
if(!menus_begin) {
- return;
+ return NULL;
}
Widget menubar = XmCreateMenuBar(window, "menubar", NULL, 0);
add_menu_widget(menubar, 0, &menu->item, obj);
ls = (UiMenu*)ls->item.next;
}
+
+ return menubar;
}
void ui_add_menu_items(Widget parent, int i, UiMenu *menu, UiObject *obj) {
typedef void(*ui_menu_add_f)(Widget, int, UiMenuItemI*, UiObject*);
-void ui_create_menubar(UiObject *obj, Widget window);
+Widget ui_create_menubar(UiObject *obj, Widget window);
void ui_add_menu_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj);
void add_menu_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj);
#include <limits.h>
#include <unistd.h>
+#include "window.h"
+
#include "toolkit.h"
#include "menu.h"
#include "toolbar.h"
#include "container.h"
#include "pathbar.h"
-#include "../ui/window.h"
#include "../common/context.h"
+#include "../common/utils.h"
#include "Grid.h"
#include "Fsb.h"
obj->window = window_data;
obj->destroy = ui_window_widget_destroy;
+ int window_width = window_default_width;
+ int window_height = window_default_height;
+ if(!simple) {
+ ui_get_window_default_width(&window_width, &window_height);
+ }
+
+ UiMotifAppWindow *appwindow = cxZalloc(a, sizeof(UiMotifAppWindow));
+ ui_object_set(obj, "ui_motif_app_window", appwindow);
+
Arg args[16];
int n = 0;
XtSetArg(args[n], XmNtitle, title); n++;
XtSetArg(args[n], XmNminWidth, 100); n++;
XtSetArg(args[n], XmNminHeight, 50); n++;
- XtSetArg(args[n], XmNwidth, window_default_width); n++;
- XtSetArg(args[n], XmNheight, window_default_height); n++;
+ XtSetArg(args[n], XmNwidth, window_width); n++;
+ XtSetArg(args[n], XmNheight, window_height); n++;
Widget toplevel = XtAppCreateShell(
ui_appname(),
// menu
if(!simple) {
- ui_create_menubar(obj, window);
+ appwindow->menubar = ui_create_menubar(obj, window);
}
// content frame
return create_window(title, window_data, TRUE);
}
+void ui_window_size(UiObject *obj, int width, int height) {
+ XtVaSetValues(obj->widget, XmNwidth, width, XmNheight, height, NULL);
+}
+
+void ui_window_default_size(int width, int height) {
+ window_default_width = width;
+ window_default_height = height;
+}
+
+void ui_window_menubar_set_visible(UiObject *obj, UiBool visible) {
+ UiMotifAppWindow *window = ui_object_get(obj, "ui_motif_app_window");
+ if(window) {
+ if(window->menubar) {
+ ui_set_visible(window->menubar, visible);
+ }
+ } else {
+ fprintf(stderr, "Error: obj is not an application window\n");
+ }
+}
+
static void filedialog_event(UiEventData *event, int result, UiFileList flist) {
UiEvent evt;
evt.obj = event->obj;
#ifndef WINDOW_H
#define WINDOW_H
+#include "../ui/window.h"
+#include "../ui/widget.h"
+
#ifdef __cplusplus
extern "C" {
#endif
+
+#define UI_MOTIF_APP_WINDOW 0xabcd
-
+typedef struct UiMotifAppWindow {
+ Widget menubar;
+} UiMotifAppWindow;
#ifdef __cplusplus
UIEXPORT void ui_list_class_set_data(UiList *list, void *data);
UIEXPORT void ui_list_class_set_iter(UiList *list, void *iter);
+UIEXPORT void ui_object_set(UiObject *obj, const char *key, void *data);
+UIEXPORT void* ui_object_get(UiObject *obj, const char *key);
+
#ifdef __cplusplus
}
#endif
UIEXPORT void ui_window_size(UiObject *obj, int width, int height);
UIEXPORT void ui_window_default_size(int width, int height);
+UIEXPORT void ui_window_menubar_set_visible(UiObject *obj, UiBool visible);
UIEXPORT void ui_splitview_window_set_pos(UiObject *obj, int pos);
UIEXPORT int ui_splitview_window_get_pos(UiObject *obj);