add playlist data structure
[uwplayer.git] / application / Sidebar.c
index b8c2f02..a3dd20a 100644 (file)
@@ -26,6 +26,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
+
+#include "xdnd.h"
 
 
 static void sidebar_class_init(void);
@@ -40,6 +43,10 @@ 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 xdndEnterAP(Widget w, XEvent *event, String *args, Cardinal *nArgs);
+
+static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata);
+
 
 static XtResource resources[] = {
 
@@ -47,10 +54,12 @@ static XtResource resources[] = {
 
 static XtActionsRec actionslist[] = {
   {"focusIn", FocusInAP},
+  {"xdnd_enter", xdndEnterAP},
   {"NULL", NULL}
 };
 
-static char defaultTranslations[] = "<FocusIn>:                        focusIn()";
+static char defaultTranslations[] = "<FocusIn>:                        focusIn()\n"
+                                    "<Message>XdndEnter:    xdnd_enter()\n";
 
 
 static XtResource constraints[] = {};
@@ -156,10 +165,15 @@ static void sidebar_resize(Widget widget) {
     
 }
 
+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);
 }
 
 static void sidebar_expose(Widget widget, XEvent *event, Region        region) {
@@ -184,11 +198,76 @@ Boolean sidebar_acceptfocus(Widget widget, Time *time) {
 
 
 static void FocusInAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) {
-    
+    printf("focusin\n");
+    fflush(stdout);
+}
+
+static void xdndEnterAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) {
+    printf("xdndEnterAP\n");
+    fflush(stdout);
 }
 
 
 
+
+static void sidebar_xdnd_callback(Widget w, XtPointer udata, XtPointer cdata) {
+    printf("xdnd\n");
+    fflush(stdout);
+    
+    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';
+    
+    // add file
+    // TODO
+    
+    free(path);
+}
+
+
 /* --------------------------- public --------------------------- */
 
 Widget CreateSidebar(