static VALUE rg_m_owner_set(int argc, VALUE *argv, G_GNUC_UNUSED VALUE self) { VALUE owner, selection, time, send_event; int ret; if (argc == 4){ rb_scan_args(argc, argv, "40", &owner, &selection, &time, &send_event); ret = gdk_selection_owner_set(GDK_WINDOW(RVAL2GOBJ(owner)), RVAL2ATOM(selection), NUM2UINT(time), RVAL2CBOOL(send_event)); } else { #if GTK_CHECK_VERSION(2,2,0) VALUE display = Qnil; rb_scan_args(argc, argv, "50", &display, &owner, &selection, &time, &send_event); ret = gdk_selection_owner_set_for_display(GDK_DISPLAY_OBJECT(RVAL2GOBJ(display)), GDK_WINDOW(RVAL2GOBJ(owner)), RVAL2ATOM(selection), NUM2UINT(time), RVAL2CBOOL(send_event)); #else rb_raise(rb_eArgError, "Wrong number of arguments: %d", argc); #endif } return CBOOL2RVAL(ret); }
/** * gdk_selection_owner_set: * @owner: (allow-none): a #GdkWindow or %NULL to indicate that the * the owner for the given should be unset. * @selection: an atom identifying a selection. * @time_: timestamp to use when setting the selection. * If this is older than the timestamp given last * time the owner was set for the given selection, the * request will be ignored. * @send_event: if %TRUE, and the new owner is different * from the current owner, the current owner * will be sent a SelectionClear event. * * Sets the owner of the given selection. * * Returns: %TRUE if the selection owner was successfully * changed to @owner, otherwise %FALSE. */ gboolean gdk_selection_owner_set (GdkWindow *owner, GdkAtom selection, guint32 time, gboolean send_event) { return gdk_selection_owner_set_for_display (gdk_display_get_default (), owner, selection, time, send_event); }
static void na_tray_manager_unmanage (NaTrayManager *manager) { #ifdef GDK_WINDOWING_X11 GdkDisplay *display; guint32 timestamp; GtkWidget *invisible; GdkWindow *window; if (manager->invisible == NULL) return; invisible = manager->invisible; window = gtk_widget_get_window (invisible); g_assert (GTK_IS_INVISIBLE (invisible)); g_assert (gtk_widget_get_realized (invisible)); g_assert (GDK_IS_WINDOW (window)); display = gtk_widget_get_display (invisible); if (gdk_selection_owner_get_for_display (display, manager->selection_atom) == window) { timestamp = gdk_x11_get_server_time (window); gdk_selection_owner_set_for_display (display, NULL, manager->selection_atom, timestamp, TRUE); } //FIXME: we should also use gdk_remove_client_message_filter when it's //available // See bug #351254 gdk_window_remove_filter (window, na_tray_manager_window_filter, manager); manager->invisible = NULL; /* prior to destroy for reentrancy paranoia */ gtk_widget_destroy (invisible); g_object_unref (G_OBJECT (invisible)); #endif }
static VALUE rg_m_owner_set(int argc, VALUE *argv, G_GNUC_UNUSED VALUE self) { VALUE owner, selection, time, send_event; int ret; if (argc == 4){ rb_scan_args(argc, argv, "40", &owner, &selection, &time, &send_event); ret = gdk_selection_owner_set(GDK_WINDOW(RVAL2GOBJ(owner)), RVAL2ATOM(selection), NUM2UINT(time), RVAL2CBOOL(send_event)); } else { VALUE display = Qnil; rb_scan_args(argc, argv, "50", &display, &owner, &selection, &time, &send_event); ret = gdk_selection_owner_set_for_display(GDK_DISPLAY_OBJECT(RVAL2GOBJ(display)), GDK_WINDOW(RVAL2GOBJ(owner)), RVAL2ATOM(selection), NUM2UINT(time), RVAL2CBOOL(send_event)); } return CBOOL2RVAL(ret); }
static gboolean na_tray_manager_manage_screen_x11 (NaTrayManager *manager, GdkScreen *screen) { GdkDisplay *display; Screen *xscreen; GtkWidget *invisible; char *selection_atom_name; guint32 timestamp; g_return_val_if_fail (NA_IS_TRAY_MANAGER (manager), FALSE); g_return_val_if_fail (manager->screen == NULL, FALSE); /* If there's already a manager running on the screen * we can't create another one. */ #if 0 if (na_tray_manager_check_running_screen_x11 (screen)) return FALSE; #endif manager->screen = screen; display = gdk_screen_get_display (screen); xscreen = GDK_SCREEN_XSCREEN (screen); invisible = gtk_invisible_new_for_screen (screen); gtk_widget_realize (invisible); gtk_widget_add_events (invisible, GDK_PROPERTY_CHANGE_MASK | GDK_STRUCTURE_MASK); selection_atom_name = g_strdup_printf ("_NET_SYSTEM_TRAY_S%d", gdk_screen_get_number (screen)); manager->selection_atom = gdk_atom_intern (selection_atom_name, FALSE); g_free (selection_atom_name); manager->invisible = invisible; g_object_ref (G_OBJECT (manager->invisible)); na_tray_manager_set_orientation_property (manager); na_tray_manager_set_visual_property (manager); timestamp = gdk_x11_get_server_time (invisible->window); /* Check if we could set the selection owner successfully */ if (gdk_selection_owner_set_for_display (display, invisible->window, manager->selection_atom, timestamp, TRUE)) { XClientMessageEvent xev; GdkAtom opcode_atom; GdkAtom message_data_atom; xev.type = ClientMessage; xev.window = RootWindowOfScreen (xscreen); xev.message_type = gdk_x11_get_xatom_by_name_for_display (display, "MANAGER"); xev.format = 32; xev.data.l[0] = timestamp; xev.data.l[1] = gdk_x11_atom_to_xatom_for_display (display, manager->selection_atom); xev.data.l[2] = GDK_WINDOW_XWINDOW (invisible->window); xev.data.l[3] = 0; /* manager specific data */ xev.data.l[4] = 0; /* manager specific data */ XSendEvent (GDK_DISPLAY_XDISPLAY (display), RootWindowOfScreen (xscreen), False, StructureNotifyMask, (XEvent *)&xev); opcode_atom = gdk_atom_intern ("_NET_SYSTEM_TRAY_OPCODE", FALSE); manager->opcode_atom = gdk_x11_atom_to_xatom_for_display (display, opcode_atom); message_data_atom = gdk_atom_intern ("_NET_SYSTEM_TRAY_MESSAGE_DATA", FALSE); /* Add a window filter */ #if 0 /* This is for when we lose the selection of _NET_SYSTEM_TRAY_Sx */ g_signal_connect (invisible, "selection-clear-event", G_CALLBACK (na_tray_manager_selection_clear_event), manager); #endif /* This is for SYSTEM_TRAY_REQUEST_DOCK and SelectionClear */ gdk_window_add_filter (invisible->window, na_tray_manager_window_filter, manager); /* This is for SYSTEM_TRAY_BEGIN_MESSAGE and SYSTEM_TRAY_CANCEL_MESSAGE */ gdk_display_add_client_message_filter (display, opcode_atom, na_tray_manager_handle_client_message_opcode, manager); /* This is for _NET_SYSTEM_TRAY_MESSAGE_DATA */ gdk_display_add_client_message_filter (display, message_data_atom, na_tray_manager_handle_client_message_message_data, manager); return TRUE; } else { gtk_widget_destroy (invisible); g_object_unref (invisible); manager->invisible = NULL; manager->screen = NULL; return FALSE; } }