2015-03-31 48 views
2

我想在ncurses中獲得一個窗口,我在其中編寫mysql-query的結果。但是查詢返回的行數比我在終端中的多。 所以我試圖創建一個墊,以便我可以滾動結果。使用ncurses pad在C中滾動

但問題是,我的終端上沒有可見的焊盤。

我只是簡化了代碼,但它仍然沒有工作對我來說:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <ncurses.h> 
#include <mysql.h> 
#include <my_global.h> 

WINDOW *pad; 
MYSQL *con; 

static int mrow, mcol; 
static char *host, *user, *pass; 

void quit(void) 
{ 
    // close MySQL connection 
    mysql_close(con); 
    // end curses 
    endwin(); 
} 


int main(int argc, char **argv) 
{ 
    // initialize curses 
    initscr(); 
    atexit(quit); 
    clear(); 
    cbreak(); 
    keypad(stdscr, TRUE); 
    start_color(); 

    // get terminal size 
    getmaxyx(stdscr, mrow, mcol); 

    // open MySQL connection 
    host = "localhost"; 
    user = "root"; 
    pass = "8$oP.4L!"; 
    con = mysql_init(NULL); 
    if (con == NULL) 
    { 
    exit(1); 
    } 
    if (mysql_real_connect(con, host, user, pass, NULL, 0, NULL, 0) == NULL) 
    { 
    mysql_close(con); 
    exit(1); 
    } 

    // Cursor off 
    curs_set(0); 

    // Get SQL Data 
    char *query = "SELECT IF((SELECT name FROM zeiterf.stdjobs WHERE nr = zeiterf.wtime.job) != '', (SELECT name FROM zeiterf.stdjobs WHERE nr = zeiterf.wtime.job), job), IF(usr != '', (SELECT vname FROM zeiterf.user WHERE nr = zeiterf.wtime.usr), NULL), IF(usr != '', (SELECT nname FROM zeiterf.user WHERE nr = zeiterf.wtime.usr), NULL), SEC_TO_TIME(SUM(TIME_TO_SEC(tout) - TIME_TO_SEC(tin))) FROM zeiterf.wtime WHERE tout != 0 AND job != '...ENDE' GROUP BY job , usr WITH ROLLUP;"; 
    if (mysql_query(con, query)) 
    { 
    exit (1); 
    } 

    MYSQL_RES *result = mysql_store_result(con); 
    MYSQL_ROW *row; 
    int num_fields = mysql_num_fields(result); 
    int rowcount = mysql_num_rows(result); 

    // create pad 
    pad = newpad (rowcount + 1, mcol); 

    // col titles 
    wprintw(pad, "Auftrag \tName \t\t\tZeit\n"); 

    while (row = mysql_fetch_row(result)) 
    { 
    int i = 0; 

    for (i = 0; i < num_fields; i++) 
    { 
     wprintw(pad, "%s\t", row[i]); 
    } 

    wprintw(pad, "\n"); 
    } 

    mysql_free_result(result); 

    // Show content of pad 
    int mypadpos = 0; 
    prefresh(pad, mypadpos, mcol, 0, 0, mrow, mcol); 

    // wait for exit key 
    int ch; 
    while((ch = wgetch(pad)) != 'q') 
    { 
    switch (ch) 
    { 
     case KEY_UP: 
     if (mypadpos >= 0) 
    { 
     mypadpos--; 
    } 
    prefresh(pad, mypadpos, mcol, 0, 0, mrow, mcol); 
    break; 
     case KEY_DOWN: 
    if (mypadpos <= rowcount+1) 
    { 
     mypadpos++; 
    } 
    prefresh(pad, mypadpos, mcol, 0, 0, mrow-1, mcol); 
    break; 
    } 
    } 

    // remove window 
    delwin(pad); 
    clear(); 
    refresh(); 

    return (0); 
} 

我的Debian希德系統上編譯

gcc -o test testpad.c `mysql_config --libs --cflags` -lncurses 

。也嘗試在我的RPi與raspbian。在兩個系統上的行爲都一樣

誰能告訴我我做錯了什麼?

回答

2

我發現了什麼是錯的。在我的代碼中,它應該是

prefresh(pad, mypadpos, 0, 0, 0, mrow, mcol);