X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d5410af8dd497c1fe70074eaf977e0b19f13d89c..a97cd7806569d0b993b80cd99b7902b4d1f3aeda:/unix/gtkdlg.c diff --git a/unix/gtkdlg.c b/unix/gtkdlg.c index 08474313..10138e27 100644 --- a/unix/gtkdlg.c +++ b/unix/gtkdlg.c @@ -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; - 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)); + 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; + 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 { @@ -2216,6 +2232,23 @@ int do_config_box(const char *title, Config *cfg, int midsession, dp.retval = 0; dp.window = window; + { + /* in gtkwin.c */ + extern void set_window_icon(GtkWidget *window, + const char *const *const *icon, + int n_icon); + extern const char *const *const cfg_icon[]; + extern const int n_cfg_icon; + 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); @@ -2511,7 +2544,7 @@ static void licence_clicked(GtkButton *button, gpointer data) char *title; char *licence = - "Copyright 1997-2006 Simon Tatham.\n\n" + "Copyright 1997-2007 Simon Tatham.\n\n" "Portions copyright Robert de Bath, Joris van Rantwijk, Delian " "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas " @@ -2592,7 +2625,7 @@ void about_box(void *window) w, FALSE, FALSE, 5); gtk_widget_show(w); - w = gtk_label_new("Copyright 1997-2006 Simon Tatham. All rights reserved"); + w = gtk_label_new("Copyright 1997-2007 Simon Tatham. All rights reserved"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); @@ -2696,7 +2729,7 @@ void eventlog_selection_get(GtkWidget *widget, GtkSelectionData *seldata, struct eventlog_stuff *es = (struct eventlog_stuff *)data; gtk_selection_data_set(seldata, seldata->target, 8, - es->seldata, es->sellen); + (unsigned char *)es->seldata, es->sellen); } gint eventlog_selection_clear(GtkWidget *widget, GdkEventSelection *seldata,