diff --git a/main.c b/main.c index 267bd89f..0bdfe69a 100644 --- a/main.c +++ b/main.c @@ -1151,16 +1151,6 @@ out: shm_fini(); - if (term.selection.clipboard.data_source != NULL) - wl_data_source_destroy(term.selection.clipboard.data_source); - if (term.selection.clipboard.data_offer != NULL) - wl_data_offer_destroy(term.selection.clipboard.data_offer); - free(term.selection.clipboard.text); - if (term.selection.primary.data_source != NULL) - zwp_primary_selection_source_v1_destroy(term.selection.primary.data_source); - if (term.selection.primary.data_offer != NULL) - zwp_primary_selection_offer_v1_destroy(term.selection.primary.data_offer); - free(term.selection.primary.text); if (term.kbd.xkb_compose_state != NULL) xkb_compose_state_unref(term.kbd.xkb_compose_state); if (term.kbd.xkb_compose_table != NULL) diff --git a/selection.c b/selection.c index d5b89dba..e53ace8b 100644 --- a/selection.c +++ b/selection.c @@ -319,7 +319,7 @@ static void send(void *data, struct wl_data_source *wl_data_source, const char *mime_type, int32_t fd) { - const struct clipboard *clipboard + const struct wl_clipboard *clipboard = wl_data_source_get_user_data(wl_data_source); assert(clipboard != NULL); @@ -346,7 +346,7 @@ send(void *data, struct wl_data_source *wl_data_source, const char *mime_type, static void cancelled(void *data, struct wl_data_source *wl_data_source) { - struct clipboard *clipboard = wl_data_source_get_user_data(wl_data_source); + struct wl_clipboard *clipboard = wl_data_source_get_user_data(wl_data_source); assert(clipboard->data_source == wl_data_source); wl_data_source_destroy(clipboard->data_source); @@ -386,7 +386,7 @@ primary_send(void *data, struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1, const char *mime_type, int32_t fd) { - const struct primary *primary + const struct wl_primary *primary = zwp_primary_selection_source_v1_get_user_data(zwp_primary_selection_source_v1); assert(primary != NULL); @@ -414,7 +414,7 @@ static void primary_cancelled(void *data, struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1) { - struct primary *primary = zwp_primary_selection_source_v1_get_user_data( + struct wl_primary *primary = zwp_primary_selection_source_v1_get_user_data( zwp_primary_selection_source_v1); //assert(primary->data_source == zwp_primary_selection_source_v1); @@ -434,10 +434,10 @@ static const struct zwp_primary_selection_source_v1_listener primary_selection_s bool text_to_clipboard(struct terminal *term, char *text, uint32_t serial) { - if (term->selection.clipboard.data_source != NULL) { - /* Kill previous data source */ - struct clipboard *clipboard = &term->selection.clipboard; + struct wl_clipboard *clipboard = &term->wl.clipboard; + if (term->wl.clipboard.data_source != NULL) { + /* Kill previous data source */ assert(clipboard->serial != 0); wl_data_device_set_selection(term->wl.data_device, NULL, clipboard->serial); wl_data_source_destroy(clipboard->data_source); @@ -447,8 +447,6 @@ text_to_clipboard(struct terminal *term, char *text, uint32_t serial) clipboard->serial = 0; } - struct clipboard *clipboard = &term->selection.clipboard; - clipboard->data_source = wl_data_device_manager_create_data_source(term->wl.data_device_manager); @@ -484,7 +482,7 @@ text_from_clipboard(struct terminal *term, uint32_t serial, void (*cb)(const char *data, size_t size, void *user), void *user) { - struct clipboard *clipboard = &term->selection.clipboard; + struct wl_clipboard *clipboard = &term->wl.clipboard; if (clipboard->data_offer == NULL) return; @@ -541,7 +539,7 @@ from_clipboard_cb(const char *data, size_t size, void *user) void selection_from_clipboard(struct terminal *term, uint32_t serial) { - struct clipboard *clipboard = &term->selection.clipboard; + struct wl_clipboard *clipboard = &term->wl.clipboard; if (clipboard->data_offer == NULL) return; @@ -560,10 +558,11 @@ text_to_primary(struct terminal *term, char *text, uint32_t serial) if (term->wl.primary_selection_device_manager == NULL) return false; + struct wl_primary *primary = &term->wl.primary; + /* TODO: somehow share code with the clipboard equivalent */ - if (term->selection.primary.data_source != NULL) { + if (term->wl.primary.data_source != NULL) { /* Kill previous data source */ - struct primary *primary = &term->selection.primary; assert(primary->serial != 0); zwp_primary_selection_device_v1_set_selection( @@ -575,8 +574,6 @@ text_to_primary(struct terminal *term, char *text, uint32_t serial) primary->serial = 0; } - struct primary *primary = &term->selection.primary; - primary->data_source = zwp_primary_selection_device_manager_v1_create_source( term->wl.primary_selection_device_manager); @@ -620,7 +617,7 @@ text_from_primary( if (term->wl.primary_selection_device_manager == NULL) return; - struct primary *primary = &term->selection.primary; + struct wl_primary *primary = &term->wl.primary; if (primary->data_offer == NULL) return; @@ -673,7 +670,7 @@ selection_from_primary(struct terminal *term) if (term->wl.primary_selection_device_manager == NULL) return; - struct clipboard *clipboard = &term->selection.clipboard; + struct wl_clipboard *clipboard = &term->wl.clipboard; if (clipboard->data_offer == NULL) return; @@ -746,7 +743,7 @@ selection(void *data, struct wl_data_device *wl_data_device, /* Selection offer from other client */ struct terminal *term = data; - struct clipboard *clipboard = &term->selection.clipboard; + struct wl_clipboard *clipboard = &term->wl.clipboard; if (clipboard->data_offer != NULL) wl_data_offer_destroy(clipboard->data_offer); @@ -795,7 +792,7 @@ primary_selection(void *data, /* Selection offer from other client, for primary */ struct terminal *term = data; - struct primary *primary = &term->selection.primary; + struct wl_primary *primary = &term->wl.primary; if (primary->data_offer != NULL) zwp_primary_selection_offer_v1_destroy(primary->data_offer); diff --git a/terminal.h b/terminal.h index df70347d..999b72e0 100644 --- a/terminal.h +++ b/terminal.h @@ -171,20 +171,6 @@ enum mouse_reporting { MOUSE_URXVT, /* ?1015h */ }; -struct clipboard { - struct wl_data_source *data_source; - struct wl_data_offer *data_offer; - char *text; - uint32_t serial; -}; - -struct primary { - struct zwp_primary_selection_source_v1 *data_source; - struct zwp_primary_selection_offer_v1 *data_offer; - char *text; - uint32_t serial; -}; - enum cursor_style { CURSOR_BLOCK, CURSOR_UNDERLINE, CURSOR_BAR }; struct terminal { @@ -279,8 +265,6 @@ struct terminal { struct { struct coord start; struct coord end; - struct clipboard clipboard; - struct primary primary; } selection; bool is_searching; diff --git a/wayland.c b/wayland.c index 9b00f5bb..96ba3641 100644 --- a/wayland.c +++ b/wayland.c @@ -34,6 +34,17 @@ wayl_destroy(struct wayland *wayl) if (wayl->xdg_output_manager != NULL) zxdg_output_manager_v1_destroy(wayl->xdg_output_manager); + if (wayl->clipboard.data_source != NULL) + wl_data_source_destroy(wayl->clipboard.data_source); + if (wayl->clipboard.data_offer != NULL) + wl_data_offer_destroy(wayl->clipboard.data_offer); + free(wayl->clipboard.text); + if (wayl->primary.data_source != NULL) + zwp_primary_selection_source_v1_destroy(wayl->primary.data_source); + if (wayl->primary.data_offer != NULL) + zwp_primary_selection_offer_v1_destroy(wayl->primary.data_offer); + free(wayl->primary.text); + free(wayl->pointer.theme_name); if (wayl->pointer.theme != NULL) wl_cursor_theme_destroy(wayl->pointer.theme); diff --git a/wayland.h b/wayland.h index cbd0392c..1b680b2c 100644 --- a/wayland.h +++ b/wayland.h @@ -27,6 +27,20 @@ struct monitor { float refresh; }; +struct wl_clipboard { + struct wl_data_source *data_source; + struct wl_data_offer *data_offer; + char *text; + uint32_t serial; +}; + +struct wl_primary { + struct zwp_primary_selection_source_v1 *data_source; + struct zwp_primary_selection_offer_v1 *data_offer; + char *text; + uint32_t serial; +}; + struct wl_window { struct wl_surface *surface; struct xdg_wm_base *shell; @@ -74,6 +88,10 @@ struct wayland { char *theme_name; } pointer; + /* Clipboard */ + struct wl_clipboard clipboard; + struct wl_primary primary; + bool have_argb8888; tll(struct monitor) monitors; /* All available outputs */ };