1
- use glium:: glutin;
2
- use glium:: glutin:: event:: { Event , WindowEvent } ;
3
- use glium:: glutin:: event_loop:: { ControlFlow , EventLoop } ;
4
- use glium:: glutin:: window:: WindowBuilder ;
5
- use glium:: { Display , Surface } ;
1
+ use glium:: glutin:: surface:: WindowSurface ;
2
+ use glium:: Surface ;
6
3
use imgui:: { Context , FontConfig , FontGlyphRanges , FontSource , Ui } ;
7
4
use imgui_glium_renderer:: Renderer ;
5
+ use imgui_winit_support:: winit:: dpi:: LogicalSize ;
6
+ use imgui_winit_support:: winit:: event:: { Event , WindowEvent } ;
7
+ use imgui_winit_support:: winit:: event_loop:: EventLoop ;
8
+ use imgui_winit_support:: winit:: window:: { Window , WindowBuilder } ;
8
9
use imgui_winit_support:: { HiDpiMode , WinitPlatform } ;
9
10
use std:: path:: Path ;
10
11
use std:: time:: Instant ;
@@ -13,7 +14,8 @@ mod clipboard;
13
14
14
15
pub struct System {
15
16
pub event_loop : EventLoop < ( ) > ,
16
- pub display : glium:: Display ,
17
+ pub window : Window ,
18
+ pub display : glium:: Display < WindowSurface > ,
17
19
pub imgui : Context ,
18
20
pub platform : WinitPlatform ,
19
21
pub renderer : Renderer ,
@@ -25,13 +27,14 @@ pub fn init(title: &str) -> System {
25
27
Some ( file_name) => file_name. to_str ( ) . unwrap ( ) ,
26
28
None => title,
27
29
} ;
28
- let event_loop = EventLoop :: new ( ) ;
29
- let context = glutin :: ContextBuilder :: new ( ) . with_vsync ( true ) ;
30
+ let event_loop = EventLoop :: new ( ) . expect ( "Failed to create EventLoop" ) ;
31
+
30
32
let builder = WindowBuilder :: new ( )
31
- . with_title ( title. to_owned ( ) )
32
- . with_inner_size ( glutin:: dpi:: LogicalSize :: new ( 1024f64 , 768f64 ) ) ;
33
- let display =
34
- Display :: new ( builder, context, & event_loop) . expect ( "Failed to initialize display" ) ;
33
+ . with_title ( title)
34
+ . with_inner_size ( LogicalSize :: new ( 1024 , 768 ) ) ;
35
+ let ( window, display) = glium:: backend:: glutin:: SimpleWindowBuilder :: new ( )
36
+ . set_window_builder ( builder)
37
+ . build ( & event_loop) ;
35
38
36
39
let mut imgui = Context :: create ( ) ;
37
40
imgui. set_ini_filename ( None ) ;
@@ -44,9 +47,6 @@ pub fn init(title: &str) -> System {
44
47
45
48
let mut platform = WinitPlatform :: init ( & mut imgui) ;
46
49
{
47
- let gl_window = display. gl_window ( ) ;
48
- let window = gl_window. window ( ) ;
49
-
50
50
let dpi_mode = if let Ok ( factor) = std:: env:: var ( "IMGUI_EXAMPLE_FORCE_DPI_FACTOR" ) {
51
51
// Allow forcing of HiDPI factor for debugging purposes
52
52
match factor. parse :: < f64 > ( ) {
@@ -57,7 +57,7 @@ pub fn init(title: &str) -> System {
57
57
HiDpiMode :: Default
58
58
} ;
59
59
60
- platform. attach_window ( imgui. io_mut ( ) , window, dpi_mode) ;
60
+ platform. attach_window ( imgui. io_mut ( ) , & window, dpi_mode) ;
61
61
}
62
62
63
63
// Fixed font size. Note imgui_winit_support uses "logical
@@ -103,6 +103,7 @@ pub fn init(title: &str) -> System {
103
103
104
104
System {
105
105
event_loop,
106
+ window,
106
107
display,
107
108
imgui,
108
109
platform,
@@ -115,6 +116,7 @@ impl System {
115
116
pub fn main_loop < F : FnMut ( & mut bool , & mut Ui ) + ' static > ( self , mut run_ui : F ) {
116
117
let System {
117
118
event_loop,
119
+ window,
118
120
display,
119
121
mut imgui,
120
122
mut platform,
@@ -123,46 +125,57 @@ impl System {
123
125
} = self ;
124
126
let mut last_frame = Instant :: now ( ) ;
125
127
126
- event_loop. run ( move |event, _, control_flow| match event {
127
- Event :: NewEvents ( _) => {
128
- let now = Instant :: now ( ) ;
129
- imgui. io_mut ( ) . update_delta_time ( now - last_frame) ;
130
- last_frame = now;
131
- }
132
- Event :: MainEventsCleared => {
133
- let gl_window = display. gl_window ( ) ;
134
- platform
135
- . prepare_frame ( imgui. io_mut ( ) , gl_window. window ( ) )
136
- . expect ( "Failed to prepare frame" ) ;
137
- gl_window. window ( ) . request_redraw ( ) ;
138
- }
139
- Event :: RedrawRequested ( _) => {
140
- let ui = imgui. frame ( ) ;
141
-
142
- let mut run = true ;
143
- run_ui ( & mut run, ui) ;
144
- if !run {
145
- * control_flow = ControlFlow :: Exit ;
128
+ event_loop
129
+ . run ( move |event, window_target| match event {
130
+ Event :: NewEvents ( _) => {
131
+ let now = Instant :: now ( ) ;
132
+ imgui. io_mut ( ) . update_delta_time ( now - last_frame) ;
133
+ last_frame = now;
146
134
}
147
-
148
- let gl_window = display. gl_window ( ) ;
149
- let mut target = display. draw ( ) ;
150
- target. clear_color_srgb ( 1.0 , 1.0 , 1.0 , 1.0 ) ;
151
- platform. prepare_render ( ui, gl_window. window ( ) ) ;
152
- let draw_data = imgui. render ( ) ;
153
- renderer
154
- . render ( & mut target, draw_data)
155
- . expect ( "Rendering failed" ) ;
156
- target. finish ( ) . expect ( "Failed to swap buffers" ) ;
157
- }
158
- Event :: WindowEvent {
159
- event : WindowEvent :: CloseRequested ,
160
- ..
161
- } => * control_flow = ControlFlow :: Exit ,
162
- event => {
163
- let gl_window = display. gl_window ( ) ;
164
- platform. handle_event ( imgui. io_mut ( ) , gl_window. window ( ) , & event) ;
165
- }
166
- } )
135
+ Event :: AboutToWait => {
136
+ platform
137
+ . prepare_frame ( imgui. io_mut ( ) , & window)
138
+ . expect ( "Failed to prepare frame" ) ;
139
+ window. request_redraw ( ) ;
140
+ }
141
+ Event :: WindowEvent {
142
+ event : WindowEvent :: RedrawRequested ,
143
+ ..
144
+ } => {
145
+ let ui = imgui. frame ( ) ;
146
+
147
+ let mut run = true ;
148
+ run_ui ( & mut run, ui) ;
149
+ if !run {
150
+ window_target. exit ( ) ;
151
+ }
152
+
153
+ let mut target = display. draw ( ) ;
154
+ target. clear_color_srgb ( 1.0 , 1.0 , 1.0 , 1.0 ) ;
155
+ platform. prepare_render ( ui, & window) ;
156
+ let draw_data = imgui. render ( ) ;
157
+ renderer
158
+ . render ( & mut target, draw_data)
159
+ . expect ( "Rendering failed" ) ;
160
+ target. finish ( ) . expect ( "Failed to swap buffers" ) ;
161
+ }
162
+ Event :: WindowEvent {
163
+ event : WindowEvent :: Resized ( new_size) ,
164
+ ..
165
+ } => {
166
+ if new_size. width > 0 && new_size. height > 0 {
167
+ display. resize ( ( new_size. width , new_size. height ) ) ;
168
+ }
169
+ platform. handle_event ( imgui. io_mut ( ) , & window, & event) ;
170
+ }
171
+ Event :: WindowEvent {
172
+ event : WindowEvent :: CloseRequested ,
173
+ ..
174
+ } => window_target. exit ( ) ,
175
+ event => {
176
+ platform. handle_event ( imgui. io_mut ( ) , & window, & event) ;
177
+ }
178
+ } )
179
+ . expect ( "EventLoop error" ) ;
167
180
}
168
181
}
0 commit comments