⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reader.cxx

📁 一个小的非常好用的电子书阅读器源码
💻 CXX
📖 第 1 页 / 共 4 页
字号:
	    if ((('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == ' ') && i < 128)	      {		DBT key, data;		memset(&key,0,sizeof(key));		memset(&data,0,sizeof(data));		setbkmkkey(g_filename,buff.data(),&key);		data.data = (char*)&lcn;		data.size = sizeof(lcn);		bkmks->put(bkmks, &key, &data, 0);	      }	    //	    else printf("%x:%c\n",ch,ch);	  }      }    bkmks->sync(bkmks, 0);    input->restore();  }  static void clrbkmk_cb(Fl_Widget *widget, void *_data)  {    DBT key, data;    memset(&key,0,sizeof(key));    memset(&data,0,sizeof(data));    key.data = ((reader_ui *)_data)->g_filename;    key.size = strlen(((reader_ui *)_data)->g_filename);    bkmks->seq(bkmks,&key,&data,R_CURSOR);    while (strcmp(((reader_ui *)_data)->g_filename,(char*)key.data)==0)      {	bkmks->del(bkmks,&key,R_CURSOR);	if (bkmks->seq(bkmks,&key,&data,R_NEXT) != 0) break;      }    bkmks->sync(bkmks,0);  }  static void tidybkmk_cb(Fl_Widget *widget, void *_data)  {    DBT key, data;    memset(&key,0,sizeof(key));    memset(&data,0,sizeof(data));    bkmks->seq(bkmks,&key,&data,R_FIRST);    do      {	struct stat buf;	char buffer[1024];	memcpy(buffer, key.data, key.size);	buffer[key.size] = '\0';	if (strcmp(buffer,LASTFILE) == 0) continue;	if (strcmp(buffer,PREFRNCE) == 0) continue;	if (stat(buffer,&buf) == -1 && errno == ENOENT)	  {	    bkmks->del(bkmks,&key,R_CURSOR);	  }      }    while (bkmks->seq(bkmks,&key,&data,R_NEXT) == 0);    bkmks->sync(bkmks,0);  }#endif#ifdef USEBKMKS  static void save_current(Fl_Widget *widget, void *_data) {    myoutput* input = (((reader_ui*)_data)->input);    if (((reader_ui *)_data)->g_filename[0] != '\0')      {	DBT key, data;	memset(&key,0,sizeof(key));	memset(&data,0,sizeof(data));	getdefaultbkmk(((reader_ui *)_data)->g_filename, &key);	unsigned int lcn = input->pagelocate();	data.data = (char*)&lcn;	data.size = sizeof(lcn);	bkmks->put(bkmks, &key, &data, 0);	bkmks->sync(bkmks, 0);      }  }#endif  static Fl_Font rotate_font(Fl_Font font)  {    switch (font)      {      case FL_HELVETICA: return FL_TIMES;      case FL_TIMES: return FL_COURIER;      case FL_COURIER: return FL_HELVETICA;      case FL_HELVETICA_BOLD: return FL_TIMES_BOLD;      case FL_TIMES_BOLD: return FL_COURIER_BOLD;      case FL_COURIER_BOLD: return FL_HELVETICA_BOLD;      }  }  static Fl_Font embolden(Fl_Font font)  {    switch (font)      {      case FL_HELVETICA: return FL_HELVETICA_BOLD;      case FL_TIMES: return FL_TIMES_BOLD;      case FL_COURIER: return FL_COURIER_BOLD;      }  }  static Fl_Font enlighten(Fl_Font font)  {    switch (font)      {      case FL_HELVETICA_BOLD: return FL_HELVETICA;      case FL_TIMES_BOLD: return FL_TIMES;      case FL_COURIER_BOLD: return FL_COURIER;      }  }  static void bld_cb(Fl_Widget *widget, void *data) {    myoutput* input = (((reader_ui*)data)->input);    ((reader_ui*)data)->bold = !((reader_ui*)data)->bold;    input->textfont(((reader_ui*)data)->bold ? embolden(input->textfont()) : enlighten(input->textfont()));    input->locate(input->pagelocate());    input->redraw();  }  static void tight_cb(Fl_Widget *widget, void *data) {    myoutput* input = (((reader_ui*)data)->input);    ((reader_ui*)data)->btight = !((reader_ui*)data)->btight;    input->tight = ((reader_ui*)data)->btight;    input->redraw();  }  static void fnt_cb(Fl_Widget *widget, void *data) {    myoutput* input = (((reader_ui*)data)->input);    input->textfont(rotate_font(input->textfont()));    input->locate(input->pagelocate());    input->redraw();  }  static void mag_cb(Fl_Widget *widget, void *data) {    myoutput* input = (((reader_ui*)data)->input);    int * sizep;    int n = Fl::get_font_sizes(input->textfont(),sizep);    if (n == 0) return;    if (sizep[0] == 0 && n <= 1)      {	input->textsize(input->textsize()+1);      }    else      {	int i;	for (i = 0; i < n-1; i++)	  {	    if (sizep[i] > input->textsize()) break;	  }	input->textsize(sizep[i]);      }    input->locate(input->pagelocate());    input->redraw();  }  static void red_cb(Fl_Widget *widget, void *data) {    myoutput* input = (((reader_ui*)data)->input);    int * sizep;    int n = Fl::get_font_sizes(input->textfont(),sizep);    if (n == 0) return;    if (sizep[0] == 0 && n <= 1)      {	input->textsize(input->textsize()-1);      }    else      {	int i;	for (i = n-1; i >= 0; i--)	  {	    if (sizep[i] < input->textsize()) break;	  }	if (sizep[i] == 0) i++;	input->textsize(sizep[i]);      }    input->locate(input->pagelocate());    input->redraw();  }  static void jump_cb(Fl_Widget *widget, void *_data) {    char vlu[40];    static Fl_Window *jumptowin = NULL;    if (jumptowin == NULL)      {	jumptowin = new Fl_Window(100,45);#ifdef AGENDA	centre_window(jumptowin);#endif	jumptowin->border(0);	jumptowin->box(FL_UP_BOX);	((reader_ui *)_data)->locn = new Fl_Int_Input(35,5,50,14,"Place");	((reader_ui *)_data)->locn->textsize(10);	((reader_ui *)_data)->locn->labelsize(10);	Fl_Button *jump_accept = new Fl_Button(10,25,35,15,"Okay");	jump_accept->labelsize(10);	jump_accept->callback(jumpAccept_cb,_data);	Fl_Button *jump_cancel = new Fl_Button(55,25,35,15,"Cancel");	jump_cancel->labelsize(10);	jump_cancel->callback(Cancel_cb,_data);	jumptowin->end();	jumptowin->set_modal();      }    sprintf(vlu, "%d", ((reader_ui *)_data)->input->pagelocate());    ((reader_ui *)_data)->locn->value(vlu);    jumptowin->show();  }  static void jumpAccept_cb(Fl_Widget *widget, void *data)  {    widget->window()->hide();    ((reader_ui *)data)->input->locate(atoi(((reader_ui *)data)->locn->value()));  }  static void find_cb(Fl_Widget *widget, void *data) {    const char *val;    myoutput* input = (((reader_ui*)data)->input);    //sprintf(search, "%d", input->pagelocate());    val = fl_input("Search String:", search);    if (val != NULL) {      // User entered a string - go find it!      strcpy(search, val);      find2_cb(widget, data);    }  }  static void find2_cb(Fl_Widget *widget, void *data) {    const char *val, *found;    int pos;    myoutput* input = (((reader_ui*)data)->input);    if (search[0] == '\0') {      // Search string is blank; get a new one...      find_cb(widget,data);      return;    }    if (found != NULL) {      CBuffer test;      //      input->jumpto(input->locate());      size_t pos;      size_t start = input->pagelocate();      input->jumpto(start);      input->buffdoc.getline(&test,input->w());      do	{	  pos = input->locate();	  if (!input->buffdoc.getline(&test,input->w()))	    {	      fl_alert("No occurrences of \'%s\' found!", search);	      pos = start;	      break;	    }	  //	  printf("%d:%s\n",pos,test.data());	}      while (strstr(test.data(),search) == NULL);      input->locate(pos);    }  }  static void open_cb(Fl_Widget *widget, void *data) {    char *newfile;    reader_ui* reader = (reader_ui*)data;    myoutput* input = reader->input;#if defined(RAW) || !defined(AGENDA)    newfile = fl_file_chooser("Open File?", "*", filename);#else    //newfile = fl_ag_file_chooser("Open File?", "*", filename);    newfile = my_fl_file_chooser("Open File?", "*", filename);#endif    if (newfile != NULL) reader->load_file(newfile);  }  static void quit_cb(Fl_Widget *widget, void *_data) {    reader_ui* reader = (reader_ui*)_data;#ifdef USEBKMKS    save_current(widget, _data);#endif    reader->setprefs();#ifdef USEBKMKS    DBT key, data;    memset(&key,0,sizeof(key));    memset(&data,0,sizeof(data));    char buffer[1024];    strcpy(buffer,LASTFILE);    key.data = buffer;    key.size = strlen(buffer);    data.data = ((reader_ui *)_data)->g_filename;    data.size = strlen(((reader_ui *)_data)->g_filename);    bkmks->put(bkmks,&key,&data,0);    bkmks->close(bkmks);#endif    reader->window->hide();  }  reader_ui(const reader_ui&);public:#ifdef USEBKMKS  void setupbkmks()  {#ifdef AGENDA    bkmkwindow = new Fl_Window(160,240,"Choose Bookmark");    //    bkmkwindow->box(FL_NO_BOX); // because it is filled with browser    //bkmkwindow->border(0);    //bkmkwindow->box(FL_UP_BOX);    bkmkbrowser = new Fl_Paged_Select_Browser(0,0,Fl_Group::current()->w(), Fl_Group::current()->h()-25);    bkmkbrowser->textfont(FL_HELVETICA);    bkmkbrowser->textsize(8);#else    int w = (8*Fl::w())/10;    int h = (8*Fl::h())/10;    if ((14*h)/w < w) w = (10*h)/14;    else h = (14*w)/10;    bkmkwindow = new Fl_Window(w,h,"Choose Bookmark");    //    bkmkwindow->box(FL_NO_BOX); // because it is filled with browser    bkmkbrowser = new Fl_Select_Browser(0,0,Fl_Group::current()->w(), Fl_Group::current()->h()-25);#endif    bkmkbrowser->callback(bkmk_cb,this);    Fl_Button *jump_accept = new Fl_Button((bkmkbrowser->w()-35)/2,bkmkbrowser->h()+5,35,15,"Cancel");    jump_accept->labelsize(10);    jump_accept->callback(Cancel_cb,NULL);    bkmkwindow->end();    bkmkwindow->set_modal();  }  static void bkmk_cb(Fl_Widget* o, void* _data)  {    o->window()->hide();    int pos = ((Fl_Browser*)o)->value();    //    printf("callback, selection = <%d:%s>, event_clicks = %d\n",    //   pos, ((Fl_Browser*)o)->text(pos), Fl::event_clicks());    if (pos != 0)      {	(((reader_ui*)_data)->input)->locate((unsigned int)((Fl_Browser*)o)->data(pos));	/*	DBT key,data;	memset(&key,0,sizeof(key));	memset(&data,0,sizeof(data));	setbkmkkey(((reader_ui *)_data)->g_filename,((Fl_Browser*)o)->text(pos),&key);	((Fl_Browser*)o)->clear();	int ret = bkmks->get(bkmks, &key, &data, 0);	if (ret == 0)	  {	    if (((reader_ui*)_data)->bkmkfind)	      {		unsigned long lcn;		memcpy(&lcn,data.data,sizeof(lcn));		(((reader_ui*)_data)->input)->locate(lcn);	      }	    else	      {		if (bkmks->del(bkmks, &key, 0) != 0)		  {		    fl_alert("Problem deleting bookmark:%d",errno);		  }	      }	  }	else	  {	    fl_alert("Bookmark not found");	  }	//delete [] (char*)key.data;	*/      }  }  static void populate_bkmk(reader_ui *r)  {    DBT key,data;    memset(&key,0,sizeof(key));    memset(&data,0,sizeof(data));    r->bkmkbrowser->clear();    char buffer1[2048];    strcpy(buffer1,r->g_filename);    int offset = strlen(r->g_filename);    key.data = buffer1;    key.size = offset;    bkmks->sync(bkmks, 0);    int cnt = 0;    CList<Bkmk>* t;    if ((t = r->input->getbkmklist()) != NULL)      {	for (CList<Bkmk>::iterator i = t->begin(); i != t->end(); i++)	  {	    r->bkmkbrowser->add(i->name(), (void*)i->value());	    cnt++;	  }	delete t;      }    if (bkmks->seq(bkmks,&key,&data,R_CURSOR) == 0)      {	while (strcmp(r->g_filename,(char*)key.data)==0)	  {	    char buffer[4096];	    memcpy(buffer, (char*)key.data+offset+1, key.size-offset-1);	    buffer[key.size-offset-1] = '\0';	    //printf("Found:%s-%s\n",buffer1,buffer);	    if (strcmp(buffer,"CURRENT") != 0)	      {		unsigned long lcn;		memcpy(&lcn,data.data,sizeof(lcn));		r->bkmkbrowser->add(buffer,(void*)lcn);		cnt++;	      }	    if (bkmks->seq(bkmks,&key,&data,R_NEXT) != 0) break;	  }      }    //    printf("Showing\n");    //    r->bkmkbrowser->position(0);    if (cnt > 0)      r->bkmkwindow->show();    else      fl_alert("No bookmarks for\n%s",filename_name(r->g_filename));  }  static void getbkmk_cb(Fl_Widget* o, void* _data)  {    reader_ui* r = (reader_ui *)_data;    r->bkmkfind = true;    populate_bkmk(r);  }  static void delbkmk_cb(Fl_Widget* o, void* _data)  {    reader_ui* r = (reader_ui *)_data;    r->bkmkfind = false;    populate_bkmk(r);  }#endif  static void bstripcr_cb(Fl_Widget* o, void* _data)  {    ((reader_ui*)_data)->bstripcr = !(((reader_ui*)_data)->bstripcr);    ((reader_ui*)_data)->setfilter();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -