diff options
| -rw-r--r-- | includes/shell.h | 6 | ||||
| -rw-r--r-- | modules/computer.c | 13 | ||||
| -rw-r--r-- | modules/devices.c | 6 | ||||
| -rw-r--r-- | shell/shell.c | 922 | 
4 files changed, 523 insertions, 424 deletions
| diff --git a/includes/shell.h b/includes/shell.h index c68d2115..c6570088 100644 --- a/includes/shell.h +++ b/includes/shell.h @@ -84,7 +84,7 @@ struct _Shell {      GtkWidget		*hbox, *vpaned;      ShellTree		*tree; -    ShellInfoTree	*info_tree, *moreinfo_tree; +    ShellInfoTree	*info_tree;      ShellModule		*selected_module;      ShellModuleEntry	*selected;      ShellNote		*note; @@ -106,11 +106,9 @@ struct _Shell {  };  struct _DetailView { -    GtkWidget		*header;      GtkWidget		*scroll;      GtkWidget		*view; - -    GSList		*items; +    GtkWidget		*detail_box;  };  struct _ShellTree { diff --git a/modules/computer.c b/modules/computer.c index 80d8ba2b..f8adfc38 100644 --- a/modules/computer.c +++ b/modules/computer.c @@ -328,7 +328,7 @@ gchar *callback_dev(void)  {      return g_strdup_printf(                  "[$ShellParam$]\n" -                "ViewType=0\n" +                "ViewType=5\n"                  "ColumnTitle$TextValue=%s\n" /* Program */                  "ColumnTitle$Value=%s\n" /* Version */                  "ShowColumnHeaders=true\n" @@ -512,8 +512,10 @@ gchar *callback_summary(void)  {      struct Info *info = info_new(); +    info_set_view_type(info, SHELL_VIEW_DETAIL); +      info_add_group(info, _("Computer"), -        info_field_printf(_("Processor"), "%s", +        info_field(_("Processor"),              module_call_method("devices::getProcessorName")),          info_field_update(_("Memory"), 1000),          info_field_printf(_("Machine Type"), "%s", @@ -547,6 +549,8 @@ gchar *callback_os(void)      struct Info *info = info_new();      struct InfoField distro = info_field(_("Distribution"), computer->os->distro); +    info_set_view_type(info, SHELL_VIEW_DETAIL); +      if (computer->os->distrocode) {          distro = info_field_with_icon(distro,                                        idle_free(g_strdup_printf("distros/%s.png", @@ -581,6 +585,8 @@ gchar *callback_security(void)  {      struct Info *info = info_new(); +    info_set_view_type(info, SHELL_VIEW_DETAIL); +      info_add_group(info, _("HardInfo"),          info_field(_("HardInfo running as"), (getuid() == 0) ? _("Superuser") : _("User")),          info_field_last()); @@ -692,6 +698,9 @@ gchar *callback_display(void)      wl_info *wl = computer->display->wl;      struct Info *info = info_new(); + +    info_set_view_type(info, SHELL_VIEW_DETAIL); +      info_add_group(info, _("Session"),          info_field(_("Type"), THISORUNK(computer->display->session_type)),          info_field_last()); diff --git a/modules/devices.c b/modules/devices.c index ca31f803..f4a716a1 100644 --- a/modules/devices.c +++ b/modules/devices.c @@ -627,7 +627,10 @@ gchar *callback_processors()  gchar *callback_dmi()  { -    return g_strdup(dmi_info); +    return g_strdup_printf("%s" +                           "[$ShellParam$]\n" +                           "ViewType=5\n", +                           dmi_info);  }  gchar *callback_dmi_mem() @@ -646,6 +649,7 @@ gchar *callback_battery()  {      return g_strdup_printf("%s\n"  			   "[$ShellParam$]\n" +			   "ViewType=5\n"  			   "ReloadInterval=4000\n", battery_list);  } diff --git a/shell/shell.c b/shell/shell.c index 4a7fe493..d31a3b39 100644 --- a/shell/shell.c +++ b/shell/shell.c @@ -35,13 +35,21 @@  #include "callbacks.h" +struct UpdateTableItem { +    union { +        GtkWidget *widget; +        GtkTreeIter *iter; +    }; +    gboolean is_iter; +}; +  /*   * Internal Prototypes ********************************************************   */ -static void create_window(); +static void create_window(void);  static ShellTree *tree_new(void); -static ShellInfoTree *info_tree_new(gboolean extra); +static ShellInfoTree *info_tree_new(void);  static void module_selected(gpointer data);  static void module_selected_show_info(ShellModuleEntry * entry, @@ -90,7 +98,6 @@ void shell_clear_tree_models(Shell *shell)  {      gtk_tree_store_clear(GTK_TREE_STORE(shell->tree->model));      gtk_tree_store_clear(GTK_TREE_STORE(shell->info_tree->model)); -    gtk_tree_store_clear(GTK_TREE_STORE(shell->moreinfo_tree->model));      gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info_tree->view), FALSE);  } @@ -662,9 +669,17 @@ void shell_add_modules_to_gui(gpointer _shell_module, gpointer _shell_tree)      }  } -static void __tree_iter_destroy(gpointer data) +static void destroy_update_tbl_value(gpointer data)  { -    gtk_tree_iter_free((GtkTreeIter *) data); +    struct UpdateTableItem *item = data; + +    if (item->is_iter) { +        gtk_tree_iter_free(item->iter); +    } else { +        g_object_unref(item->widget); +    } + +    g_free(item);  }  DetailView *detail_view_new(void) @@ -674,22 +689,18 @@ DetailView *detail_view_new(void)      detail_view = g_new0(DetailView, 1);      detail_view->scroll = gtk_scrolled_window_new(NULL, NULL);  #if GTK_CHECK_VERSION(3, 0, 0) -    detail_view->view = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); +    detail_view->view = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);  #else -    detail_view->view = gtk_vbox_new(FALSE, 5); +    detail_view->view = gtk_vbox_new(FALSE, 0);  #endif -    detail_view->items = NULL; -    gtk_container_set_border_width(GTK_CONTAINER(detail_view->view), 6);      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(detail_view->scroll), -                                   GTK_POLICY_AUTOMATIC, -                                   GTK_POLICY_AUTOMATIC); +                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);  #if GTK_CHECK_VERSION(3, 0, 0) -    gtk_container_add(GTK_CONTAINER(detail_view->scroll), -                                          detail_view->view); +    gtk_container_add(GTK_CONTAINER(detail_view->scroll), detail_view->view);  #else -    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(detail_view->scroll), -                                          detail_view->view); +    gtk_scrolled_window_add_with_viewport( +        GTK_SCROLLED_WINDOW(detail_view->scroll), detail_view->view);  #endif      gtk_widget_show_all(detail_view->scroll); @@ -725,13 +736,12 @@ void shell_init(GSList * modules)      shell_action_set_property("ReportBugAction", "is-important", TRUE);      shell->tree = tree_new(); -    shell->info_tree = info_tree_new(FALSE); -    shell->moreinfo_tree = info_tree_new(TRUE); +    shell->info_tree = info_tree_new();      shell->loadgraph = load_graph_new(75);      shell->detail_view = detail_view_new();      update_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, -                                       g_free, __tree_iter_destroy); +                                       g_free, destroy_update_tbl_value);      gtk_box_pack_start(GTK_BOX(shell->hbox), shell->tree->scroll,                         FALSE, FALSE, 0); @@ -739,8 +749,6 @@ void shell_init(GSList * modules)  		    SHELL_PACK_RESIZE, SHELL_PACK_SHRINK);      gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), -			     shell->moreinfo_tree->scroll, NULL); -    gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook),  			     load_graph_get_framed(shell->loadgraph),  			     NULL);      gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), @@ -784,48 +792,54 @@ void shell_init(GSList * modules)  static gboolean update_field(gpointer data)  {      ShellFieldUpdate *fu; -    GtkTreeIter *iter; +    struct UpdateTableItem *item; -    fu = (ShellFieldUpdate *) data; +    fu = (ShellFieldUpdate *)data;      g_return_val_if_fail(fu != NULL, FALSE);      DEBUG("update_field [%s]", fu->field_name); -    iter = g_hash_table_lookup(update_tbl, fu->field_name); -    if (!iter) { +    item = g_hash_table_lookup(update_tbl, fu->field_name); +    if (!item) {          return FALSE;      }      /* if the entry is still selected, update it */ -    if (iter && fu->entry->selected && fu->entry->fieldfunc) { -	GtkTreeStore *store = GTK_TREE_STORE(shell->info_tree->model); -	gchar *value = fu->entry->fieldfunc(fu->field_name); - -	/* -	 * this function is also used to feed the load graph when ViewType -	 * is SHELL_VIEW_LOAD_GRAPH -	 */ -	if (shell->view_type == SHELL_VIEW_LOAD_GRAPH && -	    gtk_tree_selection_iter_is_selected(shell->info_tree->selection, -						iter)) { -	    load_graph_update(shell->loadgraph, atof(value)); -	} +    if (fu->entry->selected && fu->entry->fieldfunc) { +        gchar *value = fu->entry->fieldfunc(fu->field_name); + +        if (item->is_iter) { +            /* +             * this function is also used to feed the load graph when ViewType +             * is SHELL_VIEW_LOAD_GRAPH +             */ +            if (shell->view_type == SHELL_VIEW_LOAD_GRAPH && +                gtk_tree_selection_iter_is_selected(shell->info_tree->selection, +                                                    item->iter)) { +                load_graph_update(shell->loadgraph, atof(value)); +            } -	gtk_tree_store_set(store, iter, INFO_TREE_COL_VALUE, value, -1); +            GtkTreeStore *store = GTK_TREE_STORE(shell->info_tree->model); +            gtk_tree_store_set(store, item->iter, INFO_TREE_COL_VALUE, value, -1); +        } else { +            GList *children = gtk_container_get_children(GTK_CONTAINER(item->widget)); +            gtk_label_set_markup(GTK_LABEL(children->next->data), value); +            g_list_free(children); +        } -	g_free(value); -	return TRUE; +        g_free(value); +        return TRUE;      }      if (update_sfusrc) { -	GSList *sfu; +        GSList *sfu; -	for (sfu = update_sfusrc; sfu; sfu = sfu->next) { -	    g_free(sfu->data); -	} +        for (sfu = update_sfusrc; sfu; sfu = sfu->next) { +            g_free(sfu->data); +        } -	g_slist_free(update_sfusrc); -	update_sfusrc = NULL; +        g_slist_free(update_sfusrc); +        update_sfusrc = NULL;      }      /* otherwise, cleanup and destroy the timeout */ @@ -835,77 +849,79 @@ static gboolean update_field(gpointer data)      return FALSE;  } -#define RANGE_SET_VALUE(tree,scrollbar,value) \ -  	  do { \ -  	      GtkRange CONCAT(*range, __LINE__) = GTK_RANGE(GTK_SCROLLED_WINDOW(shell->tree->scroll)->scrollbar); \ -  	      gtk_range_set_value(CONCAT(range, __LINE__), value); \ -              gtk_adjustment_value_changed(GTK_ADJUSTMENT(gtk_range_get_adjustment(CONCAT(range, __LINE__)))); \ -          } while (0) -#define RANGE_GET_VALUE(tree,scrollbar) \ -  	  gtk_range_get_value(GTK_RANGE \ -	  		    (GTK_SCROLLED_WINDOW(shell->tree->scroll)-> \ -			     scrollbar)) +#define RANGE_SET_VALUE(tree, scrollbar, value)                                \ +    do {                                                                       \ +        GtkRange CONCAT(*range, __LINE__) =                                    \ +            GTK_RANGE(GTK_SCROLLED_WINDOW(shell->tree->scroll)->scrollbar);    \ +        gtk_range_set_value(CONCAT(range, __LINE__), value);                   \ +        gtk_adjustment_value_changed(GTK_ADJUSTMENT(                           \ +            gtk_range_get_adjustment(CONCAT(range, __LINE__))));               \ +    } while (0) +#define RANGE_GET_VALUE(tree, scrollbar)                                       \ +    gtk_range_get_value(                                                       \ +        GTK_RANGE(GTK_SCROLLED_WINDOW(shell->tree->scroll)->scrollbar))  static gboolean reload_section(gpointer data)  { -    ShellModuleEntry *entry = (ShellModuleEntry *) data; +    ShellModuleEntry *entry = (ShellModuleEntry *)data;  #if GTK_CHECK_VERSION(2, 14, 0)      GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(shell->window));  #endif      /* if the entry is still selected, update it */      if (entry->selected) { -	GtkTreePath *path = NULL; -	GtkTreeIter iter; -	double pos_info_scroll, pos_more_scroll; +        GtkTreePath *path = NULL; +        GtkTreeIter iter; +        double pos_info_scroll; +        double pos_detail_scroll; -	/* save current position */ +        /* save current position */  #if GTK_CHECK_VERSION(3, 0, 0) -    /* TODO:GTK3 */ +        /* TODO:GTK3 */  #else -	pos_info_scroll = RANGE_GET_VALUE(info_tree, vscrollbar); -	pos_more_scroll = RANGE_GET_VALUE(moreinfo_tree, vscrollbar); +        pos_info_scroll = RANGE_GET_VALUE(info_tree, vscrollbar); +        pos_detail_scroll = RANGE_GET_VALUE(detail_view, vscrollbar);  #endif -	/* avoid drawing the window while we reload */ +        /* avoid drawing the window while we reload */  #if GTK_CHECK_VERSION(2, 14, 0) -    gdk_window_freeze_updates(gdk_window); +        gdk_window_freeze_updates(gdk_window);  #else -	gdk_window_freeze_updates(shell->window->window); +        gdk_window_freeze_updates(shell->window->window);  #endif -	/* gets the current selected path */ -	if (gtk_tree_selection_get_selected -	    (shell->info_tree->selection, &shell->info_tree->model, &iter)) { -	    path = gtk_tree_model_get_path(shell->info_tree->model, &iter); +        /* gets the current selected path */ +        if (gtk_tree_selection_get_selected(shell->info_tree->selection, +                                            &shell->info_tree->model, &iter)) { +            path = gtk_tree_model_get_path(shell->info_tree->model, &iter);          } -	/* update the information, clear the treeview and populate it again */ -	module_entry_reload(entry); -	info_selected_show_extra(NULL);	/* clears the more info store */ -	module_selected_show_info(entry, TRUE); - -	/* if there was a selection, reselect it */ -	if (path) { -	    gtk_tree_selection_select_path(shell->info_tree->selection, path); -            gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->info_tree->view), path, NULL, -                                     FALSE); -	    gtk_tree_path_free(path); +        /* update the information, clear the treeview and populate it again */ +        module_entry_reload(entry); +        info_selected_show_extra(NULL); /* clears the more info store */ +        module_selected_show_info(entry, TRUE); + +        /* if there was a selection, reselect it */ +        if (path) { +            gtk_tree_selection_select_path(shell->info_tree->selection, path); +            gtk_tree_view_set_cursor(GTK_TREE_VIEW(shell->info_tree->view), +                                     path, NULL, FALSE); +            gtk_tree_path_free(path);          } else {              /* restore position */  #if GTK_CHECK_VERSION(3, 0, 0) -    /* TODO:GTK3 */ +            /* TODO:GTK3 */  #else              RANGE_SET_VALUE(info_tree, vscrollbar, pos_info_scroll); -            RANGE_SET_VALUE(moreinfo_tree, vscrollbar, pos_more_scroll); +            RANGE_SET_VALUE(detail_view, vscrollbar, pos_detail_scroll);  #endif          } -	/* make the window drawable again */ +        /* make the window drawable again */  #if GTK_CHECK_VERSION(2, 14, 0) -    gdk_window_thaw_updates(gdk_window); +        gdk_window_thaw_updates(gdk_window);  #else -	gdk_window_thaw_updates(shell->window->window); +        gdk_window_thaw_updates(shell->window->window);  #endif      } @@ -1009,8 +1025,7 @@ static void set_view_type(ShellViewType viewtype, gboolean reload)          break;      case SHELL_VIEW_DUAL:          gtk_widget_show(shell->info_tree->scroll); -        gtk_widget_show(shell->moreinfo_tree->scroll); -        gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 0); +        gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 1);          gtk_widget_show(shell->notebook);          if (type_changed) { @@ -1027,7 +1042,7 @@ static void set_view_type(ShellViewType viewtype, gboolean reload)          break;      case SHELL_VIEW_LOAD_GRAPH:          gtk_widget_show(shell->info_tree->scroll); -        gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 1); +        gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 0);          gtk_widget_show(shell->notebook);          load_graph_clear(shell->loadgraph); @@ -1047,9 +1062,8 @@ static void set_view_type(ShellViewType viewtype, gboolean reload)          break;      case SHELL_VIEW_PROGRESS_DUAL:  	gtk_widget_show(shell->notebook); -        gtk_widget_show(shell->moreinfo_tree->scroll); -	gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 0); +	gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 1);  	/* fallthrough */      case SHELL_VIEW_PROGRESS:          gtk_widget_show(shell->info_tree->scroll); @@ -1063,152 +1077,161 @@ static void set_view_type(ShellViewType viewtype, gboolean reload)  		gtk_widget_hide(shell->notebook);  	break;      case SHELL_VIEW_DETAIL: -        gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 2); +        gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 1);          gtk_widget_show(shell->notebook);          gtk_widget_hide(shell->info_tree->scroll); -        gtk_widget_hide(shell->moreinfo_tree->scroll);      }  } -static void -group_handle_special(GKeyFile * key_file, ShellModuleEntry * entry, -		     const gchar * group, gchar ** keys, gboolean reload) +static void group_handle_special(GKeyFile *key_file, +                                 ShellModuleEntry *entry, +                                 const gchar *group, +                                 gchar **keys)  { -    if (g_str_equal(group, "$ShellParam$")) { -        gboolean headers_visible = FALSE; -	gint i; - -	for (i = 0; keys[i]; i++) { -	    gchar *key = keys[i]; - -	    if (g_str_has_prefix(key, "UpdateInterval")) { -		ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1); -		ShellFieldUpdateSource *sfutbl; -		gint ms; - -		ms = g_key_file_get_integer(key_file, group, key, NULL); - -		fu->field_name = g_strdup(g_utf8_strchr(key, -1, '$') + 1); -		fu->entry = entry; - -		sfutbl = g_new0(ShellFieldUpdateSource, 1); -		sfutbl->source_id = g_timeout_add(ms, update_field, fu); -		sfutbl->sfu = fu; - -		update_sfusrc = g_slist_prepend(update_sfusrc, sfutbl); -	    } else if (g_str_equal(key, "NormalizePercentage")) { -		shell->normalize_percentage = g_key_file_get_boolean(key_file, group, key, NULL); -	    } else if (g_str_equal(key, "LoadGraphSuffix")) { -		gchar *suffix = -		    g_key_file_get_value(key_file, group, key, NULL); -		load_graph_set_data_suffix(shell->loadgraph, suffix); -		g_free(suffix); -	    } else if (g_str_equal(key, "ReloadInterval")) { -		gint ms; - -		ms = g_key_file_get_integer(key_file, group, key, NULL); - -		g_timeout_add(ms, reload_section, entry); -	    } else if (g_str_equal(key, "RescanInterval")) { -		gint ms; - -		ms = g_key_file_get_integer(key_file, group, key, NULL); - -		g_timeout_add(ms, rescan_section, entry); -	    } else if (g_str_equal(key, "ShowColumnHeaders")) { -		headers_visible = g_key_file_get_boolean(key_file, group, key, NULL); -	    } else if (g_str_has_prefix(key, "ColumnTitle")) { -                GtkTreeViewColumn *column = NULL; -		gchar *value, *title = g_utf8_strchr(key, -1, '$') + 1; - -                value = g_key_file_get_value(key_file, group, key, NULL); - -                if (g_str_equal(title, "Extra1")) { -			column = shell->info_tree->col_extra1; -                } else if (g_str_equal(title, "Extra2")) { -			column = shell->info_tree->col_extra2; -                } else if (g_str_equal(title, "Value")) { -			column = shell->info_tree->col_value; -                } else if (g_str_equal(title, "TextValue")) { -			column = shell->info_tree->col_textvalue; -                } else if (g_str_equal(title, "Progress")) { -			column = shell->info_tree->col_progress; -                } +    if (!g_str_equal(group, "$ShellParam$")) { +        g_warning("Unknown parameter group: ``%s''", group); +        return; +    } -                if (column) { -                  gtk_tree_view_column_set_title(column, value); -                  gtk_tree_view_column_set_visible(column, TRUE); -                } +    gboolean headers_visible = FALSE; +    gint i; -                g_free(value); -	    } else if (g_str_equal(key, "OrderType")) { -		shell->_order_type = g_key_file_get_integer(key_file, -							    group, -							    key, NULL); -	    } else if (g_str_equal(key, "ViewType")) { -		set_view_type(g_key_file_get_integer(key_file, group, -						     key, NULL), reload); -	    } else if (g_str_has_prefix(key, "Icon$")) { -		GtkTreeIter *iter; -		const gchar *first_dollar = g_utf8_strchr(key, -1, '$'); - -		iter = g_hash_table_lookup(update_tbl, first_dollar); -		if (!iter && first_dollar) { -		    const gchar *second_dollar = g_utf8_strchr(first_dollar + 1, -1, '$'); -		    if (second_dollar) { -		        char *copy = strndupa(first_dollar, second_dollar - first_dollar + 1); -		        iter = g_hash_table_lookup(update_tbl, copy); -                    } +    for (i = 0; keys[i]; i++) { +        gchar *key = keys[i]; + +        if (g_str_has_prefix(key, "UpdateInterval")) { +            ShellFieldUpdate *fu = g_new0(ShellFieldUpdate, 1); +            ShellFieldUpdateSource *sfutbl; +            gint ms; + +            ms = g_key_file_get_integer(key_file, group, key, NULL); + +            fu->field_name = g_strdup(g_utf8_strchr(key, -1, '$') + 1); +            fu->entry = entry; + +            sfutbl = g_new0(ShellFieldUpdateSource, 1); +            sfutbl->source_id = g_timeout_add(ms, update_field, fu); +            sfutbl->sfu = fu; + +            update_sfusrc = g_slist_prepend(update_sfusrc, sfutbl); +        } else if (g_str_equal(key, "NormalizePercentage")) { +            shell->normalize_percentage = +                g_key_file_get_boolean(key_file, group, key, NULL); +        } else if (g_str_equal(key, "LoadGraphSuffix")) { +            gchar *suffix = g_key_file_get_value(key_file, group, key, NULL); +            load_graph_set_data_suffix(shell->loadgraph, suffix); +            g_free(suffix); +        } else if (g_str_equal(key, "ReloadInterval")) { +            gint ms; + +            ms = g_key_file_get_integer(key_file, group, key, NULL); + +            g_timeout_add(ms, reload_section, entry); +        } else if (g_str_equal(key, "RescanInterval")) { +            gint ms; + +            ms = g_key_file_get_integer(key_file, group, key, NULL); + +            g_timeout_add(ms, rescan_section, entry); +        } else if (g_str_equal(key, "ShowColumnHeaders")) { +            headers_visible = +                g_key_file_get_boolean(key_file, group, key, NULL); +        } else if (g_str_has_prefix(key, "ColumnTitle")) { +            GtkTreeViewColumn *column = NULL; +            gchar *value, *title = g_utf8_strchr(key, -1, '$') + 1; + +            value = g_key_file_get_value(key_file, group, key, NULL); + +            if (g_str_equal(title, "Extra1")) { +                column = shell->info_tree->col_extra1; +            } else if (g_str_equal(title, "Extra2")) { +                column = shell->info_tree->col_extra2; +            } else if (g_str_equal(title, "Value")) { +                column = shell->info_tree->col_value; +            } else if (g_str_equal(title, "TextValue")) { +                column = shell->info_tree->col_textvalue; +            } else if (g_str_equal(title, "Progress")) { +                column = shell->info_tree->col_progress; +            } + +            if (column) { +                gtk_tree_view_column_set_title(column, value); +                gtk_tree_view_column_set_visible(column, TRUE); +            } + +            g_free(value); +        } else if (g_str_equal(key, "OrderType")) { +            shell->_order_type = +                g_key_file_get_integer(key_file, group, key, NULL); +        } else if (g_str_has_prefix(key, "Icon$")) { +            struct UpdateTableItem *item; +            const gchar *first_dollar = g_utf8_strchr(key, -1, '$'); + +            item = g_hash_table_lookup(update_tbl, first_dollar); +            if (!item && first_dollar) { +                const gchar *second_dollar = +                    g_utf8_strchr(first_dollar + 1, -1, '$'); +                if (second_dollar) { +                    char *copy = strndupa(first_dollar, +                                          second_dollar - first_dollar + 1); +                    item = g_hash_table_lookup(update_tbl, copy);                  } +            } -		if (iter) { -		    gchar *file = -			g_key_file_get_value(key_file, group, key, NULL); -		    gtk_tree_store_set(GTK_TREE_STORE(shell->info_tree->model), -				       iter, INFO_TREE_COL_PBUF, -				       icon_cache_get_pixbuf_at_size(file, -								     22, -								     22), -				       -1); -		    g_free(file); -		} -	    } else if (g_str_equal(key, "Zebra")) { +            if (item) { +                gchar *file = g_key_file_get_value(key_file, group, key, NULL); +                GdkPixbuf *pixbuf = icon_cache_get_pixbuf_at_size(file, 22, 22); + +                g_free(file); + +                if (item->is_iter) { +                    gtk_tree_store_set( +                        GTK_TREE_STORE(shell->info_tree->model), item->iter, +                        INFO_TREE_COL_PBUF, pixbuf, -1); +                } else { +                    GList *children = gtk_container_get_children(GTK_CONTAINER(item->widget)); +                    gtk_image_set_from_pixbuf(GTK_IMAGE(children->data), pixbuf); +                    gtk_widget_show(GTK_WIDGET(children->data)); +                    g_list_free(children); +                } +            } +        } else if (g_str_equal(key, "Zebra")) {  #if GTK_CHECK_VERSION(3, 0, 0)  #else -		gtk_tree_view_set_rules_hint(GTK_TREE_VIEW -					     (shell->info_tree->view), -					     g_key_file_get_boolean -					     (key_file, group, key, NULL)); +            gtk_tree_view_set_rules_hint( +                GTK_TREE_VIEW(shell->info_tree->view), +                g_key_file_get_boolean(key_file, group, key, NULL));  #endif -	    } -	} - -        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info_tree->view), headers_visible); -    } else { -	g_warning("Unknown parameter group: ``%s''", group); +        }      } + +    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info_tree->view), +                                      headers_visible);  } -static void group_handle_normal(GKeyFile* key_file, ShellModuleEntry* entry, -    const gchar* group, gchar** keys, gsize ngroups) +static void group_handle_normal(GKeyFile *key_file, +                                ShellModuleEntry *entry, +                                const gchar *group, +                                gchar **keys, +                                gsize ngroups)  {      GtkTreeIter parent; -    GtkTreeStore* store = GTK_TREE_STORE(shell->info_tree->model); -    gchar* tmp = g_strdup(group); +    GtkTreeStore *store = GTK_TREE_STORE(shell->info_tree->model);      gint i;      if (ngroups > 1) {          gtk_tree_store_append(store, &parent, NULL); +        gchar *tmp = g_strdup(group);          strend(tmp, '#');          gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, tmp, -1);          g_free(tmp);      }      for (i = 0; keys[i]; i++) { -        gchar* key = keys[i]; -        gchar* value; +        gchar *key = keys[i]; +        gchar *value;          GtkTreeIter child;          value = g_key_file_get_value(key_file, group, key, NULL); @@ -1217,7 +1240,8 @@ static void group_handle_normal(GKeyFile* key_file, ShellModuleEntry* entry,              value = entry->fieldfunc(key);          } -        if ((key && value) && g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { +        if ((key && value) && g_utf8_validate(key, -1, NULL) && +            g_utf8_validate(value, -1, NULL)) {              if (ngroups == 1) {                  gtk_tree_store_append(store, &child, NULL);              } else { @@ -1226,47 +1250,55 @@ static void group_handle_normal(GKeyFile* key_file, ShellModuleEntry* entry,              /* FIXME: use g_key_file_get_string_list? */              if (g_utf8_strchr(value, -1, '|')) { -                gchar** columns = g_strsplit(value, "|", 0); +                gchar **columns = g_strsplit(value, "|", 0); -                gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, columns[0], -1); +                gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, +                                   columns[0], -1);                  if (columns[1]) { -                    gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA1, columns[1], -                        -1); +                    gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA1, +                                       columns[1], -1);                      if (columns[2]) { -                        gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA2, columns[2], -                            -1); +                        gtk_tree_store_set(store, &child, INFO_TREE_COL_EXTRA2, +                                           columns[2], -1);                      }                  }                  g_strfreev(columns);              } else { -                gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, -1); +                gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, value, +                                   -1);              }              strend(key, '#');              if (key_is_flagged(key)) { -                const gchar* name = key_get_name(key); -                gchar* flags = g_strdup(key); +                const gchar *name = key_get_name(key); +                gchar *flags = g_strdup(key);                  *(strchr(flags + 1, '$') + 1) = 0;                  gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, name, -                    INFO_TREE_COL_DATA, flags, -1); +                                   INFO_TREE_COL_DATA, flags, -1);                  g_free(flags);              } else {                  gtk_tree_store_set(store, &child, INFO_TREE_COL_NAME, key, -                    INFO_TREE_COL_DATA, NULL, -1); +                                   INFO_TREE_COL_DATA, NULL, -1);              } +            struct UpdateTableItem *item = g_new0(struct UpdateTableItem, 1); +            item->is_iter = TRUE; +            item->iter = gtk_tree_iter_copy(&child); +              const gchar *first_dollar = g_utf8_strchr(key, -1, '$');              if (first_dollar) { -                const gchar *second_dollar = g_utf8_strchr(first_dollar + 1, -1, '$'); -                gchar *key_copy = g_strndup(first_dollar, second_dollar - first_dollar + 1); +                const gchar *second_dollar = +                    g_utf8_strchr(first_dollar + 1, -1, '$'); +                gchar *key_copy = +                    g_strndup(first_dollar, second_dollar - first_dollar + 1); -                g_hash_table_insert(update_tbl, key_copy, gtk_tree_iter_copy(&child)); +                g_hash_table_insert(update_tbl, key_copy, item);              } else { -                g_hash_table_insert(update_tbl, g_strdup(key), gtk_tree_iter_copy(&child)); +                g_hash_table_insert(update_tbl, g_strdup(key), item);              }          } @@ -1274,36 +1306,6 @@ static void group_handle_normal(GKeyFile* key_file, ShellModuleEntry* entry,      }  } -static void -moreinfo_handle_normal(GKeyFile * key_file, gchar * group, gchar ** keys) -{ -    GtkTreeIter parent; -    GtkTreeStore *store = GTK_TREE_STORE(shell->moreinfo_tree->model); -    gint i; - -    gtk_tree_store_append(store, &parent, NULL); -    gtk_tree_store_set(store, &parent, INFO_TREE_COL_NAME, group, -1); - -    for (i = 0; keys[i]; i++) { -	gchar *key = keys[i]; -	GtkTreeIter child; -	gchar *value; - -	value = g_key_file_get_value(key_file, group, key, NULL); - -	if (g_utf8_validate(key, -1, NULL) -	    && g_utf8_validate(value, -1, NULL)) { -	    strend(key, '#'); - -	    gtk_tree_store_append(store, &child, &parent); -	    gtk_tree_store_set(store, &child, INFO_TREE_COL_VALUE, -			       value, INFO_TREE_COL_NAME, key, -1); -	} - -	g_free(value); -    } -} -  static void update_progress()  {      GtkTreeModel *model = shell->info_tree->model; @@ -1425,19 +1427,20 @@ select_first_item(gpointer data)      return FALSE;  } -static gboolean -select_marked_or_first_item(gpointer data) +static gboolean select_marked_or_first_item(gpointer data)  {      GtkTreeIter first, it;      gboolean found_selection = FALSE;      gchar *datacol; -    if ( gtk_tree_model_get_iter_first(shell->info_tree->model, &first) ) { +    if (gtk_tree_model_get_iter_first(shell->info_tree->model, &first)) {          it = first; -        while ( gtk_tree_model_iter_next(shell->info_tree->model, &it) ) { -            gtk_tree_model_get(shell->info_tree->model, &it, INFO_TREE_COL_DATA, &datacol, -1); +        while (gtk_tree_model_iter_next(shell->info_tree->model, &it)) { +            gtk_tree_model_get(shell->info_tree->model, &it, INFO_TREE_COL_DATA, +                               &datacol, -1);              if (key_is_highlighted(datacol)) { -                gtk_tree_selection_select_iter(shell->info_tree->selection, &it); +                gtk_tree_selection_select_iter(shell->info_tree->selection, +                                               &it);                  found_selection = TRUE;              }              g_free(datacol); @@ -1449,12 +1452,10 @@ select_marked_or_first_item(gpointer data)      return FALSE;  } -static void -module_selected_show_info_list(GKeyFile *key_file, -                               ShellModuleEntry *entry, -                               gchar **groups, -                               gsize ngroups, -                               gboolean reload) +static void module_selected_show_info_list(GKeyFile *key_file, +                                           ShellModuleEntry *entry, +                                           gchar **groups, +                                           gsize ngroups)  {      GtkTreeStore *store = GTK_TREE_STORE(shell->info_tree->model);      gint i; @@ -1464,36 +1465,151 @@ module_selected_show_info_list(GKeyFile *key_file,      g_object_ref(shell->info_tree->model);      gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info_tree->view), NULL); -    for (i = 0; groups[i]; i++) { -	if (groups[i][0] == '$') -	    ngroups--; -    } - -    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info_tree->view), FALSE); +    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info_tree->view), +                                      FALSE);      for (i = 0; groups[i]; i++) { -	gchar **keys = g_key_file_get_keys(key_file, groups[i], NULL, NULL); +        gchar **keys = g_key_file_get_keys(key_file, groups[i], NULL, NULL); -	if (groups[i][0] == '$') { -	    group_handle_special(key_file, entry, groups[i], keys, reload); -	} else { -	    group_handle_normal(key_file, entry, groups[i], keys, ngroups); -	} +        if (groups[i][0] == '$') { +            group_handle_special(key_file, entry, groups[i], keys); +        } else { +            group_handle_normal(key_file, entry, groups[i], keys, ngroups); +        } -	g_strfreev(keys); +        g_strfreev(keys);      } -    /* */      g_object_unref(shell->info_tree->model); -    gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info_tree->view), shell->info_tree->model); +    gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info_tree->view), +                            shell->info_tree->model);      gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->info_tree->view)); +    gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info_tree->view), +                                     ngroups > 1); +} -    if (ngroups == 1) { -        gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info_tree->view), -                                         FALSE); -    } else { -        gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(shell->info_tree->view), -                                         TRUE); +static void +destroy_widget(GtkWidget *widget, gpointer user_data) +{ +    gtk_widget_destroy(widget); +} + +static void detail_view_clear(DetailView *detail_view) +{ +    gtk_container_forall(GTK_CONTAINER(shell->detail_view->view), +                         destroy_widget, NULL); +    RANGE_SET_VALUE(detail_view, vscrollbar, 0.0); +    RANGE_SET_VALUE(detail_view, hscrollbar, 0.0); +} + +static void module_selected_show_info_detail(GKeyFile *key_file, +                                             ShellModuleEntry *entry, +                                             gchar **groups) +{ +    gint i; + +    detail_view_clear(shell->detail_view); + +    for (i = 0; groups[i]; i++) { +        gsize nkeys; +        gchar **keys = g_key_file_get_keys(key_file, groups[i], &nkeys, NULL); + +        if (entry && groups[i][0] == '$') { +            group_handle_special(key_file, entry, groups[i], keys); +        } else { +            gchar *tmp = g_strdup_printf("<b>%s</b>", groups[i]); +            GtkWidget *label = gtk_label_new(tmp); +            gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +            GtkWidget *frame = gtk_frame_new(NULL); +            gtk_frame_set_label_widget(GTK_FRAME(frame), label); +            gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); +            g_free(tmp); + +            gtk_container_set_border_width(GTK_CONTAINER(frame), 4); +            gtk_box_pack_start(GTK_BOX(shell->detail_view->view), frame, FALSE, +                               FALSE, 0); + +            GtkWidget *table = gtk_table_new(nkeys, 2, FALSE); +            gtk_container_set_border_width(GTK_CONTAINER(table), 4); +            gtk_container_add(GTK_CONTAINER(frame), table); + +            gint j; +            for (j = 0; keys[j]; j++) { +                gchar *key; +                gchar *key_markup; +                gchar *value = +                    g_key_file_get_value(key_file, groups[i], keys[j], NULL); + +                if (entry && entry->fieldfunc && value && g_str_equal(value, "...")) { +                    g_free(value); +                    value = entry->fieldfunc(keys[j]); +                } + +                if (key_is_flagged(keys[j])) { +                    key = g_strdup(key_get_name(keys[j])); +                } else { +                    key = g_strdup(keys[j]); +                } +                strend(key, '#'); + +                key_markup = +                    g_strdup_printf("<span color=\"#666\">%s</span>", key); + +                GtkWidget *key_label = gtk_label_new(key_markup); +                gtk_label_set_use_markup(GTK_LABEL(key_label), TRUE); +                gtk_misc_set_alignment(GTK_MISC(key_label), 1.0f, 0.5f); + +                GtkWidget *value_label = gtk_label_new(value); +                gtk_label_set_use_markup(GTK_LABEL(value_label), TRUE); +                gtk_label_set_selectable(GTK_LABEL(value_label), TRUE); +#if !GTK_CHECK_VERSION(3, 0, 0) +                gtk_label_set_line_wrap(GTK_LABEL(value_label), TRUE); +#endif +                gtk_misc_set_alignment(GTK_MISC(value_label), 0.0f, 0.5f); + +                GtkWidget *value_icon = gtk_image_new(); + +                GtkWidget *value_box = gtk_hbox_new(FALSE, 4); +                gtk_box_pack_start(GTK_BOX(value_box), value_icon, FALSE, FALSE, 0); +                gtk_box_pack_start(GTK_BOX(value_box), value_label, TRUE, TRUE, 0); + +                gtk_widget_show(key_label); +                gtk_widget_show(value_box); +                gtk_widget_show(value_label); + +                gtk_table_attach(GTK_TABLE(table), key_label, 0, 1, j, j + 1, +                                 GTK_FILL, GTK_FILL, 6, 4); +                gtk_table_attach(GTK_TABLE(table), value_box, 1, 2, j, j + 1, +                                 GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 4); + +                struct UpdateTableItem *item = g_new0(struct UpdateTableItem, 1); +                item->is_iter = FALSE; +                item->widget = g_object_ref(value_box); + +                const gchar *first_dollar = g_utf8_strchr(keys[j], -1, '$'); + +                if (first_dollar) { +                    const gchar *second_dollar = +                        g_utf8_strchr(first_dollar + 1, -1, '$'); +                    gchar *key_copy = +                        g_strndup(first_dollar, second_dollar - first_dollar + 1); + +                    g_hash_table_insert(update_tbl, key_copy, item); +                } else { +                    g_hash_table_insert(update_tbl, g_strdup(key), item); +                } + +                g_free(value); +                g_free(key); +                g_free(key_markup); +            } + +            gtk_widget_show(table); +            gtk_widget_show(label); +            gtk_widget_show(frame); +        } + +        g_strfreev(keys);      }  } @@ -1522,7 +1638,16 @@ module_selected_show_info(ShellModuleEntry *entry, gboolean reload)      gchar **groups = g_key_file_get_groups(key_file, &ngroups); -    module_selected_show_info_list(key_file, entry, groups, ngroups, reload); +    for (i = 0; groups[i]; i++) { +	if (groups[i][0] == '$') +	    ngroups--; +    } + +    if (shell->view_type == SHELL_VIEW_DETAIL) { +        module_selected_show_info_detail(key_file, entry, groups); +    } else { +        module_selected_show_info_list(key_file, entry, groups, ngroups); +    }      g_strfreev(groups);      g_key_file_free(key_file); @@ -1550,38 +1675,21 @@ module_selected_show_info(ShellModuleEntry *entry, gboolean reload)  static void info_selected_show_extra(const gchar *tag)  { -    GtkTreeStore *store; - -    store = GTK_TREE_STORE(shell->moreinfo_tree->model); -    gtk_tree_store_clear(store); - -    if (!shell->selected->morefunc) -	return; - -    if (tag) { -	GKeyFile *key_file = g_key_file_new(); -	gchar *key_data = shell->selected->morefunc((gchar *)tag); -	gchar **groups; -	gint i; - -	g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, -				  NULL); -	groups = g_key_file_get_groups(key_file, NULL); +    if (!tag || !shell->selected->morefunc) +        return; -	for (i = 0; groups[i]; i++) { -	    gchar *group = groups[i]; -	    gchar **keys = -		g_key_file_get_keys(key_file, group, NULL, NULL); +    GKeyFile *key_file = g_key_file_new(); +    gchar *key_data = shell->selected->morefunc((gchar *)tag); +    gchar **groups; -	    moreinfo_handle_normal(key_file, group, keys); -	} +    g_key_file_load_from_data(key_file, key_data, strlen(key_data), 0, NULL); +    groups = g_key_file_get_groups(key_file, NULL); -	gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->moreinfo_tree->view)); +    module_selected_show_info_detail(key_file, NULL, groups); -	g_strfreev(groups); -	g_key_file_free(key_file); -	g_free(key_data); -    } +    g_strfreev(groups); +    g_key_file_free(key_file); +    g_free(key_data);  }  static gchar *detail_view_clear_value(gchar *value) @@ -1635,81 +1743,64 @@ static gchar *detail_view_clear_value(gchar *value)  }  static void detail_view_add_item(DetailView *detail_view, -                                   gchar *icon, -                                   gchar *name, -                                   gchar *value) +                                 gchar *icon, +                                 gchar *name, +                                 gchar *value)  { -     GtkWidget *frame; -     GtkWidget *frame_label_box; -     GtkWidget *frame_image; -     GtkWidget *frame_label; -     GtkWidget *content; -     GtkWidget *alignment; -     gchar *temp; +    GtkWidget *frame; +    GtkWidget *frame_label_box; +    GtkWidget *frame_image; +    GtkWidget *frame_label; +    GtkWidget *content; +    GtkWidget *alignment; +    gchar *temp; -     temp = detail_view_clear_value(value); +    temp = detail_view_clear_value(value); -     /* creates the frame */ -     frame = gtk_frame_new(NULL); -     gtk_frame_set_shadow_type(GTK_FRAME(frame), -                               GTK_SHADOW_NONE); +    /* creates the frame */ +    frame = gtk_frame_new(NULL); +    gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);  #if GTK_CHECK_VERSION(3, 0, 0) -     frame_label_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +    frame_label_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);  #else -     frame_label_box = gtk_hbox_new(FALSE, 5); +    frame_label_box = gtk_hbox_new(FALSE, 5);  #endif -     frame_image = icon_cache_get_image(icon); -     frame_label = gtk_label_new(name); -     gtk_label_set_use_markup(GTK_LABEL(frame_label), TRUE); -     gtk_box_pack_start(GTK_BOX(frame_label_box), frame_image, FALSE, FALSE, 0); -     gtk_box_pack_start(GTK_BOX(frame_label_box), frame_label, FALSE, FALSE, 0); - -     content = gtk_label_new(temp); -     /* TODO:GTK3 gtk_alignment_new(), etc is deprecated from 3.14 */ +    frame_image = icon_cache_get_image(icon); +    frame_label = gtk_label_new(name); +    gtk_label_set_use_markup(GTK_LABEL(frame_label), TRUE); +    gtk_box_pack_start(GTK_BOX(frame_label_box), frame_image, FALSE, FALSE, 0); +    gtk_box_pack_start(GTK_BOX(frame_label_box), frame_label, FALSE, FALSE, 0); + +    content = gtk_label_new(temp); +    /* TODO:GTK3 gtk_alignment_new(), etc is deprecated from 3.14 */  #if GTK_CHECK_VERSION(3, 0, 0) -     GtkWidget *frame_box; -     frame_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); -     gtk_widget_set_margin_start(GTK_WIDGET(frame_box), 48); -     gtk_box_pack_start(GTK_BOX(frame_box), content, FALSE, FALSE, 0); -     gtk_container_add(GTK_CONTAINER(frame), frame_box); +    GtkWidget *frame_box; +    frame_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +    gtk_widget_set_margin_start(GTK_WIDGET(frame_box), 48); +    gtk_box_pack_start(GTK_BOX(frame_box), content, FALSE, FALSE, 0); +    gtk_container_add(GTK_CONTAINER(frame), frame_box);  #else -     alignment = gtk_alignment_new(0.5, 0.5, 1, 1); -     gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 48, 0); -     gtk_widget_show(alignment); -     gtk_container_add(GTK_CONTAINER(frame), alignment); -     gtk_misc_set_alignment(GTK_MISC(content), 0.0, 0.5); -     gtk_container_add(GTK_CONTAINER(alignment), content); +    alignment = gtk_alignment_new(0.5, 0.5, 1, 1); +    gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 48, 0); +    gtk_widget_show(alignment); +    gtk_container_add(GTK_CONTAINER(frame), alignment); +    gtk_misc_set_alignment(GTK_MISC(content), 0.0, 0.5); +    gtk_container_add(GTK_CONTAINER(alignment), content);  #endif -     gtk_widget_show_all(frame); -     gtk_widget_show_all(frame_label_box); +    gtk_widget_show_all(frame); +    gtk_widget_show_all(frame_label_box); -     gtk_frame_set_label_widget(GTK_FRAME(frame), frame_label_box); +    gtk_frame_set_label_widget(GTK_FRAME(frame), frame_label_box); -     /* pack the item on the detail_view screen */ -     gtk_box_pack_start(GTK_BOX(shell->detail_view->view), frame, FALSE, FALSE, 4); +    /* pack the item on the detail_view screen */ +    gtk_box_pack_start(GTK_BOX(shell->detail_view->view), frame, FALSE, FALSE, +                       4); -     /* add the item to the list of detail_view items */ -     detail_view->items = g_slist_prepend(detail_view->items, frame); - -     g_free(temp); +    g_free(temp);  } -static void detail_view_clear(DetailView *detail_view) -{ -     GSList *item; - -     for (item = detail_view->items; item; item = item->next) { -         gtk_widget_destroy(GTK_WIDGET(item->data)); -     } - -     g_slist_free(detail_view->items); -     detail_view->items = NULL; - -     if (detail_view->header) gtk_widget_destroy(detail_view->header); -     detail_view->header = NULL; -}  static void detail_view_create_header(DetailView *detail_view,                                          gchar *title)  { @@ -1727,8 +1818,6 @@ static void detail_view_create_header(DetailView *detail_view,      gtk_box_pack_start(GTK_BOX(shell->detail_view->view), header, FALSE, FALSE, 4); -    detail_view->header = header; -      g_free(temp);  } @@ -1793,76 +1882,78 @@ static void module_selected(gpointer data)      ShellModuleEntry *entry;      static ShellModuleEntry *current = NULL;      static gboolean updating = FALSE; -    GtkScrollbar		*hscrollbar, *vscrollbar; +    GtkScrollbar *hscrollbar, *vscrollbar; -    /* Gets the currently selected item on the left-side TreeView; if there is no -       selection, silently return */ +    /* Gets the currently selected item on the left-side TreeView; if there is +       no selection, silently return */      if (!gtk_tree_selection_get_selected(shelltree->selection, &model, &iter)) { -	return; +        return;      } -    /* Mark the currently selected module as "unselected"; this is used to kill the -       update timeout. */ +    /* Mark the currently selected module as "unselected"; this is used to kill +       the update timeout. */      if (current) { -	current->selected = FALSE; +        current->selected = FALSE;      }      if (updating) { -      return; +        return;      } else { -      updating = TRUE; +        updating = TRUE;      }      if (!gtk_tree_model_iter_parent(model, &parent, &iter)) {          memcpy(&parent, &iter, sizeof(iter));      } -    gtk_tree_model_get(model, &parent, TREE_COL_MODULE, &shell->selected_module, -1); +    gtk_tree_model_get(model, &parent, TREE_COL_MODULE, &shell->selected_module, +                       -1);      /* Get the current selection and shows its related info */      gtk_tree_model_get(model, &iter, TREE_COL_MODULE_ENTRY, &entry, -1);      if (entry && !entry->selected) { -	gchar *title; +        gchar *title; -	shell_status_set_enabled(TRUE); -	shell_status_update(_("Updating...")); +        shell_status_set_enabled(TRUE); +        shell_status_update(_("Updating...")); -	entry->selected = TRUE; -	shell->selected = entry; -	module_selected_show_info(entry, FALSE); +        entry->selected = TRUE; +        shell->selected = entry; +        module_selected_show_info(entry, FALSE); -	info_selected_show_extra(NULL);	/* clears the more info store */ -	gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info_tree->view)); +        info_selected_show_extra(NULL); /* clears the more info store */ +        gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info_tree->view)); -	/* urgh. why don't GTK do this when the model is cleared? */ +        /* urgh. why don't GTK do this when the model is cleared? */  #if GTK_CHECK_VERSION(3, 0, 0) -    /* TODO:GTK3 */ +        /* TODO:GTK3 */  #else          RANGE_SET_VALUE(info_tree, vscrollbar, 0.0);          RANGE_SET_VALUE(info_tree, hscrollbar, 0.0); -        RANGE_SET_VALUE(moreinfo_tree, vscrollbar, 0.0); -        RANGE_SET_VALUE(moreinfo_tree, hscrollbar, 0.0); +        RANGE_SET_VALUE(detail_view, vscrollbar, 0.0); +        RANGE_SET_VALUE(detail_view, hscrollbar, 0.0);  #endif -	title = g_strdup_printf("%s - %s", shell->selected_module->name, entry->name); -	shell_set_title(shell, title); -	g_free(title); +        title = g_strdup_printf("%s - %s", shell->selected_module->name, +                                entry->name); +        shell_set_title(shell, title); +        g_free(title); -	shell_action_set_enabled("RefreshAction", TRUE); -	shell_action_set_enabled("CopyAction", TRUE); +        shell_action_set_enabled("RefreshAction", TRUE); +        shell_action_set_enabled("CopyAction", TRUE); -	shell_status_update(_("Done.")); -	shell_status_set_enabled(FALSE); +        shell_status_update(_("Done.")); +        shell_status_set_enabled(FALSE);      } else { -	shell_set_title(shell, NULL); -	shell_action_set_enabled("RefreshAction", FALSE); -	shell_action_set_enabled("CopyAction", FALSE); +        shell_set_title(shell, NULL); +        shell_action_set_enabled("RefreshAction", FALSE); +        shell_action_set_enabled("CopyAction", FALSE); -	gtk_tree_store_clear(GTK_TREE_STORE(shell->info_tree->model)); -	set_view_type(SHELL_VIEW_NORMAL, FALSE); +        gtk_tree_store_clear(GTK_TREE_STORE(shell->info_tree->model)); +        set_view_type(SHELL_VIEW_NORMAL, FALSE);          if (shell->selected_module->summaryfunc) { -           shell_show_detail_view(); +            shell_show_detail_view();          }      } @@ -1889,11 +1980,10 @@ static void info_selected(GtkTreeSelection * ts, gpointer data)      gtk_tree_model_get(model, &parent, INFO_TREE_COL_DATA, &datacol, -1);      mi_tag = key_mi_tag(datacol);      info_selected_show_extra(mi_tag); -    gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->moreinfo_tree->view));      g_free(mi_tag);  } -static ShellInfoTree *info_tree_new(gboolean extra) +static ShellInfoTree *info_tree_new(void)  {      ShellInfoTree *info;      GtkWidget *treeview, *scroll; @@ -1980,9 +2070,7 @@ static ShellInfoTree *info_tree_new(gboolean extra)      sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); -    if (!extra) -	g_signal_connect(G_OBJECT(sel), "changed", -			 (GCallback) info_selected, info); +    g_signal_connect(G_OBJECT(sel), "changed", (GCallback)info_selected, info);      gtk_container_add(GTK_CONTAINER(scroll), treeview); | 
