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_);
}
Пример #2
0
LEMONBUDDY_NS
/**
 * Preload required xcb atoms
 */
void connection::preload_atoms() {
  for (auto&& a : ATOMS) *a.atom = intern_atom(false, a.len, a.name).atom();
}
Пример #3
0
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;
}
Пример #4
0
/**
 * 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);
}
Пример #5
0
GdkAtom
gdk_atom_intern (const gchar *atom_name, 
		 gboolean     only_if_exists)
{
  return intern_atom (atom_name, TRUE);
}