X-Git-Url: https://develop.uap-core.de/gitweb/uwplayer.git/blobdiff_plain/5f4caf1ec3793937210c83b45c54bc4264e30c58..c4d69d05f758eb2f8f98be04ff42456c9ae711fe:/application/Sidebar.c diff --git a/application/Sidebar.c b/application/Sidebar.c index b8c2f02..3a2c29b 100644 --- a/application/Sidebar.c +++ b/application/Sidebar.c @@ -26,6 +26,11 @@ #include #include #include +#include + +#include "xdnd.h" +#include "utils.h" +#include "playlist.h" static void sidebar_class_init(void); @@ -38,7 +43,12 @@ static void sidebar_expose(Widget widget, XEvent *event, Region region); static Boolean sidebar_set_values(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args); static void sidebar_insert_child(Widget child); Boolean sidebar_acceptfocus(Widget widget, Time *time); + static void FocusInAP(Widget w, XEvent *event, String *args, Cardinal *nArgs); +static void SelectElmAP(Widget w, XEvent *event, String *args, Cardinal *nArgs); +static void PopupAP(Widget w, XEvent *event, String *args, Cardinal *nArgs); + +static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata); static XtResource resources[] = { @@ -47,10 +57,13 @@ static XtResource resources[] = { static XtActionsRec actionslist[] = { {"focusIn", FocusInAP}, - {"NULL", NULL} + {"selectElm", SelectElmAP}, + {"popup", PopupAP} }; -static char defaultTranslations[] = ": focusIn()"; +static char defaultTranslations[] = ": focusIn()\n" + ": selectElm()\n" + ": popup()"; static XtResource constraints[] = {}; @@ -143,7 +156,34 @@ static void sidebar_class_part_init (WidgetClass wc) { static void sidebar_init(Widget request, Widget neww, ArgList args, Cardinal *num_args) { + Sidebar sb = (Sidebar)neww; + + // initialize everything except XftDraw or other stuff that needs a Window + + XftColor fg, bg; + fg.color.red = 0; + fg.color.green = 0; + fg.color.blue = 0; + fg.color.alpha = 0xFFFF; + + bg.color.red = 0xFFFF; + bg.color.green = 0xFFFF; + bg.color.blue = 0xFFFF; + bg.color.alpha = 0xFFFF; + + sb->sidebar.fg = fg; + sb->sidebar.bg = bg; + sb->sidebar.font = FontFromName(XtDisplay(neww), "Sans:size=11"); + if(!sb->sidebar.font) { + fprintf(stderr, "Cannot open font.\nAbort.\n"); + exit(-1); + } + + XftFont *xftFont = sb->sidebar.font->fonts->font; + int padding = 2; + int fontheight = xftFont->ascent; + sb->sidebar.elmHeight = fontheight + 2*padding; } @@ -152,20 +192,99 @@ static void sidebar_destroy(Widget widget) { } +static int testresize = 1; static void sidebar_resize(Widget widget) { - + if(testresize) { + XtWidgetGeometry geom; + geom.request_mode = CWWidth | CWHeight; + geom.width = 200; + geom.height = 2000; + XtWidgetGeometry result; + //XtMakeGeometryRequest(widget, &geom, &result); + testresize = 0; + } + printf("resize\n"); } +static int xdnd_initialized = 0; + static void sidebar_realize(Widget widget, XtValueMask *mask, XSetWindowAttributes *attributes) { (xmManagerClassRec.core_class.realize)(widget, mask, attributes); + if(!xdnd_initialized) { + XdndInit(XtDisplay(widget), XtWidgetToApplicationContext(widget), sidebar_xdnd_callback, widget); + } + XdndEnable(widget); + + Screen *screen = widget->core.screen; + Visual *visual = screen->root_visual; + for(int i=0;indepths;i++) { + Depth d = screen->depths[i]; + if(d.depth == widget->core.depth) { + visual = d.visuals; + break; + } + } + + Sidebar sb = (Sidebar)widget; + sb->sidebar.d = XftDrawCreate( + XtDisplay(widget), + XtWindow(widget), + visual, + widget->core.colormap); + + Dimension w, h; + + Widget parent = XtParent(widget); + XtVaSetValues(parent, XmNbackground, WhitePixelOfScreen(XtScreen(parent)), NULL); + + XtMakeResizeRequest(widget, 200, 100, &w, &h); + } static void sidebar_expose(Widget widget, XEvent *event, Region region) { - printf("expose\n"); + //printf("expose\n"); Dimension w, h; - XtMakeResizeRequest(widget, 200, 200, &w, &h); + //XtMakeResizeRequest(widget, 200, 2000, &w, &h); + + w = widget->core.width; + h = widget->core.height; + + Widget parent = XtParent(widget); + + Sidebar s = (Sidebar)widget; + XftFont *xftFont = s->sidebar.font->fonts->font; + UcxList *tracks = s->sidebar.window->playlist.tracks; + size_t numTracks = ucx_list_size(tracks); + + int fontheight = xftFont->ascent; + int height = s->sidebar.elmHeight; + + int list_height = numTracks * height; + if((list_height > s->core.height) || (w < parent->core.width)) { + XtMakeResizeRequest(widget, parent->core.width, list_height, &w, &h); + } + + + XftDrawRect(s->sidebar.d, &s->sidebar.bg, 0, 0, w, h); + + + //printf("current track: %d\n", s->sidebar.window->playlist.current_track); + + int i = 0; + UCX_FOREACH(elm, s->sidebar.window->playlist.tracks) { + char *name = util_resource_name(elm->data); + XftColor *cg = &s->sidebar.fg; + if(i == s->sidebar.window->playlist.current_track) { + XftDrawRect(s->sidebar.d, &s->sidebar.fg, 0, i*height, s->core.width, height); + cg = &s->sidebar.bg; + } + + XftDrawString8(s->sidebar.d, cg, s->sidebar.font->fonts->font, 10, i*height + xftFont->ascent, (const FcChar8*)name, strlen(name)); + + i++; + } } static Boolean sidebar_set_values(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args) { @@ -187,6 +306,81 @@ static void FocusInAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) { } +static void SelectElmAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) { + //printf("btn1\n"); + XButtonEvent *e = &event->xbutton; + Sidebar s = (Sidebar)w; + + int selected = e->y / s->sidebar.elmHeight; + PlayListPlayTrack(s->sidebar.window, selected); + + SidebarRepaint(w); +} + +static void PopupAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) { + //printf("btn3\n"); +} + + + +static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) { + printf("xdnd\n"); + fflush(stdout); + + Sidebar s = (Sidebar)cdata; + + char *urilist = udata; + + size_t len = strlen(urilist); + + size_t start = 0; + if(len > 7 && !memcmp(urilist, "file://", 7)) { + start = 7; + } + + int err = 0; + + // urldecode + char *path = malloc(len + 1); + int k = 0; + for(int i=start;isidebar.window, path); + SidebarRepaint((Widget)s); + + free(path); +} /* --------------------------- public --------------------------- */ @@ -199,3 +393,12 @@ Widget CreateSidebar( { return XtCreateWidget(name, xnSidebarWidgetClass, parent, arglist, argcount); } + +void SidebarSetWindow(Widget widget, MainWindow *win) { + Sidebar sb = (Sidebar)widget; + sb->sidebar.window = win; +} + +void SidebarRepaint(Widget widget) { + XClearArea(XtDisplay(widget), XtWindow(widget), 0, 0, widget->core.width, widget->core.height, true); +}