@@ -235,6 +235,7 @@ -(void) viewDidMoveToWindow;
235
235
-(void ) viewWillMoveToWindow : (NSWindow *) newWindow ;
236
236
-(void ) mouseEntered : (NSEvent *) evt ;
237
237
-(void ) mouseExited : (NSEvent *) evt ;
238
+ -(void ) viewWillStartLiveResize ;
238
239
-(void ) viewDidEndLiveResize ;
239
240
/* Window delegate methods */
240
241
-(void ) windowDidBecomeMain : (NSNotification *) notification ;
@@ -519,6 +520,33 @@ -(void) viewDidChangeBackingProperties
519
520
}
520
521
#endif
521
522
523
+ -(void ) viewWillStartLiveResize
524
+ {
525
+ ALLEGRO_DISPLAY_OSX_WIN* dpy = (ALLEGRO_DISPLAY_OSX_WIN*) dpy_ptr;
526
+ ALLEGRO_EVENT_SOURCE *es = &dpy->parent .es ;
527
+
528
+ if (dpy->send_halt_events ) {
529
+ al_lock_mutex (dpy->halt_mutex );
530
+ dpy->halt_event_acknowledged = false ;
531
+ al_unlock_mutex (dpy->halt_mutex );
532
+
533
+ _al_event_source_lock (es);
534
+ if (_al_event_source_needs_to_generate_event (es)) {
535
+ ALLEGRO_EVENT event;
536
+ event.display .type = ALLEGRO_EVENT_DISPLAY_HALT_DRAWING;
537
+ event.display .timestamp = al_get_time ();
538
+ _al_event_source_emit_event (es, &event);
539
+ }
540
+ _al_event_source_unlock (es);
541
+
542
+ al_lock_mutex (dpy->halt_mutex );
543
+ while (!dpy->halt_event_acknowledged ) {
544
+ al_wait_cond (dpy->halt_cond , dpy->halt_mutex );
545
+ }
546
+ al_unlock_mutex (dpy->halt_mutex );
547
+ }
548
+ }
549
+
522
550
-(void ) viewDidEndLiveResize
523
551
{
524
552
[super viewDidEndLiveResize ];
@@ -541,6 +569,11 @@ -(void) viewDidEndLiveResize
541
569
event.display .height = NSHeight (content);
542
570
_al_event_source_emit_event (es, &event);
543
571
ALLEGRO_INFO (" Window finished resizing %d x %d \n " , event.display .width , event.display .height );
572
+
573
+ if (dpy->send_halt_events ) {
574
+ event.display .type = ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING;
575
+ _al_event_source_emit_event (es, &event);
576
+ }
544
577
}
545
578
_al_event_source_unlock (es);
546
579
}
@@ -1102,6 +1135,19 @@ static void init_new_vsync(ALLEGRO_DISPLAY_OSX_WIN *dpy)
1102
1135
CVDisplayLinkStart (dpy->display_link );
1103
1136
}
1104
1137
1138
+ static void init_halt_events (ALLEGRO_DISPLAY_OSX_WIN *dpy)
1139
+ {
1140
+ const char * value = al_get_config_value (al_get_system_config (), " osx" , " allow_live_resize" );
1141
+ if (value && strcmp (value, " false" ) == 0 ) {
1142
+ dpy->send_halt_events = true ;
1143
+ }
1144
+ else {
1145
+ dpy->send_halt_events = false ;
1146
+ }
1147
+ dpy->halt_mutex = al_create_mutex ();
1148
+ dpy->halt_cond = al_create_cond ();
1149
+ }
1150
+
1105
1151
/* create_display_fs:
1106
1152
* Create a fullscreen display - capture the display
1107
1153
*/
@@ -1139,6 +1185,7 @@ static void init_new_vsync(ALLEGRO_DISPLAY_OSX_WIN *dpy)
1139
1185
_al_event_source_init (&display->es );
1140
1186
dpy->cursor = [[NSCursor arrowCursor ] retain ];
1141
1187
dpy->display_id = CGMainDisplayID ();
1188
+ init_halt_events (dpy);
1142
1189
1143
1190
/* Get display ID for the requested display */
1144
1191
if (al_get_new_display_adapter () > 0 ) {
@@ -1334,6 +1381,7 @@ static void init_new_vsync(ALLEGRO_DISPLAY_OSX_WIN *dpy)
1334
1381
_al_event_source_init(&dpy->parent.es);
1335
1382
osx_change_cursor(dpy, [NSCursor arrowCursor]);
1336
1383
dpy->show_cursor = YES;
1384
+ init_halt_events(dpy);
1337
1385
1338
1386
// Set up a pixel format to describe the mode we want.
1339
1387
osx_set_opengl_pixelformat_attributes(dpy);
@@ -1513,6 +1561,7 @@ static void init_new_vsync(ALLEGRO_DISPLAY_OSX_WIN *dpy)
1513
1561
_al_event_source_init (&display->es );
1514
1562
_al_osx_change_cursor (dpy, [NSCursor arrowCursor ]);
1515
1563
dpy->show_cursor = YES ;
1564
+ init_halt_events (dpy);
1516
1565
1517
1566
// Set up a pixel format to describe the mode we want.
1518
1567
osx_set_opengl_pixelformat_attributes (dpy);
@@ -1799,6 +1848,8 @@ static void destroy_display(ALLEGRO_DISPLAY* d)
1799
1848
_al_set_current_display_only (NULL );
1800
1849
}
1801
1850
1851
+ al_destroy_cond (dpy->halt_cond );
1852
+ al_destroy_mutex (dpy->halt_mutex );
1802
1853
if (dpy->flip_mutex ) {
1803
1854
al_destroy_mutex (dpy->flip_mutex );
1804
1855
al_destroy_cond (dpy->flip_cond );
@@ -2489,6 +2540,15 @@ static bool set_display_flag(ALLEGRO_DISPLAY *display, int flag, bool onoff)
2489
2540
#endif
2490
2541
}
2491
2542
2543
+ static void acknowledge_drawing_halt (ALLEGRO_DISPLAY *display)
2544
+ {
2545
+ ALLEGRO_DISPLAY_OSX_WIN *dpy = (ALLEGRO_DISPLAY_OSX_WIN *)display;
2546
+ al_lock_mutex (dpy->halt_mutex );
2547
+ dpy->halt_event_acknowledged = true ;
2548
+ al_signal_cond (dpy->halt_cond );
2549
+ al_unlock_mutex (dpy->halt_mutex );
2550
+ }
2551
+
2492
2552
ALLEGRO_DISPLAY_INTERFACE* _al_osx_get_display_driver_win (void )
2493
2553
{
2494
2554
static ALLEGRO_DISPLAY_INTERFACE* vt = NULL ;
@@ -2519,6 +2579,7 @@ static bool set_display_flag(ALLEGRO_DISPLAY *display, int flag, bool onoff)
2519
2579
vt->set_display_flag = set_display_flag;
2520
2580
vt->set_icons = set_icons;
2521
2581
vt->update_render_state = _al_ogl_update_render_state;
2582
+ vt->acknowledge_drawing_halt = acknowledge_drawing_halt;
2522
2583
_al_ogl_add_drawing_functions (vt);
2523
2584
_al_osx_add_clipboard_functions (vt);
2524
2585
}
0 commit comments