X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/663ac840aba3c8203afd517380d9eba7191787e4..3c1675731caaac73d6c362075ffb82bc45d2f060:/application/window.c diff --git a/application/window.c b/application/window.c index d14861e..1b351a8 100644 --- a/application/window.c +++ b/application/window.c @@ -27,8 +27,11 @@ #include "window.h" #include "main.h" #include "player.h" +#include "playlist.h" +#include "xdnd.h" #include "Fsb.h" +#include "Sidebar.h" static MainWindow *main_window; @@ -40,6 +43,7 @@ static void PlayRepeatCB(Widget w, void *udata, void *cdata); static void PlayRepeatListCB(Widget w, void *udata, void *cdata); static void PlayAutoPlayCB(Widget w, void *udata, void *cdata); static void ViewFullscreenCB(Widget w, void *udata, void *cdata); +static void ViewSidebarCB(Widget w, void *udata, void *cdata); static void WindowRealized(MainWindow *win); @@ -90,18 +94,16 @@ static void resizeEH(Widget widget, XtPointer data, XEvent *event, Boolean *disp static void WindowRealized(MainWindow *win) { char *open_file = GetOpenFileArg(); if(open_file) { - size_t len = strlen(open_file); - char *file = XtMalloc(len+1); - memcpy(file, open_file, len); - file[len] = 0; - WindowSetFile(win, file); - PlayerOpenFile(win); + PlayListAddFile(win, open_file); + PlayListPlayNext(win, true); CleanOpenFileArg(); } if(!blank_cursor_init) { init_blank_cursor(win->player_widget); } + + XdndEnable(win->window); } static void playerWidgetInputCB(Widget widget, XtPointer u, XtPointer c) { @@ -170,6 +172,7 @@ static void playerEH(Widget widget, XtPointer data, XEvent *event, Boolean *disp #define IGNORE_MOTION_THRESHOLD_MS 1000 #define MOTION_POS_THRESHOLD_PIX 5 +#define OSD_BOTTOM_THRESHOLD 0.09 #define DOUBLE_CLICK_TIME_MS 500 @@ -181,34 +184,72 @@ 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; + if(win->player) { + win->motion_playback_time = win->player->playback_time; + } + + 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) { - // double click - WindowFullscreen(main_window, !win->fullscreen); + + int yi = win->player_widget->core.height - event->xbutton.y; + if((float)yi/(float)win->player_widget->core.height < OSD_BOTTOM_THRESHOLD) { win->button_press_time = 0; } else { - win->button_press_time = t; + if(t - win->button_press_time < DOUBLE_CLICK_TIME_MS) { + // double click + WindowFullscreen(main_window, !win->fullscreen); + win->button_press_time = 0; + } else { + win->button_press_time = t; + } + win->pwbuttonpressed = 1; } } else if(etype == ButtonRelease) { win->player_event_time = event->xbutton.time; + win->pwbuttonpressed = FALSE; } } + + MainWindow* WindowCreate(Display *display) { Arg args[32]; int n; @@ -216,7 +257,7 @@ MainWindow* WindowCreate(Display *display) { MainWindow *window = malloc(sizeof(MainWindow)); memset(window, 0, sizeof(MainWindow)); main_window = window; - + // toplevel window n = 0; XtSetArg(args[n], XmNtitle, APP_NAME); n++; @@ -259,8 +300,19 @@ MainWindow* WindowCreate(Display *display) { WindowCreateMenu(window, container, args, n); n = 0; + XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; + XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; + XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; + XtSetArg(args[n], XmNtopWidget, window->menubar); n++; + XtSetArg(args[n], XmNwidth, 300); n++; + window->sidebar = CreateSidebar(container, "sidebar", args, n); + SidebarSetWindow(window->sidebar, window); + //XtManageChild(window->sidebar); + + n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; + XtSetArg(args[n], XmNrightWidget, window->sidebar); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, window->menubar); n++; @@ -273,10 +325,13 @@ MainWindow* WindowCreate(Display *display) { EnterWindowMask | KeyPressMask | KeyReleaseMask | LeaveWindowMask, FALSE, playerEH, window); - + // get F keycode keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F")); + + PlayListInit(window); + return window; } @@ -419,6 +474,7 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nm // view menu createMenuItem(viewMenu, "viewFullscreen", "Fullscreen", 'F', "F", "F", ViewFullscreenCB, NULL); + win->viewSidebarButton = createToggleMenuItem(viewMenu, "viewSidebar", "View Sidebar", 'S', False, NULL, NULL, ViewSidebarCB, win); } void go_fullscreen(Display *dsp, Window win) @@ -483,13 +539,6 @@ void WindowMenubarSetVisible(MainWindow *win, bool visible) { } } -void WindowSetFile(MainWindow *win, char *file) { - if(win->file) { - XtFree(win->file); - } - win->file = file; -} - static void filedialog_end( Widget widget, MainWindow *data, @@ -508,10 +557,9 @@ static void filedialog_select( if(selection->value) { XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &value); if(value) { - WindowSetFile(data, value); - // no need to free the value, because it is stored in MainWindow - - PlayerOpenFile(data); + PlayListAddFile(data, value); + PlayListPlayNext(data, true); + XtFree(value); } } filedialog_end(widget, data, NULL); @@ -544,27 +592,27 @@ static void FileQuitCB(Widget w, void *udata, void *cdata) { static void PlayRepeatCB(Widget w, void *udata, void *cdata) { MainWindow *win = udata; - win->repeatTrack = XmToggleButtonGadgetGetState(w); - win->repeatList = 0; - win->autoplayFolder = 0; + win->playlist.repeatTrack = XmToggleButtonGadgetGetState(w); + win->playlist.repeatList = 0; + win->playlist.autoplayFolder = 0; XtVaSetValues(win->playRepeatListButton, XmNset, 0, NULL); XtVaSetValues(win->playAutoPlayButton, XmNset, 0, NULL); } static void PlayRepeatListCB(Widget w, void *udata, void *cdata) { MainWindow *win = udata; - win->repeatList = XmToggleButtonGadgetGetState(w); - win->repeatTrack = 0; - win->autoplayFolder = 0; + win->playlist.repeatList = XmToggleButtonGadgetGetState(w); + win->playlist.repeatTrack = 0; + win->playlist.autoplayFolder = 0; XtVaSetValues(win->playRepeatTrackButton, XmNset, 0, NULL); XtVaSetValues(win->playAutoPlayButton, XmNset, 0, NULL); } static void PlayAutoPlayCB(Widget w, void *udata, void *cdata) { MainWindow *win = udata; - win->autoplayFolder = XmToggleButtonGadgetGetState(w); - win->repeatTrack = 0; - win->repeatList = 0; + win->playlist.autoplayFolder = XmToggleButtonGadgetGetState(w); + win->playlist.repeatTrack = 0; + win->playlist.repeatList = 0; XtVaSetValues(win->playRepeatTrackButton, XmNset, 0, NULL); XtVaSetValues(win->playRepeatListButton, XmNset, 0, NULL); } @@ -574,8 +622,17 @@ static void ViewFullscreenCB(Widget w, void *udata, void *cdata) { WindowFullscreen(main_window, FALSE); } else { WindowFullscreen(main_window, TRUE); + } +} + +static void ViewSidebarCB(Widget w, void *udata, void *cdata) { + MainWindow *win = udata; + XmToggleButtonCallbackStruct *cb = cdata; + if(cb->set) { + WindowShowSidebar(win); + } else { + WindowHideSidebar(win); } - } void WindowAdjustAspectRatio(MainWindow *win) { @@ -630,3 +687,17 @@ void WindowShowPlayerCursor(MainWindow *win) { } win->cursorhidden = False; } + +void WindowHideSidebar(MainWindow *win) { + XtUnmanageChild(win->sidebar); + XtVaSetValues(win->player_widget, XmNrightAttachment, XmATTACH_FORM, NULL); +} + +void WindowShowSidebar(MainWindow *win) { + XtManageChild(win->sidebar); + XtVaSetValues(win->player_widget, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, win->sidebar, NULL); +} + +void WindowUpdate(MainWindow *win) { + SidebarRepaint(win->sidebar); +}