#include "osgui_osx.inl"
#include "oscontrol_osx.inl"
#include "osmenu_osx.inl"
#include "ossplit_osx.inl"
#include "osglobals.inl"
#include "oscomwin.inl"
#include "../osgui.inl"
#include <sewer/cassert.h>
#if !defined(__MACOS__)
#error This file is only for OSX
#endif
NSNumber *kUNDERLINE_STYLE_NONE = nil;
NSNumber *kUNDERLINE_STYLE_SINGLE = nil;
NSMutableParagraphStyle *kLEFT_PARAGRAPH_STYLE = nil;
NSMutableParagraphStyle *kCENTER_PARAGRAPH_STYLE = nil;
NSMutableParagraphStyle *kRIGHT_PARAGRAPH_STYLE = nil;
static NSMenu *kEMPTY_MENUBAR = nil;
static const unsigned short i_kVIRTUAL_KEY[] =
{
UINT16_MAX,
kVK_ANSI_A,
kVK_ANSI_S,
kVK_ANSI_D,
kVK_ANSI_F,
kVK_ANSI_H,
kVK_ANSI_G,
kVK_ANSI_Z,
kVK_ANSI_X,
kVK_ANSI_C,
kVK_ANSI_V,
0xA,
kVK_ANSI_B,
kVK_ANSI_Q,
kVK_ANSI_W,
kVK_ANSI_E,
kVK_ANSI_R,
kVK_ANSI_Y,
kVK_ANSI_T,
kVK_ANSI_1,
kVK_ANSI_2,
kVK_ANSI_3,
kVK_ANSI_4,
kVK_ANSI_6,
kVK_ANSI_5,
kVK_ANSI_9,
kVK_ANSI_7,
kVK_ANSI_8,
kVK_ANSI_0,
kVK_ANSI_Backslash,
kVK_ANSI_O,
kVK_ANSI_U,
kVK_ANSI_Quote,
kVK_ANSI_I,
kVK_ANSI_P,
kVK_Return,
kVK_ANSI_L,
kVK_ANSI_J,
10000,
kVK_ANSI_K,
kVK_ANSI_Minus,
kVK_ANSI_Comma,
kVK_ANSI_Slash,
kVK_ANSI_N,
kVK_ANSI_M,
kVK_ANSI_Period,
kVK_Tab,
kVK_Space,
kVK_ANSI_Grave,
kVK_Delete,
kVK_Escape,
kVK_F17,
kVK_ANSI_KeypadDecimal,
kVK_ANSI_KeypadMultiply,
kVK_ANSI_KeypadPlus,
kVK_ANSI_KeypadClear,
kVK_ANSI_KeypadDivide,
kVK_ANSI_KeypadEnter,
kVK_ANSI_KeypadMinus,
kVK_F18,
kVK_F19,
kVK_ANSI_KeypadEquals,
kVK_ANSI_Keypad0,
kVK_ANSI_Keypad1,
kVK_ANSI_Keypad2,
kVK_ANSI_Keypad3,
kVK_ANSI_Keypad4,
kVK_ANSI_Keypad5,
kVK_ANSI_Keypad6,
kVK_ANSI_Keypad7,
kVK_ANSI_Keypad8,
kVK_ANSI_Keypad9,
kVK_F5,
kVK_F6,
kVK_F7,
kVK_F3,
kVK_F8,
kVK_F9,
kVK_F11,
kVK_F13,
kVK_F16,
kVK_F14,
kVK_F10,
kVK_F12,
kVK_F15,
kVK_PageUp,
kVK_Home,
kVK_ForwardDelete,
kVK_F4,
kVK_PageDown,
kVK_F2,
kVK_End,
kVK_F1,
kVK_LeftArrow,
kVK_RightArrow,
kVK_DownArrow,
kVK_UpArrow,
kVK_Shift,
kVK_RightShift,
kVK_Control,
kVK_RightControl,
kVK_Option,
kVK_RightOption,
kVK_Help,
kVK_ANSI_Equal,
0x6E,
kVK_Command,
kVK_RightCommand,
kVK_CapsLock,
kVK_ANSI_Semicolon,
kVK_ANSI_LeftBracket,
kVK_ANSI_RightBracket
};
void _osgui_start_imp(void)
{
kUNDERLINE_STYLE_NONE = [[NSNumber alloc] initWithInt:NSUnderlineStyleNone];
kUNDERLINE_STYLE_SINGLE = [[NSNumber alloc] initWithInt:NSUnderlineStyleSingle];
kLEFT_PARAGRAPH_STYLE = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[kLEFT_PARAGRAPH_STYLE setAlignment:_oscontrol_text_alignment(ekLEFT)];
kCENTER_PARAGRAPH_STYLE = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[kCENTER_PARAGRAPH_STYLE setAlignment:_oscontrol_text_alignment(ekCENTER)];
kRIGHT_PARAGRAPH_STYLE = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[kRIGHT_PARAGRAPH_STYLE setAlignment:_oscontrol_text_alignment(ekRIGHT)];
kEMPTY_MENUBAR = [[NSMenu alloc] initWithTitle:@""];
_osglobals_init();
_ossplit_create_tracks();
}
void _osgui_finish_imp(void)
{
[kLEFT_PARAGRAPH_STYLE release];
[kCENTER_PARAGRAPH_STYLE release];
[kRIGHT_PARAGRAPH_STYLE release];
[kUNDERLINE_STYLE_SINGLE release];
[kUNDERLINE_STYLE_NONE release];
[kEMPTY_MENUBAR release];
_osglobals_finish();
_ossplit_destroy_tracks();
_oscomwin_destroy_globals();
}
void _osgui_attach_menubar(OSWindow *window, OSMenu *menu)
{
cassert_no_null(menu);
unref(window);
_osmenu_set_menubar(menu);
[NSApp setMainMenu:cast(menu, NSMenu)];
}
void _osgui_detach_menubar(OSWindow *window, OSMenu *menu)
{
unref(window);
if (menu != NULL)
{
cassert([NSApp mainMenu] == cast(menu, NSMenu));
_osmenu_unset_menubar(menu);
[NSApp setMainMenu:kEMPTY_MENUBAR];
}
}
void _osgui_change_menubar(OSWindow *window, OSMenu *previous_menu, OSMenu *new_menu)
{
cassert_no_null(previous_menu);
cassert_no_null(new_menu);
cassert([NSApp mainMenu] == cast(previous_menu, NSMenu));
unref(window);
[NSApp setMainMenu:cast(new_menu, NSMenu)];
}
void _osgui_message_loop_imp(void)
{
cassert(FALSE);
}
bool_t _osgui_is_pre_initialized_imp(void)
{
cassert(FALSE);
return FALSE;
}
void _osgui_pre_initialize_imp(void)
{
cassert(FALSE);
}
vkey_t _osgui_vkey(unsigned short keycode)
{
vkey_t vkey = ENUM_MAX(vkey_t);
uint32_t i, n = sizeof(i_kVIRTUAL_KEY) / sizeof(unsigned short);
for (i = 0; i < n; ++i)
{
if (i_kVIRTUAL_KEY[i] == keycode)
{
vkey = (vkey_t)i;
break;
}
}
return vkey;
}
static ___INLINE bool_t i_modif(NSUInteger flags, uint32_t v1, uint32_t v2)
{
cassert(v2 - v1 == 256);
if ((flags & v1) == v1)
return TRUE;
if ((flags & v2) == v2)
return TRUE;
return FALSE;
}
void _osgui_modifier_flags(
NSUInteger flags,
bool_t *rshift, bool_t *rctrl, bool_t *rcommand, bool_t *ralt,
bool_t *lshift, bool_t *lctrl, bool_t *lcommand, bool_t *lalt)
{
*rshift = i_modif(flags, 131076, 131332);
*rctrl = i_modif(flags, 270336, 270592);
*rcommand = i_modif(flags, 1048592, 1048848);
*ralt = i_modif(flags, 524352, 524608);
*lshift = i_modif(flags, 131074, 131330);
*lctrl = i_modif(flags, 262145, 262401);
*lcommand = i_modif(flags, 1048584, 1048840);
*lalt = i_modif(flags, 524320, 524576);
}
uint32_t _osgui_modifiers(NSUInteger flags)
{
uint32_t modifiers = ekMKEY_NONE;
bool_t rshift, rctrl, rcommand, ralt;
bool_t lshift, lctrl, lcommand, lalt;
_osgui_modifier_flags(flags, &rshift, &rctrl, &rcommand, &ralt, &lshift, &lctrl, &lcommand, &lalt);
if (rshift || lshift)
modifiers |= ekMKEY_SHIFT;
if (rctrl || lctrl)
modifiers |= ekMKEY_CONTROL;
if (rcommand || lcommand)
modifiers |= ekMKEY_COMMAND;
if (ralt || lalt)
modifiers |= ekMKEY_ALT;
return modifiers;
}
uint32_t _osgui_key_equivalent_text(const char_t *text, char_t *buff, const uint32_t size)
{
uint32_t i = 0;
uint32_t key_equivalent = UINT32_MAX;
cassert_no_null(text);
cassert_no_null(buff);
while (*text != 0 && i < size - 1)
{
if (*text == '&')
{
if (*(text + 1) == '&')
{
buff[i] = '&';
text += 2;
i += 1;
}
else if (*(text + 1) == 0)
{
text += 1;
}
else
{
key_equivalent = i;
text += 1;
}
}
else
{
buff[i] = *text;
i += 1;
text += 1;
}
}
cassert(i < size - 1);
buff[i] = 0;
return key_equivalent;
}