Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions Photino.Native/Photino.Linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ gboolean on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gp
gboolean on_widget_deleted(GtkWidget *widget, GdkEvent *event, gpointer self);
gboolean on_focus_in_event(GtkWidget *widget, GdkEvent *event, gpointer self);
gboolean on_focus_out_event(GtkWidget *widget, GdkEvent *event, gpointer self);
gboolean on_button_press_event(GtkWidget *widget, GdkEvent *event, gpointer self);
gboolean on_webview_context_menu(WebKitWebView *web_view,
GtkWidget *default_menu,
WebKitHitTestResult *hit_test_result,
Expand Down Expand Up @@ -255,6 +256,12 @@ Photino::Photino(PhotinoInitParams *initParams) : _webview(nullptr)

Photino::Show(false);

g_signal_connect(G_OBJECT(_webview), "button-press-event",
G_CALLBACK(on_button_press_event),
this);

gtk_widget_add_events(GTK_WIDGET(_webview), GDK_BUTTON_PRESS_MASK);

g_signal_connect(G_OBJECT(_window), "focus-in-event",
G_CALLBACK(on_focus_in_event),
this);
Expand Down Expand Up @@ -678,6 +685,54 @@ void Photino::SetZoom(int zoom)
webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(_webview), newZoom);
}

void Photino::StartDragging()
{
if (!_lastButtonEvent.valid)
{
return;
}

gtk_window_begin_move_drag(GTK_WINDOW(_window), _lastButtonEvent.button,
_lastButtonEvent.x_root, _lastButtonEvent.y_root, _lastButtonEvent.time);
}

void Photino::StartResizing(PhotinoWindowHitTestCode hitTestCode)
{
if (!_lastButtonEvent.valid)
{
return;
}

GdkWindowEdge edge = [hitTestCode]() -> GdkWindowEdge {
switch (hitTestCode)
{
case PhotinoWindowHitTestCode::TopLeft:
return GdkWindowEdge::GDK_WINDOW_EDGE_NORTH_WEST;
case PhotinoWindowHitTestCode::Top:
return GdkWindowEdge::GDK_WINDOW_EDGE_NORTH;
case PhotinoWindowHitTestCode::TopRight:
return GdkWindowEdge::GDK_WINDOW_EDGE_NORTH_EAST;
case PhotinoWindowHitTestCode::Left:
return GdkWindowEdge::GDK_WINDOW_EDGE_WEST;
case PhotinoWindowHitTestCode::Right:
return GdkWindowEdge::GDK_WINDOW_EDGE_EAST;
case PhotinoWindowHitTestCode::BottomLeft:
return GdkWindowEdge::GDK_WINDOW_EDGE_SOUTH_WEST;
case PhotinoWindowHitTestCode::Bottom:
return GdkWindowEdge::GDK_WINDOW_EDGE_SOUTH;
case PhotinoWindowHitTestCode::BottomRight:
return GdkWindowEdge::GDK_WINDOW_EDGE_SOUTH_EAST;
default:
return GdkWindowEdge(-1);
}
}();
if (edge != GdkWindowEdge(-1))
{
gtk_window_begin_resize_drag(GTK_WINDOW(_window), edge, _lastButtonEvent.button,
_lastButtonEvent.x_root, _lastButtonEvent.y_root, _lastButtonEvent.time);
}
}

void Photino::SetTransparentEnabled(bool enabled)
{
_transparentEnabled = enabled;
Expand Down Expand Up @@ -1038,6 +1093,21 @@ gboolean on_webview_context_menu(WebKitWebView *web_view, GtkWidget *default_men
return !instance->_contextMenuEnabled;
}

gboolean on_button_press_event(GtkWidget *widget, GdkEvent *event, gpointer self)
{
Photino *instance = ((Photino *)self);
GdkEventButton *buttonEvent = ((GdkEventButton*)event);
std::exchange(instance->_lastButtonEvent, Photino::LastButtonEvent{
.x_root = buttonEvent->x_root,
.y_root = buttonEvent->y_root,
.time = buttonEvent->time,
.button = buttonEvent->button,
.event = std::unique_ptr<GdkEvent, Photino::LastButtonEvent::EventDeleter>{gdk_event_copy(event)},
.valid = true,
});
return FALSE;
}

gboolean on_permission_request(WebKitWebView *web_view, WebKitPermissionRequest *request, gpointer user_data)
{
//GtkWidget *dialog = gtk_message_dialog_new(
Expand Down
11 changes: 11 additions & 0 deletions Photino.Native/Photino.Mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,17 @@
[_webview setMagnification: newZoom];
}


void Photino::StartDragging()
{
// TODO: implement
}

void Photino::StartResizing(PhotinoWindowHitTestCode hitTestCode)
{
// TODO: implement
}

void EnsureInvoke(dispatch_block_t block)
{
if ([NSThread isMainThread])
Expand Down
16 changes: 16 additions & 0 deletions Photino.Native/Photino.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ typedef char *AutoString;
#ifdef __linux__
#include <gtk/gtk.h>
#include <webkit2/webkit2.h>
#include <memory>
#endif

#include <map>
Expand Down Expand Up @@ -245,6 +246,21 @@ class Photino
int _minHeight;
int _maxWidth;
int _maxHeight;

struct LastButtonEvent {
struct EventDeleter {
void operator()(GdkEvent* event) const { gdk_event_free(event); }
};

gdouble x_root;
gdouble y_root;
guint32 time;
guint button;
std::unique_ptr<GdkEvent, EventDeleter> event;
bool valid{false};

};
LastButtonEvent _lastButtonEvent;
#elif __APPLE__
static void Register();
#endif
Expand Down