X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/18d1fe7ac177615f5f8c0b2b736e535c516e2aa1..f84f78a3ae9a216a4416be5fcb2b219b68e483fe:/application/window.c?ds=sidebyside diff --git a/application/window.c b/application/window.c index f2c8091..4cdeadc 100644 --- a/application/window.c +++ b/application/window.c @@ -27,6 +27,8 @@ #include "window.h" #include "main.h" #include "player.h" +#include "playlist.h" +#include "xdnd.h" #include "Fsb.h" #include "Sidebar.h" @@ -40,8 +42,10 @@ 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 PlayRandomCB(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 ViewAdjustWindowSizeCB(Widget w, void *udata, void *cdata); static void WindowRealized(MainWindow *win); @@ -92,18 +96,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) { @@ -248,6 +250,8 @@ void WindowHandlePlayerEvent(MainWindow *win, XEvent *event) { } } + + MainWindow* WindowCreate(Display *display) { Arg args[32]; int n; @@ -255,7 +259,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++; @@ -304,8 +308,9 @@ MainWindow* WindowCreate(Display *display) { 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++; @@ -326,6 +331,11 @@ MainWindow* WindowCreate(Display *display) { // get F keycode keycodeF = XKeysymToKeycode(XtDisplay(window->window), XStringToKeysym("F")); + + PlayListInit(window); + + window->adjustWindowSize = true; // auto adjust window size by default + return window; } @@ -415,6 +425,15 @@ static Widget createToggleMenuItem( return menuItem; } +/* + * Creates a menu separator + */ +static Widget createMenuSeparator(Widget menu) { + Widget w = XmCreateSeparator(menu, "separator", NULL, 0); + XtManageChild(w); + return w; +} + static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nmbargs) { Widget menubar = XmCreateMenuBar(parent, "menubar", mbargs, nmbargs); XtManageChild(menubar); @@ -466,9 +485,18 @@ static void WindowCreateMenu(MainWindow *win, Widget parent, Arg *mbargs, int nm XtVaSetValues(win->playRepeatListButton, XmNindicatorType, XmONE_OF_MANY, NULL); XtVaSetValues(win->playAutoPlayButton, XmNindicatorType, XmONE_OF_MANY, NULL); + createMenuSeparator(playMenu); + + win->playRandom = createToggleMenuItem(playMenu, "playRandom", "Random Playback", 'P', False, NULL, NULL, PlayRandomCB, win); + + // view menu createMenuItem(viewMenu, "viewFullscreen", "Fullscreen", 'F', "F", "F", ViewFullscreenCB, NULL); win->viewSidebarButton = createToggleMenuItem(viewMenu, "viewSidebar", "View Sidebar", 'S', False, NULL, NULL, ViewSidebarCB, win); + + createMenuSeparator(viewMenu); + + win->viewAdjustWindowSize = createToggleMenuItem(viewMenu, "viewAdjustWindowSize", "Adjust Window Size", 'W', TRUE, NULL, NULL, ViewAdjustWindowSizeCB, win); } void go_fullscreen(Display *dsp, Window win) @@ -511,6 +539,8 @@ void WindowFullscreen(MainWindow *win, bool enableFullscreen) { main_window->fullscreen = FALSE; } + WindowShowSidebar(win, enableFullscreen ? false : win->sidebarvisible); + XEvent ev; memset(&ev, 0, sizeof(XEvent)); ev.type = ClientMessage; @@ -533,13 +563,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, @@ -558,10 +581,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); @@ -594,31 +616,36 @@ 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); } +static void PlayRandomCB(Widget w, void *udata, void *cdata) { + MainWindow *win = udata; + win->playlist.random = XmToggleButtonGadgetGetState(w); +} + static void ViewFullscreenCB(Widget w, void *udata, void *cdata) { if(main_window->fullscreen) { WindowFullscreen(main_window, FALSE); @@ -630,11 +657,13 @@ static void ViewFullscreenCB(Widget w, void *udata, void *cdata) { static void ViewSidebarCB(Widget w, void *udata, void *cdata) { MainWindow *win = udata; XmToggleButtonCallbackStruct *cb = cdata; - if(cb->set) { - WindowShowSidebar(win); - } else { - WindowHideSidebar(win); - } + win->sidebarvisible = cb->set; + WindowShowSidebar(win, cb->set); +} + +static void ViewAdjustWindowSizeCB(Widget w, void *udata, void *cdata) { + MainWindow *win = udata; + win->adjustWindowSize = XmToggleButtonGadgetGetState(w); } void WindowAdjustAspectRatio(MainWindow *win) { @@ -690,13 +719,16 @@ 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, bool visible) { + if(visible) { + XtManageChild(win->sidebar); + XtVaSetValues(win->player_widget, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, win->sidebar, NULL); + } else { + 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); } -