~ubuntu-branches/debian/squeeze/putty/squeeze

« back to all changes in this revision

Viewing changes to unix/gtkdlg.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2008-05-28 09:28:32 UTC
  • mfrom: (4.1.4 hardy)
  • Revision ID: james.westby@ubuntu.com-20080528092832-88epkb3d4s1zsw61
Tags: 0.60-3
* Move putty to Applications/Network/Communication menu sub-section.
* Use dh_desktop.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
#include <X11/Xutil.h>
23
23
 
24
24
#include "gtkcols.h"
25
 
#include "gtkpanel.h"
26
25
 
27
26
#ifdef TESTMODE
28
27
#define PUTTY_DO_GLOBALS               /* actually _define_ globals */
55
54
    GtkWidget *menu;          /* for optionmenu (==droplist) */
56
55
    GtkWidget *optmenu;       /* also for optionmenu */
57
56
    GtkWidget *text;          /* for text */
 
57
    GtkWidget *label;         /* for dlg_label_change */
58
58
    GtkAdjustment *adj;       /* for the scrollbar in a list box */
59
59
    guint textsig;
 
60
    int nclicks;
60
61
};
61
62
 
62
63
struct dlgparam {
90
91
                             gpointer data);
91
92
static void shortcut_add(struct Shortcuts *scs, GtkWidget *labelw,
92
93
                         int chr, int action, void *ptr);
 
94
static void shortcut_highlight(GtkWidget *label, int chr);
93
95
static int listitem_single_key(GtkWidget *item, GdkEventKey *event,
94
96
                               gpointer data);
95
97
static int listitem_multi_key(GtkWidget *item, GdkEventKey *event,
96
98
                                 gpointer data);
97
 
static int listitem_button(GtkWidget *item, GdkEventButton *event,
98
 
                            gpointer data);
 
99
static int listitem_button_press(GtkWidget *item, GdkEventButton *event,
 
100
                                 gpointer data);
 
101
static int listitem_button_release(GtkWidget *item, GdkEventButton *event,
 
102
                                   gpointer data);
99
103
static void menuitem_activate(GtkMenuItem *item, gpointer data);
100
104
static void coloursel_ok(GtkButton *button, gpointer data);
101
105
static void coloursel_cancel(GtkButton *button, gpointer data);
438
442
        gtk_signal_connect(GTK_OBJECT(listitem), "focus_in_event",
439
443
                           GTK_SIGNAL_FUNC(widget_focus), dp);
440
444
        gtk_signal_connect(GTK_OBJECT(listitem), "button_press_event",
441
 
                           GTK_SIGNAL_FUNC(listitem_button), dp);
 
445
                           GTK_SIGNAL_FUNC(listitem_button_press), dp);
 
446
        gtk_signal_connect(GTK_OBJECT(listitem), "button_release_event",
 
447
                           GTK_SIGNAL_FUNC(listitem_button_release), dp);
442
448
        gtk_object_set_data(GTK_OBJECT(listitem), "user-data",
443
449
                            GINT_TO_POINTER(id));
444
450
    } else {
549
555
    if (uc->optmenu) {
550
556
        gtk_option_menu_set_history(GTK_OPTION_MENU(uc->optmenu), index);
551
557
    } else {
 
558
        int nitems;
 
559
        GList *items;
 
560
        gdouble newtop, newbot;
 
561
 
552
562
        gtk_list_select_item(GTK_LIST(uc->list), index);
 
563
 
 
564
        /*
 
565
         * Scroll the list box if necessary to ensure the newly
 
566
         * selected item is visible.
 
567
         */
 
568
        items = gtk_container_children(GTK_CONTAINER(uc->list));
 
569
        nitems = g_list_length(items);
 
570
        if (nitems > 0) {
 
571
            int modified = FALSE;
 
572
            g_list_free(items);
 
573
            newtop = uc->adj->lower +
 
574
                (uc->adj->upper - uc->adj->lower) * index / nitems;
 
575
            newbot = uc->adj->lower +
 
576
                (uc->adj->upper - uc->adj->lower) * (index+1) / nitems;
 
577
            if (uc->adj->value > newtop) {
 
578
                modified = TRUE;
 
579
                uc->adj->value = newtop;
 
580
            } else if (uc->adj->value < newbot - uc->adj->page_size) {
 
581
                modified = TRUE;
 
582
                uc->adj->value = newbot - uc->adj->page_size;
 
583
            }
 
584
            if (modified)
 
585
                gtk_adjustment_value_changed(uc->adj);
 
586
        }
553
587
    }
554
588
}
555
589
 
564
598
    gtk_label_set_text(GTK_LABEL(uc->text), text);
565
599
}
566
600
 
 
601
void dlg_label_change(union control *ctrl, void *dlg, char const *text)
 
602
{
 
603
    struct dlgparam *dp = (struct dlgparam *)dlg;
 
604
    struct uctrl *uc = dlg_find_byctrl(dp, ctrl);
 
605
 
 
606
    switch (uc->ctrl->generic.type) {
 
607
      case CTRL_BUTTON:
 
608
        gtk_label_set_text(GTK_LABEL(uc->toplevel), text);
 
609
        shortcut_highlight(uc->toplevel, ctrl->button.shortcut);
 
610
        break;
 
611
      case CTRL_CHECKBOX:
 
612
        gtk_label_set_text(GTK_LABEL(uc->toplevel), text);
 
613
        shortcut_highlight(uc->toplevel, ctrl->checkbox.shortcut);
 
614
        break;
 
615
      case CTRL_RADIO:
 
616
        gtk_label_set_text(GTK_LABEL(uc->label), text);
 
617
        shortcut_highlight(uc->label, ctrl->radio.shortcut);
 
618
        break;
 
619
      case CTRL_EDITBOX:
 
620
        gtk_label_set_text(GTK_LABEL(uc->label), text);
 
621
        shortcut_highlight(uc->label, ctrl->editbox.shortcut);
 
622
        break;
 
623
      case CTRL_FILESELECT:
 
624
        gtk_label_set_text(GTK_LABEL(uc->label), text);
 
625
        shortcut_highlight(uc->label, ctrl->fileselect.shortcut);
 
626
        break;
 
627
      case CTRL_FONTSELECT:
 
628
        gtk_label_set_text(GTK_LABEL(uc->label), text);
 
629
        shortcut_highlight(uc->label, ctrl->fontselect.shortcut);
 
630
        break;
 
631
      case CTRL_LISTBOX:
 
632
        gtk_label_set_text(GTK_LABEL(uc->label), text);
 
633
        shortcut_highlight(uc->label, ctrl->listbox.shortcut);
 
634
        break;
 
635
      default:
 
636
        assert(!"This shouldn't happen");
 
637
        break;
 
638
    }
 
639
}
 
640
 
567
641
void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn)
568
642
{
569
643
    struct dlgparam *dp = (struct dlgparam *)dlg;
1014
1088
    return listitem_key(item, event, data, TRUE);
1015
1089
}
1016
1090
 
1017
 
static int listitem_button(GtkWidget *item, GdkEventButton *event,
1018
 
                            gpointer data)
1019
 
{
1020
 
    struct dlgparam *dp = (struct dlgparam *)data;
1021
 
    if (event->type == GDK_2BUTTON_PRESS ||
1022
 
        event->type == GDK_3BUTTON_PRESS) {
1023
 
        struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item));
 
1091
static int listitem_button_press(GtkWidget *item, GdkEventButton *event,
 
1092
                                 gpointer data)
 
1093
{
 
1094
    struct dlgparam *dp = (struct dlgparam *)data;
 
1095
    struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item));
 
1096
    switch (event->type) {
 
1097
    default:
 
1098
    case GDK_BUTTON_PRESS: uc->nclicks = 1; break;
 
1099
    case GDK_2BUTTON_PRESS: uc->nclicks = 2; break;
 
1100
    case GDK_3BUTTON_PRESS: uc->nclicks = 3; break;
 
1101
    }
 
1102
    return FALSE;
 
1103
}
 
1104
 
 
1105
static int listitem_button_release(GtkWidget *item, GdkEventButton *event,
 
1106
                                   gpointer data)
 
1107
{
 
1108
    struct dlgparam *dp = (struct dlgparam *)data;
 
1109
    struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item));
 
1110
    if (uc->nclicks>1) {
1024
1111
        uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION);
1025
1112
        return TRUE;
1026
1113
    }
1297
1384
        uc->buttons = NULL;
1298
1385
        uc->entry = uc->list = uc->menu = NULL;
1299
1386
        uc->button = uc->optmenu = uc->text = NULL;
 
1387
        uc->label = NULL;
 
1388
        uc->nclicks = 0;
1300
1389
 
1301
1390
        switch (ctrl->generic.type) {
1302
1391
          case CTRL_BUTTON:
1342
1431
                    gtk_widget_show(label);
1343
1432
                    shortcut_add(scs, label, ctrl->radio.shortcut,
1344
1433
                                 SHORTCUT_UCTRL, uc);
 
1434
                    uc->label = label;
1345
1435
                }
1346
1436
                percentages = g_new(gint, ctrl->radio.ncolumns);
1347
1437
                for (i = 0; i < ctrl->radio.ncolumns; i++) {
1446
1536
                    gtk_widget_show(w);
1447
1537
 
1448
1538
                    w = container;
 
1539
                    uc->label = label;
1449
1540
                }
1450
1541
                gtk_signal_connect(GTK_OBJECT(uc->entry), "focus_out_event",
1451
1542
                                   GTK_SIGNAL_FUNC(editbox_lostfocus), dp);
1474
1565
                                  ctrl->fileselect.shortcut :
1475
1566
                                  ctrl->fontselect.shortcut),
1476
1567
                                 SHORTCUT_UCTRL, uc);
 
1568
                    uc->label = ww;
1477
1569
                }
1478
1570
 
1479
1571
                uc->entry = ww = gtk_entry_new();
1611
1703
                shortcut_add(scs, label, ctrl->listbox.shortcut,
1612
1704
                             SHORTCUT_UCTRL, uc);
1613
1705
                w = container;
 
1706
                uc->label = label;
1614
1707
            }
1615
1708
            break;
1616
1709
          case CTRL_TEXT:
1666
1759
 
1667
1760
struct selparam {
1668
1761
    struct dlgparam *dp;
1669
 
    Panels *panels;
 
1762
    GtkNotebook *panels;
1670
1763
    GtkWidget *panel, *treeitem;
1671
1764
    struct Shortcuts shortcuts;
1672
1765
};
1674
1767
static void treeitem_sel(GtkItem *item, gpointer data)
1675
1768
{
1676
1769
    struct selparam *sp = (struct selparam *)data;
1677
 
 
1678
 
    panels_switch_to(sp->panels, sp->panel);
 
1770
    gint page_num;
 
1771
 
 
1772
    page_num = gtk_notebook_page_num(sp->panels, sp->panel);
 
1773
    gtk_notebook_set_page(sp->panels, page_num);
 
1774
 
 
1775
    dlg_refresh(NULL, sp->dp);
1679
1776
 
1680
1777
    sp->dp->shortcuts = &sp->shortcuts;
1681
1778
    sp->dp->currtreeitem = sp->treeitem;
1896
1993
    return FALSE;
1897
1994
}
1898
1995
 
 
1996
static void shortcut_highlight(GtkWidget *labelw, int chr)
 
1997
{
 
1998
    GtkLabel *label = GTK_LABEL(labelw);
 
1999
    gchar *currstr, *pattern;
 
2000
    int i;
 
2001
 
 
2002
    gtk_label_get(label, &currstr);
 
2003
    for (i = 0; currstr[i]; i++)
 
2004
        if (tolower((unsigned char)currstr[i]) == chr) {
 
2005
            GtkRequisition req;
 
2006
 
 
2007
            pattern = dupprintf("%*s_", i, "");
 
2008
 
 
2009
            gtk_widget_size_request(GTK_WIDGET(label), &req);
 
2010
            gtk_label_set_pattern(label, pattern);
 
2011
            gtk_widget_set_usize(GTK_WIDGET(label), -1, req.height);
 
2012
 
 
2013
            sfree(pattern);
 
2014
            break;
 
2015
        }
 
2016
}
 
2017
 
1899
2018
void shortcut_add(struct Shortcuts *scs, GtkWidget *labelw,
1900
2019
                  int chr, int action, void *ptr)
1901
2020
{
1902
 
    GtkLabel *label = GTK_LABEL(labelw);
1903
 
    gchar *currstr, *pattern;
1904
 
    int i;
1905
 
 
1906
2021
    if (chr == NO_SHORTCUT)
1907
2022
        return;
1908
2023
 
1920
2035
        scs->sc[chr].uc = (struct uctrl *)ptr;
1921
2036
    }
1922
2037
 
1923
 
    gtk_label_get(label, &currstr);
1924
 
    for (i = 0; currstr[i]; i++)
1925
 
        if (tolower((unsigned char)currstr[i]) == chr) {
1926
 
            GtkRequisition req;
1927
 
 
1928
 
            pattern = dupprintf("%*s_", i, "");
1929
 
 
1930
 
            gtk_widget_size_request(GTK_WIDGET(label), &req);
1931
 
            gtk_label_set_pattern(label, pattern);
1932
 
            gtk_widget_set_usize(GTK_WIDGET(label), -1, req.height);
1933
 
 
1934
 
            sfree(pattern);
1935
 
            break;
1936
 
        }
 
2038
    shortcut_highlight(labelw, chr);
1937
2039
}
1938
2040
 
1939
2041
int get_listitemheight(void)
1956
2058
    GtkTreeItem *treeitemlevels[8];
1957
2059
    GtkTree *treelevels[8];
1958
2060
    struct dlgparam dp;
1959
 
    struct sesslist sl;
1960
2061
    struct Shortcuts scs;
1961
2062
 
1962
2063
    struct selparam *selparams = NULL;
1964
2065
 
1965
2066
    dlg_init(&dp);
1966
2067
 
1967
 
    get_sesslist(&sl, TRUE);
1968
 
 
1969
2068
    listitemheight = get_listitemheight();
1970
2069
 
1971
2070
    for (index = 0; index < lenof(scs.sc); index++) {
1975
2074
    window = gtk_dialog_new();
1976
2075
 
1977
2076
    ctrlbox = ctrl_new_box();
1978
 
    setup_config_box(ctrlbox, &sl, midsession, cfg->protocol, protcfginfo);
1979
 
    unix_setup_config_box(ctrlbox, midsession);
 
2077
    setup_config_box(ctrlbox, midsession, cfg->protocol, protcfginfo);
 
2078
    unix_setup_config_box(ctrlbox, midsession, cfg->protocol);
1980
2079
    gtk_setup_config_box(ctrlbox, midsession, window);
1981
2080
 
1982
2081
    gtk_window_set_title(GTK_WINDOW(window), title);
2001
2100
    shortcut_add(&scs, label, 'g', SHORTCUT_TREE, tree);
2002
2101
    gtk_tree_set_view_mode(GTK_TREE(tree), GTK_TREE_VIEW_ITEM);
2003
2102
    gtk_tree_set_selection_mode(GTK_TREE(tree), GTK_SELECTION_BROWSE);
2004
 
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll),
2005
 
                                          tree);
2006
 
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treescroll),
2007
 
                                   GTK_POLICY_NEVER,
2008
 
                                   GTK_POLICY_AUTOMATIC);
2009
2103
    gtk_signal_connect(GTK_OBJECT(tree), "focus",
2010
2104
                       GTK_SIGNAL_FUNC(tree_focus), &dp);
2011
 
    gtk_widget_show(tree);
2012
2105
    gtk_widget_show(treescroll);
2013
2106
    gtk_box_pack_start(GTK_BOX(vbox), treescroll, TRUE, TRUE, 0);
2014
 
    panels = panels_new();
 
2107
    panels = gtk_notebook_new();
 
2108
    gtk_notebook_set_show_tabs(GTK_NOTEBOOK(panels), FALSE);
 
2109
    gtk_notebook_set_show_border(GTK_NOTEBOOK(panels), FALSE);
2015
2110
    gtk_box_pack_start(GTK_BOX(hbox), panels, TRUE, TRUE, 0);
2016
2111
    gtk_widget_show(panels);
2017
2112
 
2059
2154
                        gtk_tree_item_set_subtree
2060
2155
                            (treeitemlevels[j-1],
2061
2156
                             GTK_WIDGET(treelevels[j-1]));
2062
 
                        gtk_tree_item_expand(treeitemlevels[j-1]);
 
2157
                        if (j < 2)
 
2158
                            gtk_tree_item_expand(treeitemlevels[j-1]);
 
2159
                        else
 
2160
                            gtk_tree_item_collapse(treeitemlevels[j-1]);
2063
2161
                    }
2064
2162
                    gtk_tree_append(treelevels[j-1], treeitem);
2065
2163
                } else {
2081
2179
                first = (panelvbox == NULL);
2082
2180
 
2083
2181
                panelvbox = gtk_vbox_new(FALSE, 4);
2084
 
                gtk_container_add(GTK_CONTAINER(panels), panelvbox);
 
2182
                gtk_widget_show(panelvbox);
 
2183
                gtk_notebook_append_page(GTK_NOTEBOOK(panels), panelvbox,
 
2184
                                         NULL);
2085
2185
                if (first) {
2086
 
                    panels_switch_to(PANELS(panels), panelvbox);
 
2186
                    gint page_num;
 
2187
 
 
2188
                    page_num = gtk_notebook_page_num(GTK_NOTEBOOK(panels),
 
2189
                                                     panelvbox);
 
2190
                    gtk_notebook_set_page(GTK_NOTEBOOK(panels), page_num);
2087
2191
                    gtk_tree_select_child(GTK_TREE(tree), treeitem);
2088
2192
                }
2089
2193
 
2093
2197
                                        struct selparam);
2094
2198
                }
2095
2199
                selparams[nselparams].dp = &dp;
2096
 
                selparams[nselparams].panels = PANELS(panels);
 
2200
                selparams[nselparams].panels = GTK_NOTEBOOK(panels);
2097
2201
                selparams[nselparams].panel = panelvbox;
2098
2202
                selparams[nselparams].shortcuts = scs;   /* structure copy */
2099
2203
                selparams[nselparams].treeitem = treeitem;
2128
2232
    dp.retval = 0;
2129
2233
    dp.window = window;
2130
2234
 
 
2235
    {
 
2236
        /* in gtkwin.c */
 
2237
        extern void set_window_icon(GtkWidget *window,
 
2238
                                    const char *const *const *icon,
 
2239
                                    int n_icon);
 
2240
        extern const char *const *const cfg_icon[];
 
2241
        extern const int n_cfg_icon;
 
2242
        set_window_icon(window, cfg_icon, n_cfg_icon);
 
2243
    }
 
2244
 
 
2245
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll),
 
2246
                                          tree);
 
2247
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treescroll),
 
2248
                                   GTK_POLICY_NEVER,
 
2249
                                   GTK_POLICY_AUTOMATIC);
 
2250
    gtk_widget_show(tree);
 
2251
 
2131
2252
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
2132
2253
    gtk_widget_show(window);
2133
2254
 
2161
2282
 
2162
2283
    gtk_main();
2163
2284
 
2164
 
    get_sesslist(&sl, FALSE);
2165
2285
    dlg_cleanup(&dp);
2166
2286
    sfree(selparams);
2167
2287
 
2424
2544
    char *title;
2425
2545
 
2426
2546
    char *licence =
2427
 
        "Copyright 1997-2005 Simon Tatham.\n\n"
 
2547
        "Copyright 1997-2007 Simon Tatham.\n\n"
2428
2548
 
2429
2549
        "Portions copyright Robert de Bath, Joris van Rantwijk, Delian "
2430
2550
        "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas "
2431
 
        "Barry, Justin Bradford, Ben Harris, Malcolm Smith, Markus Kuhn, "
2432
 
        "and CORE SDI S.A.\n\n"
 
2551
        "Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, "
 
2552
        "Markus Kuhn, and CORE SDI S.A.\n\n"
2433
2553
 
2434
2554
        "Permission is hereby granted, free of charge, to any person "
2435
2555
        "obtaining a copy of this software and associated documentation "
2505
2625
                       w, FALSE, FALSE, 5);
2506
2626
    gtk_widget_show(w);
2507
2627
 
2508
 
    w = gtk_label_new("Copyright 1997-2005 Simon Tatham. All rights reserved");
 
2628
    w = gtk_label_new("Copyright 1997-2007 Simon Tatham. All rights reserved");
2509
2629
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox),
2510
2630
                       w, FALSE, FALSE, 5);
2511
2631
    gtk_widget_show(w);