Load the GtkDoc, manual and contents pages while idle

This commit is contained in:
Pierre Pronchery 2014-05-21 00:18:40 +02:00
parent 23f4dd9d82
commit ca29a6dd1a

View File

@ -62,6 +62,8 @@ typedef struct _Surfer Helper;
struct _Surfer struct _Surfer
{ {
guint source;
/* widgets */ /* widgets */
GtkIconTheme * icontheme; GtkIconTheme * icontheme;
GtkWidget * window; GtkWidget * window;
@ -71,6 +73,7 @@ struct _Surfer
GtkWidget * notebook; GtkWidget * notebook;
GtkWidget * contents; GtkWidget * contents;
GtkWidget * gtkdoc; GtkWidget * gtkdoc;
GtkWidget * manual;
GtkWidget * view; GtkWidget * view;
GtkToolItem * tb_fullscreen; GtkToolItem * tb_fullscreen;
@ -235,13 +238,16 @@ static const DesktopMenubar _helper_menubar[] =
/* functions */ /* functions */
/* Helper */ /* Helper */
/* helper_new */ /* helper_new */
static void _new_contents(Helper * helper, char const * contentsdir); static void _new_contents(Helper * helper);
static gboolean _new_contents_idle(gpointer data);
static void _new_contents_package(Helper * helper, char const * contentsdir, static void _new_contents_package(Helper * helper, char const * contentsdir,
GtkTreeStore * store, char const * package); GtkTreeStore * store, char const * package);
static void _new_gtkdoc(Helper * helper); static void _new_gtkdoc(Helper * helper);
static gboolean _new_gtkdoc_idle(gpointer data);
static void _new_gtkdoc_package(Helper * helper, char const * gtkdocdir, static void _new_gtkdoc_package(Helper * helper, char const * gtkdocdir,
GtkTreeStore * store, char const * package); GtkTreeStore * store, char const * package);
static void _new_manual(Helper * helper); static void _new_manual(Helper * helper);
static gboolean _new_manual_idle(gpointer data);
static void _new_manual_section(Helper * helper, char const * manhtmldir, static void _new_manual_section(Helper * helper, char const * manhtmldir,
char const * name, GtkTreeStore * store, unsigned int section); char const * name, GtkTreeStore * store, unsigned int section);
@ -257,6 +263,7 @@ static Helper * _helper_new(void)
if((helper = object_new(sizeof(*helper))) == NULL) if((helper = object_new(sizeof(*helper))) == NULL)
return NULL; return NULL;
helper->source = 0;
/* widgets */ /* widgets */
helper->icontheme = gtk_icon_theme_get_default(); helper->icontheme = gtk_icon_theme_get_default();
/* window */ /* window */
@ -304,7 +311,7 @@ static Helper * _helper_new(void)
gtk_paned_set_position(GTK_PANED(widget), 150); gtk_paned_set_position(GTK_PANED(widget), 150);
helper->notebook = gtk_notebook_new(); helper->notebook = gtk_notebook_new();
_new_gtkdoc(helper); _new_gtkdoc(helper);
_new_contents(helper, CONTENTSDIR); _new_contents(helper);
_new_manual(helper); _new_manual(helper);
gtk_paned_add1(GTK_PANED(widget), helper->notebook); gtk_paned_add1(GTK_PANED(widget), helper->notebook);
helper->view = ghtml_new(helper); helper->view = ghtml_new(helper);
@ -319,14 +326,12 @@ static Helper * _helper_new(void)
return helper; return helper;
} }
static void _new_contents(Helper * helper, char const * contentsdir) static void _new_contents(Helper * helper)
{ {
GtkWidget * widget; GtkWidget * widget;
GtkTreeStore * store; GtkTreeStore * store;
GtkCellRenderer * renderer; GtkCellRenderer * renderer;
GtkTreeViewColumn * column; GtkTreeViewColumn * column;
DIR * dir;
struct dirent * de;
widget = gtk_scrolled_window_new(NULL, NULL); widget = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
@ -351,14 +356,25 @@ static void _new_contents(Helper * helper, char const * contentsdir)
gtk_container_add(GTK_CONTAINER(widget), helper->contents); gtk_container_add(GTK_CONTAINER(widget), helper->contents);
gtk_notebook_append_page(GTK_NOTEBOOK(helper->notebook), widget, gtk_notebook_append_page(GTK_NOTEBOOK(helper->notebook), widget,
gtk_label_new(_("Contents"))); gtk_label_new(_("Contents")));
/* FIXME perform this while idle */ }
if((dir = opendir(contentsdir)) == NULL)
return; static gboolean _new_contents_idle(gpointer data)
{
Helper * helper = data;
GtkTreeModel * model;
DIR * dir;
struct dirent * de;
helper->source = g_idle_add(_new_manual_idle, helper);
model = gtk_tree_view_get_model(GTK_TREE_VIEW(helper->contents));
if((dir = opendir(CONTENTSDIR)) == NULL)
return FALSE;
while((de = readdir(dir)) != NULL) while((de = readdir(dir)) != NULL)
if(de->d_name[0] != '.') if(de->d_name[0] != '.')
_new_contents_package(helper, contentsdir, store, _new_contents_package(helper, CONTENTSDIR,
de->d_name); GTK_TREE_STORE(model), de->d_name);
closedir(dir); closedir(dir);
return FALSE;
} }
static void _new_contents_package(Helper * helper, char const * contentsdir, static void _new_contents_package(Helper * helper, char const * contentsdir,
@ -415,17 +431,6 @@ static void _new_gtkdoc(Helper * helper)
GtkTreeStore * store; GtkTreeStore * store;
GtkCellRenderer * renderer; GtkCellRenderer * renderer;
GtkTreeViewColumn * column; GtkTreeViewColumn * column;
char const * prefix[] =
{
/* FIXME look into more directories */
DATADIR "/gtk-doc/html", DATADIR "/devhelp/books",
"/usr/local/share/gtk-doc/html",
"/usr/local/share/devhelp/books",
"/usr/share/gtk-doc/html", "/usr/share/devhelp/books", NULL
};
char const ** p;
DIR * dir;
struct dirent * de;
widget = gtk_scrolled_window_new(NULL, NULL); widget = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
@ -450,7 +455,27 @@ static void _new_gtkdoc(Helper * helper)
gtk_container_add(GTK_CONTAINER(widget), helper->gtkdoc); gtk_container_add(GTK_CONTAINER(widget), helper->gtkdoc);
gtk_notebook_append_page(GTK_NOTEBOOK(helper->notebook), widget, gtk_notebook_append_page(GTK_NOTEBOOK(helper->notebook), widget,
gtk_label_new(_("API reference"))); gtk_label_new(_("API reference")));
/* FIXME perform this while idle */ helper->source = g_idle_add(_new_gtkdoc_idle, helper);
}
static gboolean _new_gtkdoc_idle(gpointer data)
{
Helper * helper = data;
GtkTreeModel * model;
char const * prefix[] =
{
/* FIXME look into more directories */
DATADIR "/gtk-doc/html", DATADIR "/devhelp/books",
"/usr/local/share/gtk-doc/html",
"/usr/local/share/devhelp/books",
"/usr/share/gtk-doc/html", "/usr/share/devhelp/books", NULL
};
char const ** p;
DIR * dir;
struct dirent * de;
helper->source = g_idle_add(_new_contents_idle, helper);
model = gtk_tree_view_get_model(GTK_TREE_VIEW(helper->gtkdoc));
for(p = prefix; *p != NULL; p++) for(p = prefix; *p != NULL; p++)
{ {
/* XXX avoid duplicates */ /* XXX avoid duplicates */
@ -462,10 +487,12 @@ static void _new_gtkdoc(Helper * helper)
continue; continue;
while((de = readdir(dir)) != NULL) while((de = readdir(dir)) != NULL)
if(de->d_name[0] != '.') if(de->d_name[0] != '.')
_new_gtkdoc_package(helper, *p, store, _new_gtkdoc_package(helper, *p,
GTK_TREE_STORE(model),
de->d_name); de->d_name);
closedir(dir); closedir(dir);
} }
return FALSE;
} }
static void _new_gtkdoc_package(Helper * helper, char const * gtkdocdir, static void _new_gtkdoc_package(Helper * helper, char const * gtkdocdir,
@ -522,12 +549,6 @@ static void _new_manual(Helper * helper)
GtkTreeStore * store; GtkTreeStore * store;
GtkCellRenderer * renderer; GtkCellRenderer * renderer;
GtkTreeViewColumn * column; GtkTreeViewColumn * column;
GtkWidget * view;
char const * prefix[] = { MANDIR, "/usr/share/man", NULL };
char const ** p;
DIR * dir;
struct dirent * de;
unsigned int section;
/* FIXME fully implement, de-duplicate code if possible */ /* FIXME fully implement, de-duplicate code if possible */
widget = gtk_scrolled_window_new(NULL, NULL); widget = gtk_scrolled_window_new(NULL, NULL);
@ -535,26 +556,39 @@ static void _new_manual(Helper * helper)
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
store = gtk_tree_store_new(4, GDK_TYPE_PIXBUF, G_TYPE_STRING, store = gtk_tree_store_new(4, GDK_TYPE_PIXBUF, G_TYPE_STRING,
G_TYPE_UINT, G_TYPE_STRING); G_TYPE_UINT, G_TYPE_STRING);
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); helper->manual = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(helper->manual), FALSE);
gtk_tree_view_set_search_column(GTK_TREE_VIEW(view), 1); gtk_tree_view_set_search_column(GTK_TREE_VIEW(helper->manual), 1);
renderer = gtk_cell_renderer_pixbuf_new(); renderer = gtk_cell_renderer_pixbuf_new();
column = gtk_tree_view_column_new_with_attributes(NULL, renderer, column = gtk_tree_view_column_new_with_attributes(NULL, renderer,
"pixbuf", 0, NULL); "pixbuf", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); gtk_tree_view_append_column(GTK_TREE_VIEW(helper->manual), column);
renderer = gtk_cell_renderer_text_new(); renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Section"), column = gtk_tree_view_column_new_with_attributes(_("Section"),
renderer, "text", 3, NULL); renderer, "text", 3, NULL);
gtk_tree_view_column_set_sort_column_id(column, 3); gtk_tree_view_column_set_sort_column_id(column, 3);
gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); gtk_tree_view_append_column(GTK_TREE_VIEW(helper->manual), column);
gtk_tree_view_column_clicked(column); gtk_tree_view_column_clicked(column);
gtk_tree_view_set_search_column(GTK_TREE_VIEW(view), 3); gtk_tree_view_set_search_column(GTK_TREE_VIEW(helper->manual), 3);
g_signal_connect(view, "row-activated", G_CALLBACK( g_signal_connect(helper->manual, "row-activated", G_CALLBACK(
_helper_on_manual_row_activated), helper); _helper_on_manual_row_activated), helper);
gtk_container_add(GTK_CONTAINER(widget), view); gtk_container_add(GTK_CONTAINER(widget), helper->manual);
gtk_notebook_append_page(GTK_NOTEBOOK(helper->notebook), widget, gtk_notebook_append_page(GTK_NOTEBOOK(helper->notebook), widget,
gtk_label_new(_("Manual"))); gtk_label_new(_("Manual")));
/* FIXME perform this while idle */ }
static gboolean _new_manual_idle(gpointer data)
{
Helper * helper = data;
GtkTreeModel * model;
char const * prefix[] = { MANDIR, "/usr/share/man", NULL };
char const ** p;
DIR * dir;
struct dirent * de;
unsigned int section;
helper->source = 0;
model = gtk_tree_view_get_model(GTK_TREE_VIEW(helper->manual));
for(p = prefix; *p != NULL; p++) for(p = prefix; *p != NULL; p++)
{ {
/* XXX avoid duplicates */ /* XXX avoid duplicates */
@ -567,9 +601,10 @@ static void _new_manual(Helper * helper)
while((de = readdir(dir)) != NULL) while((de = readdir(dir)) != NULL)
if(sscanf(de->d_name, "html%u", &section) == 1) if(sscanf(de->d_name, "html%u", &section) == 1)
_new_manual_section(helper, *p, de->d_name, _new_manual_section(helper, *p, de->d_name,
store, section); GTK_TREE_STORE(model), section);
closedir(dir); closedir(dir);
} }
return FALSE;
} }
static void _new_manual_section(Helper * helper, char const * manhtmldir, static void _new_manual_section(Helper * helper, char const * manhtmldir,
@ -627,6 +662,8 @@ static void _new_manual_section(Helper * helper, char const * manhtmldir,
/* helper_delete */ /* helper_delete */
void _helper_delete(Helper * helper) void _helper_delete(Helper * helper)
{ {
if(helper->source != 0)
g_source_remove(helper->source);
if(helper->ab_window != NULL) if(helper->ab_window != NULL)
gtk_widget_destroy(helper->ab_window); gtk_widget_destroy(helper->ab_window);
if(helper->fi_dialog != NULL) if(helper->fi_dialog != NULL)