diff options
Diffstat (limited to 'xwayland/selection.c')
| -rw-r--r-- | xwayland/selection.c | 95 | 
1 files changed, 95 insertions, 0 deletions
| diff --git a/xwayland/selection.c b/xwayland/selection.c new file mode 100644 index 00000000..c80e1db2 --- /dev/null +++ b/xwayland/selection.c @@ -0,0 +1,95 @@ +#include <xcb/xfixes.h> +#include "wlr/util/log.h" +#include "xwm.h" + +static void xwm_handle_selection_notify(struct wlr_xwm *xwm, xcb_generic_event_t +		*event) { +	wlr_log(L_DEBUG, "TODO: SELECTION NOTIFY"); +} + +static int xwm_handle_selection_property_notify(struct wlr_xwm *xwm, +		xcb_generic_event_t *event) { +	xcb_property_notify_event_t *property_notify = +		(xcb_property_notify_event_t *) event; + +	if (property_notify->window == xwm->selection_window) { +		if (property_notify->state == XCB_PROPERTY_NEW_VALUE && +				property_notify->atom == xwm->atoms[WL_SELECTION] && +				xwm->incr) +			wlr_log(L_DEBUG, "TODO: get selection"); +			return 1; +	} else if (property_notify->window == xwm->selection_request.requestor) { +		if (property_notify->state == XCB_PROPERTY_DELETE && +				property_notify->atom == xwm->selection_request.property && +				xwm->incr) +			wlr_log(L_DEBUG, "TODO: send selection"); +			return 1; +	} + +	return 0; +} + +static void xwm_handle_selection_request(struct wlr_xwm *xwm, +		xcb_generic_event_t *event) { +	wlr_log(L_DEBUG, "TODO: SELECTION REQUEST"); +	return; +} + +static int weston_wm_handle_xfixes_selection_notify(struct wlr_xwm *xwm, +		xcb_generic_event_t *event) { +	wlr_log(L_DEBUG, "TODO: XFIXES SELECTION NOTIFY"); +	return 1; +} + + +int xwm_handle_selection_event(struct wlr_xwm *xwm, +		xcb_generic_event_t *event) { +	switch (event->response_type & ~0x80) { +	case XCB_SELECTION_NOTIFY: +		xwm_handle_selection_notify(xwm, event); +		return 1; +	case XCB_PROPERTY_NOTIFY: +		return xwm_handle_selection_property_notify(xwm, event); +	case XCB_SELECTION_REQUEST: +		xwm_handle_selection_request(xwm, event); +		return 1; +	} + +	switch (event->response_type - xwm->xfixes->first_event) { +	case XCB_XFIXES_SELECTION_NOTIFY: +		return weston_wm_handle_xfixes_selection_notify(xwm, event); +	} + +	return 0; +} + +void xwm_selection_init(struct wlr_xwm *xwm) { +	uint32_t values[1], mask; + +	xwm->selection_request.requestor = XCB_NONE; + +	values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE; +	xwm->selection_window = xcb_generate_id(xwm->xcb_conn); +	xcb_create_window(xwm->xcb_conn, +		XCB_COPY_FROM_PARENT, +		xwm->selection_window, +		xwm->screen->root, +		0, 0, +		10, 10, +		0, +		XCB_WINDOW_CLASS_INPUT_OUTPUT, +		xwm->screen->root_visual, +		XCB_CW_EVENT_MASK, values); + +	xcb_set_selection_owner(xwm->xcb_conn, +		xwm->selection_window, +		xwm->atoms[CLIPBOARD_MANAGER], +		XCB_TIME_CURRENT_TIME); + +	mask = +		XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER | +		XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_WINDOW_DESTROY | +		XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE; +	xcb_xfixes_select_selection_input(xwm->xcb_conn, xwm->selection_window, +		xwm->atoms[CLIPBOARD], mask); +} | 
