summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/sdl/window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/sdl/window.cpp')
-rw-r--r--src/osd/sdl/window.cpp96
1 files changed, 61 insertions, 35 deletions
diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp
index 18274b6ecb2..7cec35d400a 100644
--- a/src/osd/sdl/window.cpp
+++ b/src/osd/sdl/window.cpp
@@ -89,6 +89,14 @@ sdl_window_info *sdl_window_list;
static sdl_window_info **last_window_ptr;
+class SDL_DM_Wrapper
+{
+public:
+ SDL_DisplayMode mode;
+};
+
+
+
// event handling
static SDL_threadID main_threadid;
static SDL_threadID window_threadid;
@@ -300,33 +308,13 @@ void sdl_osd_interface::update_slider_list()
void sdl_osd_interface::build_slider_list()
{
- m_sliders = nullptr;
- slider_state* full_list = nullptr;
- slider_state* curr = nullptr;
+ m_sliders.clear();
+
for (sdl_window_info *window = sdl_window_list; window != nullptr; window = window->m_next)
{
- // take the sliders of the first window
- slider_state* window_sliders = window->renderer().get_slider_list();
- if (window_sliders == nullptr)
- {
- continue;
- }
-
- if (full_list == nullptr)
- {
- full_list = curr = window_sliders;
- }
- else
- {
- curr->next = window_sliders;
- }
-
- while (curr->next != nullptr) {
- curr = curr->next;
- }
+ std::vector<ui_menu_item> window_sliders = window->renderer().get_slider_list();
+ m_sliders.insert(m_sliders.end(), window_sliders.begin(), window_sliders.end());
}
-
- m_sliders = full_list;
}
//============================================================
@@ -488,7 +476,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt )
if (window->fullscreen() && (video_config.switchres || is_osx))
{
SDL_SetWindowFullscreen(window->sdl_window(), 0); // Try to set mode
- SDL_SetWindowDisplayMode(window->sdl_window(), &window->m_original_mode); // Try to set mode
+ SDL_SetWindowDisplayMode(window->sdl_window(), &window->m_original_mode->mode); // Try to set mode
SDL_SetWindowFullscreen(window->sdl_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode
}
SDL_DestroyWindow(window->sdl_window());
@@ -623,9 +611,6 @@ int sdl_window_info::window_init()
set_renderer(osd_renderer::make_for_type(video_config.mode, reinterpret_cast<osd_window *>(this)));
- // create an event that we can use to skip blitting
- m_rendered_event = osd_event_alloc(FALSE, TRUE);
-
// load the layout
m_target = m_machine.render().target_alloc();
@@ -673,7 +658,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_video_window_destroy_wt )
if (window->fullscreen() && video_config.switchres)
{
SDL_SetWindowFullscreen(window->sdl_window(), 0); // Try to set mode
- SDL_SetWindowDisplayMode(window->sdl_window(), &window->m_original_mode); // Try to set mode
+ SDL_SetWindowDisplayMode(window->sdl_window(), &window->m_original_mode->mode); // Try to set mode
SDL_SetWindowFullscreen(window->sdl_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode
}
SDL_DestroyWindow(window->sdl_window());
@@ -706,9 +691,6 @@ void sdl_window_info::destroy()
// free the render target, after the textures!
this->machine().render().target_free(m_target);
- // free the event
- osd_event_free(m_rendered_event);
-
}
@@ -828,7 +810,7 @@ void sdl_window_info::update()
else
event_wait_ticks = 0;
- if (osd_event_wait(m_rendered_event, event_wait_ticks))
+ if (m_rendered_event.wait(event_wait_ticks))
{
// ensure the target bounds are up-to-date, and then get the primitives
@@ -967,7 +949,7 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt )
SDL_DisplayMode mode;
//SDL_GetCurrentDisplayMode(window().monitor()->handle, &mode);
SDL_GetWindowDisplayMode(window->sdl_window(), &mode);
- window->m_original_mode = mode;
+ window->m_original_mode->mode = mode;
mode.w = temp.width();
mode.h = temp.height();
if (window->m_win_config.refresh)
@@ -1130,7 +1112,7 @@ OSDWORK_CALLBACK( sdl_window_info::draw_video_contents_wt )
}
/* all done, ready for next */
- osd_event_set(window->m_rendered_event);
+ window->m_rendered_event.set();
osd_free(wp);
return nullptr;
@@ -1319,6 +1301,16 @@ osd_dim sdl_window_info::get_min_bounds(int constrain)
return osd_dim(minwidth, minheight);
}
+//============================================================
+// get_size
+//============================================================
+
+osd_dim sdl_window_info::get_size()
+{
+ int w=0; int h=0;
+ SDL_GetWindowSize(m_sdl_window, &w, &h);
+ return osd_dim(w,h);
+}
//============================================================
@@ -1361,3 +1353,37 @@ osd_dim sdl_window_info::get_max_bounds(int constrain)
return maximum.dim();
}
+
+//============================================================
+// construction and destruction
+//============================================================
+
+sdl_window_info::sdl_window_info(running_machine &a_machine, int index, osd_monitor_info *a_monitor,
+ const osd_window_config *config)
+: osd_window(), m_next(NULL),
+ // Following three are used by input code to defer resizes
+ m_resize_width(0),
+ m_resize_height(0),
+ m_last_resize(0),
+ m_minimum_dim(0,0),
+ m_windowed_dim(0,0),
+ m_rendered_event(0, 1), m_target(0),
+ m_sdl_window(NULL),
+ m_machine(a_machine), m_monitor(a_monitor), m_fullscreen(0)
+{
+ m_win_config = *config;
+ m_index = index;
+
+ //FIXME: these should be per_window in config-> or even better a bit set
+ m_fullscreen = !video_config.windowed;
+ m_prescale = video_config.prescale;
+
+ m_windowed_dim = osd_dim(config->width, config->height);
+ m_original_mode = global_alloc(SDL_DM_Wrapper);
+}
+
+sdl_window_info::~sdl_window_info()
+{
+ global_free(m_renderer);
+ global_free(m_original_mode);
+}
' href='#n371'>371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470