mirror of https://github.com/bsnes-emu/bsnes.git
104 lines
3.4 KiB
C++
104 lines
3.4 KiB
C++
#if defined(Hiro_Viewport)
|
|
|
|
namespace hiro {
|
|
|
|
static auto Viewport_dropEvent(GtkWidget* widget, GdkDragContext* context, signed x, signed y,
|
|
GtkSelectionData* data, unsigned type, unsigned timestamp, pViewport* p) -> void {
|
|
if(!p->state().droppable) return;
|
|
auto paths = DropPaths(data);
|
|
if(!paths) return;
|
|
p->self().doDrop(paths);
|
|
}
|
|
|
|
static auto Viewport_draw(GtkWidget* widget, cairo_t* context, pViewport* p) -> signed {
|
|
return true;
|
|
}
|
|
|
|
static auto Viewport_expose(GtkWidget* widget, GdkEventExpose* event) -> signed {
|
|
return true;
|
|
}
|
|
|
|
static auto Viewport_mouseLeave(GtkWidget* widget, GdkEventButton* event, pViewport* p) -> signed {
|
|
p->self().doMouseLeave();
|
|
return true;
|
|
}
|
|
|
|
static auto Viewport_mouseMove(GtkWidget* widget, GdkEventButton* event, pViewport* p) -> signed {
|
|
p->self().doMouseMove({(signed)event->x, (signed)event->y});
|
|
return true;
|
|
}
|
|
|
|
static auto Viewport_mousePress(GtkWidget* widget, GdkEventButton* event, pViewport* p) -> signed {
|
|
switch(event->button) {
|
|
case 1: p->self().doMousePress(Mouse::Button::Left); break;
|
|
case 2: p->self().doMousePress(Mouse::Button::Middle); break;
|
|
case 3: p->self().doMousePress(Mouse::Button::Right); break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static auto Viewport_mouseRelease(GtkWidget* widget, GdkEventButton* event, pViewport* p) -> signed {
|
|
switch(event->button) {
|
|
case 1: p->self().doMouseRelease(Mouse::Button::Left); break;
|
|
case 2: p->self().doMouseRelease(Mouse::Button::Middle); break;
|
|
case 3: p->self().doMouseRelease(Mouse::Button::Right); break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
auto pViewport::construct() -> void {
|
|
gtkWidget = gtk_drawing_area_new();
|
|
gtk_widget_add_events(gtkWidget,
|
|
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK);
|
|
|
|
GdkColor color;
|
|
color.pixel = 0;
|
|
color.red = 0;
|
|
color.green = 0;
|
|
color.blue = 0;
|
|
gtk_widget_modify_bg(gtkWidget, GTK_STATE_NORMAL, &color);
|
|
|
|
setDroppable(state().droppable);
|
|
|
|
g_signal_connect(G_OBJECT(gtkWidget), "button-press-event", G_CALLBACK(Viewport_mousePress), (gpointer)this);
|
|
g_signal_connect(G_OBJECT(gtkWidget), "button-release-event", G_CALLBACK(Viewport_mouseRelease), (gpointer)this);
|
|
g_signal_connect(G_OBJECT(gtkWidget), "drag-data-received", G_CALLBACK(Viewport_dropEvent), (gpointer)this);
|
|
#if HIRO_GTK==2
|
|
g_signal_connect(G_OBJECT(gtkWidget), "expose-event", G_CALLBACK(Viewport_expose), (gpointer)this);
|
|
#elif HIRO_GTK==3
|
|
g_signal_connect(G_OBJECT(gtkWidget), "draw", G_CALLBACK(Viewport_draw), (gpointer)this);
|
|
#endif
|
|
g_signal_connect(G_OBJECT(gtkWidget), "leave-notify-event", G_CALLBACK(Viewport_mouseLeave), (gpointer)this);
|
|
g_signal_connect(G_OBJECT(gtkWidget), "motion-notify-event", G_CALLBACK(Viewport_mouseMove), (gpointer)this);
|
|
|
|
pWidget::construct();
|
|
}
|
|
|
|
auto pViewport::destruct() -> void {
|
|
if(gtkWidget) gtk_widget_destroy(gtkWidget), gtkWidget = nullptr;
|
|
gtkParent = nullptr;
|
|
}
|
|
|
|
auto pViewport::handle() const -> uintptr {
|
|
#if defined(DISPLAY_WINDOWS)
|
|
return (uintptr)GDK_WINDOW_HWND(gtk_widget_get_window(gtkWidget));
|
|
#endif
|
|
|
|
#if defined(DISPLAY_XORG)
|
|
return GDK_WINDOW_XID(gtk_widget_get_window(gtkWidget));
|
|
#endif
|
|
|
|
return (uintptr)nullptr;
|
|
}
|
|
|
|
auto pViewport::setDroppable(bool droppable) -> void {
|
|
if(droppable) {
|
|
gtk_drag_dest_set(gtkWidget, GTK_DEST_DEFAULT_ALL, nullptr, 0, GDK_ACTION_COPY);
|
|
gtk_drag_dest_add_uri_targets(gtkWidget);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|