static void gdict_source_loader_update_sources (GdictSourceLoader *loader) { GSList *filenames, *f; g_assert (GDICT_IS_SOURCE_LOADER (loader)); g_slist_foreach (loader->priv->sources, (GFunc) g_object_unref, NULL); g_slist_free (loader->priv->sources); loader->priv->sources = NULL; filenames = build_source_filenames (loader); for (f = filenames; f != NULL; f = f->next) { GdictSource *source; GError *load_err; gchar *path = (gchar *) f->data; g_assert (path != NULL); source = gdict_source_new (); load_err = NULL; gdict_source_load_from_file (source, path, &load_err); if (load_err) { g_warning ("Unable to load dictionary source at '%s': %s\n", path, load_err->message); g_error_free (load_err); continue; } loader->priv->sources = g_slist_append (loader->priv->sources, source); g_hash_table_replace (loader->priv->sources_by_name, g_strdup (gdict_source_get_name (source)), source); g_signal_emit (loader, loader_signals[SOURCE_LOADED], 0, source); } g_slist_foreach (filenames, (GFunc) g_free, NULL); g_slist_free (filenames); loader->priv->paths_dirty = FALSE; }
/** * gdict_source_loader_remove_source: * @loader: a #GdictSourceLoader * @name: name of a dictionary source * * Removes the dictionary source @name from @loader. This function will * also remove the dictionary source definition file bound to it. * * Return value: %TRUE if the dictionary source was successfully removed * * Since: 1.0 */ gboolean gdict_source_loader_remove_source (GdictSourceLoader *loader, const gchar *name) { GdictSourceLoaderPrivate *priv; GSList *l; g_return_val_if_fail (GDICT_IS_SOURCE_LOADER (loader), FALSE); g_return_val_if_fail (name != NULL, FALSE); priv = loader->priv; if (priv->paths_dirty) gdict_source_loader_update_sources (loader); for (l = priv->sources; l != NULL; l = l->next) { GdictSource *s = GDICT_SOURCE (l->data); if (strcmp (gdict_source_get_name (s), name) == 0) { gchar *filename; g_object_get (G_OBJECT (s), "filename", &filename, NULL); if (g_unlink (filename) == -1) { g_warning ("Unable to remove filename '%s' for the " "dictionary source '%s'\n", filename, name); return FALSE; } g_hash_table_remove (priv->sources_by_name, name); priv->sources = g_slist_remove_link (priv->sources, l); g_object_unref (s); g_slist_free (l); return TRUE; } } return FALSE; }
/** * gdict_source_chooser_refresh: * @chooser: a #GdictSourceChooser * * Forces a refresh on the contents of the source chooser widget * * Since: 0.12 */ void gdict_source_chooser_refresh (GdictSourceChooser *chooser) { GdictSourceChooserPrivate *priv; g_return_if_fail (GDICT_IS_SOURCE_CHOOSER (chooser)); priv = chooser->priv; if (priv->loader) { const GSList *sources, *l; if (priv->treeview) gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), NULL); gtk_list_store_clear (priv->store); sources = gdict_source_loader_get_sources (priv->loader); for (l = sources; l != NULL; l = l->next) { GdictSource *source = l->data; const gchar *name, *description; GdictSourceTransport transport; gint weight; transport = gdict_source_get_transport (source); name = gdict_source_get_name (source); description = gdict_source_get_description (source); weight = PANGO_WEIGHT_NORMAL; if (priv->current_source && !strcmp (priv->current_source, name)) weight = PANGO_WEIGHT_BOLD; gtk_list_store_insert_with_values (priv->store, NULL, -1, SOURCE_TRANSPORT, transport, SOURCE_NAME, name, SOURCE_DESCRIPTION, description, SOURCE_CURRENT, weight, -1); } if (priv->treeview) gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), GTK_TREE_MODEL (priv->store)); } }
static void update_sources_view (GdictPrefDialog *dialog) { const GSList *sources, *l; gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->sources_view), NULL); gtk_list_store_clear (dialog->sources_list); /* force update of the sources list */ gdict_source_loader_update (dialog->loader); sources = gdict_source_loader_get_sources (dialog->loader); for (l = sources; l != NULL; l = l->next) { GdictSource *source = GDICT_SOURCE (l->data); GtkTreeIter iter; const gchar *name, *description; gboolean is_active = FALSE; name = gdict_source_get_name (source); description = gdict_source_get_description (source); if (!description) description = name; if (strcmp (name, dialog->active_source) == 0) is_active = TRUE; gtk_list_store_append (dialog->sources_list, &iter); gtk_list_store_set (dialog->sources_list, &iter, SOURCES_ACTIVE_COLUMN, is_active, SOURCES_NAME_COLUMN, name, SOURCES_DESCRIPTION_COLUMN, description, -1); } gtk_tree_view_set_model (GTK_TREE_VIEW (dialog->sources_view), GTK_TREE_MODEL (dialog->sources_list)); /* select the currently active source name */ gtk_tree_model_foreach (GTK_TREE_MODEL (dialog->sources_list), select_active_source_name, dialog); }
static void save_source (GdictSourceDialog *dialog) { GdictSource *source; GdictDatabaseChooser *db_chooser; GdictStrategyChooser *strat_chooser; gchar *name, *text; GdictSourceTransport transport; gchar *host, *port; gchar *data; gsize length; GError *error; gchar *filename; source = gdict_source_loader_get_source (dialog->loader, dialog->source_name); if (!source) { g_warning ("Attempting to save source `%s', but no " "source for that name was found.", dialog->source_name); return; } text = get_text_from_entry (dialog, "description_entry"); gdict_source_set_description (source, text); g_free (text); db_chooser = GDICT_DATABASE_CHOOSER (dialog->db_chooser); text = gdict_database_chooser_get_current_database (db_chooser); gdict_source_set_database (source, text); g_free (text); strat_chooser = GDICT_STRATEGY_CHOOSER (dialog->strat_chooser); text = gdict_strategy_chooser_get_current_strategy (strat_chooser); gdict_source_set_strategy (source, text); g_free (text); /* get the selected transport id */ transport = dialog->transport; switch (transport) { case GDICT_SOURCE_TRANSPORT_DICTD: host = get_text_from_entry (dialog, "hostname_entry"); port = get_text_from_entry (dialog, "port_entry"); gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD, "hostname", host, "port", atoi (port), NULL); g_free (host); g_free (port); break; case GDICT_SOURCE_TRANSPORT_INVALID: default: g_warning ("Invalid transport"); return; } error = NULL; data = gdict_source_to_data (source, &length, &error); if (error) { gdict_show_gerror_dialog (GTK_WINDOW (dialog), _("Unable to create a source file"), error); g_object_unref (source); return; } name = g_strdup_printf ("%s.desktop", gdict_source_get_name (source)); filename = g_build_filename (g_get_home_dir (), ".gnome2", "gnome-dictionary", name, NULL); g_free (name); g_file_set_contents (filename, data, length, &error); if (error) gdict_show_gerror_dialog (GTK_WINDOW (dialog), _("Unable to save source file"), error); g_free (filename); g_free (data); g_object_unref (source); }
static void build_new_source (GdictSourceDialog *dialog) { GdictSource *source; gchar *name, *text; GdictSourceTransport transport; gchar *host, *port; gchar *data; gsize length; GError *error; gchar *filename; GdictDatabaseChooser *db_chooser; GdictStrategyChooser *strat_chooser; source = gdict_source_new (); /* use the timestamp and the pid to get a unique name */ name = g_strdup_printf ("source-%lu-%u", (gulong) time (NULL), (guint) getpid ()); gdict_source_set_name (source, name); g_free (name); text = get_text_from_entry (dialog, "description_entry"); gdict_source_set_description (source, text); g_free (text); db_chooser = GDICT_DATABASE_CHOOSER (dialog->db_chooser); text = gdict_database_chooser_get_current_database (db_chooser); gdict_source_set_database (source, text); g_free (text); strat_chooser = GDICT_STRATEGY_CHOOSER (dialog->strat_chooser); text = gdict_strategy_chooser_get_current_strategy (strat_chooser); gdict_source_set_strategy (source, text); g_free (text); /* get the selected transport id */ transport = dialog->transport; switch (transport) { case GDICT_SOURCE_TRANSPORT_DICTD: host = get_text_from_entry (dialog, "hostname_entry"); port = get_text_from_entry (dialog, "port_entry"); gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD, "hostname", host, "port", atoi (port), NULL); g_free (host); g_free (port); break; case GDICT_SOURCE_TRANSPORT_INVALID: default: g_warning ("Invalid transport"); return; } error = NULL; data = gdict_source_to_data (source, &length, &error); if (error) { gdict_show_gerror_dialog (GTK_WINDOW (dialog), _("Unable to create a source file"), error); g_object_unref (source); return; } name = g_strdup_printf ("%s.desktop", gdict_source_get_name (source)); filename = g_build_filename (g_get_user_config_dir (), "mate", "mate-dictionary", name, NULL); g_free (name); g_file_set_contents (filename, data, length, &error); if (error) gdict_show_gerror_dialog (GTK_WINDOW (dialog), _("Unable to save source file"), error); g_free (filename); g_free (data); g_object_unref (source); }