X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/d165fb07a7fd8e80662281e46b998d5458e9d02c..547b5816f07b91c51ecc65a4fdd87b8378c7be95:/application/window.c diff --git a/application/window.c b/application/window.c index 9ec4323..8132f86 100644 --- a/application/window.c +++ b/application/window.c @@ -38,6 +38,7 @@ static void FileOpenCB(Widget w, void *udata, void *cdata); static void ViewFullscreenCB(Widget w, void *udata, void *cdata); static void window_close_handler(Widget window, void *udata, void *cdata) { + WindowClosePlayer(main_window); ApplicationExit(); } @@ -51,6 +52,19 @@ static void windowKeyEH(Widget widget, XtPointer data, XEvent *event, Boolean *d } } +static void resizeEH(Widget widget, XtPointer data, XEvent *event, Boolean *dispatch) { + WindowAdjustAspectRatio(data); +} + +static void playerWidgetInputCB(Widget widget, XtPointer u, XtPointer c) { + MainWindow *win = u; + XmDrawingAreaCallbackStruct *cb = c; + + if(win->player && win->player->isactive) { + PlayerHandleInput(win, win->player, cb); + } +} + MainWindow* WindowCreate(Display *display) { Arg args[32]; int n; @@ -71,7 +85,7 @@ MainWindow* WindowCreate(Display *display) { args, n); - + // close handler Atom wm_delete_window; wm_delete_window = XmInternAtom( display, @@ -83,7 +97,9 @@ MainWindow* WindowCreate(Display *display) { window_close_handler, window); - + // resize handler + XtAddEventHandler(window->window, StructureNotifyMask, False, resizeEH, window); + n = 0; XtSetArg(args[n], XmNwidth, 360); n++; XtSetArg(args[n], XmNheight, 220); n++; @@ -107,6 +123,8 @@ MainWindow* WindowCreate(Display *display) { XtSetArg(args[n], XmNbackground, BlackPixelOfScreen(XtScreen(window->window))); n++; window->player_widget = XmCreateDrawingArea(container, "player", args, n); XtManageChild(window->player_widget); + XtAddCallback(window->player_widget, XmNinputCallback, playerWidgetInputCB, window); + XmProcessTraversal(window->player_widget, XmTRAVERSE_CURRENT); // get F keycode keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F")); @@ -328,3 +346,39 @@ static void ViewFullscreenCB(Widget w, void *udata, void *cdata) { } } + +void WindowAdjustAspectRatio(MainWindow *win) { + if(!win->player) return; + if(!win->player->isactive || win->player->width <= 0 || win->player->height <= 0) return; + + // we have a running player width video + // adjust window aspect ratio (the window aspect ratio is different from + // the video, because of window decoration, menubar and other extra controls) + + Dimension win_width, win_height; + XtVaGetValues(win->window, XmNwidth, &win_width, XmNheight, &win_height, NULL); + Dimension player_width, player_height; + XtVaGetValues(win->player_widget, XmNwidth, &player_width, XmNheight, &player_height, NULL); + + double r = (double)win->player->width / (double)win->player->height; + double p_width = player_width; + double p_height = p_width / r; + + Dimension new_width = p_width + win_width - player_width; + Dimension new_height = p_height + win_height - player_height; + + XSizeHints hints; + hints.flags = PAspect; + hints.min_aspect.x = new_width; + hints.min_aspect.y = new_height; + hints.max_aspect.x = new_width; + hints.max_aspect.y = new_height; + XSetWMNormalHints(XtDisplay(win->window), XtWindow(win->window), &hints); +} + +void WindowClosePlayer(MainWindow *win) { + if(win->player) { + PlayerDestroy(win->player); + } + win->player = NULL; +}