#include "window.h"
#include <Windows.h>
#include "container.h"
#include "../common/object.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "win32.h"
#include "menu.h"
static W32WidgetClass w32_toplevel_widget_class = {
.eventproc = ui_window_widget_event,
.show = ui_window_widget_show,
.enable =
NULL,
.get_preferred_size =
NULL,
.destroy = w32_widget_default_destroy
};
static HINSTANCE hInstance;
static const char *mainWindowClass =
"UiMainWindow";
void ui_window_init(
void) {
hInstance = GetModuleHandle(
NULL);
WNDCLASSEX wc = {
sizeof(
WNDCLASSEX) };
wc.lpfnWndProc = ui_default_eventproc;
wc.hInstance = hInstance;
wc.lpszClassName = mainWindowClass;
wc.hCursor = LoadCursor(
NULL,
IDC_ARROW);
wc.hbrBackground = GetSysColorBrush(
COLOR_BTNFACE);
if(!RegisterClassExA(&wc)) {
MessageBox(
NULL,
"RegisterClassEx failed",
"Error",
MB_ICONERROR);
exit(
-1);
}
}
static UiObject* create_window(
const char *title, bool simple) {
UiObject *obj = uic_object_new_toplevel();
HWND hwnd = CreateWindowExA(
0,
"UiMainWindow",
title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInstance,
NULL);
if (!simple) {
HMENU menubar = ui_create_main_menu(obj);
if (menubar) {
SetMenu(hwnd, menubar);
}
}
UpdateWindow(hwnd);
UiContainerX *container = ui_box_container_create(obj, hwnd,
UI_BOX_VERTICAL,
0,
INSETS_ZERO);
uic_object_push_container(obj, container);
UiBoxContainer *box = (UiBoxContainer*)container;
UiWindow *widget = w32_widget_create(&w32_toplevel_widget_class, hwnd,
sizeof(UiWindow));
widget->obj = obj;
widget->widget.layout = (W32LayoutFunc)ui_grid_layout;
widget->widget.layoutmanager = box->layout;
obj->widget = (W32Widget*)widget;
obj->ref =
1;
return obj;
}
UiObject *ui_window(
const char *title) {
return create_window(title,
FALSE);
}
UiObject *ui_simple_window(
const char *title) {
return create_window(title,
TRUE);
}
int ui_window_widget_event(W32Widget *widget,
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam) {
return 0;
}
void ui_window_widget_show(W32Widget *w,
BOOLEAN show) {
ShowWindow(w->hwnd, show ?
SW_SHOWNORMAL :
SW_HIDE);
}