Skip to content

Commit e53bad9

Browse files
committed
More work on DnD protocol
1 parent 36237f3 commit e53bad9

2 files changed

Lines changed: 60 additions & 4 deletions

File tree

kitty/dnd.c

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,9 +1458,8 @@ drag_process_item_data(Window *w, size_t idx, int has_more, const uint8_t *paylo
14581458
}
14591459
size_t written = 0;
14601460
while (written < outlen) {
1461-
ssize_t n = write(ds.items[idx].fd_plus_one - 1, decoded + written, outlen - written);
1461+
ssize_t n = safe_write(ds.items[idx].fd_plus_one - 1, decoded + written, outlen - written);
14621462
if (n < 0) {
1463-
if (errno == EINTR) continue;
14641463
cancel_drag(w, EIO);
14651464
return;
14661465
}
@@ -1542,6 +1541,46 @@ parse_uri_list(Window *w, int fd, size_t *num_uris_out) {
15421541
return result;
15431542
}
15441543

1544+
static int
1545+
write_all(int fd, const void *buf, size_t sz) {
1546+
size_t pos = 0; const char *p = buf;
1547+
while (pos < sz) {
1548+
ssize_t ret = safe_write(fd, p + pos, sz - pos);
1549+
if (ret < 0) return ret;
1550+
pos += ret;
1551+
}
1552+
return 0;
1553+
}
1554+
1555+
static void
1556+
finish_remote_data(Window *w, size_t item_idx) {
1557+
const int fd = ds.items[item_idx].fd_plus_one - 1;
1558+
if (safe_ftruncate(fd, 0) != 0) abrt(errno);
1559+
if (lseek(fd, 0, SEEK_SET) == -1) abrt(errno);
1560+
for (size_t i = 0; i < ds.items[item_idx].num_uris; i++) {
1561+
int ret = write_all(fd, ds.items[item_idx].uri_list[i], strlen(ds.items[item_idx].uri_list[i]));
1562+
free((char*)ds.items[item_idx].uri_list[i]); ds.items[item_idx].uri_list[i] = NULL;
1563+
if (ret) abrt(ret);
1564+
if ((ret = write_all(fd, "\r\n", 2))) abrt(ret);
1565+
}
1566+
free(ds.items[item_idx].uri_list); ds.items[item_idx].uri_list = NULL; ds.items[item_idx].num_uris = 0;
1567+
int ret = notify_drag_data_ready(global_state.drag_source.from_os_window, ds.items[item_idx].mime_type);
1568+
abrt(ret);
1569+
}
1570+
1571+
static void
1572+
toplevel_data_for_drag(Window *w, unsigned uri_item_idx, unsigned item_type, bool has_more, const uint8_t *payload, size_t payload_sz) {
1573+
(void)w; (void)uri_item_idx; (void)item_type; (void)has_more; (void)payload; (void)payload_sz;
1574+
}
1575+
1576+
static void
1577+
subdir_data_for_drag(
1578+
Window *w, unsigned uri_item_idx, int handle, unsigned entry_num, unsigned item_type, bool has_more,
1579+
const uint8_t *payload, size_t payload_sz
1580+
) {
1581+
(void)w; (void)uri_item_idx; (void)item_type; (void)has_more; (void)payload; (void)payload_sz; (void)handle; (void)entry_num;
1582+
}
1583+
15451584

15461585
void
15471586
drag_remote_file_data(
@@ -1558,8 +1597,10 @@ drag_remote_file_data(
15581597
ds.items[item_idx].uri_list = parse_uri_list(w, ds.items[item_idx].fd_plus_one-1, &ds.items[item_idx].num_uris);
15591598
if (!ds.items[item_idx].uri_list) return;
15601599
}
1561-
(void)x; (void)y; (void)X; (void)Y; (void)has_more; (void)payload; (void)payload_sz;
1562-
// TODO: Implement this
1600+
if (X < 0) abrt(EINVAL);
1601+
if (!x && !y && !Y) { finish_remote_data(w, item_idx); return; }
1602+
if (!Y) toplevel_data_for_drag(w, x - 1, X, has_more, payload, payload_sz);
1603+
else subdir_data_for_drag(w, x - 1, Y, y - 1, X, has_more, payload, payload_sz);
15631604
}
15641605
#undef img
15651606
#undef abrt

kitty/safe-wrappers.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <sys/mman.h>
1111
#include <sys/socket.h>
1212
#include <stdlib.h>
13+
#include <sys/types.h>
1314
#include <unistd.h>
1415

1516
static inline int
@@ -98,6 +99,20 @@ safe_close(int fd, const char* file UNUSED, const int line UNUSED) {
9899
while(close(fd) != 0 && errno == EINTR);
99100
}
100101

102+
static inline int
103+
safe_ftruncate(int fd, off_t length) {
104+
int ret;
105+
while ((ret = ftruncate(fd, length)) != 0 && errno == EINTR);
106+
return ret;
107+
}
108+
109+
static inline ssize_t
110+
safe_write(int fd, const void *buf, size_t nbyte) {
111+
ssize_t ret;
112+
while ((ret = write(fd, buf, nbyte)) != 0 && errno == EINTR);
113+
return ret;
114+
}
115+
101116
static inline int
102117
safe_dup(int a) {
103118
int ret;

0 commit comments

Comments
 (0)