#include "osgui_win.inl"
#include "osmenu_win.inl"
#include "ospanel_win.inl"
#include "oswindow_win.inl"
#include "osstyleXP.inl"
#include "../osgui.inl"
#include <core/arrst.h>
#include <core/core.h>
#include <core/heap.h>
#include <sewer/cassert.h>
#include <sewer/unicode.h>
#if !defined(__WINDOWS__)
#error This file is only for Windows
#endif
#include <sewer/nowarn.hxx>
#include <Commctrl.h>
#include <Richedit.h>
#include <uxtheme.h>
#include <gdiplus.h>
#include <sewer/warn.hxx>
const WORD kVIRTUAL_KEY[] =
{
UINT16_MAX,
'A',
'S',
'D',
'F',
'H',
'G',
'Z',
'X',
'C',
'V',
VK_OEM_5,
'B',
'Q',
'W',
'E',
'R',
'Y',
'T',
'1',
'2',
'3',
'4',
'6',
'5',
'9',
'7',
'8',
'0',
VK_OEM_2,
'O',
'U',
VK_OEM_7,
'I',
'P',
VK_RETURN,
'L',
'J',
';',
'K',
VK_OEM_4,
VK_OEM_COMMA,
VK_OEM_MINUS,
'N',
'M',
VK_OEM_PERIOD,
VK_TAB,
VK_SPACE,
VK_OEM_102,
VK_BACK,
VK_ESCAPE,
VK_F17,
VK_DECIMAL,
VK_MULTIPLY,
VK_ADD,
VK_NUMLOCK,
VK_DIVIDE,
VK_RETURN,
VK_SUBTRACT,
VK_F18,
VK_F19,
' ',
VK_NUMPAD0,
VK_NUMPAD1,
VK_NUMPAD2,
VK_NUMPAD3,
VK_NUMPAD4,
VK_NUMPAD5,
VK_NUMPAD6,
VK_NUMPAD7,
VK_NUMPAD8,
VK_NUMPAD9,
VK_F5,
VK_F6,
VK_F7,
VK_F3,
VK_F8,
VK_F9,
VK_F11,
VK_F13,
VK_F16,
VK_F14,
VK_F10,
VK_F12,
VK_F15,
VK_PRIOR,
VK_HOME,
VK_DELETE,
VK_F4,
VK_NEXT,
VK_F2,
VK_END,
VK_F1,
VK_LEFT,
VK_RIGHT,
VK_DOWN,
VK_UP,
VK_LSHIFT,
VK_RSHIFT,
VK_LCONTROL,
VK_RCONTROL,
VK_LMENU,
VK_RMENU,
VK_INSERT,
VK_OEM_6,
VK_APPS,
VK_LWIN,
VK_RWIN,
VK_CAPITAL,
VK_OEM_3,
VK_OEM_1,
VK_OEM_PLUS
};
uint32_t kNUM_VKEYS = sizeof(kVIRTUAL_KEY) / sizeof(WORD);
DeclSt(ACCEL);
DeclSt(HWND);
static HINSTANCE i_INSTANCE = NULL;
static ULONG_PTR i_GDIPLUSTOKEN = 0L;
static OSPanel *i_DEFAULT_OSPANEL = NULL;
static ArrSt(ACCEL) *i_ACCELERATORS = NULL;
static ArrSt(HWND) *i_HWND_ACCELERATORS = NULL;
static HACCEL i_ACCEL_TABLE = NULL;
static uint16_t i_GLOBAL_MENU_ID = 20;
typedef HRESULT(__stdcall *DWMGETWINDOWATTRIBUTE)(HWND hwnd, DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute);
static HMODULE i_DWMAPIDLL = NULL;
static DWMGETWINDOWATTRIBUTE i_DwmGetWindowAttribute = NULL;
#define DWMWA_EXTENDED_FRAME_BOUNDS 9
HWND kDEFAULT_PARENT_WINDOW = NULL;
HCURSOR kNORMAL_ARROW_CURSOR = NULL;
HCURSOR kSIZING_HORIZONTAL_CURSOR = NULL;
HCURSOR kSIZING_VERTICAL_CURSOR = NULL;
HBRUSH kCHESSBOARD_BRUSH = NULL;
const TCHAR *kWINDOW_CLASS = L"com.nappgui.window";
const TCHAR *kVIEW_CLASS = L"com.nappgui.view";
const TCHAR *kRICHEDIT_CLASS = NULL;
const TCHAR *kWEBVIEW_CLASS = L"com.nappgui.webview";
unicode_t kWINDOWS_UNICODE = ENUM_MAX(unicode_t);
int kLOG_PIXY_GUI = 0;
LONG kTWIPS_PER_PIXEL_GUI = 0;
static void i_registry_custom_window_class(void)
{
WNDCLASSEX wc;
cassert(i_INSTANCE != NULL);
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = i_INSTANCE;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
#if defined(__x64__)
wc.hbrBackground = (HBRUSH)(uint64_t)(COLOR_BTNFACE);
#else
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
#endif
wc.lpszMenuName = NULL;
wc.lpszClassName = kWINDOW_CLASS;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
{
ATOM ret = 0;
ret = RegisterClassEx(&wc);
cassert_unref(ret != 0, ret);
}
}
static void i_registry_view_class(void)
{
WNDCLASSEX wc;
cassert(i_INSTANCE != NULL);
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_GLOBALCLASS;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(char *) * 2;
wc.hInstance = i_INSTANCE;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = kVIEW_CLASS;
wc.hIconSm = LoadCursor(NULL, IDC_ARROW);
{
ATOM ret = RegisterClassEx(&wc);
cassert_unref(ret != 0, ret);
}
}
static void i_registry_web_class(void)
{
WNDCLASSEX wc;
cassert(i_INSTANCE != NULL);
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_GLOBALCLASS;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(char *) * 2;
wc.hInstance = i_INSTANCE;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = kWEBVIEW_CLASS;
wc.hIconSm = LoadCursor(NULL, IDC_ARROW);
{
ATOM ret = RegisterClassEx(&wc);
cassert_unref(ret != 0, ret);
}
}
LRESULT _osgui_nccalcsize(HWND hwnd, WPARAM wParam, LPARAM lParam, bool_t expand, INT ypadding, RECT *border)
{
LRESULT res = 0;
RECT *window_rect = NULL;
RECT content_rect;
HDC hdc = GetWindowDC(hwnd);
HTHEME theme = _osstyleXP_OpenTheme(hwnd, L"EDIT");
cassert_no_null(border);
cassert(ypadding >= 0);
if (wParam == TRUE)
{
NCCALCSIZE_PARAMS *cp = cast(lParam, NCCALCSIZE_PARAMS);
window_rect = &cp->rgrc[0];
}
else
{
window_rect = (RECT *)lParam;
}
_osstyleXP_GetThemeBackgroundContentRect(theme, hdc, EP_EDITTEXT, ETS_NORMAL, window_rect, &content_rect);
if (expand == TRUE)
InflateRect(&content_rect, -1, -1 - ypadding);
border->left = content_rect.left - window_rect->left;
border->top = content_rect.top - window_rect->top;
border->right = window_rect->right - content_rect.right;
border->bottom = window_rect->bottom - content_rect.bottom;
if (wParam == TRUE)
{
NCCALCSIZE_PARAMS *cp = cast(lParam, NCCALCSIZE_PARAMS);
cp->rgrc[0] = content_rect;
res = WVR_REDRAW;
}
else
{
*cast(lParam, RECT) = content_rect;
res = 0;
}
_osstyleXP_CloseTheme(theme);
ReleaseDC(hwnd, hdc);
return res;
}
#if _MSC_VER > 1400
#define _CP_BORDER CP_BORDER
#define _CBB_NORMAL CBB_NORMAL
#define _CBB_FOCUSED CBB_FOCUSED
#define _CBB_DISABLED CBB_DISABLED
#else
#define _CP_BORDER 4
#define _CBB_NORMAL CBXS_NORMAL
#define _CBB_FOCUSED CBXS_PRESSED
#define _CBB_DISABLED CBXS_DISABLED
#endif
LRESULT _osgui_ncpaint(HWND hwnd, const bool_t focused, const RECT *border, HBRUSH padding_bgcolor)
{
HDC hdc = GetWindowDC(hwnd);
HTHEME theme = NULL;
int partId = _CP_BORDER;
int stateId = _CBB_NORMAL;
RECT window_rect, client_rect;
if (IsWindowEnabled(hwnd) == TRUE)
{
if (focused == TRUE)
{
theme = _osstyleXP_OpenTheme(hwnd, L"COMBOBOX");
partId = _CP_BORDER;
stateId = _CBB_FOCUSED;
}
else
{
theme = _osstyleXP_OpenTheme(hwnd, L"EDIT");
partId = EP_EDITTEXT;
stateId = ETS_NORMAL;
}
}
else
{
theme = _osstyleXP_OpenTheme(hwnd, L"COMBOBOX");
partId = _CP_BORDER;
stateId = _CBB_DISABLED;
}
GetWindowRect(hwnd, &window_rect);
window_rect.right -= window_rect.left;
window_rect.bottom -= window_rect.top;
window_rect.left = 0;
window_rect.top = 0;
client_rect = window_rect;
client_rect.left += border->left;
client_rect.top += border->top;
client_rect.right -= border->right;
client_rect.bottom -= border->bottom;
ExcludeClipRect(hdc, client_rect.left, client_rect.top, client_rect.right, client_rect.bottom);
_osstyleXP_DrawThemeBackground2(theme, partId, stateId, hdc, &window_rect);
if (padding_bgcolor != NULL)
{
RECT bgrect = window_rect;
bgrect.left += border->left;
bgrect.right -= border->right;
bgrect.top += border->left;
bgrect.bottom -= border->right;
FillRect(hdc, &bgrect, padding_bgcolor);
}
_osstyleXP_CloseTheme(theme);
ReleaseDC(hwnd, hdc);
return 0;
}
void _osgui_frame_without_shadows(const HWND hwnd, RECT *rect)
{
if (i_DwmGetWindowAttribute != NULL)
{
HRESULT ok = i_DwmGetWindowAttribute(hwnd, DWMWA_EXTENDED_FRAME_BOUNDS, (PVOID)rect, sizeof(RECT));
if (ok == S_OK)
return;
}
{
BOOL ret = GetWindowRect(hwnd, rect);
cassert_unref(ret != 0, ret);
}
}
vkey_t _osgui_vkey(const WORD key)
{
uint32_t i, n = kNUM_VKEYS;
const WORD *keys = kVIRTUAL_KEY;
for (i = 0; i < n; ++i)
{
if (keys[i] == key)
return (vkey_t)i;
}
return ENUM_MAX(vkey_t);
}
uint32_t _osgui_modifiers(void)
{
uint32_t modifiers = 0;
if ((GetAsyncKeyState(VK_LSHIFT) & 0x8000) || (GetAsyncKeyState(VK_RSHIFT) & 0x8000))
modifiers |= ekMKEY_SHIFT;
if ((GetAsyncKeyState(VK_LCONTROL) & 0x8000) || (GetAsyncKeyState(VK_RCONTROL) & 0x8000))
modifiers |= ekMKEY_CONTROL;
if ((GetAsyncKeyState(VK_LMENU) & 0x8000) || (GetAsyncKeyState(VK_RMENU) & 0x8000))
modifiers |= ekMKEY_ALT;
if ((GetAsyncKeyState(VK_LWIN) & 0x8000) || (GetAsyncKeyState(VK_RWIN) & 0x8000))
modifiers |= ekMKEY_COMMAND;
return modifiers;
}
void _osgui_start_imp(void)
{
cassert(i_INSTANCE == NULL);
i_INSTANCE = (HINSTANCE)GetModuleHandle(NULL);
cassert_no_null(i_INSTANCE);
i_registry_custom_window_class();
i_registry_view_class();
i_registry_web_class();
{
INITCOMMONCONTROLSEX commctrl;
BOOL ok;
commctrl.dwSize = sizeof(INITCOMMONCONTROLSEX);
commctrl.dwICC = ICC_STANDARD_CLASSES | ICC_BAR_CLASSES | ICC_LISTVIEW_CLASSES | ICC_PROGRESS_CLASS;
ok = InitCommonControlsEx(&commctrl);
cassert_unref(ok == TRUE, ok);
}
#if defined(NAPPGUI_WEB_SUPPORT)
{
HRESULT res = CoInitialize(NULL);
cassert_unref(res == S_OK, res);
}
#endif
_osstyleXP_init();
i_DWMAPIDLL = LoadLibrary(L"dwmapi.dll");
if (i_DWMAPIDLL != NULL)
i_DwmGetWindowAttribute = cast_func(GetProcAddress(i_DWMAPIDLL, "DwmGetWindowAttribute"), DWMGETWINDOWATTRIBUTE);
{
Gdiplus::GdiplusStartupInput startup;
Gdiplus::GdiplusStartup(&i_GDIPLUSTOKEN, &startup, NULL);
}
i_DEFAULT_OSPANEL = _ospanel_create_default();
kDEFAULT_PARENT_WINDOW = cast(i_DEFAULT_OSPANEL, OSControl)->hwnd;
kNORMAL_ARROW_CURSOR = LoadCursor(NULL, IDC_ARROW);
kSIZING_HORIZONTAL_CURSOR = LoadCursor(NULL, IDC_SIZENS);
kSIZING_VERTICAL_CURSOR = LoadCursor(NULL, IDC_SIZEWE);
{
unsigned short chess_board[] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
HBITMAP bitmap = CreateBitmap(8, 8, 1, 1, chess_board);
kCHESSBOARD_BRUSH = CreatePatternBrush(bitmap);
DeleteObject(bitmap);
}
{
HMODULE msft_mod = LoadLibrary(L"Msftedit.dll");
cassert_unref(msft_mod != NULL, msft_mod);
kRICHEDIT_CLASS = MSFTEDIT_CLASS;
}
kWINDOWS_UNICODE = ekUTF16;
{
HWND hwnd = GetDesktopWindow();
HDC hdc = GetDC(hwnd);
kLOG_PIXY_GUI = GetDeviceCaps(hdc, LOGPIXELSY);
int ret = ReleaseDC(hwnd, hdc);
cassert_unref(ret == 1, ret);
kTWIPS_PER_PIXEL_GUI = 1440 / kLOG_PIXY_GUI;
}
i_ACCELERATORS = NULL;
i_HWND_ACCELERATORS = NULL;
i_ACCEL_TABLE = NULL;
}
void _osgui_finish_imp(void)
{
if (i_ACCEL_TABLE != NULL)
{
BOOL ok = FALSE;
cassert(arrst_size(i_ACCELERATORS, ACCEL) > 0);
cassert(arrst_size(i_ACCELERATORS, ACCEL) == arrst_size(i_HWND_ACCELERATORS, HWND));
ok = DestroyAcceleratorTable(i_ACCEL_TABLE);
cassert_unref(ok == TRUE, ok);
arrst_destroy(&i_ACCELERATORS, NULL, ACCEL);
arrst_destroy(&i_HWND_ACCELERATORS, NULL, HWND);
}
else
{
cassert(i_ACCELERATORS == NULL);
cassert(i_HWND_ACCELERATORS == NULL);
}
kWINDOWS_UNICODE = ENUM_MAX(unicode_t);
kRICHEDIT_CLASS = NULL;
_ospanel_destroy_default(&i_DEFAULT_OSPANEL);
kDEFAULT_PARENT_WINDOW = NULL;
{
BOOL ret = UnregisterClass(kVIEW_CLASS, NULL);
cassert_unref(ret != 0, ret);
}
{
BOOL ret = UnregisterClass(kWEBVIEW_CLASS, NULL);
cassert_unref(ret != 0, ret);
}
{
BOOL ret = 0;
ret = UnregisterClass(kWINDOW_CLASS, NULL);
cassert_unref(ret != 0, ret);
}
if (i_DWMAPIDLL != NULL)
FreeLibrary(i_DWMAPIDLL);
_osstyleXP_finish();
#if defined(NAPPGUI_WEB_SUPPORT)
CoUninitialize();
#endif
DeleteObject(kCHESSBOARD_BRUSH);
Gdiplus::GdiplusShutdown(i_GDIPLUSTOKEN);
i_GDIPLUSTOKEN = 0L;
_oswindow_destroy_idles();
i_INSTANCE = NULL;
}
HINSTANCE _osgui_instance(void)
{
return i_INSTANCE;
}
BOOL _osgui_hit_test(HWND hwnd)
{
if (hwnd == NULL)
return FALSE;
{
HWND capture_hwnd = GetCapture();
if ((capture_hwnd != NULL) && (capture_hwnd != hwnd))
return FALSE;
}
{
POINT pt;
HWND mouse_hwnd = NULL;
GetCursorPos(&pt);
{
RECT rect;
GetWindowRect(hwnd, &rect);
if (!PtInRect(&rect, pt))
return FALSE;
}
mouse_hwnd = WindowFromPoint(pt);
if (!IsWindowEnabled(mouse_hwnd))
return FALSE;
if (mouse_hwnd == hwnd)
return TRUE;
ScreenToClient(mouse_hwnd, &pt);
return (ChildWindowFromPointEx(mouse_hwnd, pt, CWP_ALL) == hwnd);
}
}
uint16_t _osgui_unique_child_id(void)
{
uint16_t id = i_GLOBAL_MENU_ID;
cassert(i_GLOBAL_MENU_ID < 0xFFF0);
i_GLOBAL_MENU_ID += 1;
return id;
}
void _osgui_add_accelerator(BYTE fVirt, WORD key, WORD cmd, HWND hwnd)
{
if (i_ACCELERATORS == NULL)
{
cassert(i_HWND_ACCELERATORS == NULL);
i_ACCELERATORS = arrst_create(ACCEL);
i_HWND_ACCELERATORS = arrst_create(HWND);
}
{
ACCEL *accel = arrst_new(i_ACCELERATORS, ACCEL);
HWND *nhwnd = arrst_new(i_HWND_ACCELERATORS, HWND);
accel->fVirt = fVirt;
accel->key = key;
accel->cmd = cmd;
*nhwnd = hwnd;
}
if (i_ACCEL_TABLE != NULL)
{
BOOL ok = DestroyAcceleratorTable(i_ACCEL_TABLE);
cassert_unref(ok == TRUE, ok);
cassert(arrst_size(i_ACCELERATORS, ACCEL) > 1);
}
else
{
cassert(arrst_size(i_ACCELERATORS, ACCEL) == 1);
}
cassert(arrst_size(i_HWND_ACCELERATORS, HWND) == arrst_size(i_ACCELERATORS, ACCEL));
i_ACCEL_TABLE = CreateAcceleratorTable(arrst_all(i_ACCELERATORS, ACCEL), (int)arrst_size(i_ACCELERATORS, ACCEL));
cassert_no_null(i_ACCEL_TABLE);
}
void _osgui_remove_accelerator(WORD cmd)
{
uint32_t i = UINT32_MAX;
BOOL ok = FALSE;
cassert_no_null(i_ACCELERATORS);
cassert_no_null(i_HWND_ACCELERATORS);
arrst_foreach(accel, i_ACCELERATORS, ACCEL)
if (accel->cmd == cmd)
{
i = accel_i;
break;
}
arrst_end()
cassert(i < arrst_size(i_ACCELERATORS, ACCEL));
cassert(arrst_size(i_HWND_ACCELERATORS, HWND) == arrst_size(i_ACCELERATORS, ACCEL));
arrst_delete(i_ACCELERATORS, i, NULL, ACCEL);
arrst_delete(i_HWND_ACCELERATORS, i, NULL, HWND);
ok = DestroyAcceleratorTable(i_ACCEL_TABLE);
cassert_unref(ok == TRUE, ok);
if (arrst_size(i_ACCELERATORS, ACCEL) > 0)
{
i_ACCEL_TABLE = CreateAcceleratorTable(arrst_all(i_ACCELERATORS, ACCEL), (int)arrst_size(i_ACCELERATORS, ACCEL));
}
else
{
i_ACCEL_TABLE = NULL;
arrst_destroy(&i_ACCELERATORS, NULL, ACCEL);
arrst_destroy(&i_HWND_ACCELERATORS, NULL, HWND);
}
}
void _osgui_change_accelerator(BYTE fVirt, WORD key, WORD cmd)
{
uint32_t i = UINT32_MAX;
BOOL ok = FALSE;
cassert_no_null(i_ACCELERATORS);
cassert_no_null(i_HWND_ACCELERATORS);
cassert(arrst_size(i_HWND_ACCELERATORS, HWND) == arrst_size(i_ACCELERATORS, ACCEL));
arrst_foreach(accel, i_ACCELERATORS, ACCEL)
if (accel->cmd == cmd)
{
i = accel_i;
accel->fVirt = fVirt;
accel->key = key;
break;
}
arrst_end()
cassert_unref(i < arrst_size(i_ACCELERATORS, ACCEL), i);
cassert_no_null(i_ACCEL_TABLE);
ok = DestroyAcceleratorTable(i_ACCEL_TABLE);
cassert_unref(ok == TRUE, ok);
i_ACCEL_TABLE = CreateAcceleratorTable(arrst_all(i_ACCELERATORS, ACCEL), (int)arrst_size(i_ACCELERATORS, ACCEL));
cassert_no_null(i_ACCEL_TABLE);
}
HACCEL _osgui_accel_table(void)
{
return i_ACCEL_TABLE;
}
HWND _osgui_hwnd_accelerator(WORD cmd)
{
cassert_no_null(i_ACCELERATORS);
cassert_no_null(i_HWND_ACCELERATORS);
cassert(arrst_size(i_HWND_ACCELERATORS, HWND) == arrst_size(i_ACCELERATORS, ACCEL));
arrst_foreach(accel, i_ACCELERATORS, ACCEL)
if (accel->cmd == cmd)
{
HWND *hwnd = arrst_get(i_HWND_ACCELERATORS, accel_i, HWND);
return *hwnd;
}
arrst_end()
cassert_msg(FALSE, "Unknown win32 acelerator cmd");
return NULL;
}
void _osgui_select_text(const int32_t st, const int32_t ed, int32_t *platform_st, int32_t *platform_ed)
{
cassert_no_null(platform_st);
cassert_no_null(platform_ed);
if (st == -1 && ed == -1)
{
*platform_st = INT32_MAX;
*platform_ed = INT32_MAX;
}
else
{
*platform_st = st;
*platform_ed = ed;
}
}
void _osgui_attach_menubar(OSWindow *window, OSMenu *menu)
{
HMENU hmenu = _osmenu_menubar(menu, window);
_oswindow_set_menubar(window, hmenu);
}
void _osgui_detach_menubar(OSWindow *window, OSMenu *menu)
{
if (menu != NULL)
{
HMENU hmenu = _osmenu_menubar_unlink(menu, window);
_oswindow_unset_menubar(window, hmenu);
}
}
void _osgui_change_menubar(OSWindow *window, OSMenu *previous_menu, OSMenu *new_menu)
{
HMENU prev_hmenu = _osmenu_menubar_unlink(previous_menu, window);
HMENU new_hmenu = _osmenu_menubar(new_menu, window);
_oswindow_change_menubar(window, prev_hmenu, new_hmenu);
}
void _osgui_message_loop_imp(void)
{
_oswindow_message_loop(NULL);
}
bool_t _osgui_is_pre_initialized_imp(void)
{
cassert(FALSE);
return FALSE;
}
void _osgui_pre_initialize_imp(void)
{
cassert(FALSE);
}