For one, I added a new member gs_window for future use. The member is "display" which represents our connection to X11. Ideally, we should use this specific connection to deal with our Window. For now, it's disabled. Read comment for more information. Secondly, wxGTK apparently doesn't map our window in some cases. This causes the window ID passed to be bad and will stop (or segfault) our program. This might be related to the first commit above. For now, all this commit does is realize the window manually.
95 lines
2.4 KiB
C++
95 lines
2.4 KiB
C++
/******************************************************************************
|
|
Copyright (C) 2013 by Hugh Bailey <obs.jim@gmail.com>
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
******************************************************************************/
|
|
|
|
#include <wx/window.h>
|
|
#include <wx/msgdlg.h>
|
|
#include <obs.h>
|
|
#include "wx-wrappers.hpp"
|
|
#include <wx/utils.h>
|
|
|
|
#ifdef __linux__
|
|
#include <gdk/gdkx.h>
|
|
#include <gtk/gtk.h>
|
|
#endif
|
|
|
|
#include <memory>
|
|
using namespace std;
|
|
|
|
gs_window WxToGSWindow(wxWindow *wxwin)
|
|
{
|
|
gs_window window;
|
|
|
|
#ifdef __APPLE__
|
|
window.view = (id)wxwin->GetHandle();
|
|
#elif _WIN32
|
|
window.hwnd = wxwin->GetHandle();
|
|
#else
|
|
GtkWidget* hndl = wxwin->GetHandle();
|
|
|
|
/* I don't really understand why wxWidgets doesn't do this during Show() */
|
|
gtk_widget_realize(hndl);
|
|
|
|
GdkWindow* gdkwin = gtk_widget_get_window(hndl);
|
|
window.id = GDK_DRAWABLE_XID(gdkwin);
|
|
window.display = GDK_DRAWABLE_XDISPLAY(gdkwin);
|
|
#endif
|
|
|
|
return window;
|
|
}
|
|
|
|
void OBSErrorBox(wxWindow *parent, const char *message, ...)
|
|
{
|
|
va_list args;
|
|
char output[4096];
|
|
|
|
va_start(args, message);
|
|
vsnprintf(output, 4095, message, args);
|
|
va_end(args);
|
|
|
|
wxMessageBox(message, "Error", wxOK|wxCENTRE, parent);
|
|
blog(LOG_ERROR, "%s", output);
|
|
}
|
|
|
|
class MenuWrapper : public wxEvtHandler {
|
|
public:
|
|
int retId;
|
|
|
|
inline MenuWrapper() : retId(-1) {}
|
|
|
|
void GetItem(wxCommandEvent &event)
|
|
{
|
|
retId = event.GetId();
|
|
}
|
|
};
|
|
|
|
int WXDoPopupMenu(wxWindow *parent, wxMenu *menu)
|
|
{
|
|
unique_ptr<MenuWrapper> wrapper(new MenuWrapper);
|
|
|
|
menu->Connect(wxEVT_MENU,
|
|
wxCommandEventHandler(MenuWrapper::GetItem),
|
|
NULL, wrapper.get());
|
|
|
|
bool success = parent->PopupMenu(menu);
|
|
|
|
menu->Disconnect(wxEVT_MENU,
|
|
wxCommandEventHandler(MenuWrapper::GetItem),
|
|
NULL, wrapper.get());
|
|
|
|
return (success) ? wrapper->retId : -1;
|
|
}
|