diff options
Diffstat (limited to 'src/osd/sdl/window.cpp')
-rw-r--r-- | src/osd/sdl/window.cpp | 96 |
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); +} |