Skip to content

Instantly share code, notes, and snippets.

@reagent
Last active November 8, 2023 08:53
Show Gist options
  • Select an option

  • Save reagent/9819045 to your computer and use it in GitHub Desktop.

Select an option

Save reagent/9819045 to your computer and use it in GitHub Desktop.

Revisions

  1. reagent created this gist Mar 25, 2014.
    2 changes: 2 additions & 0 deletions .gitignore
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,2 @@
    demo
    *.swp
    7 changes: 7 additions & 0 deletions Makefile
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    CFLAGS=-Wall
    LDFLAGS=-lncurses

    all: demo

    clean:
    rm -rf demo
    77 changes: 77 additions & 0 deletions demo.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,77 @@
    #include <ncurses.h>
    #include <unistd.h>

    void draw_borders(WINDOW *screen) {
    int x, y, i;

    getmaxyx(screen, y, x);

    // 4 corners
    mvwprintw(screen, 0, 0, "+");
    mvwprintw(screen, y - 1, 0, "+");
    mvwprintw(screen, 0, x - 1, "+");
    mvwprintw(screen, y - 1, x - 1, "+");

    // sides
    for (i = 1; i < (y - 1); i++) {
    mvwprintw(screen, i, 0, "|");
    mvwprintw(screen, i, x - 1, "|");
    }

    // top and bottom
    for (i = 1; i < (x - 1); i++) {
    mvwprintw(screen, 0, i, "-");
    mvwprintw(screen, y - 1, i, "-");
    }
    }

    int main(int argc, char *argv[]) {
    int parent_x, parent_y, new_x, new_y;
    int score_size = 3;

    initscr();
    noecho();
    curs_set(FALSE);

    // set up initial windows
    getmaxyx(stdscr, parent_y, parent_x);

    WINDOW *field = newwin(parent_y - score_size, parent_x, 0, 0);
    WINDOW *score = newwin(score_size, parent_x, parent_y - score_size, 0);

    draw_borders(field);
    draw_borders(score);

    while(1) {
    getmaxyx(stdscr, new_y, new_x);

    if (new_y != parent_y || new_x != parent_x) {
    parent_x = new_x;
    parent_y = new_y;

    wresize(field, new_y - score_size, new_x);
    wresize(score, score_size, new_x);
    mvwin(score, new_y - score_size, 0);

    wclear(stdscr);
    wclear(field);
    wclear(score);

    draw_borders(field);
    draw_borders(score);
    }

    // draw to our windows
    mvwprintw(field, 1, 1, "Field");
    mvwprintw(score, 1, 1, "Score");

    // refresh each window
    wrefresh(field);
    wrefresh(score);
    }

    endwin();

    return 0;
    }