resize_term
はncurses関数です。
resize_term
機能は、端末のサイズを変更しません。 ncursesは、とするサイズを変更します。
cursesによって何も表示されず(notes in the manual pageを参照)、あなたの例ではgetch
はありません。変更としてcursesには何も表示されません。
興味深いことに、PDCursesは、同じ名前(ncursesに触発されています:これらの中にいくつかあります)が異なる方法で実装されています。 pdcurses/initscr.c
のコメントからの引用:
と関数は、このことから始まる:
今度はWindowsコンソールのためにこれを呼び出す
int resize_term(int nlines, int ncols)
{
PDC_LOG(("resize_term() - called: nlines %d\n", nlines));
if (!stdscr || PDC_resize_screen(nlines, ncols) == ERR)
return ERR;
SP->lines = PDC_get_rows();
LINES = SP->lines - SP->linesrippedoff - SP->slklines;
SP->cols = COLS = PDC_get_columns();
:
int PDC_resize_screen(int nlines, int ncols)
{
SMALL_RECT rect;
COORD size, max;
if (nlines < 2 || ncols < 2)
return ERR;
max = GetLargestConsoleWindowSize(pdc_con_out);
rect.Left = rect.Top = 0;
rect.Right = ncols - 1;
if (rect.Right > max.X)
rect.Right = max.X;
rect.Bottom = nlines - 1;
if (rect.Bottom > max.Y)
rect.Bottom = max.Y;
size.X = rect.Right + 1;
size.Y = rect.Bottom + 1;
_fit_console_window(pdc_con_out, &rect);
SetConsoleScreenBufferSize(pdc_con_out, size);
_fit_console_window(pdc_con_out, &rect);
SetConsoleScreenBufferSize(pdc_con_out, size);
SetConsoleActiveScreenBuffer(pdc_con_out);
return OK;
}
あなたが見ることができるように結果は互換性のない関数です。 (同様のSDLへのポートがあります)。 PDCursesの行動に関連するいくつかの質問があります。
しかし、PDCursesは通常のcurses(またはncursesベース)との相違点を示すために<xcurses.h>
として、そのヘッダファイルをインストールします。私は質問がncursesベースについてだったと仮定し、問題はライブラリ関数が何をするかについて混乱がある:
、それは同じ2つのコールを二回作るということ奇妙です。
/* Calls SetConsoleWindowInfo with the given parameters, but fits them
if a scoll bar shrinks the maximum possible value. The rectangle
must at least fit in a half-sized window. */
static BOOL _fit_console_window(HANDLE con_out, CONST SMALL_RECT *rect)
{
SMALL_RECT run;
SHORT mx, my;
if (SetConsoleWindowInfo(con_out, TRUE, rect))
return TRUE;
run = *rect;
run.Right /= 2;
run.Bottom /= 2;
mx = run.Right;
my = run.Bottom;
if (!SetConsoleWindowInfo(con_out, TRUE, &run))
return FALSE;
for (run.Right = rect->Right; run.Right >= mx; run.Right--)
if (SetConsoleWindowInfo(con_out, TRUE, &run))
break;
if (run.Right < mx)
return FALSE;
for (run.Bottom = rect->Bottom; run.Bottom >= my; run.Bottom--)
if (SetConsoleWindowInfo(con_out, TRUE, &run))
return TRUE;
return FALSE;
}
コードが見えます...奇数、二度同じことをやってほか:かない - PDCurses機能は、彼らが収まるまで、与えられた値を減らし、おそらくいくつかの試みになります。SetConsoleWindowInfoというMSDNの説明を参照すると、rectangleパラメータはで、パラメータ(変更されていません)です。パラメータを通して続き、それが要求されたサイズを取って、そして
- 要求されたサイズを設定、または
- は半分の初期サイズにまで列を削減しながら、要求されたラインを設定し、または
- セットに続いてしようとしています要求された列を削除しながら、行を初期サイズの半分に縮小します。
多分これが2回実行されるのは、コンソールAPIに不確定な動作があるからです。コード内のコメントは役に立たない。
もしあなたがWin64を使っているのであれば、いくつかのunix-portの代わりに標準のコンソール機能を使うのはなぜですか? – BitTickler