X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/1ece1247ff8ccb11bc2090f0218a037d28a6598f..e8e14035551f3e683c48eeedb1cedc07a95916cb:/application/window.c diff --git a/application/window.c b/application/window.c index dd8700c..26092cd 100644 --- a/application/window.c +++ b/application/window.c @@ -37,6 +37,26 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *args, int narg static void FileOpenCB(Widget w, void *udata, void *cdata); static void ViewFullscreenCB(Widget w, void *udata, void *cdata); +static void WindowRealized(MainWindow *win); + +static int blank_cursor_init = 0; +static Pixmap blank_cursor_pixmap; +static Cursor blank_cursor; + +static void init_blank_cursor(Widget w) { + char data = 0; + + XColor c; + + blank_cursor_pixmap = XCreateBitmapFromData(XtDisplay(w), XtWindow(w), &data, 1, 1); + if(!blank_cursor_pixmap) return; + + blank_cursor = XCreatePixmapCursor(XtDisplay(w), blank_cursor_pixmap, blank_cursor_pixmap, &c, &c, 0, 0); + + XFreePixmap(XtDisplay(w), blank_cursor_pixmap); + blank_cursor_init = 1; +} + static void window_close_handler(Widget window, void *udata, void *cdata) { WindowClosePlayer(main_window); ApplicationExit(); @@ -52,14 +72,115 @@ static void windowKeyEH(Widget widget, XtPointer data, XEvent *event, Boolean *d } } -static void resizeEH(Widget widget, XtPointer data, XEvent *event, Boolean *dispatch) { +static int main_window_is_realized = 0; + +static void resizeEH(Widget widget, XtPointer data, XEvent *event, Boolean *dispatch) { + if(!main_window_is_realized) { + if(XtIsRealized(widget)) { + main_window_is_realized = 1; + WindowRealized(data); + } + } WindowAdjustAspectRatio(data); } +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); + CleanOpenFileArg(); + } + + if(!blank_cursor_init) { + init_blank_cursor(win->player_widget); + } +} + +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); + } +} + +static void windowGrabButton(MainWindow *win) { + //printf("grab\n"); + XtGrabButton( + win->player_widget, + AnyButton, + AnyModifier, + True, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask | EnterWindowMask | LeaveWindowMask, + GrabModeAsync, + GrabModeAsync, + None, + None); + win->buttongrab = True; +} + +static void playerEH(Widget widget, XtPointer data, XEvent *event, Boolean *dispatch) { + MainWindow *win = data; + int etype = event->type; + + ///* + if(etype == EnterNotify) { + //printf("enter\n"); + windowGrabButton(win); + return; + } + if(etype == LeaveNotify) { + //printf("leave\n"); + //XtUngrabButton(win->player_widget, AnyButton, AnyModifier); + //win->buttongrab = False; + return; + } + + int pass = 0; + if(etype == ButtonPress || etype == ButtonRelease || etype == KeyPress || etype == KeyRelease) { + //printf("button press\n"); + pass = 1; + } + + if(!win->player || win->player->window == 0) return; + + WindowPlayerWidgetEvent(win, event); + + if(pass) { + // redirect key events to the player window + //printf("redirect\n"); + event->xkey.window = win->player->window; + XSendEvent( + XtDisplay(win->player_widget), + win->player->window, + True, + 0, + event); + } +} + +void WindowPlayerWidgetEvent(MainWindow *win, XEvent *event) { + int etype = event->type; + + if(etype == MotionNotify) { + + } else if(etype == ButtonPress) { + + } else if(etype == ButtonRelease) { + + } +} + MainWindow* WindowCreate(Display *display) { Arg args[32]; int n; - + MainWindow *window = malloc(sizeof(MainWindow)); memset(window, 0, sizeof(MainWindow)); main_window = window; @@ -90,7 +211,7 @@ MainWindow* WindowCreate(Display *display) { // resize handler XtAddEventHandler(window->window, StructureNotifyMask, False, resizeEH, window); - + n = 0; XtSetArg(args[n], XmNwidth, 360); n++; XtSetArg(args[n], XmNheight, 220); n++; @@ -114,7 +235,12 @@ 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); + XtAddEventHandler(window->player_widget, PointerMotionMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | + EnterWindowMask | KeyPressMask | KeyReleaseMask | + LeaveWindowMask, FALSE, playerEH, window); + // get F keycode keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F")); @@ -276,7 +402,12 @@ 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, @@ -296,10 +427,7 @@ static void filedialog_select( if(selection->value) { XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &value); if(value) { - if(data->file) { - XtFree(data->file); - } - data->file = value; + WindowSetFile(data, value); // no need to free the value, because it is stored in MainWindow PlayerOpenFile(data); @@ -340,7 +468,7 @@ 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) @@ -372,3 +500,19 @@ void WindowClosePlayer(MainWindow *win) { } win->player = NULL; } + +void WindowHidePlayerCursor(MainWindow *win) { + if(!win->cursorhidden && win->player && win->player->window != 0) { + //XDefineCursor(XtDisplay(win->player_widget), XtWindow(win->player_widget), blank_cursor); + win->cursorhidden = True; + XFlush(XtDisplay(win->player_widget)); + } +} + +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)); + } +}