在滚动下与ncurses的垫 [英] Scrolling in C with ncurses pad

查看:118
本文介绍了在滚动下与ncurses的垫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图让在我写一个MySQL查询的结果ncurses的一个窗口。但是,查询返回的行比我有我的终端。
所以,我试图创建一个垫,这样我可以滚动结果。

I'm trying to get a window in ncurses where i write the result of a mysql-query. But the query returns more lines than i have in my terminal. So I tried to create a pad, so that i can scroll through the results.

但问题是,有没有垫我的终端上可见。

But the problem is, that there is no pad visible on my terminal.

我只是简化了code,但它仍然不是为我工作:

I just simplified the code, but it's still not working for me:

#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);
}

编译

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

我的Debian希德系统。还试图在我的RPI与raspbian。在两个系统上相同的行为。

on my Debian Sid system. Also tried on my RPi with raspbian. On both systems same behavior.

谁能告诉我,我做错了什么?

Can anyone tell me what i did wrong?

推荐答案

我发现了什么是错误的。在我的code应该是

I found out what was wrong. In my code it should be

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

这篇关于在滚动下与ncurses的垫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆