From b1fcf2b70eed56402eb7452dd9370e70b6c811c9 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sun, 23 Jan 2022 08:55:59 +0100 Subject: [PATCH] click in the video area can move the window now --- application/window.c | 38 ++++++++++++++++++++++++++++++++------ application/window.h | 3 +-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/application/window.c b/application/window.c index d14861e..c011084 100644 --- a/application/window.c +++ b/application/window.c @@ -181,20 +181,44 @@ void WindowHandlePlayerEvent(MainWindow *win, XEvent *event) { if(etype == MotionNotify) { Time cur_motion_time = event->xmotion.time; - int x = event->xmotion.x; - int y = event->xmotion.y; + int x = event->xmotion.x_root; + int y = event->xmotion.y_root; if(win->cursorhidden && cur_motion_time - win->player_event_time < IGNORE_MOTION_THRESHOLD_MS) { - int diff_x = abs(x - win->mouse_x_orig); - int diff_y = abs(y - win->mouse_y_orig); + int diff_x = abs(x - win->mouse_x); + int diff_y = abs(y - win->mouse_y); if(diff_x > MOTION_POS_THRESHOLD_PIX || diff_y > MOTION_POS_THRESHOLD_PIX) { WindowShowPlayerCursor(win); } } else { - win->mouse_x_orig = x; - win->mouse_y_orig = y; + win->mouse_x = x; + win->mouse_y = y; } win->player_event_time = cur_motion_time; win->motion_playback_time = win->player->playback_time; + + + + if(win->pwbuttonpressed) { + Display *dp = XtDisplay(win->window); + + XtUngrabPointer(win->player_widget, CurrentTime); + + XEvent xev; + memset(&xev, 0, sizeof(xev)); + xev.type = ClientMessage; + xev.xclient.message_type = XInternAtom(dp, "_NET_WM_MOVERESIZE", False); + xev.xclient.window = XtWindow(win->window); + xev.xclient.format = 32; + xev.xclient.data.l[0] = x; + xev.xclient.data.l[1] = y; + xev.xclient.data.l[2] = 8; // _NET_WM_MOVERESIZE_MOVE + xev.xclient.data.l[3] = 1; // button1 + xev.xclient.data.l[4] = 1; // source indication + + XSendEvent(dp, DefaultRootWindow(dp), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); + + win->pwbuttonpressed = FALSE; + } } else if(etype == ButtonPress) { Time t = event->xbutton.time; if(t - win->button_press_time < DOUBLE_CLICK_TIME_MS) { @@ -204,8 +228,10 @@ void WindowHandlePlayerEvent(MainWindow *win, XEvent *event) { } else { win->button_press_time = t; } + win->pwbuttonpressed = 1; } else if(etype == ButtonRelease) { win->player_event_time = event->xbutton.time; + win->pwbuttonpressed = FALSE; } } diff --git a/application/window.h b/application/window.h index b0f9c64..05385cc 100644 --- a/application/window.h +++ b/application/window.h @@ -57,6 +57,7 @@ typedef struct MainWindow { bool mbvisible; bool cursorhidden; bool buttongrab; + bool pwbuttonpressed; Widget playRepeatTrackButton; Widget playRepeatListButton; @@ -67,8 +68,6 @@ typedef struct MainWindow { double motion_playback_time; int mouse_x; int mouse_y; - int mouse_x_orig; - int mouse_y_orig; Boolean repeatTrack; Boolean repeatList; -- 2.43.5