mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-15 04:54:14 +02:00
Allow drop clients to use machine id as well
This commit is contained in:
81
kitty/dnd.c
81
kitty/dnd.c
@@ -144,40 +144,6 @@ reset_drop(Window *w) {
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
drop_register_window(Window *w, const uint8_t *payload, size_t payload_sz, bool on, uint32_t client_id, bool more) {
|
||||
w->drop.wanted = on;
|
||||
w->drop.client_id = client_id;
|
||||
if (!on) { drop_free_data(w); zero_at_ptr(&w->drop); return; }
|
||||
if (!payload || !payload_sz) return;
|
||||
size_t sz = w->drop.registered_mimes ? strlen(w->drop.registered_mimes) : 0;
|
||||
if (sz + payload_sz > MIME_LIST_SIZE_CAP) return;
|
||||
w->drop.registered_mimes = realloc(w->drop.registered_mimes, sz + payload_sz + 1);
|
||||
if (w->drop.registered_mimes) {
|
||||
memcpy(w->drop.registered_mimes + sz, payload, payload_sz);
|
||||
sz += payload_sz;
|
||||
w->drop.registered_mimes[sz] = 0;
|
||||
}
|
||||
if (more) return;
|
||||
if (w->drop.registered_mimes) {
|
||||
OSWindow *osw = os_window_for_kitty_window(w->id);
|
||||
if (osw) {
|
||||
size_t num = 0;
|
||||
RAII_ALLOC(const char*, mimes, malloc(sizeof(char*) * strlen(w->drop.registered_mimes)));
|
||||
if (mimes) {
|
||||
char* token = strtok(w->drop.registered_mimes, " ");
|
||||
while (token != NULL) {
|
||||
mimes[num++] = token;
|
||||
token = strtok(NULL, " ");
|
||||
}
|
||||
register_mimes_for_drop(osw, mimes, num);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(w->drop.registered_mimes); w->drop.registered_mimes = NULL;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
string_arrays_cmp(const char **a, size_t an, const char **b, size_t bn) {
|
||||
if (an != bn) return (int)an - (int)bn;
|
||||
@@ -289,6 +255,46 @@ queue_payload_to_child(id_type id, uint32_t client_id, PendingData *pending, con
|
||||
if (pending->count) check_for_pending_writes();
|
||||
}
|
||||
|
||||
void
|
||||
drop_register_window(Window *w, const uint8_t *payload, size_t payload_sz, bool on, uint32_t client_id, bool more) {
|
||||
w->drop.wanted = on;
|
||||
w->drop.client_id = client_id;
|
||||
if (!on) { drop_free_data(w); zero_at_ptr(&w->drop); return; }
|
||||
if (!payload || !payload_sz) return;
|
||||
size_t sz = w->drop.registered_mimes ? strlen(w->drop.registered_mimes) : 0;
|
||||
if (sz + payload_sz > MIME_LIST_SIZE_CAP) return;
|
||||
w->drop.registered_mimes = realloc(w->drop.registered_mimes, sz + payload_sz + 1);
|
||||
if (w->drop.registered_mimes) {
|
||||
memcpy(w->drop.registered_mimes + sz, payload, payload_sz);
|
||||
sz += payload_sz;
|
||||
w->drop.registered_mimes[sz] = 0;
|
||||
}
|
||||
if (more) return;
|
||||
if (w->drop.registered_mimes) {
|
||||
OSWindow *osw = os_window_for_kitty_window(w->id);
|
||||
if (osw) {
|
||||
size_t num = 0;
|
||||
RAII_ALLOC(const char*, mimes, malloc(sizeof(char*) * strlen(w->drop.registered_mimes)));
|
||||
if (mimes) {
|
||||
char* token = strtok(w->drop.registered_mimes, " ");
|
||||
while (token != NULL) {
|
||||
mimes[num++] = token;
|
||||
token = strtok(NULL, " ");
|
||||
}
|
||||
register_mimes_for_drop(osw, mimes, num);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(w->drop.registered_mimes); w->drop.registered_mimes = NULL;
|
||||
const char* host_machine_id = machine_id();
|
||||
if (host_machine_id) {
|
||||
char header[32] = {0};
|
||||
int n = snprintf(header, sizeof(header), "\x1b]%d;t=a", DND_CODE);
|
||||
queue_payload_to_child(
|
||||
w->id, w->drop.client_id, &w->drop.pending, header, n, host_machine_id, strlen(host_machine_id), false);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
drop_move_on_child(Window *w, const char** mimes, size_t num_mimes, bool is_drop) {
|
||||
if (!w->drop.hovered) {
|
||||
@@ -866,13 +872,6 @@ do_drop_request_uri_data(Window *w, int32_t mime_idx, int32_t file_idx) {
|
||||
return sync;
|
||||
}
|
||||
|
||||
void
|
||||
drop_request_uri_data(Window *w, const char *payload, size_t payload_sz) {
|
||||
(void)w; (void)payload; (void)payload_sz;
|
||||
/* This function is no longer used in the new protocol; URI data requests
|
||||
* are now handled through the unified t=r queue via do_drop_request_uri_data. */
|
||||
}
|
||||
|
||||
/* Handle a directory request from the client.
|
||||
* handle_id: the directory handle (Y= key).
|
||||
* entry_num: 0 means close the handle; >=1 means read that entry (x= key, 1-based).
|
||||
|
||||
@@ -14,7 +14,6 @@ void drop_move_on_child(Window *w, const char **mimes, size_t num_mimes, bool is
|
||||
void drop_left_child(Window *w);
|
||||
void drop_free_data(Window *w);
|
||||
void drop_send_einval(Window *w);
|
||||
void drop_request_uri_data(Window *w, const char *payload, size_t payload_sz);
|
||||
void drop_handle_dir_request(Window *w, uint32_t handle_id, int32_t entry_num);
|
||||
void drop_enqueue_request(Window *w, int32_t cell_x, int32_t cell_y, int32_t pixel_y);
|
||||
void drop_set_status(Window *w, int operation, const char *payload, size_t payload_sz, bool more);
|
||||
|
||||
Reference in New Issue
Block a user