redraw during live resize operations
This commit is contained in:
parent
e22893e9ea
commit
beffc60634
|
@ -342,6 +342,9 @@ void mp_set_target_fps(u32 fps); // or use wait vblank?
|
||||||
void mp_pump_events(f64 timeout);
|
void mp_pump_events(f64 timeout);
|
||||||
bool mp_next_event(mp_event* event);
|
bool mp_next_event(mp_event* event);
|
||||||
|
|
||||||
|
typedef void(*mp_live_resize_callback)(mp_event event, void* data);
|
||||||
|
void mp_set_live_resize_callback(mp_live_resize_callback callback, void* data);
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// Input state polling
|
// Input state polling
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
|
@ -171,6 +171,11 @@ struct mp_app_data
|
||||||
mp_input_state inputState;
|
mp_input_state inputState;
|
||||||
ringbuffer eventQueue;
|
ringbuffer eventQueue;
|
||||||
|
|
||||||
|
mp_live_resize_callback liveResizeCallback;
|
||||||
|
void* liveResizeData;
|
||||||
|
|
||||||
|
CVDisplayLinkRef displayLink;
|
||||||
|
|
||||||
mp_frame_stats frameStats;
|
mp_frame_stats frameStats;
|
||||||
|
|
||||||
NSTimer* frameTimer;
|
NSTimer* frameTimer;
|
||||||
|
@ -181,7 +186,6 @@ struct mp_app_data
|
||||||
mp_view_data viewPool[MP_APP_MAX_VIEWS];
|
mp_view_data viewPool[MP_APP_MAX_VIEWS];
|
||||||
list_info viewFreeList;
|
list_info viewFreeList;
|
||||||
|
|
||||||
|
|
||||||
TISInputSourceRef kbLayoutInputSource;
|
TISInputSourceRef kbLayoutInputSource;
|
||||||
void* kbLayoutUnicodeData;
|
void* kbLayoutUnicodeData;
|
||||||
id kbLayoutListener;
|
id kbLayoutListener;
|
||||||
|
@ -839,9 +843,26 @@ static void mp_queue_event(mp_event* event)
|
||||||
mp_rect viewFrame = {0, 0, contentRect.size.width, contentRect.size.height};
|
mp_rect viewFrame = {0, 0, contentRect.size.width, contentRect.size.height};
|
||||||
mp_view_set_frame(mpWindow->mainView, viewFrame);
|
mp_view_set_frame(mpWindow->mainView, viewFrame);
|
||||||
|
|
||||||
|
|
||||||
|
if(__mpAppData.liveResizeCallback)
|
||||||
|
{
|
||||||
|
__mpAppData.liveResizeCallback(event, __mpAppData.liveResizeData);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: also ensure we don't overflow the queue during live resize...
|
||||||
mp_queue_event(&event);
|
mp_queue_event(&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void)windowWillStartLiveResize:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
CVDisplayLinkStart(__mpAppData.displayLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)windowDidEndLiveResize:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
CVDisplayLinkStop(__mpAppData.displayLink);
|
||||||
|
}
|
||||||
|
|
||||||
- (void)windowWillClose:(NSNotification *)notification
|
- (void)windowWillClose:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
mpWindow->nsWindow = nil;
|
mpWindow->nsWindow = nil;
|
||||||
|
@ -1297,6 +1318,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@end //@implementation MPNativeView
|
@end //@implementation MPNativeView
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1326,6 +1348,25 @@ f64 mp_get_elapsed_seconds()
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink,
|
||||||
|
const CVTimeStamp *inNow,
|
||||||
|
const CVTimeStamp *inOutputTime,
|
||||||
|
CVOptionFlags flagsIn,
|
||||||
|
CVOptionFlags *flagsOut,
|
||||||
|
void *displayLinkContext)
|
||||||
|
{
|
||||||
|
if(__mpAppData.liveResizeCallback)
|
||||||
|
{
|
||||||
|
mp_event event = {};
|
||||||
|
event.type = MP_EVENT_FRAME;
|
||||||
|
|
||||||
|
__mpAppData.liveResizeCallback(event, __mpAppData.liveResizeData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//***************************************************************
|
//***************************************************************
|
||||||
// public API
|
// public API
|
||||||
//***************************************************************
|
//***************************************************************
|
||||||
|
@ -1367,6 +1408,10 @@ void mp_init()
|
||||||
LOG_MESSAGE("run application\n");
|
LOG_MESSAGE("run application\n");
|
||||||
[NSApp run];
|
[NSApp run];
|
||||||
|
|
||||||
|
CGDirectDisplayID displayID = CGMainDisplayID();
|
||||||
|
CVDisplayLinkCreateWithCGDisplay(displayID, &__mpAppData.displayLink);
|
||||||
|
CVDisplayLinkSetOutputCallback(__mpAppData.displayLink, DisplayLinkCallback, 0);
|
||||||
|
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||||
[NSApp activateIgnoringOtherApps:YES];
|
[NSApp activateIgnoringOtherApps:YES];
|
||||||
|
|
||||||
|
@ -1993,6 +2038,12 @@ void mp_end_frame()
|
||||||
// Events handling
|
// Events handling
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
void mp_set_live_resize_callback(mp_live_resize_callback callback, void* data)
|
||||||
|
{
|
||||||
|
__mpAppData.liveResizeCallback = callback;
|
||||||
|
__mpAppData.liveResizeData = data;
|
||||||
|
}
|
||||||
|
|
||||||
void mp_pump_events(f64 timeout)
|
void mp_pump_events(f64 timeout)
|
||||||
{
|
{
|
||||||
__mpAppData.inputState.frameCounter++;
|
__mpAppData.inputState.frameCounter++;
|
||||||
|
|
Loading…
Reference in New Issue