From 7718480a6681242f7a78090d9f1eaf5f0c2fa615 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 10 Apr 2003 08:53:43 +0000 Subject: [PATCH] Minor improvements to subsidiary window placement; with any luck the Event Log should go off the side of the screen rather less often now. git-svn-id: svn://svn.tartarus.org/sgt/putty@3088 cda61777-01e9-0310-a592-d414129be87e --- unix/gtkdlg.c | 63 +++++++++++++++++++++++++++++++++++------------------------ unix/pterm.c | 4 ++-- unix/unix.h | 4 ++-- unix/uxcfg.c | 6 +++--- unix/uxsel.c | 11 +++++++++-- 5 files changed, 53 insertions(+), 35 deletions(-) diff --git a/unix/gtkdlg.c b/unix/gtkdlg.c index e6997321..6115e49e 100644 --- a/unix/gtkdlg.c +++ b/unix/gtkdlg.c @@ -677,6 +677,35 @@ static void errmsg_button_clicked(GtkButton *button, gpointer data) gtk_widget_destroy(GTK_WIDGET(data)); } +static void set_transient_window_pos(GtkWidget *parent, GtkWidget *child) +{ + gint x, y, w, h, dx, dy; + GtkRequisition req; + gtk_window_set_position(GTK_WINDOW(child), GTK_WIN_POS_NONE); + gtk_widget_size_request(GTK_WIDGET(child), &req); + + gdk_window_get_origin(GTK_WIDGET(parent)->window, &x, &y); + gdk_window_get_size(GTK_WIDGET(parent)->window, &w, &h); + + /* + * One corner of the transient will be offset inwards, by 1/4 + * of the parent window's size, from the corresponding corner + * of the parent window. The corner will be chosen so as to + * place the transient closer to the centre of the screen; this + * should avoid transients going off the edge of the screen on + * a regular basis. + */ + if (x + w/2 < gdk_screen_width() / 2) + dx = x + w/4; /* work from left edges */ + else + dx = x + 3*w/4 - req.width; /* work from right edges */ + if (y + h/2 < gdk_screen_height() / 2) + dy = y + h/4; /* work from top edges */ + else + dy = y + 3*h/4 - req.height; /* work from bottom edges */ + gtk_widget_set_uposition(GTK_WIDGET(child), dx, dy); +} + void dlg_error_msg(void *dlg, char *msg) { struct dlgparam *dp = (struct dlgparam *)dlg; @@ -705,15 +734,7 @@ void dlg_error_msg(void *dlg, char *msg) GTK_SIGNAL_FUNC(window_destroy), NULL); gtk_window_set_modal(GTK_WINDOW(window), TRUE); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(dp->window)); - { - gint x, y, w, h, dx, dy; - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); - gdk_window_get_origin(GTK_WIDGET(dp->window)->window, &x, &y); - gdk_window_get_size(GTK_WIDGET(dp->window)->window, &w, &h); - dx = x + w/4; - dy = y + h/4; - gtk_widget_set_uposition(GTK_WIDGET(window), dx, dy); - } + set_transient_window_pos(dp->window, window); gtk_widget_show(window); gtk_main(); } @@ -1940,11 +1961,12 @@ int do_config_box(const char *title, Config *cfg) scs.sc[index].action = SHORTCUT_EMPTY; } + window = gtk_dialog_new(); + ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, &sl, FALSE, 0); - unix_setup_config_box(ctrlbox, FALSE); + unix_setup_config_box(ctrlbox, FALSE, window); - window = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(window), title); hbox = gtk_hbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), hbox, TRUE, TRUE, 0); @@ -2218,13 +2240,7 @@ int messagebox(GtkWidget *parentwin, char *title, char *msg, int minwid, ...) gtk_window_set_modal(GTK_WINDOW(window), TRUE); if (parentwin) { - gint x, y, w, h, dx, dy; - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); - gdk_window_get_origin(parentwin->window, &x, &y); - gdk_window_get_size(parentwin->window, &w, &h); - dx = x + w/4; - dy = y + h/4; - gtk_widget_set_uposition(GTK_WIDGET(window), dx, dy); + set_transient_window_pos(parentwin, window); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parentwin)); } else @@ -2419,7 +2435,7 @@ static void licence_clicked(GtkButton *button, gpointer data) sfree(title); } -void about_box(void) +void about_box(void *window) { GtkWidget *w; char *title; @@ -2467,6 +2483,7 @@ void about_box(void) w, FALSE, FALSE, 5); gtk_widget_show(w); + set_transient_window_pos(GTK_WIDGET(window), aboutbox); gtk_widget_show(aboutbox); } @@ -2582,13 +2599,7 @@ void showeventlog(void *estuff, void *parentwin) dlg_refresh(NULL, &es->dp); if (parent) { - gint x, y, w, h, dx, dy; - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); - gdk_window_get_origin(parent->window, &x, &y); - gdk_window_get_size(parent->window, &w, &h); - dx = x + w/4; - dy = y + h/4; - gtk_widget_set_uposition(GTK_WIDGET(window), dx, dy); + set_transient_window_pos(parent, window); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parent)); } else diff --git a/unix/pterm.c b/unix/pterm.c index dad013cf..a485eb72 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -2314,8 +2314,8 @@ void special_menuitem(GtkMenuItem *item, gpointer data) void about_menuitem(GtkMenuItem *item, gpointer data) { - /* struct gui_data *inst = (struct gui_data *)data; */ - about_box(); + struct gui_data *inst = (struct gui_data *)data; + about_box(inst->window); } void event_log_menuitem(GtkMenuItem *item, gpointer data) diff --git a/unix/unix.h b/unix/unix.h index 2cf462c9..3e126ea7 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -60,7 +60,7 @@ void *get_window(void *frontend); /* void * to avoid depending on gtk.h */ /* Things pterm.c needs from gtkdlg.c */ void fatal_message_box(void *window, char *msg); -void about_box(void); +void about_box(void *window); void *eventlogstuff_new(void); void showeventlog(void *estuff, void *parentwin); void logevent_dlg(void *estuff, char *string); @@ -89,7 +89,7 @@ void uxsel_input_remove(int id); /* uxcfg.c */ struct controlbox; -void unix_setup_config_box(struct controlbox *b, int midsession); +void unix_setup_config_box(struct controlbox *b, int midsession, void *window); /* * In the Unix Unicode layer, DEFAULT_CODEPAGE is a special value diff --git a/unix/uxcfg.c b/unix/uxcfg.c index 409c06c2..9b13348d 100644 --- a/unix/uxcfg.c +++ b/unix/uxcfg.c @@ -14,11 +14,11 @@ static void about_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_ACTION) { - about_box(); + about_box(ctrl->generic.context.p); } } -void unix_setup_config_box(struct controlbox *b, int midsession) +void unix_setup_config_box(struct controlbox *b, int midsession, void *win) { struct controlset *s, *s2; union control *c; @@ -30,7 +30,7 @@ void unix_setup_config_box(struct controlbox *b, int midsession) */ s = ctrl_getset(b, "", "", ""); c = ctrl_pushbutton(s, "About", 'a', HELPCTX(no_help), - about_handler, P(NULL)); + about_handler, P(win)); c->generic.column = 0; } diff --git a/unix/uxsel.c b/unix/uxsel.c index 7142acb2..0383faa6 100644 --- a/unix/uxsel.c +++ b/unix/uxsel.c @@ -115,6 +115,13 @@ int first_fd(int *state, int *rwx) int select_result(int fd, int event) { struct fd *fdstruct = find234(fds, &fd, uxsel_fd_findcmp); - assert(fdstruct != NULL); - return fdstruct->callback(fd, event); + /* + * Apparently this can sometimes be NULL. Can't see how, but I + * assume it means I need to ignore the event since it's on an + * fd I've stopped being interested in. Sigh. + */ + if (fdstruct) + return fdstruct->callback(fd, event); + else + return 1; } -- 2.11.0