お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2008-12-31 19:32:14

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

青空文庫ビューワ XJP を使う

ubuntu-eee (8.04 ベース)の導入をきっかけに青空文庫を活用したくなりました.
EeePC のスペックから出来るだけ軽いものをと思って,
http://forum.ubuntulinux.jp/viewtopic.php?pid=8955
のスレッドを参考にXJP2_2.8.0 http://xjp-text.sourceforge.jp/ のコンパイルに挑戦しました.
大変参考になりました.ありがとうございます.

./configure --enable-net で青空文庫と接続可能にして,書籍検索などするためには以下の4ヶ所でソースに修正を加える必要がありました.

1) ~/.xtext/xtext.conf で XFT_FONT をコメントアウトするとEUC-JP で表示しようとするので文字化けるが,設定すると起動でいきなりセグる.

コード:

--- xjp.orig/src/xtext_main.c    2008-12-31 03:44:17.000000000 +0900
+++ xjp/src/xtext_main.c    2008-12-31 03:45:05.000000000 +0900
@@ -96,6 +96,7 @@
     main_win->rubi_gc = XCreateGC(disp,root,0,0);
     main_win->sgc = XCreateGC(disp,root,0,0);
     main_win->image.img = 0;
+    main_win->font = main_win->font_e = main_win->font_s = main_win->font_rubi = NULL;
     XSetLineAttributes(disp,main_win->sgc,1,LineSolid,CapButt,JoinMiter);
 }
 static void _set_title()

2) ~/.xtext/xtext.conf で BOOK_DIR が設定されていなかったり,ディレクトリがなかったり,青空文庫からダウンロードしたファイルがないとメニュー表示でセグる.

コード:

--- xjp.orig/src/xtext_main.c    2008-12-31 03:45:05.000000000 +0900
+++ xjp/src/xtext_main.c    2008-12-31 03:45:07.000000000 +0900
@@ -635,10 +635,10 @@
 {
     if(save_book_head != NULL)
         book_link_free(&save_book_head,&save_book_tail);
-    if(xconf.book_dir == NULL){
-        xtextSubWindow_Message(disp,main_win,XJP_MESSAGE[1]); return 1; }
     save_book_head = NULL; save_book_tail = NULL;
-    ibookGetBookData(&save_book_head,&save_book_tail,xconf.book_dir);
+    if(xconf.book_dir == NULL ||
+       ibookGetBookData(&save_book_head,&save_book_tail,xconf.book_dir) <= 0){
+        xtextSubWindow_Message(disp,main_win,XJP_MESSAGE[1]); return 1; }
     save_book_head->siori = siori_head;
     save_book_head->dbpath = xconf.rast_db;
     save_book_head->bookdir = xconf.book_dir;

3) BOOK_DIR が不正だったときなどの警告メッセージが文字化けする.

誤りがあったため削除

4) 検索メニューで入力ウィンドウが開くが入力できない.

コード:

--- xjp.orig/src/xtext_f6.c    2008-12-31 01:31:22.000000000 +0900
+++ xjp/src/xtext_f6.c    2008-12-31 02:50:41.000000000 +0900
@@ -12,6 +12,30 @@
 static XIC _create_input_context(XIM,XIMStyle,XFontSet,Window,int,long,long);
 static XIMStyle _select_input_style(XIM);
 
+static char *
+_utf82euc(char *utf8, int len)
+{
+  static iconv_t con = NULL;
+  char *euc, *start;
+  size_t utf8_len, euc_len;
+  if (utf8 == NULL) return NULL;
+  if (con == NULL && (con = iconv_open("EUC-JP", "UTF-8")) == NULL){
+    fprintf(stderr, "iconv_open(\"EUC-JP\", \"UTF-8\") failed\n");
+    return NULL;
+  }
+  if ((euc = (char *)malloc(len)) == NULL) return NULL;
+  memset(euc,0,len);
+  start = euc;
+  utf8_len = euc_len = len;
+  if (iconv(con,&utf8,&utf8_len,&start,&euc_len) < 0){
+    fprintf(stderr, "iconv(\"EUC-JP\", \"UTF-8\") failed\n");
+    return NULL;
+  }
+  len -= euc_len;
+  *(euc + len) = '\0';
+  return euc;
+
+}
 static void 
 _move_input_position(XIC xic,XFontSet fs,char *str,int slen,int h)
 {
@@ -93,16 +117,13 @@
 {
     if(str != NULL && len >= 0){
         XRectangle ink,log;
-        char utf8[1024];
         int cx,cy;
         XClearWindow(disp,iwin);
         if(win->anti){
 #if HAVE_LIBXFT
             XGlyphInfo gi;
-        
-            euc2utf8_c(XJP_CONV,utf8,str,len);
-            XftDrawStringUtf8(idraw,&(win->menu_fg_color),win->font,x,y,utf8,strlen(utf8));
-            XftTextExtentsUtf8(disp,win->font,utf8,strlen(utf8),&gi);
+            XftDrawStringUtf8(idraw,&(win->menu_fg_color),win->font,x,y,str,len);
+            XftTextExtentsUtf8(disp,win->font,str,len,&gi);
             cx = x + gi.width;
             cy = y - height + 2;
 #else
@@ -223,7 +244,7 @@
 
     XMapRaised(disp,pwin);
     XMapWindow(disp,iwin);
-
+    XSetInputFocus(disp,iwin,RevertToNone,CurrentTime);
     XSetICValues(xic,XNFocusWindow,iwin,NULL);
     XSetICFocus(xic);
     if(xstyle & XIMPreeditPosition)
@@ -232,7 +253,8 @@
     buf = (char *)malloc(blen);
     while(1){
         XNextEvent(disp,&event);
-        if(XFilterEvent(&event,iwin)) continue;
+
+        if(XFilterEvent(&event,0) == True) continue;
 
 
         switch(event.type){
@@ -256,24 +278,28 @@
                 }
                 switch(st){
                     case XLookupBoth:case XLookupChars:
-                        if(sym == XK_BackSpace){
+                      if (len == 1){
+                        if(buf[0] == '\b'){
                             if(str[--slen] & 0x80)
                                 --slen;
                             if(slen < 0) slen = 0;
 
-                        }else if(sym == XK_Return){
+                        }else if(buf[0] == '\r'){
                             if(slen > 0){
                                 str[slen] = '\0';
-                                result = (char *)malloc(slen + 2);
-                                strcpy(result,str);
+                                result = _utf82euc(str, slen + 2);
                             }else{
                                 result = NULL;
                             }
                             goto end;
 
                         }else{
-                            for(i=0;i<len;i++) str[slen++] = buf[i];
+                          goto _add;
                         }
+                      }else{
+                      _add:
+                            for(i=0;i<len;i++) str[slen++] = buf[i];
+                      }
 
                         if(xstyle & XIMPreeditPosition)
                             _move_input_position(xic,win->fs,str,slen,h1-5);
@@ -315,7 +341,10 @@
             break;
         }
     }
+    XUnsetICFocus(xic);
+    XDestroyIC(xic);
 end:
+    XCloseIM(xim);
     if(buf != NULL) free(buf);
     if(win->anti){
 #if HAVE_LIBXFT

5) 4ヶ所と言いながらおまけ,ソースを探索していて目についた明らかなタイポ /* free を NULL と比較しても... */

コード:

--- xjp.orig/src/xtext_f7.c    2008-12-31 03:41:58.000000000 +0900
+++ xjp/src/xtext_f7.c    2008-12-31 03:43:50.000000000 +0900
@@ -57,7 +57,7 @@
     len -= utf8_len;
     memcpy(to,utf,len);
     *(to+len) = '\0';
-    if(free != NULL) free(utf);
+    free(utf);
 }
 char * euc2utf8(iconv_t con,char *str,int len)
 {

当方では ipamona をインストールして, ~/.xtext/xtext.conf のフォント設定は

コード:

MAIN_FONT_J: -ipamona-mincho-medium-r-normal--16-*-*-*-c-0-jisx0208.1983-0
MAIN_FONT_S: -ipamona-gothic-medium-r-normal--16-*-*-*-c-0-jisx0208.1983-0
MAIN_FONT_E: -ipamona-mincho-medium-r-normal--16-*-*-*-c-0-iso8859-1
RUBI_FONT: -ipamona-gothic-medium-r-normal--8-*-*-*-c-0-jisx0208.1983-0
XFT_FONT: 1

にしてあります,通常の文章が16ドット,ルビが8ドットです.

Happy Reading!!

2009/1/1 3:38
3) の修正にミスがあったため削除しました.
2009/1/1 17:07
2) の修正を一部変更しました.

最後の編集者: einundzwanzighundertsechs (2009-01-01 17:07:29)

オフライン

 

#2 2009-01-01 03:52:04

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: 青空文庫ビューワ XJP を使う

注記ウィンドウの文字化けを修正していたら,前の投稿にミスがあったので 3) を削除しました.
この様に動作は保証できませんのでご了承ください.

3) メッセージが文字化けする.または表示されない.

コード:

--- xjp.orig/src/xtext_f4.c    2008-12-31 03:44:16.000000000 +0900
+++ xjp/src/xtext_f4.c    2009-01-01 03:06:59.000000000 +0900
@@ -484,6 +484,9 @@
 }
 int xtextSubWindow_Message(Display *disp,my_window_t *win,char *message)
 {
+#if HAVE_LIBXFT
+    char utf8[1024];
+#endif
     my_subwindow_t swin;
     XRectangle ink,log;
     int x,y;
@@ -500,16 +503,47 @@
     swin.bg_pixel = win->menu_bg_pixel;
     swin.parent_win = win->win;
     message_len = strlen(message);
+    if(win->anti){
+#if HAVE_LIBXFT
+                XGlyphInfo gi;
+                euc2utf8_c(XJP_CONV,utf8,message,message_len);
+                XftTextExtentsUtf8(disp,win->font_s,utf8,strlen(utf8),&gi);
+                log.width = gi.width;
+                log.height = gi.height;
+#else
+                goto _no_anti;
+#endif
+    }else{
+    _no_anti:
     XmbTextExtents(swin.fs,message,message_len,&ink,&log);
+    }
     swin.width = log.width + 4;
     swin.height = log.height + 4;
     swin.x = (win->width - swin.width) / 2;
     swin.y = (win->height - swin.height) / 2;
     swin.win = XCreateSimpleWindow(disp,swin.parent_win,swin.x,swin.y,swin.width,swin.height,1,swin.fg_pixel,swin.bg_pixel);
+#if HAVE_LIBXFT
+        if(win->anti){
+                swin.draw = XftDrawCreate(disp,swin.win,win->visual,win->cmap);
+                XftDrawRect(swin.draw,&(win->menu_bg_color),0,0,swin.width,swin.height);
+        }
+#endif
     XMapRaised(disp,swin.win);
+    if(win->anti){
+#if HAVE_LIBXFT
+      XftDrawStringUtf8(swin.draw,&(win->menu_fg_color),win->font_s,2,log.height,utf8,strlen(utf8));
+#else
+      goto _no_anti1:
+#endif
+    }else{
+    _no_anti1:
     XmbDrawString(disp,swin.win,swin.fs,swin.fgc,2,log.height,message,message_len);
+    }
     XFlush(disp);
     sleep(1);
+#ifdef HAVE_LIBXFT
+    if(win->anti && swin.draw != NULL){ XftDrawDestroy(swin.draw);}
+#endif
     XDestroyWindow(disp,swin.win);
     return 0;
 }

6)注記が数値のみ表示される.

コード:

--- xjp.orig/src/xtext_f5.c    2009-01-01 03:04:41.000000000 +0900
+++ xjp/src/xtext_f5.c    2009-01-01 03:27:48.000000000 +0900
@@ -60,7 +60,20 @@
                 }
                 temp[i] = *p;
             }
-            temp[i] = '\0'; XmbDrawString(disp,win->mwin,win->fs_s,win->fgc,x,y,temp,i);
+            temp[i] = '\0';
+            if (win->anti){
+#if HAVE_LIBXFT
+              char utf8[1024];
+              static XftDraw *draw = NULL;
+              if (draw == NULL) draw = XftDrawCreate(disp,win->mwin,win->visual,win->cmap);
+              euc2utf8_c(XJP_CONV,utf8,temp,i);
+              XftDrawStringUtf8(draw,&(win->fg_color),win->font_s,x,y,utf8,strlen(utf8));
+#else
+              goto _no_anti;
+#endif
+            }else{
+              XmbDrawString(disp,win->mwin,win->fs_s,win->fgc,x,y,temp,i);
+            }
             if(i<max)
                 break;
             else

オフライン

 

Board footer

Powered by FluxBB