EAPI void ecore_x_window_shape_rectangles_add(Ecore_X_Window dest_win, Ecore_X_Rectangle *rects, int num) { #ifdef ECORE_XCB_SHAPE if (num > 0) xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, num, (const xcb_rectangle_t *)rects); else xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, 0, NULL); #endif /* ECORE_XCB_SHAPE */ } /* ecore_x_window_shape_rectangles_add */
/** * Sets the shape of the given window to a rectangle. * @param dest_win The given window. * @param x The X coordinate of the top left corner of the rectangle. * @param y The Y coordinate of the top left corner of the rectangle. * @param width The width of the rectangle. * @param height The height of the rectangle. * * Sets the shape of the window @p dest_win to a rectangle defined by * @p x, @p y, @p width and @p height. * @ingroup Ecore_X_Shape_Group */ EAPI void ecore_x_window_shape_rectangle_set(Ecore_X_Window dest_win, int x, int y, int width, int height) { #ifdef ECORE_XCB_SHAPE xcb_rectangle_t rect; rect.x = x; rect.y = y; rect.width = width; rect.height = height; xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, 1, &rect); #endif /* ECORE_XCB_SHAPE */ } /* ecore_x_window_shape_rectangle_set */
static void _e_alert_display(void) { xcb_char2b_t *str = NULL; xcb_query_text_extents_cookie_t cookie; xcb_query_text_extents_reply_t *reply; int x = 0, w = 0; tainted = _e_alert_root_tainted_get(); str = _e_alert_build_string(title); cookie = xcb_query_text_extents_unchecked(conn, font, strlen(title), str); reply = xcb_query_text_extents_reply(conn, cookie, NULL); if (reply) { fa = reply->font_ascent; fh = (fa + reply->font_descent); fw = reply->overall_width; free(reply); } free(str); /* move buttons */ x = 20; w = (WINDOW_WIDTH / 2) - 40; _e_alert_button_move_resize(btn1, x, WINDOW_HEIGHT - 20 - (fh + 20), w, (fh + 20)); x = ((WINDOW_WIDTH / 2) + 20); _e_alert_button_move_resize(btn2, x, WINDOW_HEIGHT - 20 - (fh + 20), w, (fh + 20)); comp_win = _e_alert_comp_win_get(); if (comp_win) { xcb_rectangle_t rect; int wx = 0, wy = 0; wx = ((sw - WINDOW_WIDTH) / 2); wy = ((sh - WINDOW_HEIGHT) / 2); rect.x = wx; rect.y = wy; rect.width = WINDOW_WIDTH; rect.height = WINDOW_HEIGHT; xcb_shape_rectangles(conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED, comp_win, 0, 0, 1, &rect); xcb_reparent_window(conn, win, comp_win, wx, wy); } /* map and raise main window */ xcb_map_window(conn, win); _e_alert_window_raise(win); /* grab pointer & keyboard */ xcb_grab_pointer_unchecked(conn, 0, win, (XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE), XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_NONE, XCB_NONE, XCB_CURRENT_TIME); xcb_grab_keyboard_unchecked(conn, 0, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, win, XCB_CURRENT_TIME); /* flush screen */ xcb_flush(conn); /* sync */ _e_alert_sync(); }
static gboolean _eventd_nd_xcb_events_callback(xcb_generic_event_t *event, gpointer user_data) { EventdNdBackendContext *self = user_data; EventdNdSurface *surface; if ( event == NULL ) { self->nd->backend_stop(self->nd->context); return FALSE; } gint type = event->response_type & ~0x80; /* RandR events */ if ( self->randr ) switch ( type - self->randr_event_base ) { case XCB_RANDR_SCREEN_CHANGE_NOTIFY: _eventd_nd_xcb_check_geometry(self); return TRUE; case XCB_RANDR_NOTIFY: return TRUE; default: break; } /* XFixes events */ if ( self->xfixes ) switch ( type - self->xfixes_event_base ) { case XCB_XFIXES_SELECTION_NOTIFY: { xcb_xfixes_selection_notify_event_t *e = (xcb_xfixes_selection_notify_event_t *)event; if ( e->selection == self->ewmh._NET_WM_CM_Sn[self->screen_number] ) { gboolean compositing = ( e->owner != XCB_WINDOW_NONE ); if ( self->compositing != compositing ) { xcb_rectangle_t rectangles[] = { { 0, 0, 0, 0 } }; self->compositing = compositing; GHashTableIter iter; g_hash_table_iter_init(&iter, self->bubbles); while ( g_hash_table_iter_next(&iter, NULL, (gpointer *) &surface) ) { if ( compositing && self->shape ) { rectangles[0].width = surface->width; rectangles[0].height = surface->height; xcb_shape_rectangles(self->xcb_connection, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, 0, surface->window, 0, 0, 1, rectangles); } _eventd_nd_xcb_surface_draw(surface); } } } return TRUE; } break; } /* Core events */ switch ( type ) { case XCB_BUTTON_RELEASE: { xcb_button_release_event_t *e = (xcb_button_release_event_t *)event; surface = g_hash_table_lookup(self->bubbles, GUINT_TO_POINTER(e->event)); if ( surface != NULL ) _eventd_nd_xcb_surface_button_release_event(surface); } break; case XCB_PROPERTY_NOTIFY: { xcb_property_notify_event_t *e = (xcb_property_notify_event_t *)event; if ( e->window != self->screen->root ) break; if ( ( self->follow_focus != EVENTD_ND_XCB_FOLLOW_FOCUS_NONE ) && ( e->atom == self->ewmh._NET_ACTIVE_WINDOW ) ) _eventd_nd_xcb_check_geometry(self); } break; default: break; } return TRUE; }