diff options
author | C. Davis <cd.rattan@gmail.com> | 2012-07-27 18:39:54 -0700 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2013-04-29 13:05:58 +0200 |
commit | 5e0f4be8e2123ccf9f6beece95b187cd2676ff24 (patch) | |
tree | 55f8e7b41b2ee46432365c9c720eaf3c25a8cf01 | |
parent | 6155abcf82f0bb03e62f7fc4b1df3f7260337bc3 (diff) | |
download | samba-5e0f4be8e2123ccf9f6beece95b187cd2676ff24.tar.gz samba-5e0f4be8e2123ccf9f6beece95b187cd2676ff24.tar.bz2 samba-5e0f4be8e2123ccf9f6beece95b187cd2676ff24.zip |
regedit: Improve calculation for centering dialogs.
Add some sanity checks to avoid crashing.
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
-rw-r--r-- | source3/utils/regedit_dialog.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/source3/utils/regedit_dialog.c b/source3/utils/regedit_dialog.c index 419c4081e0..b5e41ee901 100644 --- a/source3/utils/regedit_dialog.c +++ b/source3/utils/regedit_dialog.c @@ -86,15 +86,40 @@ fail: } -struct dialog *dialog_center_new(TALLOC_CTX *ctx, const char *title, int nlines, - int ncols, WINDOW *below) +static void center_dialog_above_window(WINDOW *below, int *nlines, int *ncols, + int *y, int *x) { - int y, x, maxy, maxx; + int maxy, maxx; + int centery, centerx; getmaxyx(below, maxy, maxx); - y = maxy / 2 - nlines; - x = maxx / 2 - ncols; + centery = maxy / 2; + centerx = maxx / 2; + *y = 0; + *x = 0; + + if (*nlines > maxy) { + *nlines = maxy; + } + if (*ncols > maxx) { + *ncols = maxx; + } + + if (*nlines < centery) { + *y = centery - *nlines; + } + if (*ncols < centerx) { + *x = centerx - *ncols; + } +} + +struct dialog *dialog_center_new(TALLOC_CTX *ctx, const char *title, int nlines, + int ncols, WINDOW *below) +{ + int y, x; + + center_dialog_above_window(below, &nlines, &ncols, &y, &x); return dialog_new(ctx, title, nlines, ncols, y, x); } @@ -161,12 +186,9 @@ struct dialog *dialog_choice_center_new(TALLOC_CTX *ctx, const char *title, const char **choices, int nlines, int ncols, WINDOW *below) { - int y, x, maxy, maxx; - - getmaxyx(below, maxy, maxx); + int y, x; - y = maxy / 2 - nlines; - x = maxx / 2 - ncols; + center_dialog_above_window(below, &nlines, &ncols, &y, &x); return dialog_choice_new(ctx, title, choices, nlines, ncols, y, x); } |