
Ubuntu日本語フォーラム

ログインしていません。
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_LIBXFT5) 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)
オフライン
注記ウィンドウの文字化けを修正していたら,前の投稿にミスがあったので 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オフライン