SF.net SVN: geany:[3488] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Mon Jan 19 13:12:46 UTC 2009
Revision: 3488
http://geany.svn.sourceforge.net/geany/?rev=3488&view=rev
Author: ntrel
Date: 2009-01-19 13:12:45 +0000 (Mon, 19 Jan 2009)
Log Message:
-----------
Use tree for Documents sidebar, grouped by path.
Remove Documents show full path pref.
Use enum for documents tree store column ids.
Modified Paths:
--------------
trunk/ChangeLog
trunk/geany.glade
trunk/src/interface.c
trunk/src/keyfile.c
trunk/src/plugindata.h
trunk/src/prefs.c
trunk/src/treeviews.c
trunk/src/ui_utils.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/ChangeLog 2009-01-19 13:12:45 UTC (rev 3488)
@@ -1,3 +1,12 @@
+2009-01-19 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/interface.c, src/ui_utils.h, src/prefs.c, src/plugindata.h,
+ src/treeviews.c, src/keyfile.c, geany.glade:
+ Use tree for Documents sidebar, grouped by path.
+ Remove Documents show full path pref.
+ Use enum for documents tree store column ids.
+
+
2009-01-18 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
* src/utils.c: Added a missing g_free().
Modified: trunk/geany.glade
===================================================================
--- trunk/geany.glade 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/geany.glade 2009-01-19 13:12:45 UTC (rev 3488)
@@ -3484,25 +3484,6 @@
<property name="fill">False</property>
</packing>
</child>
-
- <child>
- <widget class="GtkCheckButton" id="check_list_openfiles_fullpath">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Show full path name in documents list</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
</widget>
</child>
</widget>
Modified: trunk/src/interface.c
===================================================================
--- trunk/src/interface.c 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/src/interface.c 2009-01-19 13:12:45 UTC (rev 3488)
@@ -2278,7 +2278,6 @@
GtkWidget *vbox11;
GtkWidget *check_list_symbol;
GtkWidget *check_list_openfiles;
- GtkWidget *check_list_openfiles_fullpath;
GtkWidget *label146;
GtkWidget *frame4;
GtkWidget *alignment5;
@@ -2839,10 +2838,6 @@
gtk_box_pack_start (GTK_BOX (vbox11), check_list_openfiles, FALSE, FALSE, 0);
gtk_tooltips_set_tip (tooltips, check_list_openfiles, _("Toggle the documents list on and off"), NULL);
- check_list_openfiles_fullpath = gtk_check_button_new_with_mnemonic (_("Show full path name in documents list"));
- gtk_widget_show (check_list_openfiles_fullpath);
- gtk_box_pack_start (GTK_BOX (vbox11), check_list_openfiles_fullpath, FALSE, FALSE, 0);
-
label146 = gtk_label_new (_("<b>Sidebar</b>"));
gtk_widget_show (label146);
gtk_frame_set_label_widget (GTK_FRAME (frame7), label146);
@@ -4530,7 +4525,6 @@
GLADE_HOOKUP_OBJECT (prefs_dialog, vbox11, "vbox11");
GLADE_HOOKUP_OBJECT (prefs_dialog, check_list_symbol, "check_list_symbol");
GLADE_HOOKUP_OBJECT (prefs_dialog, check_list_openfiles, "check_list_openfiles");
- GLADE_HOOKUP_OBJECT (prefs_dialog, check_list_openfiles_fullpath, "check_list_openfiles_fullpath");
GLADE_HOOKUP_OBJECT (prefs_dialog, label146, "label146");
GLADE_HOOKUP_OBJECT (prefs_dialog, frame4, "frame4");
GLADE_HOOKUP_OBJECT (prefs_dialog, alignment5, "alignment5");
Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/src/keyfile.c 2009-01-19 13:12:45 UTC (rev 3488)
@@ -325,7 +325,6 @@
/* interface */
g_key_file_set_boolean(config, PACKAGE, "sidebar_symbol_visible", interface_prefs.sidebar_symbol_visible);
g_key_file_set_boolean(config, PACKAGE, "sidebar_openfiles_visible", interface_prefs.sidebar_openfiles_visible);
- g_key_file_set_boolean(config, PACKAGE, "sidebar_openfiles_fullpath", interface_prefs.sidebar_openfiles_fullpath);
g_key_file_set_string(config, PACKAGE, "editor_font", interface_prefs.editor_font);
g_key_file_set_string(config, PACKAGE, "tagbar_font", interface_prefs.tagbar_font);
g_key_file_set_string(config, PACKAGE, "msgwin_font", interface_prefs.msgwin_font);
@@ -599,7 +598,6 @@
interface_prefs.tab_pos_sidebar = utils_get_setting_integer(config, PACKAGE, "tab_pos_sidebar", GTK_POS_TOP);
interface_prefs.sidebar_symbol_visible = utils_get_setting_boolean(config, PACKAGE, "sidebar_symbol_visible", TRUE);
interface_prefs.sidebar_openfiles_visible = utils_get_setting_boolean(config, PACKAGE, "sidebar_openfiles_visible", TRUE);
- interface_prefs.sidebar_openfiles_fullpath = utils_get_setting_boolean(config, PACKAGE, "sidebar_openfiles_fullpath", FALSE);
interface_prefs.statusbar_visible = utils_get_setting_boolean(config, PACKAGE, "statusbar_visible", TRUE);
file_prefs.tab_order_ltr = utils_get_setting_boolean(config, PACKAGE, "tab_order_ltr", TRUE);
interface_prefs.show_notebook_tabs = utils_get_setting_boolean(config, PACKAGE, "show_notebook_tabs", TRUE);
Modified: trunk/src/plugindata.h
===================================================================
--- trunk/src/plugindata.h 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/src/plugindata.h 2009-01-19 13:12:45 UTC (rev 3488)
@@ -45,13 +45,13 @@
enum {
/** The Application Programming Interface (API) version, incremented
* whenever any plugin data types are modified or appended to. */
- GEANY_API_VERSION = 126,
+ GEANY_API_VERSION = 127,
/** The Application Binary Interface (ABI) version, incremented whenever
* existing fields in the plugin data types have to be changed or reordered. */
/* This should usually stay the same if fields are only appended, assuming only pointers to
* structs and not structs themselves are declared by plugins. */
- GEANY_ABI_VERSION = 57
+ GEANY_ABI_VERSION = 58
};
/** Check the plugin can be loaded by Geany.
Modified: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/src/prefs.c 2009-01-19 13:12:45 UTC (rev 3488)
@@ -88,7 +88,6 @@
static void on_show_notebook_tabs_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data);
-static void on_openfiles_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_prefs_print_radio_button_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_prefs_print_page_header_toggled(GtkToggleButton *togglebutton, gpointer user_data);
@@ -249,11 +248,7 @@
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.sidebar_openfiles_visible);
- on_openfiles_visible_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
- widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles_fullpath");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.sidebar_openfiles_fullpath);
-
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "tagbar_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), interface_prefs.tagbar_font);
@@ -657,9 +652,6 @@
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles");
interface_prefs.sidebar_openfiles_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles_fullpath");
- interface_prefs.sidebar_openfiles_fullpath = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_line");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) editor_prefs.long_line_type = 0;
else
@@ -1373,14 +1365,6 @@
}
-static void on_openfiles_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data)
-{
- gboolean sens = gtk_toggle_button_get_active(togglebutton);
-
- gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles_fullpath"), sens);
-}
-
-
static void on_prefs_print_radio_button_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
@@ -1523,8 +1507,6 @@
"toggled", G_CALLBACK(on_use_folding_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding"),
"toggled", G_CALLBACK(on_open_encoding_toggled), NULL);
- g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles"),
- "toggled", G_CALLBACK(on_openfiles_visible_toggled), NULL);
}
prefs_init_dialog();
Modified: trunk/src/treeviews.c
===================================================================
--- trunk/src/treeviews.c 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/src/treeviews.c 2009-01-19 13:12:45 UTC (rev 3488)
@@ -57,14 +57,16 @@
OPENFILES_ACTION_RELOAD
};
-typedef struct
+/* documents tree model columns */
+enum
{
- GtkWidget *documents_fullpath;
-} menu_items;
+ DOCUMENTS_SHORTNAME, /* dirname for parents, basename for children */
+ DOCUMENTS_DOCUMENT,
+ DOCUMENTS_COLOR,
+ DOCUMENTS_FILENAME /* full filename */
+};
-static menu_items mi;
-
-static GtkListStore *store_openfiles;
+static GtkTreeStore *store_openfiles;
static GtkWidget *tag_window; /* scrolled window that holds the symbol list GtkTreeView */
/* callback prototypes */
@@ -214,7 +216,7 @@
/* store the short filename to show, and the index as reference,
* the colour (black/red/green) and the full name for the tooltip */
- store_openfiles = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_COLOR, G_TYPE_STRING);
+ store_openfiles = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_COLOR, G_TYPE_STRING);
gtk_tree_view_set_model(GTK_TREE_VIEW(tv.tree_openfiles), GTK_TREE_MODEL(store_openfiles));
g_object_unref(store_openfiles);
@@ -226,7 +228,7 @@
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Documents"), renderer,
- "text", 0, "foreground-gdk", 2, NULL);
+ "text", DOCUMENTS_SHORTNAME, "foreground-gdk", DOCUMENTS_COLOR, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tv.tree_openfiles), column);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv.tree_openfiles), FALSE);
@@ -234,13 +236,13 @@
/* sort opened filenames in the store_openfiles treeview */
sortable = GTK_TREE_SORTABLE(GTK_TREE_MODEL(store_openfiles));
- gtk_tree_sortable_set_sort_column_id(sortable, 0, GTK_SORT_ASCENDING);
+ gtk_tree_sortable_set_sort_column_id(sortable, DOCUMENTS_SHORTNAME, GTK_SORT_ASCENDING);
ui_widget_modify_font_from_string(tv.tree_openfiles, interface_prefs.tagbar_font);
/* GTK 2.12 tooltips */
if (gtk_check_version(2, 12, 0) == NULL)
- g_object_set(tv.tree_openfiles, "has-tooltip", TRUE, "tooltip-column", 3, NULL);
+ g_object_set(tv.tree_openfiles, "has-tooltip", TRUE, "tooltip-column", DOCUMENTS_FILENAME, NULL);
g_signal_connect(tv.tree_openfiles, "button-press-event",
G_CALLBACK(on_treeviews_button_press_event), GINT_TO_POINTER(TREEVIEW_OPENFILES));
@@ -252,39 +254,132 @@
}
-/* Also sets documents[idx]->iter.
+/* iter should be toplevel */
+static gboolean find_tree_iter_dir(GtkTreeIter *iter, const gchar *dir)
+{
+ GeanyDocument *doc;
+ gchar *name;
+
+ if (utils_str_equal(dir, "."))
+ dir = GEANY_STRING_UNTITLED;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_DOCUMENT, &doc, -1);
+ g_return_val_if_fail(!doc, FALSE);
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_SHORTNAME, &name, -1);
+ return utils_str_equal(name, dir);
+}
+
+
+static GtkTreeIter *get_doc_parent(GeanyDocument *doc)
+{
+ gchar *dirname;
+ static GtkTreeIter parent;
+ GtkTreeModel *model = GTK_TREE_MODEL(store_openfiles);
+
+ dirname = g_path_get_dirname(DOC_FILENAME(doc));
+
+ if (gtk_tree_model_get_iter_first(model, &parent))
+ {
+ do
+ {
+ if (find_tree_iter_dir(&parent, dirname))
+ {
+ g_free(dirname);
+ return &parent;
+ }
+ }
+ while (gtk_tree_model_iter_next(model, &parent));
+ }
+ /* no match, add dir parent */
+ gtk_tree_store_append(store_openfiles, &parent, NULL);
+ gtk_tree_store_set(store_openfiles, &parent, DOCUMENTS_SHORTNAME,
+ doc->file_name ? dirname : GEANY_STRING_UNTITLED, -1);
+
+ g_free(dirname);
+ return &parent;
+}
+
+
+/* Also sets doc->priv->iter.
* This is called recursively in treeviews_openfiles_update_all(). */
void treeviews_openfiles_add(GeanyDocument *doc)
{
GtkTreeIter *iter = &doc->priv->iter;
+ GtkTreeIter *parent = get_doc_parent(doc);
+ gchar *basename;
+ GdkColor *color = document_get_status_color(doc);
+
+ gtk_tree_store_append(store_openfiles, iter, parent);
+
+ /* check if new parent */
+ if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_openfiles), parent) == 1)
+ {
+ GtkTreePath *path;
- gtk_list_store_append(store_openfiles, iter);
- treeviews_openfiles_update(doc);
+ /* expand parent */
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(store_openfiles), parent);
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(tv.tree_openfiles), path, TRUE);
+ gtk_tree_path_free(path);
+ }
+ basename = g_path_get_basename(DOC_FILENAME(doc));
+ gtk_tree_store_set(store_openfiles, iter,
+ 0, basename, 1, doc, 2, color, 3, DOC_FILENAME(doc), -1);
+ g_free(basename);
}
-void treeviews_openfiles_update(GeanyDocument *doc)
+static void openfiles_remove(GeanyDocument *doc)
{
- gchar *basename;
- GdkColor *color = document_get_status_color(doc);
+ GtkTreeIter *iter = &doc->priv->iter;
+ GtkTreeIter parent;
- if (interface_prefs.sidebar_openfiles_fullpath)
- basename = DOC_FILENAME(doc);
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_openfiles), &parent, iter) &&
+ gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_openfiles), &parent) == 1)
+ gtk_tree_store_remove(store_openfiles, &parent);
else
- basename = g_path_get_basename(DOC_FILENAME(doc));
- gtk_list_store_set(store_openfiles, &doc->priv->iter,
- 0, basename, 1, doc, 2, color, 3, DOC_FILENAME(doc), -1);
- if (! interface_prefs.sidebar_openfiles_fullpath)
- g_free(basename);
+ gtk_tree_store_remove(store_openfiles, iter);
}
+void treeviews_openfiles_update(GeanyDocument *doc)
+{
+ GtkTreeIter *iter = &doc->priv->iter;
+ gchar *fname;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_FILENAME, &fname, -1);
+
+ if (utils_str_equal(fname, DOC_FILENAME(doc)))
+ {
+ /* just update color */
+ GdkColor *color = document_get_status_color(doc);
+
+ gtk_tree_store_set(store_openfiles, iter, DOCUMENTS_COLOR, color, -1);
+ }
+ else
+ {
+ /* path has changed, so remove and re-add */
+ GtkTreeSelection *treesel;
+ gboolean sel;
+
+ treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv.tree_openfiles));
+ sel = gtk_tree_selection_iter_is_selected(treesel, &doc->priv->iter);
+ openfiles_remove(doc);
+
+ treeviews_openfiles_add(doc);
+ if (sel)
+ gtk_tree_selection_select_iter(treesel, &doc->priv->iter);
+ }
+ g_free(fname);
+}
+
+
void treeviews_openfiles_update_all()
{
guint i;
GeanyDocument *doc;
- gtk_list_store_clear(store_openfiles);
+ gtk_tree_store_clear(store_openfiles);
for (i = 0; i < (guint) gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); i++)
{
doc = document_get_from_page(i);
@@ -298,10 +393,8 @@
void treeviews_remove_document(GeanyDocument *doc)
{
- GtkTreeIter *iter = &doc->priv->iter;
-
- gtk_list_store_remove(store_openfiles, iter);
-
+ openfiles_remove(doc);
+
if (GTK_IS_WIDGET(doc->priv->tag_tree))
{
gtk_widget_destroy(doc->priv->tag_tree);
@@ -371,13 +464,6 @@
}
-static void on_openfiles_fullpath_activate(GtkCheckMenuItem *item, gpointer user_data)
-{
- interface_prefs.sidebar_openfiles_fullpath = gtk_check_menu_item_get_active(item);
- treeviews_openfiles_update_all();
-}
-
-
static void on_list_document_activate(GtkCheckMenuItem *item, gpointer user_data)
{
interface_prefs.sidebar_openfiles_visible = gtk_check_menu_item_get_active(item);
@@ -422,17 +508,20 @@
g_signal_connect(item, "activate",
G_CALLBACK(on_openfiles_document_action), GINT_TO_POINTER(OPENFILES_ACTION_RELOAD));
- item = gtk_separator_menu_item_new();
- gtk_widget_show(item);
- gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), item);
+ sidebar_add_common_menu_items(GTK_MENU(tv.popup_openfiles));
+}
- mi.documents_fullpath = gtk_check_menu_item_new_with_mnemonic(_("Show _Full Path Name"));
- gtk_widget_show(mi.documents_fullpath);
- gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), mi.documents_fullpath);
- g_signal_connect(mi.documents_fullpath, "activate",
- G_CALLBACK(on_openfiles_fullpath_activate), NULL);
- sidebar_add_common_menu_items(GTK_MENU(tv.popup_openfiles));
+static void unfold_parent(GtkTreeIter *iter)
+{
+ GtkTreeIter parent;
+ GtkTreePath *path;
+
+ gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_openfiles), &parent, iter);
+
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(store_openfiles), &parent);
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(tv.tree_openfiles), path, TRUE);
+ gtk_tree_path_free(path);
}
@@ -444,10 +533,13 @@
{
GeanyDocument *doc;
- gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, 1, &doc, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_DOCUMENT, &doc, -1);
if (doc == data)
{
+ /* unfolding also prevents a strange bug where the selection gets stuck on the parent
+ * when it is collapsed and then switching documents */
+ unfold_parent(iter);
gtk_tree_view_set_cursor(GTK_TREE_VIEW(tv.tree_openfiles), path, NULL, FALSE);
return TRUE;
}
@@ -472,7 +564,7 @@
if (gtk_tree_selection_get_selected(selection, &model, &iter))
{
- gtk_tree_model_get(model, &iter, 1, &doc, -1);
+ gtk_tree_model_get(model, &iter, DOCUMENTS_DOCUMENT, &doc, -1);
if (DOC_VALID(doc))
{
switch (GPOINTER_TO_INT(user_data))
@@ -524,7 +616,9 @@
/* use switch_notebook_page to ignore changing the notebook page because it is already done */
if (gtk_tree_selection_get_selected(selection, &model, &iter) && ! ignore_callback)
{
- gtk_tree_model_get(model, &iter, 1, &doc, -1);
+ gtk_tree_model_get(model, &iter, DOCUMENTS_DOCUMENT, &doc, -1);
+ if (!doc)
+ return; /* parent */
gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook),
gtk_notebook_page_num(GTK_NOTEBOOK(main_widgets.notebook),
(GtkWidget*) doc->editor->sci));
@@ -613,8 +707,6 @@
{ /* update & show popup menus */
if (GPOINTER_TO_INT(user_data) == TREEVIEW_OPENFILES)
{
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi.documents_fullpath),
- interface_prefs.sidebar_openfiles_fullpath);
gtk_menu_popup(GTK_MENU(tv.popup_openfiles), NULL, NULL, NULL, NULL,
event->button, event->time);
}
Modified: trunk/src/ui_utils.h
===================================================================
--- trunk/src/ui_utils.h 2009-01-18 23:05:54 UTC (rev 3487)
+++ trunk/src/ui_utils.h 2009-01-19 13:12:45 UTC (rev 3488)
@@ -38,7 +38,6 @@
{
gboolean sidebar_symbol_visible;
gboolean sidebar_openfiles_visible;
- gboolean sidebar_openfiles_fullpath;
gchar *editor_font;
gchar *tagbar_font;
gchar *msgwin_font;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list