diff libmenu/menu_txt.c @ 8197:b31caec933e9

OSD menus initial version
author albeu
date Thu, 14 Nov 2002 23:47:11 +0000
parents
children edfe34c5405d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmenu/menu_txt.c	Thu Nov 14 23:47:11 2002 +0000
@@ -0,0 +1,194 @@
+
+#include "../config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "img_format.h"
+#include "mp_image.h"
+
+#include "../m_struct.h"
+#include "../m_option.h"
+#include "menu.h"
+
+#include "../libvo/font_load.h"
+#include "../linux/keycodes.h"
+
+struct menu_priv_s {
+  char** lines;
+  int num_lines;
+  int cur_line;
+  int disp_lines;
+  int minb;
+  int hspace;
+  char* file;
+};
+
+static struct menu_priv_s cfg_dflt = {
+  NULL,
+  0,
+  0,
+  0,
+  0,
+  3,
+  NULL
+};
+
+#define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
+
+static m_option_t cfg_fields[] = {
+  { "minbor", ST_OFF(minb), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
+  { "hspace", ST_OFF(hspace), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
+  { "file", ST_OFF(file), CONF_TYPE_STRING, 0, 0, 0, NULL },
+  { NULL, NULL, NULL, 0,0,0,NULL }
+};
+
+#define mpriv (menu->priv)
+
+static void read_cmd(menu_t* menu,int cmd) {
+  switch(cmd) {
+  case MENU_CMD_UP:
+    mpriv->cur_line -= mpriv->disp_lines / 2;
+    if(mpriv->cur_line < 0)
+      mpriv->cur_line = 0;
+    break;
+  case MENU_CMD_DOWN:
+  case MENU_CMD_OK:
+    mpriv->cur_line += mpriv->disp_lines / 2;
+    if(mpriv->cur_line >= mpriv->num_lines)
+      mpriv->cur_line = mpriv->num_lines - 1;
+    break;
+  case MENU_CMD_CANCEL:
+    menu->show = 0;
+    menu->cl = 1;
+    break;
+  }
+}
+
+static void read_key(menu_t* menu,int c) {
+  switch (c) {
+  case KEY_HOME:
+    mpriv->cur_line = 0;
+    break;
+  case KEY_END:
+    mpriv->cur_line = mpriv->num_lines - 1;
+    break;
+  case KEY_PAGE_UP:
+    mpriv->cur_line =  mpriv->cur_line > mpriv->disp_lines ?
+      mpriv->cur_line - mpriv->disp_lines : 0;
+    break;
+  case KEY_PAGE_DOWN:
+    mpriv->cur_line = mpriv->cur_line + mpriv->disp_lines > mpriv->num_lines - 1 ? mpriv->num_lines - 1 : mpriv->cur_line + mpriv->disp_lines;
+    break;
+  default:
+    menu_dflt_read_key(menu,c);
+  }
+}
+
+
+static void draw(menu_t* menu,mp_image_t* mpi) {
+  int x = mpriv->minb;
+  int y = mpriv->minb;
+  //int th = 2*mpriv->hspace + vo_font->height;
+  int i,end;
+
+  if(x < 0) x = 8;
+  if(y < 0) y = 8;
+
+  mpriv->disp_lines = (mpi->h + mpriv->hspace  - 2*mpriv->minb) / (  vo_font->height + mpriv->hspace);
+  if(mpriv->num_lines - mpriv->cur_line < mpriv->disp_lines) {
+    i = mpriv->num_lines - 1 - mpriv->disp_lines;
+    if(i < 0) i = 0;
+    end = mpriv->num_lines - 1;
+  } else {
+    i = mpriv->cur_line;
+    end = i + mpriv->disp_lines;
+    if(end >= mpriv->num_lines) end = mpriv->num_lines - 1;
+  }
+  
+  for( ; i < end ; i++) {
+    menu_draw_text(mpi,mpriv->lines[i],x,y);
+    y += vo_font->height + mpriv->hspace;
+  }
+
+}
+    
+#define BUF_SIZE 1024
+
+static int open(menu_t* menu, char* args) {
+  FILE* fd;
+  char buf[BUF_SIZE];
+  char *l;
+  int s;
+  int pos = 0, r = 0;
+  args = NULL; // Warning kill
+
+  menu->draw = draw;
+  menu->read_cmd = read_cmd;
+  menu->read_key = read_key;
+
+  if(!mpriv->file) {
+    printf("Menu txt need a txt file name (param file)\n");
+    return 0;
+  }
+
+  fd = fopen(mpriv->file,"r");
+  if(!fd) {
+    printf("Menu txt can't open: %s\n",mpriv->file);
+    return 0;
+  }
+
+  while(1) {
+    r = fread(buf+pos,1,BUF_SIZE-pos-1,fd);
+    if(r <= 0) {
+      if(pos > 0) {
+	mpriv->lines = realloc(mpriv->lines,(mpriv->num_lines + 1)*sizeof(char*));
+	mpriv->lines[mpriv->num_lines] = strdup(buf);
+	mpriv->num_lines++;
+      }
+      fclose(fd);
+      break;
+    }
+    pos += r;
+    buf[pos] = '\0';
+    
+    while((l = strchr(buf,'\n')) != NULL) {
+      s = l-buf;
+      mpriv->lines = realloc(mpriv->lines,(mpriv->num_lines + 1)*sizeof(char*));
+      mpriv->lines[mpriv->num_lines] = malloc(s+1);
+      memcpy(mpriv->lines[mpriv->num_lines],buf,s);
+      mpriv->lines[mpriv->num_lines][s] = '\0';
+      pos -= s + 1;
+      if(pos > 0)
+	memmove(buf,l+1,pos);
+      buf[pos] = '\0';
+      mpriv->num_lines++;
+    }
+    if(pos >= BUF_SIZE-1) {
+      printf("Warning too long line, splitting it\n");
+      mpriv->lines = realloc(mpriv->lines,(mpriv->num_lines + 1)*sizeof(char*));
+      mpriv->lines[mpriv->num_lines] = strdup(buf);
+      mpriv->num_lines++;
+      pos = 0;
+    }
+  }
+
+  printf("Parsed %d lines\n",mpriv->num_lines);
+
+  return 1;
+}
+
+const menu_info_t menu_info_txt = {
+  "Text file viewer",
+  "txt",
+  "Albeu",
+  "",
+  {
+    "txt_cfg",
+    sizeof(struct menu_priv_s),
+    &cfg_dflt,
+    cfg_fields
+  },
+  open,
+};