char * na_tray_manager_get_child_title (NaTrayManager *manager, NaTrayManagerChild *child) { char *retval = NULL; #ifdef GDK_WINDOWING_X11 GdkDisplay *display; Window *child_window; Atom utf8_string, atom, type; int result; int format; gulong nitems; gulong bytes_after; gchar *val; g_return_val_if_fail (NA_IS_TRAY_MANAGER (manager), NULL); g_return_val_if_fail (GTK_IS_SOCKET (child), NULL); display = gdk_screen_get_display (manager->screen); child_window = g_object_get_data (G_OBJECT (child), "na-tray-child-window"); utf8_string = gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"); atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME"); gdk_error_trap_push (); result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), *child_window, atom, 0, G_MAXLONG, False, utf8_string, &type, &format, &nitems, &bytes_after, (guchar **)&val); if (gdk_error_trap_pop () || result != Success) return NULL; if (type != utf8_string || format != 8 || nitems == 0) { if (val) XFree (val); return NULL; } if (!g_utf8_validate (val, nitems, NULL)) { XFree (val); return NULL; } retval = g_strndup (val, nitems); XFree (val); #endif return retval; }
GtkOrientation na_tray_manager_get_orientation (NaTrayManager *manager) { g_return_val_if_fail (NA_IS_TRAY_MANAGER (manager), GTK_ORIENTATION_HORIZONTAL); return manager->orientation; }
void na_tray_manager_set_icon_size (NaTrayManager *manager, gint icon_size) { g_return_if_fail (NA_IS_TRAY_MANAGER (manager)); if (manager->icon_size != icon_size) { manager->icon_size = icon_size; na_tray_manager_set_icon_size_property (manager); } }
void na_tray_manager_set_padding (NaTrayManager *manager, gint padding) { g_return_if_fail (NA_IS_TRAY_MANAGER (manager)); if (manager->padding != padding) { manager->padding = padding; na_tray_manager_set_padding_property (manager); } }
void na_tray_manager_set_orientation (NaTrayManager *manager, GtkOrientation orientation) { g_return_if_fail (NA_IS_TRAY_MANAGER (manager)); if (manager->orientation != orientation) { manager->orientation = orientation; na_tray_manager_set_orientation_property (manager); g_object_notify (G_OBJECT (manager), "orientation"); } }
void na_tray_manager_set_colors (NaTrayManager *manager, GdkRGBA *fg, GdkRGBA *error, GdkRGBA *warning, GdkRGBA *success) { g_return_if_fail (NA_IS_TRAY_MANAGER (manager)); if (!gdk_rgba_equal (&manager->fg, fg) || !gdk_rgba_equal (&manager->error, error) || !gdk_rgba_equal (&manager->warning, warning) || !gdk_rgba_equal (&manager->success, success)) { manager->fg = *fg; manager->error = *error; manager->warning = *warning; manager->success = *success; na_tray_manager_set_colors_property (manager); } }
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; } }