X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/dc6deecb9155cc8e90d28bb90c66d58c8ae2b93e..5f4caf1ec3793937210c83b45c54bc4264e30c58:/application/window.c?ds=sidebyside diff --git a/application/window.c b/application/window.c index 17bda64..b3f24d7 100644 --- a/application/window.c +++ b/application/window.c @@ -29,13 +29,19 @@ #include "player.h" #include "Fsb.h" +#include "Sidebar.h" static MainWindow *main_window; static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *args, int nargs); static void FileOpenCB(Widget w, void *udata, void *cdata); +static void FileQuitCB(Widget w, void *udata, void *cdata); +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); @@ -58,8 +64,7 @@ static void init_blank_cursor(Widget w) { } static void window_close_handler(Widget window, void *udata, void *cdata) { - WindowClosePlayer(main_window); - ApplicationExit(); + FileQuitCB(window, NULL, NULL); } static unsigned int keycodeF; @@ -178,20 +183,48 @@ 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) { @@ -201,8 +234,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; } } @@ -256,8 +291,18 @@ 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); + //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++; @@ -270,7 +315,7 @@ MainWindow* WindowCreate(Display *display) { EnterWindowMask | KeyPressMask | KeyReleaseMask | LeaveWindowMask, FALSE, playerEH, window); - + // get F keycode keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F")); @@ -323,6 +368,46 @@ static Widget createMenuItem( return menuItem; } +/* + * Creates a XmToggleButton menu item + */ +static Widget createToggleMenuItem( + Widget menu, + char *name, + char *label, + char mnemonic, + Boolean defaultValue, + const char *accelerator, + char *accelerator_text, + XtCallbackProc callback, + void *cbData) +{ + Arg args[16]; + int n = 0; + + XmString s1 = XmStringCreateSimple(label); + XtSetArg(args[n], XmNlabelString, s1); n++; + XtSetArg(args[n], XmNmnemonic, mnemonic); n++; + XtSetArg(args[n], XmNset, defaultValue); n++; + XmString at = NULL; + if(accelerator && accelerator_text) { + at = XmStringCreateSimple(accelerator_text); + XtSetArg(args[n], XmNaccelerator, accelerator); n++; + XtSetArg(args[n], XmNacceleratorText, at); n++; + } + + Widget menuItem = XmCreateToggleButtonGadget(menu, name, args, n); + XtManageChild(menuItem); + XmStringFree(s1); + if(at) XmStringFree(at); + + if(callback) { + XtAddCallback(menuItem, XmNvalueChangedCallback, (XtCallbackProc)callback, cbData); + } + + return menuItem; +} + static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nmbargs) { Widget menubar = XmCreateMenuBar(parent, "menubar", mbargs, nmbargs); XtManageChild(menubar); @@ -333,7 +418,7 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nm // menus XmString s = XmStringCreateSimple("File"); - Widget fileMenuItem = XtVaCreateManagedWidget( + XtVaCreateManagedWidget( "menuitem", xmCascadeButtonWidgetClass, menubar, @@ -343,7 +428,7 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nm Widget fileMenu = XmVaCreateSimplePulldownMenu(menubar, "menu", 0, NULL, NULL); s = XmStringCreateSimple("Playback"); - Widget playMenuItem = XtVaCreateManagedWidget( + XtVaCreateManagedWidget( "menuitem", xmCascadeButtonWidgetClass, menubar, @@ -364,9 +449,19 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nm // file menu createMenuItem(fileMenu, "fileOpen", "Open...", 'O', "CtrlO", "Ctrl+O", FileOpenCB, NULL); + createMenuItem(fileMenu, "fileQuit", "Exit", 'E', "CtrlQ", "Ctrl+Q", FileQuitCB, NULL); + + // play menu + win->playRepeatTrackButton = createToggleMenuItem(playMenu, "playRepeatTrack", "Repeat", 'R', False, NULL, NULL, PlayRepeatCB, win); + win->playRepeatListButton = createToggleMenuItem(playMenu, "playRepeatList", "Repeat List", 'L', False, NULL, NULL, PlayRepeatListCB, win); + win->playAutoPlayButton = createToggleMenuItem(playMenu, "playAutoNext", "Autoplay Folder", 'A', False, NULL, NULL, PlayAutoPlayCB, win); + XtVaSetValues(win->playRepeatTrackButton, XmNindicatorType, XmONE_OF_MANY, NULL); + XtVaSetValues(win->playRepeatListButton, XmNindicatorType, XmONE_OF_MANY, NULL); + XtVaSetValues(win->playAutoPlayButton, XmNindicatorType, XmONE_OF_MANY, NULL); // 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) @@ -485,13 +580,54 @@ static void FileOpenCB(Widget w, void *udata, void *cdata) { XtManageChild(dialog); } +static void FileQuitCB(Widget w, void *udata, void *cdata) { + WindowClosePlayer(main_window); + ApplicationExit(); +} + +static void PlayRepeatCB(Widget w, void *udata, void *cdata) { + MainWindow *win = udata; + win->repeatTrack = XmToggleButtonGadgetGetState(w); + win->repeatList = 0; + win->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; + 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; + XtVaSetValues(win->playRepeatTrackButton, XmNset, 0, NULL); + XtVaSetValues(win->playRepeatListButton, XmNset, 0, NULL); +} + static void ViewFullscreenCB(Widget w, void *udata, void *cdata) { if(main_window->fullscreen) { 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) { @@ -546,3 +682,14 @@ 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); +} +