X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/f197f4d96e1b87df46d35f2dd00e18b32cad4097..b4c8e61d4466789fddccac524f046f038d86d681:/application/window.c diff --git a/application/window.c b/application/window.c index fe81481..b0d9a34 100644 --- a/application/window.c +++ b/application/window.c @@ -35,6 +35,8 @@ 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 ViewFullscreenCB(Widget w, void *udata, void *cdata); static void WindowRealized(MainWindow *win); @@ -58,8 +60,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; @@ -168,6 +169,8 @@ static void playerEH(Widget widget, XtPointer data, XEvent *event, Boolean *disp #define IGNORE_MOTION_THRESHOLD_MS 1000 #define MOTION_POS_THRESHOLD_PIX 5 +#define DOUBLE_CLICK_TIME_MS 500 + void WindowHandlePlayerEvent(MainWindow *win, XEvent *event) { // event handler for intercepted player mouse events // win->player is not NULL @@ -191,7 +194,14 @@ void WindowHandlePlayerEvent(MainWindow *win, XEvent *event) { win->player_event_time = cur_motion_time; win->motion_playback_time = win->player->playback_time; } else if(etype == ButtonPress) { - win->player_event_time = event->xbutton.time; + Time t = event->xbutton.time; + 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; + } } else if(etype == ButtonRelease) { win->player_event_time = event->xbutton.time; } @@ -314,6 +324,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); @@ -324,7 +374,7 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nm // menus XmString s = XmStringCreateSimple("File"); - Widget fileMenuItem = XtVaCreateManagedWidget( + XtVaCreateManagedWidget( "menuitem", xmCascadeButtonWidgetClass, menubar, @@ -334,7 +384,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, @@ -355,6 +405,10 @@ 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 + createToggleMenuItem(playMenu, "playRepeatTrack", "Repeat", 'R', False, NULL, NULL, PlayRepeatCB, win); // view menu createMenuItem(viewMenu, "viewFullscreen", "Fullscreen", 'F', "F", "F", ViewFullscreenCB, NULL); @@ -476,6 +530,16 @@ 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); +} + static void ViewFullscreenCB(Widget w, void *udata, void *cdata) { if(main_window->fullscreen) { WindowFullscreen(main_window, FALSE); @@ -533,7 +597,7 @@ void WindowHidePlayerCursor(MainWindow *win) { void WindowShowPlayerCursor(MainWindow *win) { if(win->cursorhidden && win->player && win->player->window != 0) { XDefineCursor(XtDisplay(win->player_widget), XtWindow(win->player_widget), None); - win->cursorhidden = False; XFlush(XtDisplay(win->player_widget)); } + win->cursorhidden = False; }