From 5743010af02b5fa44560cff852601fe9c15fd3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Sun, 15 Jan 2012 22:16:11 -0500 Subject: [PATCH] xserver: Create WM window, handle client messages --- src/xserver-launcher.c | 77 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/xserver-launcher.c b/src/xserver-launcher.c index 9d00c41f..b85b8130 100644 --- a/src/xserver-launcher.c +++ b/src/xserver-launcher.c @@ -68,6 +68,7 @@ struct weston_wm { xcb_screen_t *screen; struct hash_table *window_hash; struct weston_xserver *server; + xcb_window_t wm_window; xcb_window_t selection_window; int incr; @@ -94,6 +95,9 @@ struct weston_wm { xcb_atom_t net_wm_user_time; xcb_atom_t net_wm_icon_name; xcb_atom_t net_wm_window_type; + xcb_atom_t net_wm_moveresize; + xcb_atom_t net_supporting_wm_check; + xcb_atom_t net_supported; xcb_atom_t clipboard; xcb_atom_t targets; xcb_atom_t utf8_string; @@ -1056,6 +1060,17 @@ weston_wm_handle_xfixes_selection_notify(struct weston_wm *wm, xcb_flush(wm->conn); } +static void +weston_wm_handle_client_message(struct weston_wm *wm, + xcb_generic_event_t *event) +{ + xcb_client_message_event_t *client_message = + (xcb_client_message_event_t *) event; + + fprintf(stderr, "got client message, type: %s\n", + get_atom_name(wm->conn, client_message->type)); +} + static int weston_wm_handle_event(int fd, uint32_t mask, void *data) { @@ -1098,6 +1113,9 @@ weston_wm_handle_event(int fd, uint32_t mask, void *data) case XCB_SELECTION_REQUEST: weston_wm_handle_selection_request(wm, event); break; + case XCB_CLIENT_MESSAGE: + weston_wm_handle_client_message(wm, event); + break; } switch (event->response_type - wm->xfixes->first_event) { @@ -1133,6 +1151,10 @@ wxs_wm_get_resources(struct weston_wm *wm) { "_NET_WM_USER_TIME", F(atom.net_wm_user_time) }, { "_NET_WM_ICON_NAME", F(atom.net_wm_icon_name) }, { "_NET_WM_WINDOW_TYPE", F(atom.net_wm_window_type) }, + { "_NET_WM_MOVERESIZE", F(atom.net_wm_moveresize) }, + { "_NET_SUPPORTING_WM_CHECK", + F(atom.net_supporting_wm_check) }, + { "_NET_SUPPORTED", F(atom.net_supported) }, { "CLIPBOARD", F(atom.clipboard) }, { "TARGETS", F(atom.targets) }, { "UTF8_STRING", F(atom.utf8_string) }, @@ -1183,6 +1205,49 @@ wxs_wm_get_resources(struct weston_wm *wm) free(xfixes_reply); } +static void +weston_wm_create_wm_window(struct weston_wm *wm) +{ + static const char name[] = "Weston WM"; + + wm->wm_window = xcb_generate_id(wm->conn); + xcb_create_window(wm->conn, + XCB_COPY_FROM_PARENT, + wm->wm_window, + wm->screen->root, + 0, 0, + 10, 10, + 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + wm->screen->root_visual, + 0, NULL); + + xcb_change_property(wm->conn, + XCB_PROP_MODE_REPLACE, + wm->wm_window, + wm->atom.net_supporting_wm_check, + XCB_ATOM_WINDOW, + 32, /* format */ + 1, &wm->wm_window); + + xcb_change_property(wm->conn, + XCB_PROP_MODE_REPLACE, + wm->wm_window, + wm->atom.net_wm_name, + wm->atom.utf8_string, + 8, /* format */ + strlen(name), name); + + xcb_change_property(wm->conn, + XCB_PROP_MODE_REPLACE, + wm->screen->root, + wm->atom.net_supporting_wm_check, + XCB_ATOM_WINDOW, + 32, /* format */ + 1, &wm->wm_window); + +} + static struct weston_wm * weston_wm_create(struct weston_xserver *wxs) { @@ -1192,6 +1257,7 @@ weston_wm_create(struct weston_xserver *wxs) xcb_screen_iterator_t s; uint32_t values[1], mask; int sv[2]; + xcb_atom_t supported[1]; wm = malloc(sizeof *wm); if (wm == NULL) @@ -1246,6 +1312,17 @@ weston_wm_create(struct weston_xserver *wxs) xcb_change_window_attributes(wm->conn, wm->screen->root, XCB_CW_EVENT_MASK, values); + weston_wm_create_wm_window(wm); + + supported[0] = wm->atom.net_wm_moveresize; + xcb_change_property(wm->conn, + XCB_PROP_MODE_REPLACE, + wm->screen->root, + wm->atom.net_supported, + XCB_ATOM_ATOM, + 32, /* format */ + ARRAY_LENGTH(supported), supported); + wm->selection_request.requestor = XCB_NONE; wm->selection_window = xcb_generate_id(wm->conn);