+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);
+ s->sidebar.select2 = -1;
+
+ SidebarRepaint(w);
+}
+
+static void PopupAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) {
+ XButtonEvent *e = &event->xbutton;
+ Sidebar s = (Sidebar)w;
+
+ int selected = e->y / s->sidebar.elmHeight;
+ s->sidebar.select2 = selected;
+ SidebarRepaint(w);
+
+ //printf("btn3\n");
+ //fflush(stdout);
+
+ XmMenuPosition(s->sidebar.popupMenu, &event->xbutton);
+ XtManageChild(s->sidebar.popupMenu);
+}
+
+
+static void open_uri(Sidebar s, cxstring uri) {
+ if(uri.length == 0) {
+ return;
+ }
+
+ const char *urilist = uri.ptr;
+ size_t len = uri.length;
+
+ 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;i<len;i++) {
+ char c = urilist[i];
+ if(c == '%') {
+ if(i + 2 < len) {
+ char code[3];
+ code[0] = urilist[i+1];
+ code[1] = urilist[i+2];
+ code[2] = '\0';
+
+ errno = 0;
+ char *end = NULL;
+ int ascii = (int)strtol(code, &end, 16);
+ if(errno == 0 && end == &code[2]) {
+ path[k] = ascii;
+ i += 2;
+ } else {
+ err = 1;
+ break;
+ }
+ } else {
+ err = 1;
+ break;
+ }
+ } else if(c == '\n' || c == '\r') {
+ break;
+ } else {
+ path[k] = c;
+ }
+
+ k++;
+ }
+ path[k] = '\0';
+
+ PlayListAddFile(s->sidebar.window, path);
+
+ free(path);
+}
+
+static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) {
+ printf("xdnd\n");
+ fflush(stdout);
+
+ Sidebar s = (Sidebar)cdata;
+
+ cxstring urllist = cx_str(udata);
+
+ CxStrtokCtx tk = cx_strtok(urllist, cx_str("\r\n"), INT_MAX);
+ cxstring uri;
+ while(cx_strtok_next(&tk, &uri)) {
+ open_uri(s, uri);
+ }
+
+ SidebarRepaint((Widget)s);
+}