void panel_action_protocol_init (void) { GdkDisplay *display; GdkAtom gdk_atom_gnome_panel_action; display = gdk_display_get_default (); gdk_atom_gnome_panel_action = gdk_atom_intern ("_GNOME_PANEL_ACTION", FALSE); atom_gnome_panel_action = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_GNOME_PANEL_ACTION", FALSE); atom_gnome_panel_action_main_menu = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_GNOME_PANEL_ACTION_MAIN_MENU", FALSE); atom_gnome_panel_action_run_dialog = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_GNOME_PANEL_ACTION_RUN_DIALOG", FALSE); gdk_display_add_client_message_filter ( display, gdk_atom_gnome_panel_action, panel_action_protocol_filter, NULL); }
void panel_action_protocol_init (void) { GdkDisplay *display; #if !GTK_CHECK_VERSION (3, 0, 0) GdkAtom gdk_atom_mate_panel_action; #endif display = gdk_display_get_default (); #if !GTK_CHECK_VERSION (3, 0, 0) gdk_atom_mate_panel_action = gdk_atom_intern_static_string ("_MATE_PANEL_ACTION"); #endif atom_mate_panel_action = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_MATE_PANEL_ACTION", FALSE); atom_mate_panel_action_main_menu = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_MATE_PANEL_ACTION_MAIN_MENU", FALSE); atom_mate_panel_action_run_dialog = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_MATE_PANEL_ACTION_RUN_DIALOG", FALSE); atom_mate_panel_action_kill_dialog = XInternAtom (GDK_DISPLAY_XDISPLAY (display), "_MATE_PANEL_ACTION_KILL_DIALOG", FALSE); #if GTK_CHECK_VERSION (3, 0, 0) /* We'll filter event sent on non-root windows later */ gdk_window_add_filter (NULL, panel_action_protocol_filter, NULL); #else gdk_display_add_client_message_filter ( display, gdk_atom_mate_panel_action, panel_action_protocol_filter, NULL); #endif }
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; } }