Started reintegrating uiWindow on macOS. I didn't think the implData variable naming through... Also made uiWindow a mere typedef to uiControl; I'll need to copy the handle logic from Windows to make this robust, or something to that effect...

This commit is contained in:
Pietro Gagliardi 2020-05-22 22:43:33 -04:00
parent a65bbfa057
commit ba6f2865df
3 changed files with 74 additions and 14 deletions

View File

@ -3,9 +3,10 @@
#define defaultStyleMask (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
struct uiWindow {
uiDarwinControl c;
struct windowImplData {
NSWindow *window;
char *title;
#if 0
uiControl *child;
int margined;
int (*onClosing)(uiWindow *, void *);
@ -16,8 +17,11 @@ struct uiWindow {
BOOL suppressSizeChanged;
int fullscreen;
int borderless;
#endif
};
#if 0
@implementation uiprivNSWindow
- (void)uiprivDoMove:(NSEvent *)initialEvent
@ -367,24 +371,25 @@ static void defaultOnPositionContentSizeChanged(uiWindow *w, void *data)
// do nothing
}
uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
#endif
static bool windowInit(uiControl *c, void *implData, void *initData)
{
uiWindow *w;
windowImplData *w = (windowImplData *) implData;
uiprivFinalizeMenus();
uiDarwinNewControl(uiWindow, w);
w->window = [[uiprivNSWindow alloc] initWithContentRect:NSMakeRect(0, 0, (CGFloat) width, (CGFloat) height)
w->window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, TODO, TODO)
styleMask:defaultStyleMask
backing:NSBackingStoreBuffered
defer:YES];
[w->window setTitle:uiprivToNSString(title)];
w->title = NULL;
[w->window setTitle:@""];
// do NOT release when closed
// we manually do this in uiWindowDestroy() above
[w->window setReleasedWhenClosed:NO];
#if 0
if (windowDelegate == nil) {
windowDelegate = [[windowDelegateClass new] autorelease];
[uiprivDelegates addObject:windowDelegate];
@ -392,10 +397,63 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
[windowDelegate registerWindow:w];
uiWindowOnClosing(w, defaultOnClosing, NULL);
uiWindowOnContentSizeChanged(w, defaultOnPositionContentSizeChanged, NULL);
#endif
return w;
return true;
}
static void windowFree(uiControl *c, void *implData)
{
}
static void windowParentChanging(uiControl *c, void *implData, uiControl *oldParent)
{
}
static void windowParentChanged(uiControl *c, void *implData, uiControl *newParent)
{
}
static const uiControlVtable windowVtable = {
.Size = sizeof (uiControlVtable),
.Init = windowInit,
.Free = windowFree,
.ParentChanging = windowParentChanging,
.ParentChanged = windowParentChanged,
};
static const uiControlOSVtable windowOSVtable = {
.Size = sizeof (uiControlOSVtable),
};
static uint32_t windowType = 0;
uint32_t uiWindowType(void)
{
if (windowType == 0)
windowType = uiRegisterControlType("uiWindow", &windowVtable, &windowOSVtable, sizeof (windowImplData));
return windowType;
}
uiWindow *uiNewWindow(void)
{
return (uiWindow *) uiNewControl(uiWindowType(), NULL);
}
const char *uiWindowTitle(uiWindow *w)
{
if (w->title == NULL)
return "";
return w->title;
}
void uiWindowSetTitle(uiWindow *w, const char *title)
{
// TODO
}
#if 0
// utility function for menus
uiWindow *uiprivWindowFromNSWindow(NSWindow *w)
{
@ -405,3 +463,5 @@ uiWindow *uiprivWindowFromNSWindow(NSWindow *w)
return NULL;
return [windowDelegate lookupWindow:w];
}
#endif

View File

@ -11,12 +11,12 @@ TODO
### `uiWindow`
```c
typedef struct uiWindow uiWindow;
typedef uiControl uiWindow;
uiprivExtern uint32_t uiWindowType(void);
#define uiWindow(obj) ((uiWindow *) uiCheckControlType((obj), uiWindowType()))
```
`uiWindow` is an opaque `uiControl` type that represents a window.
`uiWindow` is a `uiControl` that represents a window.
Windows are the highest level of a control hierarchy that is visibile on screen. All controls that are current visible are contained within a `uiWindow`, and it is the size and position of the window that ultimately decides their size and position (though a control's minimum size may contribute to this). Windows also have titles, which are used to identify the window to the user.

2
ui.h
View File

@ -66,7 +66,7 @@ uiprivExtern void uiControlFree(uiControl *c);
uiprivExtern void uiControlSetParent(uiControl *c, uiControl *parent);
uiprivExtern void *uiControlImplData(uiControl *c);
typedef struct uiWindow uiWindow;
typedef uiControl uiWindow;
uiprivExtern uint32_t uiWindowType(void);
#define uiWindow(obj) ((uiWindow *) uiCheckControlType((obj), uiWindowType()))