static ClutterX11FilterReturn st_clipboard_x11_event_filter (XEvent *xev, ClutterEvent *cev, EventFilterData *filter_data) { Atom actual_type; int actual_format, result; unsigned long nitems, bytes_after; unsigned char *data = NULL; if(xev->type != SelectionNotify) return CLUTTER_X11_FILTER_CONTINUE; if (xev->xselection.property == None) { /* clipboard empty */ filter_data->callback (filter_data->clipboard, NULL, filter_data->user_data); clutter_x11_remove_filter ((ClutterX11FilterFunc) st_clipboard_x11_event_filter, filter_data); g_free (filter_data); return CLUTTER_X11_FILTER_REMOVE; } clutter_x11_trap_x_errors (); result = XGetWindowProperty (xev->xselection.display, xev->xselection.requestor, xev->xselection.property, 0L, G_MAXINT, True, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &data); if (clutter_x11_untrap_x_errors () || result != Success) { /* FIXME: handle failure better */ g_warning ("Clipboard: prop retrival failed"); } filter_data->callback (filter_data->clipboard, (char*) data, filter_data->user_data); clutter_x11_remove_filter ((ClutterX11FilterFunc) st_clipboard_x11_event_filter, filter_data); g_free (filter_data); if (data) XFree (data); return CLUTTER_X11_FILTER_REMOVE; }
static void clutter_backend_x11_finalize (GObject *gobject) { ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (gobject); g_free (backend_x11->display_name); clutter_x11_remove_filter (cogl_xlib_filter, gobject); clutter_x11_remove_filter (xsettings_filter, backend_x11); _clutter_xsettings_client_destroy (backend_x11->xsettings); XCloseDisplay (backend_x11->xdpy); G_OBJECT_CLASS (clutter_backend_x11_parent_class)->finalize (gobject); }
static void clutter_x11_texture_pixmap_dispose (GObject *object) { ClutterX11TexturePixmap *texture = CLUTTER_X11_TEXTURE_PIXMAP (object); ClutterX11TexturePixmapPrivate *priv = texture->priv; free_damage_resources (texture); clutter_x11_remove_filter (on_x_event_filter_too, (gpointer)texture); if (priv->owns_pixmap && priv->pixmap) { g_signal_emit (texture, signals[PIXMAP_FREEING], 0, NULL); XFreePixmap (clutter_x11_get_default_display (), priv->pixmap); priv->pixmap = None; } if (priv->image) { XDestroyImage (priv->image); priv->image = NULL; } free_shm_resources (texture); G_OBJECT_CLASS (clutter_x11_texture_pixmap_parent_class)->dispose (object); }
/** * clutter_x11_texture_pixmap_set_window: * @texture: the texture to bind * @window: the X window to which the texture should be bound * @automatic: TRUE is automatic window updates, FALSE for manual. * * Sets up a suitable pixmap for the window, using the composite and damage * extensions if possible, and then calls * clutter_x11_texture_pixmap_set_pixmap(). If you want a window in a texture, * you probably want this function, or its older sister, * clutter_glx_texture_pixmap_set_window(). * * Since: 0.8 **/ void clutter_x11_texture_pixmap_set_window (ClutterX11TexturePixmap *texture, Window window) { ClutterX11TexturePixmapPrivate *priv; XWindowAttributes attr; Display *dpy = clutter_x11_get_default_display (); g_return_if_fail (CLUTTER_X11_IS_TEXTURE_PIXMAP (texture)); priv = texture->priv; if (!clutter_x11_has_composite_extension()) return; if (priv->window == window) return; if (priv->window) { clutter_x11_remove_filter (on_x_event_filter_too, (gpointer)texture); } priv->window = window; priv->window_mapped = FALSE; priv->destroyed = FALSE; if (window == None) return; clutter_x11_trap_x_errors (); { if (!XGetWindowAttributes (dpy, window, &attr)) { XSync (dpy, False); clutter_x11_untrap_x_errors (); g_warning ("bad window 0x%x", (guint32)window); priv->window = None; return; } } clutter_x11_untrap_x_errors (); if (priv->window) { XSelectInput (dpy, priv->window, attr.your_event_mask | StructureNotifyMask); clutter_x11_add_filter (on_x_event_filter_too, (gpointer)texture); } g_object_ref (texture); g_object_notify (G_OBJECT (texture), "window"); clutter_x11_texture_pixmap_set_mapped (texture, attr.map_state == IsViewable); clutter_x11_texture_pixmap_sync_window (texture); g_object_unref (texture); }
static void free_damage_resources (ClutterX11TexturePixmap *texture) { ClutterX11TexturePixmapPrivate *priv; Display *dpy; priv = texture->priv; dpy = clutter_x11_get_default_display(); if (priv->damage) { clutter_x11_trap_x_errors (); XDamageDestroy (dpy, priv->damage); XSync (dpy, FALSE); clutter_x11_untrap_x_errors (); priv->damage = None; priv->damage_drawable = None; } clutter_x11_remove_filter (on_x_event_filter, (gpointer)texture); }
static void xfixes_cursor_set_stage (ShellXFixesCursor *xfixes_cursor, ClutterStage *stage) { if (xfixes_cursor->stage == stage) return; if (xfixes_cursor->stage) { g_signal_handlers_disconnect_by_func (xfixes_cursor->stage, (void *)xfixes_cursor_on_stage_destroy, xfixes_cursor); clutter_x11_remove_filter (xfixes_cursor_event_filter, xfixes_cursor); } xfixes_cursor->stage = stage; if (xfixes_cursor->stage) { int error_base; xfixes_cursor->stage = stage; g_signal_connect (xfixes_cursor->stage, "destroy", G_CALLBACK (xfixes_cursor_on_stage_destroy), xfixes_cursor); clutter_x11_add_filter (xfixes_cursor_event_filter, xfixes_cursor); xfixes_cursor->have_xfixes = XFixesQueryExtension (clutter_x11_get_default_display (), &xfixes_cursor->xfixes_event_base, &error_base); if (xfixes_cursor->have_xfixes) XFixesSelectCursorInput (clutter_x11_get_default_display (), clutter_x11_get_stage_window (stage), XFixesDisplayCursorNotifyMask); xfixes_cursor_reset_image (xfixes_cursor); } }