#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
+
+#include "xdnd.h"
static void sidebar_class_init(void);
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[] = {
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[] = {};
}
+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) {
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(