It's a new year (and we've even made a code checkin).
[u/mdw/putty] / unix / gtkdlg.c
index 875512a..bdfe3e5 100644 (file)
@@ -57,6 +57,7 @@ struct uctrl {
     GtkWidget *label;         /* for dlg_label_change */
     GtkAdjustment *adj;       /* for the scrollbar in a list box */
     guint textsig;
+    int nclicks;
 };
 
 struct dlgparam {
@@ -95,8 +96,10 @@ static int listitem_single_key(GtkWidget *item, GdkEventKey *event,
                                gpointer data);
 static int listitem_multi_key(GtkWidget *item, GdkEventKey *event,
                                  gpointer data);
-static int listitem_button(GtkWidget *item, GdkEventButton *event,
-                           gpointer data);
+static int listitem_button_press(GtkWidget *item, GdkEventButton *event,
+                                gpointer data);
+static int listitem_button_release(GtkWidget *item, GdkEventButton *event,
+                                  gpointer data);
 static void menuitem_activate(GtkMenuItem *item, gpointer data);
 static void coloursel_ok(GtkButton *button, gpointer data);
 static void coloursel_cancel(GtkButton *button, gpointer data);
@@ -439,7 +442,9 @@ void dlg_listbox_addwithid(union control *ctrl, void *dlg,
         gtk_signal_connect(GTK_OBJECT(listitem), "focus_in_event",
                            GTK_SIGNAL_FUNC(widget_focus), dp);
        gtk_signal_connect(GTK_OBJECT(listitem), "button_press_event",
-                          GTK_SIGNAL_FUNC(listitem_button), dp);
+                          GTK_SIGNAL_FUNC(listitem_button_press), dp);
+       gtk_signal_connect(GTK_OBJECT(listitem), "button_release_event",
+                          GTK_SIGNAL_FUNC(listitem_button_release), dp);
        gtk_object_set_data(GTK_OBJECT(listitem), "user-data",
                            GINT_TO_POINTER(id));
     } else {
@@ -1083,13 +1088,26 @@ static int listitem_multi_key(GtkWidget *item, GdkEventKey *event,
     return listitem_key(item, event, data, TRUE);
 }
 
-static int listitem_button(GtkWidget *item, GdkEventButton *event,
-                           gpointer data)
+static int listitem_button_press(GtkWidget *item, GdkEventButton *event,
+                                gpointer data)
+{
+    struct dlgparam *dp = (struct dlgparam *)data;
+    struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item));
+    switch (event->type) {
+    default:
+    case GDK_BUTTON_PRESS: uc->nclicks = 1; break;
+    case GDK_2BUTTON_PRESS: uc->nclicks = 2; break;
+    case GDK_3BUTTON_PRESS: uc->nclicks = 3; break;
+    }
+    return FALSE;
+}
+
+static int listitem_button_release(GtkWidget *item, GdkEventButton *event,
+                                   gpointer data)
 {
     struct dlgparam *dp = (struct dlgparam *)data;
-    if (event->type == GDK_2BUTTON_PRESS ||
-       event->type == GDK_3BUTTON_PRESS) {
-       struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item));
+    struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item));
+    if (uc->nclicks>1) {
        uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION);
         return TRUE;
     }
@@ -1367,6 +1385,7 @@ GtkWidget *layout_ctrls(struct dlgparam *dp, struct Shortcuts *scs,
        uc->entry = uc->list = uc->menu = NULL;
        uc->button = uc->optmenu = uc->text = NULL;
        uc->label = NULL;
+        uc->nclicks = 0;
 
         switch (ctrl->generic.type) {
           case CTRL_BUTTON:
@@ -2081,14 +2100,8 @@ int do_config_box(const char *title, Config *cfg, int midsession,
     shortcut_add(&scs, label, 'g', SHORTCUT_TREE, tree);
     gtk_tree_set_view_mode(GTK_TREE(tree), GTK_TREE_VIEW_ITEM);
     gtk_tree_set_selection_mode(GTK_TREE(tree), GTK_SELECTION_BROWSE);
-    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll),
-                                         tree);
-    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treescroll),
-                                  GTK_POLICY_NEVER,
-                                  GTK_POLICY_AUTOMATIC);
     gtk_signal_connect(GTK_OBJECT(tree), "focus",
                       GTK_SIGNAL_FUNC(tree_focus), &dp);
-    gtk_widget_show(tree);
     gtk_widget_show(treescroll);
     gtk_box_pack_start(GTK_BOX(vbox), treescroll, TRUE, TRUE, 0);
     panels = gtk_notebook_new();
@@ -2141,7 +2154,10 @@ int do_config_box(const char *title, Config *cfg, int midsession,
                        gtk_tree_item_set_subtree
                            (treeitemlevels[j-1],
                             GTK_WIDGET(treelevels[j-1]));
-                       gtk_tree_item_expand(treeitemlevels[j-1]);
+                        if (j < 2)
+                            gtk_tree_item_expand(treeitemlevels[j-1]);
+                        else
+                            gtk_tree_item_collapse(treeitemlevels[j-1]);
                    }
                    gtk_tree_append(treelevels[j-1], treeitem);
                } else {
@@ -2226,6 +2242,13 @@ int do_config_box(const char *title, Config *cfg, int midsession,
        set_window_icon(window, cfg_icon, n_cfg_icon);
     }
 
+    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll),
+                                         tree);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treescroll),
+                                  GTK_POLICY_NEVER,
+                                  GTK_POLICY_AUTOMATIC);
+    gtk_widget_show(tree);
+
     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
     gtk_widget_show(window);
 
@@ -2521,7 +2544,7 @@ static void licence_clicked(GtkButton *button, gpointer data)
     char *title;
 
     char *licence =
-       "Copyright 1997-2007 Simon Tatham.\n\n"
+       "Copyright 1997-2008 Simon Tatham.\n\n"
 
        "Portions copyright Robert de Bath, Joris van Rantwijk, Delian "
        "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas "
@@ -2602,7 +2625,7 @@ void about_box(void *window)
                       w, FALSE, FALSE, 5);
     gtk_widget_show(w);
 
-    w = gtk_label_new("Copyright 1997-2007 Simon Tatham. All rights reserved");
+    w = gtk_label_new("Copyright 1997-2008 Simon Tatham. All rights reserved");
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox),
                       w, FALSE, FALSE, 5);
     gtk_widget_show(w);