/* local functions */ static Eina_Bool _ecore_xcb_selection_set(Ecore_X_Window win, const void *data, int size, Ecore_X_Atom selection) { xcb_get_selection_owner_cookie_t cookie; xcb_get_selection_owner_reply_t *reply; int in = 0; LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; xcb_set_selection_owner(_ecore_xcb_conn, win, selection, XCB_CURRENT_TIME); cookie = xcb_get_selection_owner(_ecore_xcb_conn, selection); reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return EINA_FALSE; if (reply->owner != win) { free(reply); return EINA_FALSE; } free(reply); if (selection == ECORE_X_ATOM_SELECTION_PRIMARY) in = 0; else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY) in = 1; else if (selection == ECORE_X_ATOM_SELECTION_XDND) in = 2; else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD) in = 3; else return EINA_FALSE; if (data) { unsigned char *buff = NULL; _selections[in].win = win; _selections[in].selection = selection; _selections[in].length = size; _selections[in].time = _ecore_xcb_events_last_time_get(); buff = malloc(size); if (!buff) return EINA_FALSE; memcpy(buff, data, size); _selections[in].data = buff; } else if (_selections[in].data) { free(_selections[in].data); memset(&_selections[in], 0, sizeof(Ecore_X_Selection_Data)); } return EINA_TRUE; }
void app_init_system_tray_selection_owner_window(struct app * app) { xcb_generic_error_t * error; xcb_get_selection_owner_cookie_t cookie; xcb_get_selection_owner_reply_t * reply; cookie = xcb_get_selection_owner(app->xcb_connection, app->atoms.net_system_tray_sdefault); reply = xcb_get_selection_owner_reply(app->xcb_connection, cookie, &error); if (error || !reply) { app_init_error(app, "could not get system tray selection owner"); return; } app->system_tray_selection_owner_window = reply->owner; free(reply); }
EAPI Ecore_X_Window ecore_x_selection_owner_get(Ecore_X_Atom atom) { xcb_get_selection_owner_cookie_t cookie; xcb_get_selection_owner_reply_t *reply; Ecore_X_Window ret; LOGFN(__FILE__, __LINE__, __FUNCTION__); CHECK_XCB_CONN; cookie = xcb_get_selection_owner(_ecore_xcb_conn, atom); reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL); if (!reply) return 0; ret = reply->owner; free(reply); return ret; }
QXcbXSettings::QXcbXSettings(QXcbScreen *screen) : d_ptr(new QXcbXSettingsPrivate(screen)) { QByteArray settings_atom_for_screen("_XSETTINGS_S"); settings_atom_for_screen.append(QByteArray::number(screen->screenNumber())); xcb_intern_atom_cookie_t atom_cookie = xcb_intern_atom(screen->xcb_connection(), true, settings_atom_for_screen.length(), settings_atom_for_screen.constData()); xcb_generic_error_t *error = 0; xcb_intern_atom_reply_t *atom_reply = xcb_intern_atom_reply(screen->xcb_connection(),atom_cookie,&error); if (error) { free(error); return; } xcb_atom_t selection_owner_atom = atom_reply->atom; free(atom_reply); xcb_get_selection_owner_cookie_t selection_cookie = xcb_get_selection_owner(screen->xcb_connection(), selection_owner_atom); xcb_get_selection_owner_reply_t *selection_result = xcb_get_selection_owner_reply(screen->xcb_connection(), selection_cookie, &error); if (error) { free(error); return; } d_ptr->x_settings_window = selection_result->owner; free(selection_result); if (!d_ptr->x_settings_window) { return; } const uint32_t event = XCB_CW_EVENT_MASK; const uint32_t event_mask[] = { XCB_EVENT_MASK_STRUCTURE_NOTIFY|XCB_EVENT_MASK_PROPERTY_CHANGE }; xcb_change_window_attributes(screen->xcb_connection(),d_ptr->x_settings_window,event,event_mask); #ifdef XCB_USE_XLIB d_ptr->populateSettings(d_ptr->getSettings()); d_ptr->initialized = true; #endif //XCB_USE_XLIB }