getmaxyx () возвращает тот же размер, а getch () не возвращает код ключа при изменении размера терминала - PullRequest
0 голосов
/ 10 февраля 2019

Я встречал странные проблемы между C и Go по поводу ncurses.

Проблемы ниже

  • Тот же код, реализованный в C и Go, работает по-разному.Код Go не работает, как задумано.
    • getmaxyx () (getmaxy и getmaxx) при Go всегда возвращает исходный размер, даже после изменения размера терминала.
    • Функция getch () не возвращает код ключа при изменении размера терминала.

Мои коды C для ncurses приведены ниже.

#include <stdio.h>
#include <stdbool.h>

#include <locale.h>
#include <ncursesw/curses.h>

void draw(int count, int ch);

int main(void)
{
    setlocale(LC_ALL, "");

    initscr();

    timeout(50);

    noecho();
    cbreak();
    curs_set(0);

    start_color();

    keypad(stdscr, true);

    int count = 0;
    draw(count, 0);

    for (;;) {
        int ch = getch();
        if (ch < 0) {
            continue;
        }

        count++;
        draw(count, ch);
    }
}

void draw(int count, int ch)
{
    int y, x;
    getmaxyx(stdscr, y, x);

    char s[64];
    sprintf(s, "count=%5d y=%d x=%d ch=%d           ", count, y, x, ch);

    mvwaddstr(stdscr, 1, 1, s);
    wrefresh(stdscr); // 안해도 갱신 되네?
}

Мои коды go для ncurses приведены ниже.

package main

// #include <stdlib.h>
// #include <locale.h>
// #include <ncursesw/curses.h>
// #cgo LDFLAGS: -lncursesw
import "C"

import "unsafe"
import "fmt"

func main() {
    // C Code : setlocale(LC_ALL, "");
    {
        _s := C.CString("")
        defer C.free(unsafe.Pointer(_s))

        C.setlocale(C.LC_ALL, _s)
    }

    C.initscr()

    C.timeout(50)

    C.noecho()
    C.cbreak()
    C.curs_set(C.int(0))

    C.start_color()

    C.keypad(C.stdscr, C.bool(true))

    var count int = 0
    draw(count, 0)

    for {
        ch := int(C.getch())
        if ch < 0 {
            continue
        }

        count++
        draw(count, ch)
    }
}

func draw(count int, ch int) {
    // C Code : getmaxyx(stdscr, y, x)
    var y, x int
    {
        _y := C.getmaxy(C.stdscr)
        _x := C.getmaxx(C.stdscr)

        y = int(_y)
        x = int(_x)
    }

    var s string
    s = fmt.Sprintf("count=%5d y=%d x=%d ch=%d        ", count, y, x, ch)

    // C Code : mvwaddstr(stdscr, 1, 1, s);
    {
        _s := C.CString(s)
        defer C.free(unsafe.Pointer(_s))

        C.mvwaddstr(C.stdscr, C.int(1), C.int(1), _s)
    }
    C.wrefresh(C.stdscr)
}

Коды печатают некоторую информацию при запуске и перепечатывают после обработки ключа

И, как я уже говорил, только C печатает обновленный размер и печатает, когда размер терминалаизменено.

...