/* HR 050203: drag & drop */ static boolean itm_drop(WINDOW *w, int n, int *list, int kstate, ICND *icnlist, int x, int y) { int i, item, apid = -1, hdl = wind_find(x, y); long fd; /* ITMTYPE type; */ const char *path; if (hdl > 0) wind_get(hdl, WF_OWNER, &apid); if (apid > 0) { char ddsexts[32]; fd = ddcreate(apid, ap_id, hdl, x, y, kstate, ddsexts); if (fd > 0) { if (ddstry(fd, "ARGS", "", sizeof(LNAME)) != DD_NAK) { for (i = 0; i < n; i++) { if ((item = list[i]) == -1) continue; path = itm_fullname(w, item); if (path) { /* type = itm_type(w, item); alert_msg("type %d | %s | '%s'", type, name, path); */ Fwrite(fd, 1, "'"); Fwrite(fd, strlen(path), path); Fwrite(fd, 1, "'"); } if (i < n - 1) Fwrite(fd, 1, " "); } ddclose(fd); itm_select(w, -1, 0, TRUE); return TRUE; } else alert_printf(1, APPNOEXT); ddclose(fd); } else { alert_printf(1, APPNODD); return FALSE; } } alert_printf(1, MILLDEST); return FALSE; }
short ddmessage(short apid, short fd, short winid, short mx, short my, short kstate, short pipeid) { char c; short i, msg[8]; long fd_mask; /* AES-Message define and post */ msg[0] = AP_DRAGDROP; msg[1] = _AESapid; msg[2] = 0; msg[3] = winid; msg[4] = mx; msg[5] = my; msg[6] = kstate; msg[7] = pipeid; i = appl_write(apid, 16, msg); if (i == 0) { ddclose(fd); return(-3); } /* receiver reaction */ fd_mask = (1L << fd); i = Fselect(DD_TIMEOUT, &fd_mask, 0L, 0L); if (!i || !fd_mask) { /* Timeout eingetreten */ ddclose(fd); return(-2); } /* le recepteur refuse (lecture du pipe) */ if (Fread(fd, 1L, &c) != 1L) { ddclose(fd); return(-1); } if (c != DD_OK) { ddclose(fd); return(-1); } return(1); }
short ddopen(short ddnam, char ddmsg) { long fd; pipename[17] = (ddnam & 0xff00) >> 8; pipename[18] = ddnam & 0x00ff; fd = Fopen(pipename, 2); if (fd < 0L) return(-1); /* Signalhandler konfigurieren */ ddgetsig(&pipesig); if (Fwrite((short) fd, 1L, &ddmsg) != 1L) { ddclose((short) fd); return(-1); } return((short) fd); }
short ddreply(short fd, char ack) { if (Fwrite(fd, 1L, &ack) != 1L) { ddclose(fd); return(-1); } return(1); }
short ddsexts(short fd, char *exts) { if (Fwrite(fd, DD_EXTSIZE, exts) != DD_EXTSIZE) { ddclose(fd); return(-1); } return(1); }