static GtkListStore * do_query (void) { GtkListStore *store; Bonobo_ServerInfoList *servers; #if 0 /* This is the old query, but too many components are not generally useful and cause problems, so we are changing to an 'opt-in' query, where we only include components that have a 'glade:show' property set to TRUE. */ const char *query = "repo_ids.has('IDL:Bonobo/Control:1.0') AND NOT " "repo_ids.has('IDL:GNOME/Vertigo/PanelAppletShell:1.0')"; #else const char *query = "glade:show"; #endif char *sort[] = { "description", NULL }; CORBA_Environment ev; int i; Bonobo_ServerInfo *serverinfo; const char *desc; GtkTreeIter iter; store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); CORBA_exception_init (&ev); servers = bonobo_activation_query (query, sort, &ev); if (BONOBO_EX (&ev)) { g_warning ("query failed: %s\n", ev._id); CORBA_exception_free (&ev); return store; } CORBA_exception_free (&ev); #if 0 g_print ("got %d servers.\n", servers ? servers->_length : 0); #endif for (i = 0; i < servers->_length; i++) { serverinfo = &servers->_buffer[i]; desc = bonobo_server_info_prop_lookup (serverinfo, "description", NULL); if (!desc) desc = bonobo_server_info_prop_lookup (serverinfo, "name", NULL); if (!desc) desc = serverinfo->iid; gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, COL_OBJID, serverinfo->iid, COL_DESC, desc, -1); } CORBA_free (servers); return store; }
static void query_components (EComponentRegistry *registry) { Bonobo_ServerInfoList *info_list; const gchar * const *language_names; CORBA_Environment ev; GSList *languages = NULL; char *query; int i; if (registry->priv->init) return; registry->priv->init = TRUE; CORBA_exception_init (&ev); query = g_strdup_printf ("repo_ids.has ('IDL:GNOME/Evolution/Component:%s')", BASE_VERSION); info_list = bonobo_activation_query (query, NULL, &ev); g_free (query); if (BONOBO_EX (&ev)) { char *ex_text = bonobo_exception_get_text (&ev); g_warning ("Cannot query for components: %s\n", ex_text); g_free (ex_text); CORBA_exception_free (&ev); return; } language_names = g_get_language_names (); while (*language_names != NULL) languages = g_slist_append (languages, (gpointer)(*language_names++)); for (i = 0; i < info_list->_length; i++) { const char *id; const char *label; const char *menu_label; const char *menu_accelerator; const char *alias; const char *icon_name; const char *sort_order_string; const char *tooltips; GdkPixbuf *icon = NULL, *menuicon = NULL; EComponentInfo *info; int sort_order; GNOME_Evolution_Component iface; id = info_list->_buffer[i].iid; iface = bonobo_activation_activate_from_id ((char *)id, 0, NULL, &ev); if (BONOBO_EX (&ev) || iface == CORBA_OBJECT_NIL) { char *ex_text = bonobo_exception_get_text (&ev); g_warning("Cannot activate '%s': %s\n", id, ex_text); g_free(ex_text); CORBA_exception_free(&ev); CORBA_exception_init(&ev); continue; } label = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:button_label", languages); tooltips = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:button_tooltips", languages); menu_label = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:menu_label", languages); menu_accelerator = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:menu_accelerator", languages); alias = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:component_alias", NULL); icon_name = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:button_icon", NULL); if (icon_name) { icon = e_icon_factory_get_icon (icon_name, E_ICON_SIZE_LARGE_TOOLBAR); menuicon = e_icon_factory_get_icon (icon_name, E_ICON_SIZE_MENU); } sort_order_string = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:button_sort_order", NULL); if (sort_order_string == NULL) sort_order = 0; else sort_order = atoi (sort_order_string); info = component_info_new (id, iface, alias, label, tooltips, menu_label, menu_accelerator, sort_order, icon, menuicon); set_schemas (info, & info_list->_buffer [i]); registry->priv->infos = g_slist_prepend (registry->priv->infos, info); if (icon != NULL) g_object_unref (icon); if (menuicon != NULL) g_object_unref (menuicon); bonobo_object_release_unref(iface, NULL); } g_slist_free(languages); CORBA_free (info_list); CORBA_exception_free (&ev); registry->priv->infos = g_slist_sort (registry->priv->infos, (GCompareFunc) component_info_compare_func); }
static gint on_button_press_event (GtkWidget *widget, GdkEventButton *event, GtkamList *list) { GtkTreePath *path = NULL; GtkWidget *w; GtkamCamera *camera; CameraAbilities a; switch (event->button) { case 3: if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (list), event->x, event->y, &path, NULL, NULL, NULL)) return (FALSE); gtk_tree_model_get_iter (GTK_TREE_MODEL (list->priv->store), &list->priv->iter, path); gtk_tree_path_free (path); camera = gtkam_list_get_camera_from_iter (list, &list->priv->iter); gp_camera_get_abilities (camera->camera, &a); /* What operations does the camera support? */ w = gtk_item_factory_get_widget (list->priv->factory, "/Delete"); gtk_widget_set_sensitive (w, (a.file_operations & GP_FILE_OPERATION_DELETE)); #ifdef HAVE_BONOBO { Bonobo_ServerInfoList *l; guint i; GtkWidget *item, *c; CORBA_Environment ev; CameraFileInfo finfo; gchar *fo, *fi, *query; ViewAsData *d; GList *cl; w = gtk_item_factory_get_widget (list->priv->factory, "/View with..."); c = gtk_item_factory_get_widget (list->priv->factory, "/View with.../Built-in viewer"); cl = gtk_container_get_children (GTK_CONTAINER (w)); for (i = 0; i < g_list_length (cl); i++) { if (g_list_nth_data (cl, i) != c) gtk_container_remove (GTK_CONTAINER (w), GTK_WIDGET (g_list_nth_data (cl, i))); } fo = gtkam_list_get_folder_from_iter (list, &list->priv->iter); fi = gtkam_list_get_name_from_iter (list, &list->priv->iter); gp_camera_file_get_info (camera->camera, fo, fi, &finfo, NULL); g_free (fo); g_free (fi); if (finfo.file.fields & GP_FILE_INFO_TYPE) { CORBA_exception_init (&ev); query = g_strconcat ("repo_ids.has ('IDL:Bonobo/Control:1.0') AND " "bonobo:supported_mime_types.has ('", finfo.file.type, "')", NULL); l = bonobo_activation_query (query, NULL, &ev); g_free (query); CORBA_exception_free (&ev); if (l && l->_length) { for (i = 0; i < l->_length; i++) { Bonobo_ServerInfo *si = &l->_buffer[i]; const gchar *n; if (!si->iid) continue; n = bonobo_server_info_prop_lookup (si, "name", NULL); if (!n) n = si->iid; item = gtk_menu_item_new_with_label (n); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (w), item); d = g_new0 (ViewAsData, 1); d->list = list; d->camera = camera; g_object_ref (G_OBJECT (d->camera)); d->folder = gtkam_list_get_folder_from_iter (list, &list->priv->iter); d->file = gtkam_list_get_name_from_iter (list, &list->priv->iter); d->iid = g_strdup (si->iid); g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (on_view_as_activate), d); g_signal_connect (G_OBJECT (item), "destroy", G_CALLBACK (on_menu_item_destroy), d); } } if (l) CORBA_free (l); } } #endif gtk_item_factory_popup (list->priv->factory, event->x_root, event->y_root, event->button, event->time); return (TRUE); default: return (FALSE); } }