Fix compilation by adding forgotten comma.
[mplayer/glamo.git] / libmenu / menu_txt.c
blobbdf20a771fa35e517af2036ce48c71b8a93e8957
2 #include "config.h"
3 #include "mp_msg.h"
4 #include "help_mp.h"
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <string.h>
10 #include "libmpcodecs/img_format.h"
11 #include "libmpcodecs/mp_image.h"
13 #include "m_struct.h"
14 #include "m_option.h"
15 #include "menu.h"
17 #include "libvo/font_load.h"
18 #include "osdep/keycodes.h"
20 struct menu_priv_s {
21 char** lines;
22 int num_lines;
23 int cur_line;
24 int disp_lines;
25 int minb;
26 int hspace;
27 char* file;
30 static struct menu_priv_s cfg_dflt = {
31 NULL,
37 NULL
40 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
42 static m_option_t cfg_fields[] = {
43 { "minbor", ST_OFF(minb), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
44 { "hspace", ST_OFF(hspace), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
45 { "file", ST_OFF(file), CONF_TYPE_STRING, 0, 0, 0, NULL },
46 { NULL, NULL, NULL, 0,0,0,NULL }
49 #define mpriv (menu->priv)
51 static void read_cmd(menu_t* menu,int cmd) {
52 switch(cmd) {
53 case MENU_CMD_UP:
54 mpriv->cur_line -= mpriv->disp_lines / 2;
55 if(mpriv->cur_line < 0)
56 mpriv->cur_line = 0;
57 break;
58 case MENU_CMD_DOWN:
59 case MENU_CMD_OK:
60 mpriv->cur_line += mpriv->disp_lines / 2;
61 if(mpriv->cur_line >= mpriv->num_lines)
62 mpriv->cur_line = mpriv->num_lines - 1;
63 break;
64 case MENU_CMD_LEFT:
65 case MENU_CMD_CANCEL:
66 menu->show = 0;
67 menu->cl = 1;
68 break;
72 static void read_key(menu_t* menu,int c) {
73 switch (c) {
74 case KEY_HOME:
75 mpriv->cur_line = 0;
76 break;
77 case KEY_END:
78 mpriv->cur_line = mpriv->num_lines - 1;
79 break;
80 case KEY_PAGE_UP:
81 mpriv->cur_line = mpriv->cur_line > mpriv->disp_lines ?
82 mpriv->cur_line - mpriv->disp_lines : 0;
83 break;
84 case KEY_PAGE_DOWN:
85 mpriv->cur_line = mpriv->cur_line + mpriv->disp_lines > mpriv->num_lines - 1 ? mpriv->num_lines - 1 : mpriv->cur_line + mpriv->disp_lines;
86 break;
87 default:
88 menu_dflt_read_key(menu,c);
93 static void draw(menu_t* menu,mp_image_t* mpi) {
94 int x = mpriv->minb;
95 int y = mpriv->minb;
96 //int th = 2*mpriv->hspace + vo_font->height;
97 int i,end;
99 if(x < 0) x = 8;
100 if(y < 0) y = 8;
102 mpriv->disp_lines = (mpi->h + mpriv->hspace - 2*mpriv->minb) / ( vo_font->height + mpriv->hspace);
103 if(mpriv->num_lines - mpriv->cur_line < mpriv->disp_lines) {
104 i = mpriv->num_lines - 1 - mpriv->disp_lines;
105 if(i < 0) i = 0;
106 end = mpriv->num_lines - 1;
107 } else {
108 i = mpriv->cur_line;
109 end = i + mpriv->disp_lines;
110 if(end >= mpriv->num_lines) end = mpriv->num_lines - 1;
113 for( ; i < end ; i++) {
114 menu_draw_text(mpi,mpriv->lines[i],x,y);
115 y += vo_font->height + mpriv->hspace;
120 #define BUF_SIZE 1024
122 static int open_txt(menu_t* menu, char* args) {
123 FILE* fd;
124 char buf[BUF_SIZE];
125 char *l;
126 int s;
127 int pos = 0, r = 0;
128 args = NULL; // Warning kill
130 menu->draw = draw;
131 menu->read_cmd = read_cmd;
132 menu->read_key = read_key;
134 if(!mpriv->file) {
135 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_MenuTxtNeedATxtFileName);
136 return 0;
139 fd = fopen(mpriv->file,"r");
140 if(!fd) {
141 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_MenuTxtCantOpen,mpriv->file);
142 return 0;
145 while(1) {
146 r = fread(buf+pos,1,BUF_SIZE-pos-1,fd);
147 if(r <= 0) {
148 if(pos > 0) {
149 mpriv->lines = realloc(mpriv->lines,(mpriv->num_lines + 1)*sizeof(char*));
150 mpriv->lines[mpriv->num_lines] = strdup(buf);
151 mpriv->num_lines++;
153 fclose(fd);
154 break;
156 pos += r;
157 buf[pos] = '\0';
159 while((l = strchr(buf,'\n')) != NULL) {
160 s = l-buf;
161 mpriv->lines = realloc(mpriv->lines,(mpriv->num_lines + 1)*sizeof(char*));
162 mpriv->lines[mpriv->num_lines] = malloc(s+1);
163 memcpy(mpriv->lines[mpriv->num_lines],buf,s);
164 mpriv->lines[mpriv->num_lines][s] = '\0';
165 pos -= s + 1;
166 if(pos > 0)
167 memmove(buf,l+1,pos);
168 buf[pos] = '\0';
169 mpriv->num_lines++;
171 if(pos >= BUF_SIZE-1) {
172 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_WarningTooLongLineSplitting);
173 mpriv->lines = realloc(mpriv->lines,(mpriv->num_lines + 1)*sizeof(char*));
174 mpriv->lines[mpriv->num_lines] = strdup(buf);
175 mpriv->num_lines++;
176 pos = 0;
180 mp_msg(MSGT_GLOBAL,MSGL_INFO,MSGTR_LIBMENU_ParsedLines,mpriv->num_lines);
182 return 1;
185 const menu_info_t menu_info_txt = {
186 "Text file viewer",
187 "txt",
188 "Albeu",
191 "txt_cfg",
192 sizeof(struct menu_priv_s),
193 &cfg_dflt,
194 cfg_fields
196 open_txt,