diff --git a/CMakeLists.txt b/CMakeLists.txt index cb88506..509ebb4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,7 @@ emulator.cpp filterchroma.cpp filterluma.cpp firmwarecard.cpp +gtkutil.cpp gui.cpp keyboardbuffermode.cpp keyboard.cpp @@ -193,6 +194,13 @@ find_package(wxWidgets REQUIRED COMPONENTS base core xrc qa) include(${wxWidgets_USE_FILE}) target_link_libraries(${APP_NAME} PRIVATE ${wxWidgets_LIBRARIES}) +if(NOT (APPLE OR WIN32)) + find_package(PkgConfig REQUIRED) + pkg_check_modules(GTKMM REQUIRED gtk+-3.0) + target_include_directories(${APP_NAME} PRIVATE ${GTKMM_INCLUDE_DIRS}) + target_link_libraries(${APP_NAME} PRIVATE ${GTKMM_LIBRARIES}) +endif() + configure_file(src/config.h.in config.h) diff --git a/src/gtkutil.cpp b/src/gtkutil.cpp new file mode 100644 index 0000000..4e28668 --- /dev/null +++ b/src/gtkutil.cpp @@ -0,0 +1,15 @@ +#include "gtkutil.h" + +#include +#include + +void *get_gtk_native_window_handle(void *widget) { + GtkWidget *gtk_widget = GTK_WIDGET(widget); + + gtk_widget_realize(gtk_widget); + + GdkWindow *gdk_window = gtk_widget_get_window(gtk_widget); + Window xid = gdk_x11_window_get_xid(gdk_window); + + return reinterpret_cast(xid); +} diff --git a/src/gtkutil.h b/src/gtkutil.h new file mode 100644 index 0000000..056e59d --- /dev/null +++ b/src/gtkutil.h @@ -0,0 +1,17 @@ +/* + * File: gtkutil.h + * Author: user + * + * Created on January 4, 2023, 7:18 AM + */ + +#ifndef GTKUTIL_H +#define GTKUTIL_H + +#ifdef __WXGTK__ + +void *get_gtk_native_window_handle(void *widget); + +#endif + +#endif /* GTKUTIL_H */ diff --git a/src/screenimage.cpp b/src/screenimage.cpp index b36be1c..6129ffe 100644 --- a/src/screenimage.cpp +++ b/src/screenimage.cpp @@ -21,8 +21,10 @@ #include "e2const.h" #include "applentsc.h" #include "card.h" +#include "gtkutil.h" #include "util.h" +#include #include #include #include @@ -74,6 +76,7 @@ ScreenImage::ScreenImage(KeyEventHandler &k) : cassOutName(32, ' '), keyEventHandler(k) { createScreen(); + Center(); Show(); Bind(wxEVT_IDLE, &ScreenImage::OnIdle, this); } @@ -120,19 +123,27 @@ void ScreenImage::createScreen() { notifyObservers(); } -void ScreenImage::createSdlTexture() { - WXWidget nativeSdl = this->sdl->GetHandle(); - // TODO: do we need special gtk handling here, to get xid using: -// GtkWidget* widget = panel->GetHandle(); -// gtk_widget_realize(widget); -// Window xid = GDK_WINDOW_XWINDOW(widget->window); +static void *get_native_window_handle(wxWindowBase *panel) { + void *vn = static_cast(panel->GetHandle()); +#ifdef __WXGTK__ + vn = get_gtk_native_window_handle(vn); +#endif + return vn; +} - this->window = SDL_CreateWindowFrom(static_cast(nativeSdl)); +void ScreenImage::createSdlTexture() { + void *nativeSdl = get_native_window_handle(this->sdl); + + this->window = SDL_CreateWindowFrom(nativeSdl); if (this->window == NULL) { printf("Unable to create window: %s\n", SDL_GetError()); throw ScreenException(); } +#ifdef __WXGTK__ + SDL_SetWindowSize(this->window, SCRW, SCRH*ASPECT_RATIO); +#endif + this->renderer = SDL_CreateRenderer(this->window, -1, 0); if (this->renderer == NULL) { std::cerr << SDL_GetError() << std::endl;