202
204
/* gtk_spin_button_set_set_update_policy(GTK_SPIN_BUTTON(Button),
203
205
GTK_UPDATE_IF_VALID); */
204
206
gtk_box_pack_end(GTK_BOX(Toolbar), Button, FALSE, FALSE, 0);
205
gtk_signal_connect(GTK_OBJECT(Adjustment), "value_changed",
207
g_signal_connect(GTK_OBJECT(Adjustment), "value_changed",
206
208
GTK_SIGNAL_FUNC(WaitTime_changed), Button);
207
gtk_widget_show(Button);
209
Label = gtk_label_new("Hostname");
210
Label = gtk_label_new_with_mnemonic("_Hostname:");
210
211
gtk_box_pack_start(GTK_BOX(Toolbar), Label, FALSE, FALSE, 0);
211
gtk_widget_show(Label);
213
213
Entry = gtk_entry_new();
214
214
gtk_entry_set_text(GTK_ENTRY(Entry), Hostname);
215
gtk_signal_connect(GTK_OBJECT(Entry), "activate",
215
g_signal_connect(GTK_OBJECT(Entry), "activate",
216
216
GTK_SIGNAL_FUNC(Host_activate), NULL);
217
217
gtk_box_pack_start(GTK_BOX(Toolbar), Entry, TRUE, TRUE, 0);
218
gtk_widget_show(Entry);
222
char *Report_Text[] = { "Hostname", "Loss", "Rcv", "Snt", "Last", "Best", "Avg", "Worst", "StDev", NULL };
223
int Report_Positions[] = { 10, 200, 240, 280, 320, 360, 400, 440, 480, 0 };
225
GtkWidget *ReportBody;
227
GtkWidget *GetRow(int index)
231
GtkWidget *Row, *Label;
233
Row = gtk_fixed_new();
235
addr = net_addr(index);
237
if ( addrcmp( (void *) addr, (void *) &unspec_addr, af ) != 0 ) {
238
name = dns_lookup(addr);
240
/* Actually this is not neccesary:
241
dns_lookup always returns a printable string */
242
name = strlongip (addr);
246
Label = gtk_label_new(name);
247
gtk_fixed_put(GTK_FIXED(Row), Label, Report_Positions[0], 0);
248
gtk_widget_show(Label);
254
GtkWidget *Scrollarea_create(void)
260
for(count = 0; Report_Positions[count]; count++);
262
List = GTK_WIDGET(gtk_clist_new_with_titles(count, Report_Text));
263
scroll = gtk_scrolled_window_new(NULL, NULL);
264
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
265
for(count = 0; Report_Positions[count + 1]; count++) {
266
gtk_clist_set_column_width(GTK_CLIST(List), count,
267
Report_Positions[count + 1] -
268
Report_Positions[count]);
270
gtk_clist_set_column_width(GTK_CLIST(List), count, 0);
271
for(count = 1; Report_Positions[count]; count++) {
272
gtk_clist_set_column_justification(GTK_CLIST(List), count, GTK_JUSTIFY_RIGHT);
274
gtk_container_add(GTK_CONTAINER(scroll), List);
275
gtk_widget_show(List);
282
void gtk_add_row(GtkWidget *List)
285
GtkWidget *Row, *Label;
287
Row = gtk_fixed_new();
289
for(at = 0; Report_Positions[at] != 0; at++) {
290
Label = gtk_label_new("-");
292
gtk_widget_set_usize(Label, 40, 0);
293
gtk_label_set_justify(GTK_LABEL(Label), GTK_JUSTIFY_RIGHT);
295
gtk_fixed_put(GTK_FIXED(Row), Label, Report_Positions[at], 0);
296
gtk_widget_show(Label);
299
gtk_box_pack_start(GTK_BOX(List), Row, FALSE, FALSE, 0);
300
gtk_widget_show(Row);
304
void gtk_set_field(GtkCList *List, int row, int ix, char *str) {
305
gtk_clist_set_text(List, row, ix, str);
309
/* void gtk_set_field_num(GtkCList *List, int row, int ix, char *format, int num) {
310
changed int to dobule byMin */
311
void gtk_set_field_num(GtkCList *List, int row, int ix, char *format, double num)
315
sprintf(str, format, num);
316
gtk_set_field(List, row, ix, str);
320
void gtk_update_row(GtkCList *List, int row)
219
gtk_label_set_mnemonic_widget(GTK_LABEL(Label), Entry);
222
static GtkWidget *ReportTreeView;
223
static GtkListStore *ReportStore;
239
void float_formatter(GtkTreeViewColumn *tree_column,
240
GtkCellRenderer *cell,
241
GtkTreeModel *tree_model,
247
gtk_tree_model_get(tree_model, iter, (gint)data, &f, -1);
248
sprintf(text, "%.2f", f);
249
g_object_set(cell, "text", text, NULL);
252
void percent_formatter(GtkTreeViewColumn *tree_column,
253
GtkCellRenderer *cell,
254
GtkTreeModel *tree_model,
260
gtk_tree_model_get(tree_model, iter, (gint)data, &f, -1);
261
sprintf(text, "%.1f%%", f);
262
g_object_set(cell, "text", text, NULL);
265
void TreeViewCreate(void)
267
GtkCellRenderer *renderer;
268
GtkTreeViewColumn *column;
270
ReportStore = gtk_list_store_new(N_COLS,
283
ReportTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ReportStore));
285
g_signal_connect(GTK_OBJECT(ReportTreeView), "button_press_event",
286
G_CALLBACK(ReportTreeView_clicked),NULL);
288
renderer = gtk_cell_renderer_text_new ();
289
column = gtk_tree_view_column_new_with_attributes ("Hostname",
291
"text", COL_HOSTNAME,
292
"foreground", COL_COLOR,
294
gtk_tree_view_column_set_expand(column, TRUE);
295
gtk_tree_view_column_set_resizable(column, TRUE);
296
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
298
renderer = gtk_cell_renderer_text_new ();
299
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
300
column = gtk_tree_view_column_new_with_attributes ("Loss",
303
"foreground", COL_COLOR,
305
gtk_tree_view_column_set_resizable(column, TRUE);
306
gtk_tree_view_column_set_cell_data_func(column, renderer, percent_formatter, (void*)COL_LOSS, NULL);
307
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
309
renderer = gtk_cell_renderer_text_new ();
310
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
311
column = gtk_tree_view_column_new_with_attributes ("Rcv",
314
"foreground", COL_COLOR,
316
gtk_tree_view_column_set_resizable(column, TRUE);
317
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
319
renderer = gtk_cell_renderer_text_new ();
320
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
321
column = gtk_tree_view_column_new_with_attributes ("Snt",
324
"foreground", COL_COLOR,
326
gtk_tree_view_column_set_resizable(column, TRUE);
327
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
329
renderer = gtk_cell_renderer_text_new ();
330
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
331
column = gtk_tree_view_column_new_with_attributes ("Last",
334
"foreground", COL_COLOR,
336
gtk_tree_view_column_set_resizable(column, TRUE);
337
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
339
renderer = gtk_cell_renderer_text_new ();
340
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
341
column = gtk_tree_view_column_new_with_attributes ("Best",
344
"foreground", COL_COLOR,
346
gtk_tree_view_column_set_resizable(column, TRUE);
347
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
349
renderer = gtk_cell_renderer_text_new ();
350
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
351
column = gtk_tree_view_column_new_with_attributes ("Avg",
354
"foreground", COL_COLOR,
356
gtk_tree_view_column_set_resizable(column, TRUE);
357
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
359
renderer = gtk_cell_renderer_text_new ();
360
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
361
column = gtk_tree_view_column_new_with_attributes ("Worst",
364
"foreground", COL_COLOR,
366
gtk_tree_view_column_set_resizable(column, TRUE);
367
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
369
renderer = gtk_cell_renderer_text_new ();
370
g_object_set (G_OBJECT(renderer), "xalign", 1.0, NULL);
371
column = gtk_tree_view_column_new_with_attributes ("StDev",
374
"foreground", COL_COLOR,
376
gtk_tree_view_column_set_resizable(column, TRUE);
377
gtk_tree_view_column_set_cell_data_func(column, renderer, float_formatter, (void*)COL_STDEV, NULL);
378
gtk_tree_view_append_column (GTK_TREE_VIEW(ReportTreeView), column);
382
void update_tree_row(int row, GtkTreeIter *iter)
323
385
char str[256], *name;
327
387
addr = net_addr(row);
337
cmap = gtk_widget_get_colormap(ReportBody);
339
gdk_color_black(cmap, &color);
345
gdk_color_alloc (cmap, &color);
346
gtk_clist_set_foreground(List, row, &color);
348
/* changed the format type and added stdev and first/max TTL byMin */
349
/* the row - net_min() is kind of not clean, need some more work */
350
gtk_set_field(List, row - net_min(), 0, name);
352
gtk_set_field_num(List, row - net_min(), 1, "%.1f%%", net_loss(row)/1000.0);
353
gtk_set_field_num(List, row - net_min(), 2, "%.0f", net_returned(row));
354
gtk_set_field_num(List, row - net_min(), 3, "%.0f", net_xmit(row));
356
gtk_set_field_num(List, row - net_min(), 4, "%.0f", net_last(row)/1000.0);
357
gtk_set_field_num(List, row - net_min(), 5, "%.0f", net_best(row)/1000.0);
358
gtk_set_field_num(List, row - net_min(), 6, "%.0f", net_avg(row)/1000.0);
359
gtk_set_field_num(List, row - net_min(), 7, "%.0f", net_worst(row)/1000.0);
360
gtk_set_field_num(List, row - net_min(), 8, "%.2f", net_stdev(row)/1000.0);
397
gtk_list_store_set(ReportStore, iter,
399
COL_LOSS, (float)(net_loss(row)/1000.0),
401
COL_RCV, net_returned(row),
402
COL_SNT, net_xmit(row),
404
COL_LAST, net_last(row)/1000,
405
COL_BEST, net_best(row)/1000,
406
COL_AVG, net_avg(row)/1000,
407
COL_WORST, net_worst(row)/1000,
408
COL_STDEV, (float)(net_stdev(row)/1000.0),
410
COL_COLOR, net_up(row) ? "black" : "red",
364
415
void gtk_redraw(void)
366
int at = net_min(); /* changed from 0 to net_min for TTL stuff byMin */
367
417
int max = net_max();
369
gtk_clist_freeze(GTK_CLIST(ReportBody));
371
while(GTK_CLIST(ReportBody)->rows < max -at) { /* byMin */
372
gtk_clist_append(GTK_CLIST(ReportBody), Report_Text);
375
while(GTK_CLIST(ReportBody)->rows > max) {
376
gtk_clist_remove(GTK_CLIST(ReportBody), GTK_CLIST(ReportBody)->rows - 1);
379
/* for(at=0; at < max; at++) { replaced byMin */
380
for(; at < max; at++) {
381
gtk_update_row(GTK_CLIST(ReportBody), at);
384
gtk_clist_thaw(GTK_CLIST(ReportBody));
423
valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ReportStore), &iter);
427
update_tree_row(row++, &iter);
428
valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(ReportStore), &iter);
430
valid = gtk_list_store_remove(ReportStore, &iter);
434
gtk_list_store_append(ReportStore, &iter);
435
update_tree_row(row++, &iter);
459
510
net_send_batch();
460
gtk_timeout_remove (tag);
511
g_source_remove (tag);
461
512
gtk_add_ping_timeout ();
466
void gtk_net_data(UNUSED gpointer data, UNUSED gint fd, UNUSED GdkInputCondition cond)
517
gboolean gtk_net_data(UNUSED GIOChannel *channel, UNUSED GIOCondition cond, UNUSED gpointer data)
468
519
net_process_return();
472
void gtk_dns_data(UNUSED gpointer data, UNUSED gint fd, UNUSED GdkInputCondition cond)
524
gboolean gtk_dns_data(UNUSED GIOChannel *channel, UNUSED GIOCondition cond, UNUSED gpointer data)
479
532
void gtk_loop(void)
534
GIOChannel *net_iochannel, *dns_iochannel;
481
536
gtk_add_ping_timeout ();
482
gdk_input_add(net_waitfd(), GDK_INPUT_READ, gtk_net_data, NULL);
483
gdk_input_add(dns_waitfd(), GDK_INPUT_READ, gtk_dns_data, NULL);
538
net_iochannel = g_io_channel_unix_new(net_waitfd());
539
g_io_add_watch(net_iochannel, G_IO_IN, gtk_net_data, NULL);
540
dns_iochannel = g_io_channel_unix_new(dns_waitfd());
541
g_io_add_watch(dns_iochannel, G_IO_IN, gtk_dns_data, NULL);
546
gboolean NewDestination_activate(GtkWidget *widget, gpointer data)
549
GtkTreePath *path = (GtkTreePath*)data;
551
hostname = getSelectedHost(path);
553
gtk_entry_set_text (GTK_ENTRY(Entry), hostname);
554
Host_activate(Entry, NULL);
561
gboolean Copy_activate(GtkWidget *widget, gpointer data)
564
GtkTreePath *path = (GtkTreePath*)data;
566
hostname = getSelectedHost(path);
567
if (hostname != NULL) {
568
GtkClipboard *clipboard;
570
clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
571
gtk_clipboard_set_text(clipboard, hostname, -1);
573
clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
574
gtk_clipboard_set_text(clipboard, hostname, -1);
582
gchar *getSelectedHost(GtkTreePath *path)
587
if (gtk_tree_model_get_iter(GTK_TREE_MODEL(ReportStore), &iter, path)) {
588
gtk_tree_model_get (GTK_TREE_MODEL(ReportStore), &iter, COL_HOSTNAME, &name, -1);
590
gtk_tree_path_free(path);
595
gboolean ReportTreeView_clicked(GtkWidget *Tree, GdkEventButton *event)
597
GtkWidget* popup_menu;
598
GtkWidget* copy_item;
599
GtkWidget* newdestination_item;
602
if (event->type != GDK_BUTTON_PRESS || event->button != 3)
605
if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(ReportTreeView),
606
event->x, event->y, &path, NULL, NULL, NULL))
609
gtk_tree_view_set_cursor(GTK_TREE_VIEW(ReportTreeView), path, NULL, FALSE);
611
// Single right click: prepare and show the popup menu
612
popup_menu = gtk_menu_new ();
614
copy_item = gtk_menu_item_new_with_label ("Copy to clipboard");
615
newdestination_item = gtk_menu_item_new_with_label ("Set as new destination");
617
gtk_menu_append (GTK_MENU (popup_menu), copy_item);
618
gtk_menu_append (GTK_MENU (popup_menu), newdestination_item);
620
g_signal_connect(GTK_OBJECT(copy_item),"activate",
621
GTK_SIGNAL_FUNC(Copy_activate), path);
623
g_signal_connect(GTK_OBJECT(newdestination_item),"activate",
624
GTK_SIGNAL_FUNC(NewDestination_activate), path);
626
gtk_widget_show (copy_item);
627
gtk_widget_show (newdestination_item);
629
gtk_menu_popup (GTK_MENU(popup_menu), NULL, NULL, NULL, NULL,