Minor improvements to subsidiary window placement; with any luck the
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 10 Apr 2003 08:53:43 +0000 (08:53 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 10 Apr 2003 08:53:43 +0000 (08:53 +0000)
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
unix/pterm.c
unix/unix.h
unix/uxcfg.c
unix/uxsel.c

index e699732..6115e49 100644 (file)
@@ -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
index dad013c..a485eb7 100644 (file)
@@ -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)
index 2cf462c..3e126ea 100644 (file)
@@ -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
index 409c06c..9b13348 100644 (file)
@@ -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;
     }
 
index 7142acb..0383faa 100644 (file)
@@ -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;
 }