void ShellXcb::create_window() { win_ = xcb_generate_id(c_); uint32_t value_mask, value_list[32]; value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; value_list[0] = scr_->black_pixel; value_list[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_STRUCTURE_NOTIFY; xcb_create_window(c_, XCB_COPY_FROM_PARENT, win_, scr_->root, 0, 0, settings_.initial_width, settings_.initial_height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, scr_->root_visual, value_mask, value_list); xcb_intern_atom_cookie_t utf8_string_cookie = intern_atom_cookie(c_, "UTF8_STRING"); xcb_intern_atom_cookie_t _net_wm_name_cookie = intern_atom_cookie(c_, "_NET_WM_NAME"); xcb_intern_atom_cookie_t wm_protocols_cookie = intern_atom_cookie(c_, "WM_PROTOCOLS"); xcb_intern_atom_cookie_t wm_delete_window_cookie = intern_atom_cookie(c_, "WM_DELETE_WINDOW"); // set title xcb_atom_t utf8_string = intern_atom(c_, utf8_string_cookie); xcb_atom_t _net_wm_name = intern_atom(c_, _net_wm_name_cookie); xcb_change_property(c_, XCB_PROP_MODE_REPLACE, win_, _net_wm_name, utf8_string, 8, settings_.name.size(), settings_.name.c_str()); // advertise WM_DELETE_WINDOW wm_protocols_ = intern_atom(c_, wm_protocols_cookie); wm_delete_window_ = intern_atom(c_, wm_delete_window_cookie); xcb_change_property(c_, XCB_PROP_MODE_REPLACE, win_, wm_protocols_, XCB_ATOM_ATOM, 32, 1, &wm_delete_window_); }
LEMONBUDDY_NS /** * Preload required xcb atoms */ void connection::preload_atoms() { for (auto&& a : ATOMS) *a.atom = intern_atom(false, a.len, a.name).atom(); }
struct rutabaga * window_impl_rtb_alloc(void) { struct xcb_rutabaga *self; Display *dpy; if (!(self = calloc(1, sizeof(*self)))) goto err_malloc; if (!(self->dpy = dpy = XOpenDisplay(NULL))) { ERR("can't open X display\n"); goto err_dpy; } if (!(self->xcb_conn = XGetXCBConnection(dpy))) { ERR("can't get XCB connection for display\n"); goto err_get_conn; } if (xrtb_keyboard_init(self)) { ERR("can't initialize keyboard\n"); goto err_keyboard_init; } XSetEventQueueOwner(dpy, XCBOwnsEventQueue); self->xkb_event = get_xkb_event_id(self->xcb_conn); self->xkb_core_kbd_id = get_core_kbd_id(self->xcb_conn); if (self->xkb_event >= 0 && self->xkb_core_kbd_id >= 0 && !receive_xkb_events(self->xcb_conn)) self->xkb_supported = 1; self->running_in_xwayland = intern_atom(self->xcb_conn, "WL_SURFACE_ID", 1) != XCB_NONE; #define INTERN_ATOM(atom, name) \ self->atoms.atom = intern_atom(self->xcb_conn, name, 0); INTERN_ATOM(wm_protocols, "WM_PROTOCOLS"); INTERN_ATOM(wm_delete_window, "WM_DELETE_WINDOW"); #undef INTERN_ATOM self->empty_cursor = create_empty_cursor(self); return (struct rutabaga *) self; err_keyboard_init: err_get_conn: XCloseDisplay(self->dpy); err_dpy: free(self); err_malloc: return NULL; }
/** * gdk_atom_intern_static_string: * @atom_name: a static string * * Finds or creates an atom corresponding to a given string. * * Note that this function is identical to gdk_atom_intern() except * that if a new #GdkAtom is created the string itself is used rather * than a copy. This saves memory, but can only be used if the string * will <emphasis>always</emphasis> exist. It can be used with statically * allocated strings in the main program, but not with statically * allocated memory in dynamically loaded modules, if you expect to * ever unload the module again (e.g. do not use this function in * GTK+ theme engines). * * Returns: the atom corresponding to @atom_name * * Since: 2.10 */ GdkAtom gdk_atom_intern_static_string (const gchar *atom_name) { return intern_atom (atom_name, FALSE); }
GdkAtom gdk_atom_intern (const gchar *atom_name, gboolean only_if_exists) { return intern_atom (atom_name, TRUE); }