Cemu/src/gui/wxgui/helpers/wxHelpers.cpp

117 lines
3.1 KiB
C++

#include "wxgui/helpers/wxHelpers.h"
#include <wx/wupdlock.h>
#include <wx/stattext.h>
#include <wx/slider.h>
#include <wx/dirdlg.h>
#if BOOST_OS_LINUX || BOOST_OS_BSD
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkwindow.h>
#include <gdk/gdkx.h>
#ifdef HAS_WAYLAND
#include <gdk/gdkwayland.h>
#endif
#endif
#include "wxgui/helpers/wxControlObject.h"
void wxAutosizeColumn(wxListCtrlBase* ctrl, int col)
{
ctrl->SetColumnWidth(col, wxLIST_AUTOSIZE_USEHEADER);
int wh = ctrl->GetColumnWidth(col);
ctrl->SetColumnWidth(col, wxLIST_AUTOSIZE);
int wc = ctrl->GetColumnWidth(col);
if (wh > wc)
ctrl->SetColumnWidth(col, wxLIST_AUTOSIZE_USEHEADER);
}
void wxAutosizeColumns(wxListCtrlBase* ctrl, int col_start, int col_end)
{
wxWindowUpdateLocker lock(ctrl);
for (int i = col_start; i <= col_end; ++i)
wxAutosizeColumn(ctrl, i);
}
void update_slider_text(wxCommandEvent& event, const wxFormatString& format /*= "%d%%"*/)
{
const auto slider = dynamic_cast<wxSlider*>(event.GetEventObject());
wxASSERT(slider);
auto slider_text = dynamic_cast<wxControlObject*>(event.GetEventUserData())->GetControl<wxStaticText>();
wxASSERT(slider_text);
slider_text->SetLabel(wxString::Format(format, slider->GetValue()));
}
uint32 fix_raw_keycode(uint32 keycode, uint32 raw_flags)
{
#if BOOST_OS_WINDOWS
const auto flags = (HIWORD(raw_flags) & 0xFFF);
if(keycode == VK_SHIFT)
{
if(flags == 0x2A)
return 160;
else if (flags == 0x36)
return 161;
}
else if (keycode == VK_CONTROL)
{
if (flags == 0x1d)
return 162;
else if (flags == 0x11d)
return 163;
}
else if (keycode == VK_MENU)
{
if ((flags & 0xFF) == 0x38)
return 164;
else if ((flags & 0xFF) == 0x38)
return 165;
}
#endif
return keycode;
}
WindowSystem::WindowHandleInfo initHandleContextFromWxWidgetsWindow(wxWindow* wxw)
{
WindowSystem::WindowHandleInfo handleInfo;
#if BOOST_OS_WINDOWS
handleInfo.backend = WindowSystem::WindowHandleInfo::Backend::Windows;
handleInfo.surface = reinterpret_cast<void*>(wxw->GetHWND());
#elif BOOST_OS_LINUX || BOOST_OS_BSD
GtkWidget* gtkWidget = (GtkWidget*)wxw->GetHandle(); // returns GtkWidget
gtk_widget_realize(gtkWidget);
GdkWindow* gdkWindow = gtk_widget_get_window(gtkWidget);
GdkDisplay* gdkDisplay = gdk_window_get_display(gdkWindow);
if (GDK_IS_X11_WINDOW(gdkWindow))
{
handleInfo.backend = WindowSystem::WindowHandleInfo::Backend::X11;
handleInfo.surface = reinterpret_cast<void*>(gdk_x11_window_get_xid(gdkWindow));
handleInfo.display = gdk_x11_display_get_xdisplay(gdkDisplay);
if (!handleInfo.display)
{
cemuLog_log(LogType::Force, "Unable to get xlib display");
}
}
#ifdef HAS_WAYLAND
else if (GDK_IS_WAYLAND_WINDOW(gdkWindow))
{
handleInfo.backend = WindowSystem::WindowHandleInfo::Backend::Wayland;
handleInfo.surface = gdk_wayland_window_get_wl_surface(gdkWindow);
handleInfo.display = gdk_wayland_display_get_wl_display(gdkDisplay);
}
#endif
else
{
cemuLog_log(LogType::Force, "Unsuported GTK backend");
}
#elif BOOST_OS_MACOS
handleInfo.backend = WindowSystem::WindowHandleInfo::Backend::Cocoa;
handleInfo.surface = reinterpret_cast<void*>(wxw->GetHandle());
#endif
return std::move(handleInfo);
}