+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;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);
+}