mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
Add new tree_view_foreach_visible() function.
Wed Nov 9 00:24:11 2005 Soeren Sandmann <sandmann@redhat.com> * treeviewutils.[ch]: Add new tree_view_foreach_visible() function. * sysprof.c: Add update_screenshot_window() function.
This commit is contained in:
committed by
Søren Sandmann Pedersen
parent
00244118a2
commit
c3ce4ef8c5
@ -1,3 +1,10 @@
|
|||||||
|
Wed Nov 9 00:24:11 2005 Soeren Sandmann <sandmann@redhat.com>
|
||||||
|
|
||||||
|
* treeviewutils.[ch]: Add new tree_view_foreach_visible()
|
||||||
|
function.
|
||||||
|
|
||||||
|
* sysprof.c: Add update_screenshot_window() function.
|
||||||
|
|
||||||
Mon Nov 7 23:42:26 2005 Soeren Sandmann <sandmann@redhat.com>
|
Mon Nov 7 23:42:26 2005 Soeren Sandmann <sandmann@redhat.com>
|
||||||
|
|
||||||
* sysprof.c: Add beginning of a screenshot
|
* sysprof.c: Add beginning of a screenshot
|
||||||
|
|||||||
6
TODO
6
TODO
@ -184,6 +184,12 @@ Before 1.2:
|
|||||||
UI: "generate screenshot" menu item pops up a window with
|
UI: "generate screenshot" menu item pops up a window with
|
||||||
a text area + a radio buttons "text/html". When you flick
|
a text area + a radio buttons "text/html". When you flick
|
||||||
them, the text area is automatically updated.
|
them, the text area is automatically updated.
|
||||||
|
- beginning in CVS:
|
||||||
|
- why does the window not remember its position when
|
||||||
|
you close it with the close button, but does remember
|
||||||
|
it when you use the wm button or the menu item? It actually
|
||||||
|
seems that it only forgets the position when you click the
|
||||||
|
button with the mouse. But not if you use the keyboard ...
|
||||||
|
|
||||||
- Find out how gdb does backtraces; they may have a better way. Also
|
- Find out how gdb does backtraces; they may have a better way. Also
|
||||||
find out what dwarf2 is and how to use it. Look into libunwind.
|
find out what dwarf2 is and how to use it. Look into libunwind.
|
||||||
|
|||||||
258
sysprof.c
258
sysprof.c
@ -69,7 +69,7 @@ struct Application
|
|||||||
GtkWidget * screenshot_item;
|
GtkWidget * screenshot_item;
|
||||||
|
|
||||||
GtkWidget * samples_label;
|
GtkWidget * samples_label;
|
||||||
|
|
||||||
gboolean screenshot_window_visible;
|
gboolean screenshot_window_visible;
|
||||||
GtkWidget * screenshot_textview;
|
GtkWidget * screenshot_textview;
|
||||||
GtkWidget * screenshot_close_button;
|
GtkWidget * screenshot_close_button;
|
||||||
@ -80,7 +80,7 @@ struct Application
|
|||||||
ProfileCaller * callers;
|
ProfileCaller * callers;
|
||||||
|
|
||||||
int timeout_id;
|
int timeout_id;
|
||||||
|
|
||||||
char * loaded_profile;
|
char * loaded_profile;
|
||||||
|
|
||||||
gboolean profile_from_file; /* FIXME - not10: This is a kludge. Figure out how
|
gboolean profile_from_file; /* FIXME - not10: This is a kludge. Figure out how
|
||||||
@ -106,7 +106,7 @@ show_samples_timeout (gpointer data)
|
|||||||
Application *app = data;
|
Application *app = data;
|
||||||
char *label;
|
char *label;
|
||||||
int n_samples;
|
int n_samples;
|
||||||
|
|
||||||
switch (app->state)
|
switch (app->state)
|
||||||
{
|
{
|
||||||
case INITIAL:
|
case INITIAL:
|
||||||
@ -120,14 +120,14 @@ show_samples_timeout (gpointer data)
|
|||||||
case DISPLAYING:
|
case DISPLAYING:
|
||||||
n_samples = profile_get_size (app->profile);
|
n_samples = profile_get_size (app->profile);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
label = g_strdup_printf ("Samples: %d", n_samples);
|
label = g_strdup_printf ("Samples: %d", n_samples);
|
||||||
|
|
||||||
gtk_label_set_label (GTK_LABEL (app->samples_label), label);
|
gtk_label_set_label (GTK_LABEL (app->samples_label), label);
|
||||||
|
|
||||||
g_free (label);
|
g_free (label);
|
||||||
@ -155,9 +155,9 @@ update_sensitivity (Application *app)
|
|||||||
gboolean sensitive_reset_button;
|
gboolean sensitive_reset_button;
|
||||||
|
|
||||||
GtkWidget *active_radio_button;
|
GtkWidget *active_radio_button;
|
||||||
|
|
||||||
gboolean has_samples;
|
gboolean has_samples;
|
||||||
|
|
||||||
switch (app->state)
|
switch (app->state)
|
||||||
{
|
{
|
||||||
case INITIAL:
|
case INITIAL:
|
||||||
@ -172,7 +172,7 @@ update_sensitivity (Application *app)
|
|||||||
|
|
||||||
case PROFILING:
|
case PROFILING:
|
||||||
has_samples = (collector_get_n_samples (app->collector) > 0);
|
has_samples = (collector_get_n_samples (app->collector) > 0);
|
||||||
|
|
||||||
sensitive_profile_button = has_samples;
|
sensitive_profile_button = has_samples;
|
||||||
sensitive_save_as_button = has_samples;
|
sensitive_save_as_button = has_samples;
|
||||||
sensitive_reset_button = has_samples;
|
sensitive_reset_button = has_samples;
|
||||||
@ -191,15 +191,15 @@ update_sensitivity (Application *app)
|
|||||||
sensitive_samples_label = FALSE;
|
sensitive_samples_label = FALSE;
|
||||||
active_radio_button = app->profile_button;
|
active_radio_button = app->profile_button;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_toggle_tool_button_set_active (
|
gtk_toggle_tool_button_set_active (
|
||||||
GTK_TOGGLE_TOOL_BUTTON (active_radio_button), TRUE);
|
GTK_TOGGLE_TOOL_BUTTON (active_radio_button), TRUE);
|
||||||
|
|
||||||
/* "profile" widgets */
|
/* "profile" widgets */
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (app->profile_button),
|
gtk_widget_set_sensitive (GTK_WIDGET (app->profile_button),
|
||||||
sensitive_profile_button);
|
sensitive_profile_button);
|
||||||
@ -211,7 +211,7 @@ update_sensitivity (Application *app)
|
|||||||
sensitive_save_as_button);
|
sensitive_save_as_button);
|
||||||
gtk_widget_set_sensitive (app->save_as_item,
|
gtk_widget_set_sensitive (app->save_as_item,
|
||||||
sensitive_save_as_button);
|
sensitive_save_as_button);
|
||||||
|
|
||||||
/* "start" widgets */
|
/* "start" widgets */
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (app->start_button),
|
gtk_widget_set_sensitive (GTK_WIDGET (app->start_button),
|
||||||
sensitive_start_button);
|
sensitive_start_button);
|
||||||
@ -232,14 +232,14 @@ update_sensitivity (Application *app)
|
|||||||
gtk_widget_set_sensitive (GTK_WIDGET (app->callers_view), sensitive_tree_views);
|
gtk_widget_set_sensitive (GTK_WIDGET (app->callers_view), sensitive_tree_views);
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (app->descendants_view), sensitive_tree_views);
|
gtk_widget_set_sensitive (GTK_WIDGET (app->descendants_view), sensitive_tree_views);
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (app->samples_label), sensitive_samples_label);
|
gtk_widget_set_sensitive (GTK_WIDGET (app->samples_label), sensitive_samples_label);
|
||||||
|
|
||||||
if (app->screenshot_window_visible)
|
if (app->screenshot_window_visible)
|
||||||
gtk_widget_show (app->screenshot_window);
|
gtk_widget_show (app->screenshot_window);
|
||||||
else
|
else
|
||||||
gtk_widget_hide (app->screenshot_window);
|
gtk_widget_hide (app->screenshot_window);
|
||||||
|
|
||||||
gtk_check_menu_item_set_active (
|
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (app->screenshot_item),
|
||||||
GTK_CHECK_MENU_ITEM (app->screenshot_item), app->screenshot_window_visible);
|
app->screenshot_window_visible);
|
||||||
|
|
||||||
queue_show_samples (app);
|
queue_show_samples (app);
|
||||||
}
|
}
|
||||||
@ -254,12 +254,12 @@ set_busy (GtkWidget *widget,
|
|||||||
cursor = gdk_cursor_new (GDK_WATCH);
|
cursor = gdk_cursor_new (GDK_WATCH);
|
||||||
else
|
else
|
||||||
cursor = NULL;
|
cursor = NULL;
|
||||||
|
|
||||||
gdk_window_set_cursor (widget->window, cursor);
|
gdk_window_set_cursor (widget->window, cursor);
|
||||||
|
|
||||||
if (cursor)
|
if (cursor)
|
||||||
gdk_cursor_unref (cursor);
|
gdk_cursor_unref (cursor);
|
||||||
|
|
||||||
gdk_flush ();
|
gdk_flush ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ set_application_title (Application *app,
|
|||||||
|
|
||||||
if (app->loaded_profile)
|
if (app->loaded_profile)
|
||||||
g_free (app->loaded_profile);
|
g_free (app->loaded_profile);
|
||||||
|
|
||||||
app->loaded_profile = new_name;
|
app->loaded_profile = new_name;
|
||||||
|
|
||||||
if (app->loaded_profile)
|
if (app->loaded_profile)
|
||||||
@ -302,7 +302,7 @@ delete_data (Application *app)
|
|||||||
gtk_tree_view_set_model (GTK_TREE_VIEW (app->callers_view), NULL);
|
gtk_tree_view_set_model (GTK_TREE_VIEW (app->callers_view), NULL);
|
||||||
gtk_tree_view_set_model (GTK_TREE_VIEW (app->descendants_view), NULL);
|
gtk_tree_view_set_model (GTK_TREE_VIEW (app->descendants_view), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
collector_reset (app->collector);
|
collector_reset (app->collector);
|
||||||
|
|
||||||
queue_show_samples (app);
|
queue_show_samples (app);
|
||||||
@ -340,7 +340,7 @@ static void
|
|||||||
on_menu_item_activated (GtkWidget *menu_item, GtkWidget *tool_button)
|
on_menu_item_activated (GtkWidget *menu_item, GtkWidget *tool_button)
|
||||||
{
|
{
|
||||||
GtkToggleToolButton *button = GTK_TOGGLE_TOOL_BUTTON (tool_button);
|
GtkToggleToolButton *button = GTK_TOGGLE_TOOL_BUTTON (tool_button);
|
||||||
|
|
||||||
if (!gtk_toggle_tool_button_get_active (button))
|
if (!gtk_toggle_tool_button_get_active (button))
|
||||||
gtk_toggle_tool_button_set_active (button, TRUE);
|
gtk_toggle_tool_button_set_active (button, TRUE);
|
||||||
}
|
}
|
||||||
@ -355,11 +355,11 @@ on_start_toggled (GtkWidget *widget, gpointer data)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collector_start (app->collector, NULL))
|
if (collector_start (app->collector, NULL))
|
||||||
{
|
{
|
||||||
delete_data (app);
|
delete_data (app);
|
||||||
|
|
||||||
app->state = PROFILING;
|
app->state = PROFILING;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -373,7 +373,7 @@ on_start_toggled (GtkWidget *widget, gpointer data)
|
|||||||
"\n"
|
"\n"
|
||||||
"as root.");
|
"as root.");
|
||||||
}
|
}
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,7 +448,7 @@ fill_main_list (Application *app)
|
|||||||
ProfileObject *object = list->data;
|
ProfileObject *object = list->data;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
double profile_size = profile_get_size (profile);
|
double profile_size = profile_get_size (profile);
|
||||||
|
|
||||||
gtk_list_store_append (list_store, &iter);
|
gtk_list_store_append (list_store, &iter);
|
||||||
|
|
||||||
gtk_list_store_set (list_store, &iter,
|
gtk_list_store_set (list_store, &iter,
|
||||||
@ -652,7 +652,7 @@ ensure_profile (Application *app)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
app->profile = collector_create_profile (app->collector);
|
app->profile = collector_create_profile (app->collector);
|
||||||
|
|
||||||
collector_stop (app->collector);
|
collector_stop (app->collector);
|
||||||
|
|
||||||
fill_lists (app);
|
fill_lists (app);
|
||||||
@ -667,7 +667,7 @@ on_about_activated (GtkWidget *widget, gpointer data)
|
|||||||
{
|
{
|
||||||
#define OSLASH "\303\270"
|
#define OSLASH "\303\270"
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
|
|
||||||
gtk_show_about_dialog (GTK_WINDOW (app->main_window),
|
gtk_show_about_dialog (GTK_WINDOW (app->main_window),
|
||||||
"logo", app->icon,
|
"logo", app->icon,
|
||||||
"name", APPLICATION_NAME,
|
"name", APPLICATION_NAME,
|
||||||
@ -680,7 +680,7 @@ static void
|
|||||||
on_profile_toggled (GtkWidget *widget, gpointer data)
|
on_profile_toggled (GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
|
|
||||||
if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (app->profile_button)))
|
if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (app->profile_button)))
|
||||||
{
|
{
|
||||||
set_busy (app->main_window, TRUE);
|
set_busy (app->main_window, TRUE);
|
||||||
@ -699,7 +699,7 @@ static void
|
|||||||
on_reset_clicked (gpointer widget, gpointer data)
|
on_reset_clicked (gpointer widget, gpointer data)
|
||||||
{
|
{
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
|
|
||||||
set_busy (app->main_window, TRUE);
|
set_busy (app->main_window, TRUE);
|
||||||
|
|
||||||
delete_data (app);
|
delete_data (app);
|
||||||
@ -711,7 +711,7 @@ on_reset_clicked (gpointer widget, gpointer data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
|
|
||||||
set_busy (app->main_window, FALSE);
|
set_busy (app->main_window, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -781,7 +781,7 @@ on_save_as_clicked (gpointer widget,
|
|||||||
|
|
||||||
set_busy (app->main_window, FALSE);
|
set_busy (app->main_window, FALSE);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
@ -801,7 +801,7 @@ on_save_as_clicked (gpointer widget,
|
|||||||
{
|
{
|
||||||
sorry (app->main_window, "Could not save %s: %s",
|
sorry (app->main_window, "Could not save %s: %s",
|
||||||
filename, err->message);
|
filename, err->message);
|
||||||
|
|
||||||
set_busy (dialog, FALSE);
|
set_busy (dialog, FALSE);
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
goto retry;
|
goto retry;
|
||||||
@ -825,14 +825,14 @@ set_loaded_profile (Application *app,
|
|||||||
set_busy (app->main_window, TRUE);
|
set_busy (app->main_window, TRUE);
|
||||||
|
|
||||||
delete_data (app);
|
delete_data (app);
|
||||||
|
|
||||||
app->state = DISPLAYING;
|
app->state = DISPLAYING;
|
||||||
|
|
||||||
app->profile = profile;
|
app->profile = profile;
|
||||||
app->profile_from_file = TRUE;
|
app->profile_from_file = TRUE;
|
||||||
|
|
||||||
fill_lists (app);
|
fill_lists (app);
|
||||||
|
|
||||||
set_application_title (app, name);
|
set_application_title (app, name);
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
@ -852,7 +852,7 @@ show_could_not_open (Application *app,
|
|||||||
filename,
|
filename,
|
||||||
err->message);
|
err->message);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_open_clicked (gpointer widget,
|
on_open_clicked (gpointer widget,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
@ -861,7 +861,7 @@ on_open_clicked (gpointer widget,
|
|||||||
gchar *filename = NULL;
|
gchar *filename = NULL;
|
||||||
Profile *profile = NULL;
|
Profile *profile = NULL;
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
|
|
||||||
set_busy (app->main_window, TRUE);
|
set_busy (app->main_window, TRUE);
|
||||||
|
|
||||||
dialog = gtk_file_chooser_dialog_new ("Open",
|
dialog = gtk_file_chooser_dialog_new ("Open",
|
||||||
@ -872,24 +872,24 @@ on_open_clicked (gpointer widget,
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
|
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
|
||||||
|
|
||||||
set_busy (app->main_window, FALSE);
|
set_busy (app->main_window, FALSE);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
|
||||||
|
|
||||||
set_busy (dialog, TRUE);
|
set_busy (dialog, TRUE);
|
||||||
|
|
||||||
profile = profile_load (filename, &err);
|
profile = profile_load (filename, &err);
|
||||||
|
|
||||||
if (!profile)
|
if (!profile)
|
||||||
{
|
{
|
||||||
set_busy (dialog, FALSE);
|
set_busy (dialog, FALSE);
|
||||||
|
|
||||||
show_could_not_open (app, filename, err);
|
show_could_not_open (app, filename, err);
|
||||||
g_error_free (err);
|
g_error_free (err);
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
@ -900,14 +900,14 @@ on_open_clicked (gpointer widget,
|
|||||||
|
|
||||||
set_busy (dialog, FALSE);
|
set_busy (dialog, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_destroy (dialog);
|
||||||
|
|
||||||
if (profile)
|
if (profile)
|
||||||
{
|
{
|
||||||
g_assert (filename);
|
g_assert (filename);
|
||||||
set_loaded_profile (app, filename, profile);
|
set_loaded_profile (app, filename, profile);
|
||||||
|
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -935,13 +935,13 @@ expand_descendants_tree (Application *app)
|
|||||||
double top_value = 0.0;
|
double top_value = 0.0;
|
||||||
GtkTreePath *first_path;
|
GtkTreePath *first_path;
|
||||||
GList *list;
|
GList *list;
|
||||||
|
|
||||||
first_path = gtk_tree_path_new_first();
|
first_path = gtk_tree_path_new_first();
|
||||||
|
|
||||||
all_paths = g_list_prepend (all_paths, first_path);
|
all_paths = g_list_prepend (all_paths, first_path);
|
||||||
|
|
||||||
n_rows = 1;
|
n_rows = 1;
|
||||||
|
|
||||||
gtk_tree_model_get_iter (model, &iter, first_path);
|
gtk_tree_model_get_iter (model, &iter, first_path);
|
||||||
gtk_tree_model_get (model, &iter,
|
gtk_tree_model_get (model, &iter,
|
||||||
OBJECT_TOTAL, &top_value,
|
OBJECT_TOTAL, &top_value,
|
||||||
@ -954,10 +954,10 @@ expand_descendants_tree (Application *app)
|
|||||||
double best_value;
|
double best_value;
|
||||||
int n_children;
|
int n_children;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
best_value = 0.0;
|
best_value = 0.0;
|
||||||
best_path = NULL;
|
best_path = NULL;
|
||||||
|
|
||||||
for (list = all_paths; list != NULL; list = list->next)
|
for (list = all_paths; list != NULL; list = list->next)
|
||||||
{
|
{
|
||||||
GtkTreePath *path = list->data;
|
GtkTreePath *path = list->data;
|
||||||
@ -974,13 +974,13 @@ expand_descendants_tree (Application *app)
|
|||||||
{
|
{
|
||||||
best_value = value;
|
best_value = value;
|
||||||
best_path = path;
|
best_path = path;
|
||||||
|
|
||||||
gtk_tree_model_get_iter (model, &best_iter, path);
|
gtk_tree_model_get_iter (model, &best_iter, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_tree_model_get_iter (model, &iter, best_path);
|
gtk_tree_model_get_iter (model, &iter, best_path);
|
||||||
|
|
||||||
n_children = gtk_tree_model_iter_n_children (model, &best_iter);
|
n_children = gtk_tree_model_iter_n_children (model, &best_iter);
|
||||||
|
|
||||||
if (n_children && (best_value / top_value) > 0.04 &&
|
if (n_children && (best_value / top_value) > 0.04 &&
|
||||||
@ -988,50 +988,110 @@ expand_descendants_tree (Application *app)
|
|||||||
{
|
{
|
||||||
gtk_tree_view_expand_row (GTK_TREE_VIEW (app->descendants_view), best_path, FALSE);
|
gtk_tree_view_expand_row (GTK_TREE_VIEW (app->descendants_view), best_path, FALSE);
|
||||||
n_rows += n_children;
|
n_rows += n_children;
|
||||||
|
|
||||||
if (gtk_tree_path_get_depth (best_path) < 4)
|
if (gtk_tree_path_get_depth (best_path) < 4)
|
||||||
{
|
{
|
||||||
GtkTreePath *path = gtk_tree_path_copy (best_path);
|
GtkTreePath *path = gtk_tree_path_copy (best_path);
|
||||||
gtk_tree_path_down (path);
|
gtk_tree_path_down (path);
|
||||||
|
|
||||||
for (i = 0; i < n_children; ++i)
|
for (i = 0; i < n_children; ++i)
|
||||||
{
|
{
|
||||||
all_paths = g_list_prepend (all_paths, path);
|
all_paths = g_list_prepend (all_paths, path);
|
||||||
|
|
||||||
path = gtk_tree_path_copy (path);
|
path = gtk_tree_path_copy (path);
|
||||||
gtk_tree_path_next (path);
|
gtk_tree_path_next (path);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_tree_path_free (path);
|
gtk_tree_path_free (path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
all_paths = g_list_remove (all_paths, best_path);
|
all_paths = g_list_remove (all_paths, best_path);
|
||||||
|
|
||||||
|
if (!all_paths && n_rows == 1)
|
||||||
|
{
|
||||||
|
/* Always expand at least once */
|
||||||
|
gtk_tree_view_expand_row (GTK_TREE_VIEW (app->descendants_view),
|
||||||
|
best_path, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
gtk_tree_path_free (best_path);
|
gtk_tree_path_free (best_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (list = all_paths; list != NULL; list = list->next)
|
for (list = all_paths; list != NULL; list = list->next)
|
||||||
gtk_tree_path_free (list->data);
|
gtk_tree_path_free (list->data);
|
||||||
|
|
||||||
g_list_free (all_paths);
|
g_list_free (all_paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int text_width;
|
||||||
|
int self_width;
|
||||||
|
int cumulative_width;
|
||||||
|
} Widths;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_object_selection_changed (GtkTreeSelection *selection,
|
compute_widths (GtkTreeView *view,
|
||||||
gpointer data)
|
GtkTreePath *path,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_text (GtkTreeView *view,
|
||||||
|
GtkTreePath *path,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
gpointer data)
|
||||||
{
|
{
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_screenshot_window (Application *app)
|
||||||
|
{
|
||||||
|
typedef gboolean (* GtkTreeModelForeachFunc) (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
|
||||||
|
|
||||||
|
/* FIXME: clear the text buffer here */
|
||||||
|
|
||||||
|
if (app->descendants)
|
||||||
|
{
|
||||||
|
Widths widths;
|
||||||
|
|
||||||
|
widths.text_width = 0;
|
||||||
|
widths.self_width = 0;
|
||||||
|
widths.cumulative_width = 0;
|
||||||
|
|
||||||
|
tree_view_foreach_visible (app->descendants_view,
|
||||||
|
compute_widths,
|
||||||
|
&widths);
|
||||||
|
|
||||||
|
tree_view_foreach_visible (app->descendants_view,
|
||||||
|
add_text,
|
||||||
|
app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_object_selection_changed (GtkTreeSelection *selection,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
Application *app = data;
|
||||||
|
|
||||||
set_busy (app->main_window, TRUE);
|
set_busy (app->main_window, TRUE);
|
||||||
|
|
||||||
gdk_window_process_all_updates (); /* Display updated selection */
|
gdk_window_process_all_updates (); /* Display updated selection */
|
||||||
|
|
||||||
fill_descendants_tree (app);
|
fill_descendants_tree (app);
|
||||||
fill_callers_list (app);
|
fill_callers_list (app);
|
||||||
|
|
||||||
if (get_current_object (app))
|
if (get_current_object (app))
|
||||||
expand_descendants_tree (app);
|
expand_descendants_tree (app);
|
||||||
|
|
||||||
|
update_screenshot_window (app);
|
||||||
|
|
||||||
set_busy (app->main_window, FALSE);
|
set_busy (app->main_window, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1116,7 +1176,7 @@ on_callers_row_activated (GtkTreeView *tree_view,
|
|||||||
Application *app = data;
|
Application *app = data;
|
||||||
|
|
||||||
goto_object (app, tree_view, path, CALLERS_OBJECT);
|
goto_object (app, tree_view, path, CALLERS_OBJECT);
|
||||||
|
|
||||||
gtk_widget_grab_focus (GTK_WIDGET (app->callers_view));
|
gtk_widget_grab_focus (GTK_WIDGET (app->callers_view));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1125,7 +1185,7 @@ on_screenshot_activated (GtkCheckMenuItem *menu_item,
|
|||||||
Application *app)
|
Application *app)
|
||||||
{
|
{
|
||||||
app->screenshot_window_visible = gtk_check_menu_item_get_active (menu_item);
|
app->screenshot_window_visible = gtk_check_menu_item_get_active (menu_item);
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1135,7 +1195,7 @@ on_screenshot_window_delete (GtkWidget *window,
|
|||||||
Application *app)
|
Application *app)
|
||||||
{
|
{
|
||||||
app->screenshot_window_visible = FALSE;
|
app->screenshot_window_visible = FALSE;
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1144,12 +1204,13 @@ on_screenshot_close_button_clicked (GtkWidget *widget,
|
|||||||
Application *app)
|
Application *app)
|
||||||
{
|
{
|
||||||
app->screenshot_window_visible = FALSE;
|
app->screenshot_window_visible = FALSE;
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_sizes (GtkWindow *window,
|
set_sizes (GtkWindow *window,
|
||||||
|
GtkWindow *screenshot_window,
|
||||||
GtkWidget *hpaned,
|
GtkWidget *hpaned,
|
||||||
GtkWidget *vpaned)
|
GtkWidget *vpaned)
|
||||||
{
|
{
|
||||||
@ -1171,6 +1232,12 @@ set_sizes (GtkWindow *window,
|
|||||||
|
|
||||||
gtk_paned_set_position (GTK_PANED (vpaned), height / 2);
|
gtk_paned_set_position (GTK_PANED (vpaned), height / 2);
|
||||||
gtk_paned_set_position (GTK_PANED (hpaned), width / 2);
|
gtk_paned_set_position (GTK_PANED (hpaned), width / 2);
|
||||||
|
|
||||||
|
width = monitor.width * 5 / 8;
|
||||||
|
height = monitor.height * 5/ 8;
|
||||||
|
|
||||||
|
gtk_window_resize (screenshot_window, width, height);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1198,9 +1265,9 @@ build_gui (Application *app)
|
|||||||
GladeXML *xml;
|
GladeXML *xml;
|
||||||
GtkTreeSelection *selection;
|
GtkTreeSelection *selection;
|
||||||
GtkTreeViewColumn *col;
|
GtkTreeViewColumn *col;
|
||||||
|
|
||||||
set_shadows ();
|
set_shadows ();
|
||||||
|
|
||||||
if (!g_file_test (GLADE_FILE, G_FILE_TEST_EXISTS) ||
|
if (!g_file_test (GLADE_FILE, G_FILE_TEST_EXISTS) ||
|
||||||
!g_file_test (ICON_FILE, G_FILE_TEST_EXISTS))
|
!g_file_test (ICON_FILE, G_FILE_TEST_EXISTS))
|
||||||
{
|
{
|
||||||
@ -1208,26 +1275,23 @@ build_gui (Application *app)
|
|||||||
"Sysprof was not compiled or installed correctly.\n"
|
"Sysprof was not compiled or installed correctly.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Running \"make install\" may solve this problem.\n");
|
"Running \"make install\" may solve this problem.\n");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
xml = glade_xml_new (GLADE_FILE, NULL, NULL);
|
xml = glade_xml_new (GLADE_FILE, NULL, NULL);
|
||||||
|
|
||||||
/* Main Window */
|
/* Main Window */
|
||||||
app->main_window = glade_xml_get_widget (xml, "main_window");
|
app->main_window = glade_xml_get_widget (xml, "main_window");
|
||||||
app->icon = gdk_pixbuf_new_from_file (ICON_FILE, NULL);
|
app->icon = gdk_pixbuf_new_from_file (ICON_FILE, NULL);
|
||||||
|
|
||||||
gtk_window_set_icon (GTK_WINDOW (app->main_window), app->icon);
|
gtk_window_set_icon (GTK_WINDOW (app->main_window), app->icon);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->main_window), "delete_event",
|
g_signal_connect (G_OBJECT (app->main_window), "delete_event",
|
||||||
G_CALLBACK (on_delete), NULL);
|
G_CALLBACK (on_delete), NULL);
|
||||||
|
|
||||||
gtk_widget_realize (GTK_WIDGET (app->main_window));
|
gtk_widget_realize (GTK_WIDGET (app->main_window));
|
||||||
set_sizes (GTK_WINDOW (app->main_window),
|
|
||||||
glade_xml_get_widget (xml, "hpaned"),
|
|
||||||
glade_xml_get_widget (xml, "vpaned"));
|
|
||||||
|
|
||||||
/* Tool items */
|
/* Tool items */
|
||||||
|
|
||||||
@ -1251,7 +1315,7 @@ build_gui (Application *app)
|
|||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->save_as_button), "clicked",
|
g_signal_connect (G_OBJECT (app->save_as_button), "clicked",
|
||||||
G_CALLBACK (on_save_as_clicked), app);
|
G_CALLBACK (on_save_as_clicked), app);
|
||||||
|
|
||||||
|
|
||||||
app->samples_label = glade_xml_get_widget (xml, "samples_label");
|
app->samples_label = glade_xml_get_widget (xml, "samples_label");
|
||||||
|
|
||||||
@ -1276,19 +1340,19 @@ build_gui (Application *app)
|
|||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->reset_item), "activate",
|
g_signal_connect (G_OBJECT (app->reset_item), "activate",
|
||||||
G_CALLBACK (on_reset_clicked), app);
|
G_CALLBACK (on_reset_clicked), app);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->open_item), "activate",
|
g_signal_connect (G_OBJECT (app->open_item), "activate",
|
||||||
G_CALLBACK (on_open_clicked), app);
|
G_CALLBACK (on_open_clicked), app);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->save_as_item), "activate",
|
g_signal_connect (G_OBJECT (app->save_as_item), "activate",
|
||||||
G_CALLBACK (on_save_as_clicked), app);
|
G_CALLBACK (on_save_as_clicked), app);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (app->screenshot_item), "activate",
|
g_signal_connect (G_OBJECT (app->screenshot_item), "activate",
|
||||||
G_CALLBACK (on_screenshot_activated), app);
|
G_CALLBACK (on_screenshot_activated), app);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "quit")), "activate",
|
g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "quit")), "activate",
|
||||||
G_CALLBACK (on_delete), NULL);
|
G_CALLBACK (on_delete), NULL);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "about")), "activate",
|
g_signal_connect (G_OBJECT (glade_xml_get_widget (xml, "about")), "activate",
|
||||||
G_CALLBACK (on_about_activated), app);
|
G_CALLBACK (on_about_activated), app);
|
||||||
|
|
||||||
@ -1323,27 +1387,33 @@ build_gui (Application *app)
|
|||||||
g_signal_connect (app->descendants_view, "row-activated",
|
g_signal_connect (app->descendants_view, "row-activated",
|
||||||
G_CALLBACK (on_descendants_row_activated), app);
|
G_CALLBACK (on_descendants_row_activated), app);
|
||||||
gtk_tree_view_column_set_expand (col, TRUE);
|
gtk_tree_view_column_set_expand (col, TRUE);
|
||||||
|
|
||||||
gtk_widget_grab_focus (GTK_WIDGET (app->object_view));
|
gtk_widget_grab_focus (GTK_WIDGET (app->object_view));
|
||||||
|
|
||||||
/* Screenshot window */
|
/* screenshot window */
|
||||||
app->screenshot_window = glade_xml_get_widget (xml, "screenshot_window");
|
app->screenshot_window = glade_xml_get_widget (xml, "screenshot_window");
|
||||||
app->screenshot_textview = glade_xml_get_widget (xml, "screenshot_textview");
|
app->screenshot_textview = glade_xml_get_widget (xml, "screenshot_textview");
|
||||||
app->screenshot_close_button = glade_xml_get_widget (xml, "screenshot_close_button");
|
app->screenshot_close_button = glade_xml_get_widget (xml, "screenshot_close_button");
|
||||||
|
|
||||||
g_signal_connect (app->screenshot_window, "delete_event",
|
g_signal_connect (app->screenshot_window, "delete_event",
|
||||||
G_CALLBACK (on_screenshot_window_delete), app);
|
G_CALLBACK (on_screenshot_window_delete), app);
|
||||||
|
|
||||||
g_signal_connect (app->screenshot_close_button, "clicked",
|
g_signal_connect (app->screenshot_close_button, "clicked",
|
||||||
G_CALLBACK (on_screenshot_close_button_clicked), app);
|
G_CALLBACK (on_screenshot_close_button_clicked), app);
|
||||||
|
|
||||||
|
/* set sizes */
|
||||||
|
set_sizes (GTK_WINDOW (app->main_window),
|
||||||
|
GTK_WINDOW (app->screenshot_window),
|
||||||
|
glade_xml_get_widget (xml, "hpaned"),
|
||||||
|
glade_xml_get_widget (xml, "vpaned"));
|
||||||
|
|
||||||
/* hide/show widgets */
|
/* hide/show widgets */
|
||||||
gtk_widget_show_all (app->main_window);
|
gtk_widget_show_all (app->main_window);
|
||||||
gtk_widget_hide (app->dummy_button);
|
gtk_widget_hide (app->dummy_button);
|
||||||
gtk_widget_hide (app->screenshot_window);
|
gtk_widget_hide (app->screenshot_window);
|
||||||
|
|
||||||
queue_show_samples (app);
|
queue_show_samples (app);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1351,7 +1421,7 @@ static void
|
|||||||
on_new_sample (gpointer data)
|
on_new_sample (gpointer data)
|
||||||
{
|
{
|
||||||
Application *app = data;
|
Application *app = data;
|
||||||
|
|
||||||
if (app->state == PROFILING)
|
if (app->state == PROFILING)
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
}
|
}
|
||||||
@ -1360,7 +1430,7 @@ static Application *
|
|||||||
application_new (void)
|
application_new (void)
|
||||||
{
|
{
|
||||||
Application *app = g_new0 (Application, 1);
|
Application *app = g_new0 (Application, 1);
|
||||||
|
|
||||||
app->collector = collector_new (on_new_sample, app);
|
app->collector = collector_new (on_new_sample, app);
|
||||||
app->state = INITIAL;
|
app->state = INITIAL;
|
||||||
|
|
||||||
@ -1381,7 +1451,7 @@ load_file (gpointer data)
|
|||||||
Application *app = file_open_data->app;
|
Application *app = file_open_data->app;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
Profile *profile;
|
Profile *profile;
|
||||||
|
|
||||||
set_busy (app->main_window, TRUE);
|
set_busy (app->main_window, TRUE);
|
||||||
|
|
||||||
profile = profile_load (filename, &err);
|
profile = profile_load (filename, &err);
|
||||||
@ -1397,7 +1467,7 @@ load_file (gpointer data)
|
|||||||
show_could_not_open (app, filename, err);
|
show_could_not_open (app, filename, err);
|
||||||
g_error_free (err);
|
g_error_free (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (file_open_data);
|
g_free (file_open_data);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -1412,21 +1482,21 @@ main (int argc,
|
|||||||
gtk_init (&argc, &argv);
|
gtk_init (&argc, &argv);
|
||||||
|
|
||||||
app = application_new ();
|
app = application_new ();
|
||||||
|
|
||||||
if (!build_gui (app))
|
if (!build_gui (app))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
update_sensitivity (app);
|
update_sensitivity (app);
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
{
|
{
|
||||||
FileOpenData *file_open_data = g_new0 (FileOpenData, 1);
|
FileOpenData *file_open_data = g_new0 (FileOpenData, 1);
|
||||||
file_open_data->filename = argv[1];
|
file_open_data->filename = argv[1];
|
||||||
file_open_data->app = app;
|
file_open_data->app = app;
|
||||||
|
|
||||||
g_idle_add (load_file, file_open_data);
|
g_idle_add (load_file, file_open_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_main ();
|
gtk_main ();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -39,11 +39,11 @@ tree_view_unset_sort_ids (GtkTreeView *tree_view)
|
|||||||
{
|
{
|
||||||
GList *columns = gtk_tree_view_get_columns (tree_view);
|
GList *columns = gtk_tree_view_get_columns (tree_view);
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
for (l = columns; l; l = l->next) {
|
for (l = columns; l; l = l->next) {
|
||||||
gtk_tree_view_column_set_sort_column_id (l->data, -1);
|
gtk_tree_view_column_set_sort_column_id (l->data, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_list_free (columns);
|
g_list_free (columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,12 +52,12 @@ tree_view_set_sort_ids (GtkTreeView *tree_view)
|
|||||||
{
|
{
|
||||||
GList *columns = gtk_tree_view_get_columns (tree_view);
|
GList *columns = gtk_tree_view_get_columns (tree_view);
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
for (l = columns; l; l = l->next) {
|
for (l = columns; l; l = l->next) {
|
||||||
int column_id = GPOINTER_TO_INT (g_object_get_data (l->data, "mi-saved-sort-column"));
|
int column_id = GPOINTER_TO_INT (g_object_get_data (l->data, "mi-saved-sort-column"));
|
||||||
gtk_tree_view_column_set_sort_column_id (l->data, column_id);
|
gtk_tree_view_column_set_sort_column_id (l->data, column_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_list_free (columns);
|
g_list_free (columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,9 +72,9 @@ list_iter_get_index (GtkTreeModel *model,
|
|||||||
g_assert (gtk_tree_path_get_depth (path) == 1);
|
g_assert (gtk_tree_path_get_depth (path) == 1);
|
||||||
result = gtk_tree_path_get_indices (path)[0];
|
result = gtk_tree_path_get_indices (path)[0];
|
||||||
gtk_tree_path_free (path);
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkTreeViewColumn *
|
GtkTreeViewColumn *
|
||||||
@ -82,7 +82,7 @@ add_plain_text_column (GtkTreeView *view, const gchar *title, gint model_column)
|
|||||||
{
|
{
|
||||||
GtkCellRenderer *renderer;
|
GtkCellRenderer *renderer;
|
||||||
GtkTreeViewColumn *column;
|
GtkTreeViewColumn *column;
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_text_new ();
|
renderer = gtk_cell_renderer_text_new ();
|
||||||
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
|
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
|
||||||
column = gtk_tree_view_column_new_with_attributes (title, renderer,
|
column = gtk_tree_view_column_new_with_attributes (title, renderer,
|
||||||
@ -91,7 +91,7 @@ add_plain_text_column (GtkTreeView *view, const gchar *title, gint model_column)
|
|||||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||||
gtk_tree_view_append_column (view, column);
|
gtk_tree_view_append_column (view, column);
|
||||||
column_set_sort_id (column, model_column);
|
column_set_sort_id (column, model_column);
|
||||||
|
|
||||||
return column;
|
return column;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ pointer_to_text (GtkTreeViewColumn *tree_column,
|
|||||||
gpointer p;
|
gpointer p;
|
||||||
gchar *text;
|
gchar *text;
|
||||||
int column = GPOINTER_TO_INT (data);
|
int column = GPOINTER_TO_INT (data);
|
||||||
|
|
||||||
gtk_tree_model_get (tree_model, iter, column, &p, -1);
|
gtk_tree_model_get (tree_model, iter, column, &p, -1);
|
||||||
text = g_strdup_printf ("%p", p);
|
text = g_strdup_printf ("%p", p);
|
||||||
g_object_set (cell, "text", text, NULL);
|
g_object_set (cell, "text", text, NULL);
|
||||||
@ -123,11 +123,11 @@ double_to_text (GtkTreeViewColumn *tree_column,
|
|||||||
gdouble d;
|
gdouble d;
|
||||||
gchar *text;
|
gchar *text;
|
||||||
ColumnInfo *info = data;
|
ColumnInfo *info = data;
|
||||||
|
|
||||||
gtk_tree_model_get (tree_model, iter, info->column, &d, -1);
|
gtk_tree_model_get (tree_model, iter, info->column, &d, -1);
|
||||||
|
|
||||||
text = g_strdup_printf (info->format, d);
|
text = g_strdup_printf (info->format, d);
|
||||||
|
|
||||||
g_object_set (cell, "text", text, NULL);
|
g_object_set (cell, "text", text, NULL);
|
||||||
g_free (text);
|
g_free (text);
|
||||||
}
|
}
|
||||||
@ -146,21 +146,21 @@ add_double_format_column (GtkTreeView *view, const gchar *title, gint model_colu
|
|||||||
GtkCellRenderer *renderer;
|
GtkCellRenderer *renderer;
|
||||||
GtkTreeViewColumn *column;
|
GtkTreeViewColumn *column;
|
||||||
ColumnInfo *column_info = g_new (ColumnInfo, 1);
|
ColumnInfo *column_info = g_new (ColumnInfo, 1);
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_text_new ();
|
renderer = gtk_cell_renderer_text_new ();
|
||||||
g_object_set (renderer, "xalign", 1.0, NULL);
|
g_object_set (renderer, "xalign", 1.0, NULL);
|
||||||
|
|
||||||
column = gtk_tree_view_column_new ();
|
column = gtk_tree_view_column_new ();
|
||||||
gtk_tree_view_column_set_title (column, title);
|
gtk_tree_view_column_set_title (column, title);
|
||||||
gtk_tree_view_column_pack_start (column, renderer, TRUE);
|
gtk_tree_view_column_pack_start (column, renderer, TRUE);
|
||||||
gtk_tree_view_column_set_resizable (column, FALSE);
|
gtk_tree_view_column_set_resizable (column, FALSE);
|
||||||
|
|
||||||
column_info->column = model_column;
|
column_info->column = model_column;
|
||||||
column_info->format = g_strdup (format);
|
column_info->format = g_strdup (format);
|
||||||
|
|
||||||
gtk_tree_view_column_set_cell_data_func (column, renderer,
|
gtk_tree_view_column_set_cell_data_func (column, renderer,
|
||||||
double_to_text, column_info, free_column_info);
|
double_to_text, column_info, free_column_info);
|
||||||
|
|
||||||
gtk_tree_view_append_column (view, column);
|
gtk_tree_view_append_column (view, column);
|
||||||
column_set_sort_id (column, model_column);
|
column_set_sort_id (column, model_column);
|
||||||
|
|
||||||
@ -172,9 +172,9 @@ add_pointer_column (GtkTreeView *view, const gchar *title, gint model_column)
|
|||||||
{
|
{
|
||||||
GtkCellRenderer *renderer;
|
GtkCellRenderer *renderer;
|
||||||
GtkTreeViewColumn *column;
|
GtkTreeViewColumn *column;
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_text_new ();
|
renderer = gtk_cell_renderer_text_new ();
|
||||||
|
|
||||||
column = gtk_tree_view_column_new ();
|
column = gtk_tree_view_column_new ();
|
||||||
if (title)
|
if (title)
|
||||||
gtk_tree_view_column_set_title (column, title);
|
gtk_tree_view_column_set_title (column, title);
|
||||||
@ -182,7 +182,7 @@ add_pointer_column (GtkTreeView *view, const gchar *title, gint model_column)
|
|||||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||||
gtk_tree_view_column_set_cell_data_func (column, renderer,
|
gtk_tree_view_column_set_cell_data_func (column, renderer,
|
||||||
pointer_to_text, GINT_TO_POINTER (model_column), NULL);
|
pointer_to_text, GINT_TO_POINTER (model_column), NULL);
|
||||||
|
|
||||||
gtk_tree_view_append_column (view, column);
|
gtk_tree_view_append_column (view, column);
|
||||||
column_set_sort_id (column, model_column);
|
column_set_sort_id (column, model_column);
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ save_sort_state (GtkTreeView *view)
|
|||||||
{
|
{
|
||||||
SortState *state = NULL;
|
SortState *state = NULL;
|
||||||
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
||||||
|
|
||||||
if (model && GTK_IS_TREE_SORTABLE (model)) {
|
if (model && GTK_IS_TREE_SORTABLE (model)) {
|
||||||
state = g_new (SortState, 1);
|
state = g_new (SortState, 1);
|
||||||
state->is_sorted = gtk_tree_sortable_get_sort_column_id (
|
state->is_sorted = gtk_tree_sortable_get_sort_column_id (
|
||||||
@ -218,7 +218,7 @@ restore_sort_state (GtkTreeView *view, gpointer st)
|
|||||||
{
|
{
|
||||||
SortState *state = st;
|
SortState *state = st;
|
||||||
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
if (state->is_sorted && model && GTK_IS_TREE_SORTABLE (model)) {
|
if (state->is_sorted && model && GTK_IS_TREE_SORTABLE (model)) {
|
||||||
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
|
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
|
||||||
@ -230,3 +230,41 @@ restore_sort_state (GtkTreeView *view, gpointer st)
|
|||||||
|
|
||||||
gtk_tree_sortable_sort_column_changed (GTK_TREE_SORTABLE (model));
|
gtk_tree_sortable_sort_column_changed (GTK_TREE_SORTABLE (model));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_iter (GtkTreeView *view,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
VisibleCallback callback,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
||||||
|
GtkTreePath *path;
|
||||||
|
GtkTreeIter child;
|
||||||
|
|
||||||
|
path = gtk_tree_model_get_path (model, iter);
|
||||||
|
|
||||||
|
callback (view, path, iter, data);
|
||||||
|
|
||||||
|
if (gtk_tree_view_row_expanded (view, path)) {
|
||||||
|
if (gtk_tree_model_iter_children (model, &child, iter)) {
|
||||||
|
do {
|
||||||
|
process_iter (view, &child, callback, data);
|
||||||
|
} while (gtk_tree_model_iter_next (model, &child));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tree_view_foreach_visible (GtkTreeView *view,
|
||||||
|
VisibleCallback callback,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkTreeModel *model = gtk_tree_view_get_model (view);
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
if (gtk_tree_model_get_iter_first (model, &iter))
|
||||||
|
process_iter (view, &iter, callback, data);
|
||||||
|
}
|
||||||
|
|||||||
@ -43,3 +43,11 @@ GtkTreeViewColumn *add_pointer_column (GtkTreeView *view,
|
|||||||
gpointer save_sort_state (GtkTreeView *view);
|
gpointer save_sort_state (GtkTreeView *view);
|
||||||
void restore_sort_state (GtkTreeView *view,
|
void restore_sort_state (GtkTreeView *view,
|
||||||
gpointer state);
|
gpointer state);
|
||||||
|
|
||||||
|
typedef void (* VisibleCallback) (GtkTreeView *view,
|
||||||
|
GtkTreePath *path,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
gpointer data);
|
||||||
|
void tree_view_foreach_visible (GtkTreeView *view,
|
||||||
|
VisibleCallback callback,
|
||||||
|
gpointer data);
|
||||||
|
|||||||
Reference in New Issue
Block a user